【神经网络】激活函数的作用及常用激活函数
【神经网络】激活函数的作用及常用激活函数
一、激活函数的作用
激活函数(activation function)的作用是去线性化,神经网络节点的计算就是加权求和,再加上偏置项:
ai=∑ixiwi+ba_i=\sum_ix_iw_i+bai=i∑xiwi+b
这是一个线性模型,将这个计算结果传到下一个节点还是同样的线性模型。只通过线性变换,所有的隐含层的节点就无存在的意义。原因如下:假设每一层的权值矩阵用W(i)W^{(i)}W(i)表示。那么存在一个W′W'W′使:
W′=W(1)W(2)…W(n)W'=W^{(1)}W^{(2)}…W^{(n)}W′=W(1)W(2)…W(n)
那么,n层隐含层就可以全部变成一个隐含层,隐含层的数量就没有任何意义。所以使用激活函数将其去线性化。种种情况下,W′=W(1)W(2)…W(n)W'=W^{(1)}W^{(2)}…W^{(n)}W′=W(1)W(2)…W(n)不再成立,每层隐含层都有其存在的意义。
下面有更详细的解释,改内容来自《TensorFlow实战Google深度学习框架》(第2版)。
二、常用激活函数
人工神经网络中常用到激活函数(activation function):ReLu和Sigmoid。
2.1 ReLu
线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元。其函数表达式如下:
f(x)=max(0,x)f(x)=max(0,x)f(x)=max(0,x)
其函数图像图下:
其含义就是,如果输入的x>0x>0x>0,那么f(x)=xf(x)=xf(x)=x;如果x<0,那么f(x)=0f(x)=0f(x)=0。
2.2 Sigmoid
Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。其函数表达式如下:
f(x)=11+e−xf(x)=\dfrac{1}{1+e^{-x}}f(x)=1+e−x1
其函数图像图下:
可以看到在趋于正无穷或负无穷时,函数趋近平滑状态,sigmoid函数因为输出范围(0,1),所以二分类的概率常常用这个函数。
sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些缺点,下面将根据其导数对其缺点进行分析,导数图像如下:
缺点:
- 在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
如果我们初始化神经网络的权值为[0,1][0,1][0,1]之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为(1,+∞)(1,+\infty)(1,+∞)区间内的值,则会出现梯度爆炸情况。 - Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x>0,f=wTx+bx>0,f=w^Tx+bx>0,f=wTx+b,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。
当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。 - 其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
参考:https://blog.csdn.net/tyhj_sf/article/details/79932893