神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。
理想的激活函数是阶跃函数,把输入数据映射为激活(1)和抑制(0)。但阶跃函数的问题是不连续不光滑。这个问题主要反映在计算梯度(求偏导)的过程中。
激活函数常用上图右边的Sigmoid函数。它可以把输入值挤压到(0,1)的范围中。
从Sigmoid能看出一些激活函数的特点,同时还有一些其他特点:
最常见的激活函数。
Sigmoid在定义域内处处可导,两侧的倒数逐渐趋近于0,即:$\displaystyle \lim_{x \to \infty}f’(x)=0$.(也称作软饱和激活函数)
Sigmoid导数:
优点:
缺点:
一般来说,sigmoid网络在5层之内就产生梯度消失。(sigmoid导数的最大值是0.25,意味着导数每一层至少压缩到原来的1/4,经过5层就非常小了。) 优化办法:后续会发出来介绍
代表:sigmoid交叉熵损失函数
tanh实际上是sigmoid的变形:
tanh(x) = 2sigmoid(2x) - 1
tanh也有软饱和性,所以也有梯度消失的问题。
由于tanh的输出均值比sigmoid更接近0,SGD会更接近natural gradient,从而降低所需的迭代次数,所以tanh收敛速度比sigmoid更快。
ReLU的导数:
虽然2006年Hinton教授提出通过分层无监督预训练解决深层网络训练困难的问题(比如DBN?),但是深度网络的直接监督式训练的最终突破,最主要的原因是采用了新型激活函数ReLU
优点:
max(x, 0)
函数,所以计算量比前两者小,计算速度也快。缺点:
本文作者公开在arxiv的文章中的实验表明,如果不采用Batch Normalization,即使用 MSRA 初始化30层以上的ReLU网络,最终也难以收敛。 关于神经元死亡: 比如计算出一个很大的梯度 $\nabla w $,反向传播后 $w - \nabla w$ 使得优化后的 $w$ 变成负数,接着正向传播这个神经元就不会对任何数据有激活现象了。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。
由于sigmoid可以看做概率,所以在输出层使用sigmoid比较多。
隐藏层中,ReLU的优秀的计算速度和收敛速度都让其成为一个首选。
ReLU还有很多其他变种,可以参考最后的链接阅读学习。
【机器学习】神经网络-激活函数-面面观(Activation Function) 激活函数导引 26种神经网络激活函数可视化