Activation Functions
关键词:Sigmoid、tanh、ReLU、Leaky ReLU、ELU、Maxout
本来是作为Day1 Training Neural Networks, part I的一部分的,但是由于补充的内容比较多,觉得还会单独一篇比较好。
激活函数的作用:给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。
六种常见激活函数
激活函数实践指南
Sigmoid、tanh、Relu的对比
sigmoid function在历史上流行过一段时间因为它能够很好的表达“激活”的意思,未激活就是0,完全饱和的激活则是1。但是因为它的输出不是zero-centered的,所以在sigmoid的基础上发展出来了tanh。Sigmoid会发成梯度弥散,所以又出现了Relu(于生物神经更类似),在正值区域内,不会发生梯度弥散。
1. 为什么希望输出是zero-centered?
对于Sigmoid函数,当后面的神经元的输入都为正数时,(e.g. x>0 elementwise in f=wTx+b),那么对 w 求局部梯度时,梯度值则都为正数,这样在反向传播的过程中 w 要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。
2. 什么是梯度弥散?
梯度弥散的问题很大程度上是来源于激活函数的“饱和”。Sigmoid gate容易饱和:当输入非常大或者非常小的时候,神经元的梯度(斜率)就接近于0了,从曲线图中可以看出梯度的趋势。
这就使得我们在反向传播算法中反向传播接近于0的梯度,导致最终权重基本没什么更新,这样一来,深层模型也就变成了前几层相对固定,只能改变最后几层的浅层模型,我们就无法递归地学习到输入数据了。这种现象就是梯度弥散(vanishing gradient problem)
另外,需要尤其注意参数的初始值来尽量避免饱和(saturation)的情况。如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradient kill掉,这会导致网络变的很难学习。
x = -10 或者 x = 10, 都会使得当前神经元的梯度接近于0,会引起梯度弥散。
3. Kill Gradient & dead ReLU
与上述Sigmoid gate相似,当 x = -10 (负数)的时候,正向传播时,该神经元未被激活,梯度为0,无法进行反向传播,也就不能更新权值,称为“Kill Gradient”.
但当 x = 10 (正数)时,输出为正数,反向传播时,直接传播前一个神经元的梯度。
x = 0时,没有定义它的梯度是什么,因为在这一点是不可微的。
有两种情况会引起dead ReLU
1)初始化权重的时候时,将权重设置为了不能激活ReLU的数值(少见)
2)Learning Rate设置过大:以 y = w * x + b 为例,如果Learning rate设置过大,在某次反向传播后,调整w的时候,可能会使 w 变的很少,输出 y' 为负数,那么进入到ReLU的时候,输出为0,该神经元的局部梯度为0,则在此处权重将不会得到更新, 也就是说,ReLU神经元在训练中不可逆地死亡了。
Leaky RuLU
优点:解决Dead ReLU 问题,既修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失
缺点:性能不稳定,众说纷纭,没有清晰的定论。
PReLU:LReLU的改进版,可以自适应地从数据中学习参数。PReLU具有收敛速度快、错误率低的特点。PReLU可以用于反向传播的训练,可以与其他层同时优化。
值得注意的是:在tflearn中有现成的LReLU和PReLU可以直接用。
ELU
优点:1)ELU减少了正常梯度与单位自然梯度之间的差距,从而加快了学习。
2)在负的限制条件下能够更有鲁棒性。
缺点:涉及到指数运算,影响运算速度。
MaxOut
ReLU和Leaky ReLU都是这个公式的特殊情况(比如ReLU就是当w1 = 0, b = 0 的时候)。这样Maxout神经元就拥有ReLU单元的所有优点(线性操作和不饱和),而没有它的缺点(死亡的ReLU单元)。然而和ReLU对比,它每个神经元的参数数量增加了一倍,这就导致整体参数的数量激增。
相关文章链接:https://www.cnblogs.com/rgvb178/p/6055213.html