激活函数 sigmoid、tanh、relu

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了激活函数 sigmoid、tanh、relu相关的知识,希望对你有一定的参考价值。

参考技术A 连续的:当输入值发生较小的改变时,输出值也发生较小的改变;

可导的:在定义域中,每一处都是存在导数;

激活函数

常见的激活函数:sigmoid,tanh,relu。

sigmoid

sigmoid是平滑(smoothened)的阶梯函数(step function),可导(differentiable)。sigmoid可以将任何值转换为0~1概率,用于二分类。细节可以 参考 。

公式:

导数:

导数2:

图(红色原函数,蓝色导函数):

sigmoid

当使用sigmoid作为激活函数时,随着神经网络隐含层(hidden layer)层数的增加,训练误差反而加大。表现为:

靠近输出层的隐含层梯度较大,参数更新速度快,很快就会收敛;

靠近输入层的隐含层梯度较小,参数更新速度慢,几乎和初始状态一样,随机分布;

在含有四个隐藏层的网络结构中,第一层比第四层慢了接近100倍!

这种现象就是梯度弥散(vanishing gradient)。而另一种情况,梯度爆炸(exploding gradient),则是前面层的梯度,通过训练变大,导致后面层的梯度,以指数级增大。

sigmoid的更新速率

由于sigmoid的导数值小于1/4,x变化的速率要快于y变化的速率,随着层数的增加,连续不断执行sigmoid函数,就会导致,前面更新较大的幅度,后面更新较小的幅度,因此,网络在学习过程中,更倾向于,更新后面(靠近输出层)的参数,而不是前面的参数(靠近输入层)。

sigmoid的导函数

sigmoid缺点:

激活函数的计算量较大,在反向传播中,当求误差梯度时,求导涉及除法;

在反向传播中,容易就会出现梯度消失,无法完成深层网络的训练;

函数的敏感区间较短,(-1,1)之间较为敏感,超过区间,则处于饱和状态,

参考1 、 参考2

tanh

tanh,即双曲正切(hyperbolic tangent),类似于幅度增大sigmoid,将输入值转换为-1至1之间。tanh的导数取值范围在0至1之间,优于sigmoid的0至1/4,在一定程度上,减轻了梯度消失的问题。tanh的输出和输入能够保持非线性单调上升和下降关系,符合BP(back propagation)网络的梯度求解,容错性好,有界。

公式:

导数:

图(红色原函数,蓝色导函数):

tanh

sigmoid和tanh:

sigmoid在输入处于[-1,1]之间时,函数值变化敏感,一旦接近或者超出区间就失去敏感性,处于饱和状态,影响神经网络预测的精度值;

tanh的变化敏感区间较宽,导数值渐进于0、1,符合人脑神经饱和的规律,比sigmoid函数延迟了饱和期;

tanh在原点附近与y=x函数形式相近,当激活值较低时,可以直接进行矩阵运算,训练相对容易;

tanh和sigmoid都是全部激活(fire),使得神经网络较重(heavy)。

参考1 、 参考2 、 参考3

relu

relu,即Rectified Linear Unit,整流线性单元,激活部分神经元,增加稀疏性,当x小于0时,输出值为0,当x大于0时,输出值为x.

公式:

图:

relu

导数:

图:

ReLU的导函数

relu对比于sigmoid:

sigmoid的导数,只有在0附近,具有较好的激活性,而在正负饱和区的梯度都接近于0,会造成梯度弥散;而relu的导数,在大于0时,梯度为常数,不会导致梯度弥散。

relu函数在负半区的导数为0 ,当神经元激活值进入负半区,梯度就会为0,也就是说,这个神经元不会被训练,即稀疏性;

relu函数的导数计算更快,程序实现就是一个if-else语句;而sigmoid函数要进行浮点四则运算,涉及到除法;

relu的缺点:

在训练的时候,ReLU单元比较脆弱并且可能“死掉”。举例来说,当一个很大的梯度,流过ReLU的神经元的时候,可能会导致梯度更新到一种特别的状态,在这种状态下神经元将无法被其他任何数据点再次激活。如果这种情况发生,那么从此所以流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的丢失。

如果学习率设置得太高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。通过合理设置学习率,这种情况的发生概率会降低。

在神经网络中,隐含层的激活函数,最好选择ReLU。

关于RNN中为什么选择tanh,而不是relu, 参考 。

深度学习调参体验

 

深度学习调参体验(二)

1. 激活函数选择:

常用的激活函数有relu、leaky-relu、sigmoid、tanh等。对于输出层,多分类任务选用softmax输出,二分类任务选用sigmoid输出,回归任务选用线性输出。而对于中间隐层,则优先选择relu激活函数(relu激活函数可以有效的解决sigmoid和tanh出现的梯度弥散问题,多次实验表明它会比其他激活函数以更快的速度收敛)。另外,构建序列神经网络(RNN)时要优先选用tanh激活函数。

2、学习率设定:

一般学习率从0.1或0.01开始尝试。学习率设置太大会导致训练十分不稳定,甚至出现Nan,设置太小会导致损失下降太慢。学习率一般要随着训练进行衰减。衰减系数设0.1,0.3,0.5均可,衰减时机,可以是验证集准确率不再上升时,或固定训练多少个周期以后自动进行衰减。

3、防止过拟合:

一般常用的防止过拟合方法有使用L1正则项、L2正则项、dropout、提前终止、数据集扩充等。如果模型在训练集上表现比较好但在测试集上表现欠佳可以选择增大L1或L2正则的惩罚力度(L2正则经验上首选1.0,超过10很少见),或增大dropout的随机失活概率(经验首选0.5);或者当随着训练的持续在测试集上不增反降时,使用提前终止训练的方法。当然最有效的还是增大训练集的规模,实在难以获得新数据也可以使用数据集增强的方法,比如CV任务可以对数据集进行裁剪、翻转、平移等方法进行数据集增强,这种方法往往都会提高最后模型的测试精度。

4、优化器选择:

如果数据是稀疏的,就用自适应方法,即 Adagrad, Adadelta, RMSprop, Adam。整体来讲,Adam 是最好的选择。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。

5、残差块与BN层:

如果你希望训练一个更深更复杂的网络,那么残差块绝对是一个重要的组件,它可以让你的网络训练的更深。

BN层具有加速训练速度,有效防止梯度消失与梯度爆炸,具有防止过拟合的效果,所以构建网络时最好要加上这个组件。

6.自动调参方法:

1)Grid Search:网格搜索,在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。缺点是太费时间了,特别像神经网络,一般尝试不了太多的参数组合。

2)Random Search:经验上,Random Search比Gird Search更有效。实际操作的时候,一般也是先用Gird Search的方法,得到所有候选参数,然后每次从中随机选择进行训练。另外Random Search往往会和由粗到细的调参策略结合使用,即在效果比较好的参数附近进行更加精细的搜索。

3)Bayesian Optimization:贝叶斯优化,考虑到了不同参数对应的 实验结果值,因此更节省时间,贝叶斯调参比Grid Search迭代次数少, 速度快;而且其针对非凸问题依然稳健。

7.参数随机初始化与数据预处理:

参数初始化很重要,它决定了模型的训练速度与是否可以躲开局部极小。relu激活函数初始化推荐使用He normal,tanh初始化推荐使用Glorot normal,其中Glorot normal也称作Xavier normal初始化;数据预处理方法一般也就采用数据归一化即可。

深度学习debug的流程策略

针对上面的问题,小哥总结出调试深度学习模型的第一要义——悲观主义

既然消除模型中的错误很难,我们不如先从简单模型入手,然后逐渐增加模型的复杂度。

他把这个过程分为5个步骤:

9.  从最简单模型入手;

10. 成功搭建模型,重现结果;

11. 分解偏差各项,逐步拟合数据;

12. 用由粗到细随机搜索优化超参数;

13. 如果欠拟合,就增大模型;如果过拟合,就添加数据或调整。

14. 学习率:

·       执行学习率范围测试以确定“大”的学习率。

·       一轮测试确定最大学习速率,将最小学习速率设置为最大学习速率的十分之一。

15. 动量:

·       用短期动量值0.99、0.97、0.95和0.9进行测试,以获得动量的最佳值;

·       如果使用周期学习率计划,最好从该最大动量值开始循环设置动量,并随着学习率的增加而减小到0.8或0.85;

16. 批量大小:

·       根据硬件条件使用尽可能大的批量大小,然后比较不同批量大小的性能;

·       小批量添加正规化的效果大,而大批量添加的正则化效果小,因此在适当平衡正规化效果的同时利用好它;

·       使用更大的批量通常会更好,这样就可以使用更大的学习率;

17. 权重衰减:

·       网格搜索以确定适当的幅度,但通常不需要超过一个有效数字精度;

·       更复杂的数据集需要较少的正则化,因此设置为较小的权重衰减值,例如10^-4、10^-5、10^-6、0;

·       浅层结构需要更多的正则化,因此设置更大的权重衰减值,例如10^-2、10^-3、10^-4。

 

以上是关于激活函数 sigmoid、tanh、relu的主要内容,如果未能解决你的问题,请参考以下文章

神经网络中的激活函数具体是什么?为什么Relu要好过与tanh和sigmoid function

神经网络中的激活函数

学习经验分享NO.16超全代码-python画Sigmoid,ReLU,Tanh等十多种激活函数曲线及其梯度曲线(持续更新)

Relu激活函数的优点

深度学习调参体验

深度学习调参体验