![Python人工智能](https://wfqqreader-1252317822.image.myqcloud.com/cover/801/40107801/b_40107801.jpg)
3.2 神经激活函数
取决于不同的架构和问题,人工神经网络中存在几种不同的神经激活函数。本节将讨论最常用的激活函数,因为这些函数决定了网络的架构和性能。线性激活函数和Sigmoid激活函数曾经在人工神经网络中使用较多,直到Hinton等人发明了修正线性单元(Rectified Linear Unit,ReLU),ReLU使人工神经网络的性能产生了翻天覆地的变化。
3.2.1 线性激活函数
线性激活函数神经元输出的是总输入对神经元的衰减,如图3-4所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-076-1.jpg?sign=1739038264-VoP3aBww0hXSfUGMt34eiGPfDnPb0DHL-0-a09acab40c4d0627285cbe03fb3f1ae4)
图3-4 线性激活函数神经元
如果x是线性激活函数神经元的总输入,那么输出y如下所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-076-2.jpg?sign=1739038264-ICeVDLnc42y2fIO5UXv6bOzIH9jlAmyX-0-ead202f61c8be1c774ddb1c68dc0ad0c)
3.2.2 Sigmoid激活函数
Sigmoid激活函数简称Sigmoid函数,也被称为S型函数。它可以将整个实数区间映射到(0,1)区间,因此经常被用来计算概率。它也是传统人工神经网络中经常被使用的一种激活函数。
Sigmoid函数的公式定义为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-076-3.jpg?sign=1739038264-os6jAhL84Zel086S6edoNL78GUkSADDg-0-4dc9bc917bf22338432543707db8bcda)
Sigmoid函数曲线如图3-5所示,其中,x的范围可以是正无穷到负无穷,但是对应y的范围为0~1,所以经过Sigmoid函数输出的值都会落在0~1的区间里,即Sigmoid函数能够把输入的值“压缩”到0~1。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-076-4.jpg?sign=1739038264-SWmWI2OcO06M3ZPfcZDC28jyYJCsM9id-0-a2f0aa0dda3bba42d200e287d5a0fe54)
图3-5 Sigmoid函数曲线
对于自然界中的各种复杂过程,输入与输出的关系通常是非线性的,因此,我们需要使用非线性激活函数通过神经网络来对它们建模。一个二元分类问题的神经网络,它的输出概率由Sigmoid神经元的输出给出,因为它的输出范围是0~1。输出概率可表示为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-076-5.jpg?sign=1739038264-nTJvgvNzUmQWp2Ow3tOHKdzYVfaHNZRF-0-dbd9d6c2bbd469838369a62a6b01780b)
此处,x表示输出层中的Sigmoid神经元的总输入。
【例3-1】 利用Python绘制Sigmoid激活函数。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-077-1.jpg?sign=1739038264-4gZvK7i6VrgXTrXwm70NUaSLZ2uBOLdu-0-7e7bff6b47ff226fc58f28f8d466ae77)
运行程序,效果如图3-6所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-077-2.jpg?sign=1739038264-vYXMOR5uxaetOZWma8M9Mo8ok6YVnM1m-0-10f11d50de0bf7f989df712d9a8d2869)
图3-6 Python绘制的Sigmoid激活函数
3.2.3 双曲正切激活函数
双曲正切激活函数(Hyperbolic Tangent Activation Function)又被称为tanh函数。它将整个实数区间映射到(-1,1),tanh函数也具有软饱和性。它的输出以0为中心,tanh函数的收敛速度比Sigmoid函数快。由于存在软饱和性,所以tanh函数也存在梯度消失的问题。
tanh函数的公式定义为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-078-1.jpg?sign=1739038264-nCxCe4pTKwNjo5zyTU5dSm5Fbt9nzGNU-0-1f52f3a8d40035602569f7d5a41e5ce1)
如图3-7所示,tanh函数输出值的范围是[-1,1]。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-078-2.jpg?sign=1739038264-MNQMY1PHEF5u75UVnaoGopw9IJvjOYa7-0-2bb47ea9884aa6022efed9c9b9a62318)
图3-7 tanh函数
值得注意的是,Sigmoid函数和tanh函数在一个小范围内是线性的,在此范围之外则输出趋于饱和。在饱和区间,激活函数(相对输入)的梯度非常小或趋于零,这意味着它们很容易产生梯度消失问题。之后可以看到,人工神经网络可以从反向传播方法学习,其中每一层的梯度由下一层激活函数的梯度决定,直到最终的输出层。因此,如果单元中的激活函数处于饱和区间,那么极少数的误差会被反向传播至之前的神经网络层。通过利用梯度,神经网络最小化预测误差来学习权重和偏置(W)。这意味着,如果梯度太小或趋于零,那么神经网络将无法有效地学习这些权重。
【例3-2】 利用Python绘制tanh函数。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-078-3.jpg?sign=1739038264-nFJpR4RKd8KpeQ5x1idDFl1DOT9LHIVI-0-752a07abab9be0b87444dc5b23636ce7)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-079-1.jpg?sign=1739038264-Dp2vBrJglsrWB4yAJoXsOdBhOXcxAKAT-0-c74525a067a9a261bfc7c40db04de4a8)
运行程序,效果如图3-8所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-079-2.jpg?sign=1739038264-A9FLsE0wigISTZMDk0Ex5oxbnzzUvYLO-0-bd3b79d287dfe07f189a484ca3615974)
图3-8 Python绘制的tanh函数
3.2.4 修正线性激活函数
当神经元的总输入大于零的时候,修正线性单元(ReLU)的输出是线性的;当总输入为负数时,输出为零。这个简单的激活函数为神经网络提供了非线性变换,同时,它为总输入提供了一个恒定的梯度。这个恒定的梯度可帮助人工神经网络避免其他激活函数(如Sigmoid函数和tanh函数)出现梯度消失问题。ReLU函数的输出为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-079-4.jpg?sign=1739038264-imnQYU0hkyOuGn5P1vwFaQzpZTfayPiZ-0-bae2d1a49c0a9c6041a35698d04640e9)
ReLU函数如图3-9所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-079-3.jpg?sign=1739038264-Yzwzlv2wlaXSxxyBly1pZbQNEmdjU61r-0-cac8b105e5057585f52cb8675df61fcc)
图3-9 ReLU函数
ReLU函数是目前比较火的一个激活函数,相比Sigmoid函数和tanh函数,它有以下优点:
(1)在输入为正数的时候,不存在梯度饱和问题。
(2)计算速度要快很多。ReLU函数只有线性关系,不管是前向传播还是反向传播,都比Sigmoid函数和tanh函数要快很多(Sigmoid函数和tanh函数要计算指数,计算速度会比较慢)。
当然,缺点也是有的:
(1)当输入是负数的时候,ReLU函数是完全不被激活的,这表明一旦输入负数,ReLU函数就会失效。这在前向传播过程中,还不算什么问题,因为有的区域是敏感的,有的区域是不敏感的。但是在反向传播过程中,输入负数,梯度就会完全到0,这个和Sigmoid函数、tanh函数有一样的问题。
(2)ReLU函数的输出要么是0,要么是正数,这也就是说,ReLU函数也不是以0为中心的函数。
【例3-3】 Python绘制ReLU函数。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-080-1.jpg?sign=1739038264-0mk3WV42kTZ8Y61ZxRNLZsSldj7zHVes-0-6ad29e121b4df5ee31a78e97673945ee)
运行程序,效果如图3-10所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-081-1.jpg?sign=1739038264-meAhvEm49PRzis4ZKyA2V2NW9cn9PFaT-0-630a2b6bc396cd1f63dca4f417685a73)
图3-10 Python绘制的ReLU函数
3.2.5 PReLU激活函数
ReLU函数的一个缺点是它对负数输入的零梯度。这可能会降低训练的速度,尤其是在初始阶段。在这种情况下,带参数的修正线性单元(PReLU)激活函数(简称PReLU函数,见图3-11)会很有用,对于负数的输入,输出和梯度都不是零。PReLU函数为
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-081-3.jpg?sign=1739038264-AY67BTCsmREh2UmPKfZt3ZhM5sU4SGYC-0-adb16fa130b63fedc5f1745d3a614d94)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-081-2.jpg?sign=1739038264-Zg1xnGZcnFnemcvWUUhXR8EApp8Hxx4s-0-21fb62aa86d9b9ef686996da395ae1b4)
图3-11 PReLU函数
PReLU函数是针对ReLU函数的一个改进函数,在负数区域内,PReLU函数有一个很小的斜率,这样也可以避免ReLU函数失效。相比ReLU函数,PReLU函数在负数区域内进行线性运算,斜率虽然小,但是不会趋于0。
在PReLU函数公式中,参数a一般取0~1的数,而且取值比较小,如零点零几。当a=0.01时,我们称PReLU函数为Leaky ReLU函数,是PReLU函数的一种特殊情况。
【例3-4】 利用Python绘制PReLU函数。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-081-4.jpg?sign=1739038264-MhkGwjK6VdEde0Jp6uGuHxxnXfVBUN6y-0-bb0558a3f6d33e6ff6073119da360853)
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-082-1.jpg?sign=1739038264-lGIkid5WEhZVgPJYE9pQia3hTUTauEei-0-776045b49d454e26c5015c16655e637f)
运行程序,效果如图3-12所示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-082-2.jpg?sign=1739038264-sADaORYlzHQDUyevAIlWXK6WtCgFmmIJ-0-a5888640515e9a12525cc95580197bee)
图3-12 Python绘制的PReLU函数
3.2.6 softmax激活函数
softmax激活函数常被用于多分类问题,其输出为不同类别的概率。假设我们需要处理一个包含n个类别的分类问题,那么所有类别的总输入可用下面的公式表示。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-082-3.jpg?sign=1739038264-HEx45kfPan3KfsR9N8EtdzV2faVibeWO-0-ed23e72a52c03c68a1833b9f90daf7e7)
在这种情况下,可以通过softmax激活函数给出第k个类别的输出概率。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-083-1.jpg?sign=1739038264-MQpddHawPSwwsWAfP5VQdL7VSAbsBKfE-0-7631bfba10242350dcd02d45761992d3)
还有很多其他激活函数,通常是这些基本激活函数的变形形式。
softmax激活函数在机器学习中有非常广泛的应用,下面利用softmax激活函数对MNIST数据进行分类,演示softmax激活函数对分类的处理效果。
【例3-5】 对MNIST数据进行分类处理。
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-083-2.jpg?sign=1739038264-OhpMSa93j1xVEXuaCJnwUCVZ4etXBHQ3-0-07bf6b3049c1d434495d79070c3adb1a)
运行程序,输出如下:
![](https://epubservercos.yuewen.com/CBEF87/20862582601479206/epubprivate/OEBPS/Images/41374-00-083-3.jpg?sign=1739038264-s6fDgEdaCo19ykQCjzBzOKbbQUbuS9JQ-0-7d7b62ab7760b500d957e19179a0164c)