深度神经网络中的激活函数
激活函数在深度神经网络中是经常用到的,而且现在也有很多资料都会提到常用的激活函数。本篇作为学习笔记,和大家一起分享我对激活函数的理解。
单神经元模型如下所示:
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。对于深度神经网络,我们在每一层线性变换后叠加一个非线性激活函数,以避免多层网络等效于单层线性函数,从而获得更强大的学习与拟合能力。
下面我们来总结下常用的激活函数:
Sigmoid函数
数学形式为:
对应的导函数为:
几何图像为:
特点:Sigmoid激活函数将输入z映射到区间(0,1),当z很大时,f(z)趋近于1;当z很小时,f(z)趋近于0。其导数在z很大或很小时都会趋近于0,造成梯度消失的现象。
Tanh函数
数学形式为:
对应的导函数为:
几何图形:
特点:如上图所示,当z很大时,f(z)趋近于1;当z很小时,f(z) 趋近于−1。其导数 在z很大或很小时都会趋近于0,同样会出现“梯 度消失”。实际上,Tanh激活函数相当于Sigmoid的平移:
Relu函数
数学形式为:
对应的导函数为:
几何图形为:
ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
1)从计算的角度上,Sigmoid和Tanh激活函数均需要计算指数,复杂度 高,而ReLU只需要一个阈值即可得到激活值。
2)ReLU的非饱和性可以有效地解决梯度消失的问题,提供相对宽的激活 边界。
3)ReLU的单侧抑制提供了网络的稀疏表达能力。
ReLU的局限性在于其训练过程中会导致神经元死亡的问题。这是由于函数导致负梯度在经过该ReLU单元时被置为0,且在之后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生响应。在实际训练中,如果学习率(Learning Rate设置较大,会导致超过一定比例的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。
为解决这一问题,人们设计了ReLU的变种Leaky ReLU(LReLU),其形式表示为:
几何图形为:
LReLU与ReLU的区别在于, 当z<0时其值不为0,而是一个斜率为a的线性函数,一般a为一个很小的正常数, 这样既实现了单侧抑制,又保留了部分负梯度信息以致不完全丢失。但另一方面,a值的选择增加了问题难度,需要较强的人工先验或多次重复训练以确定合适的参数值。
基于此,参数化的PReLU(Parametric ReLU)应运而生。它与LReLU的主要区别是将负轴部分斜率a作为网络中一个可学习的参数,进行反向传播训练,与其他含参数网络层联合优化。而另一个LReLU的变种增加了“随机化”机制,具体地,在训练过程中,斜率a作为一个满足某种分布的随机采样;测试时再固定下 来。Random ReLU(RReLU)在一定程度上能起到正则化的作用。
如何选择合适的激活函数?
根据经验总结如下:
1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU。
3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU。
参考资料: 《百面机器学习 算法工程师带你去面试》
- 点赞
- 收藏
- 关注作者
评论(0)