1、激活函数
更新W有两种方法:穷举法、梯度下降法
如何选择激活函数?
- 通常来说,很少会把各种激活函数串起来在一个网络中使用。
- 如果使用 ReLU ,那么一定要小心设置学习率(learning rate ),预防出现过多的“神经元死亡”问题。
- 如果这个问题不好解决,那么可以试试 Leaky ReLU 、 PReLU 或者 Maxout。
- 最好不要用 sigmoid ,可以试试 tanh ,不过可以预期它的效果会比不上 ReLU 和 Maxout。
激励层建议:
CNN尽量不要使用sigmoid,如果要使用,建议只在全连接层使用
首先使用ReLU,因为迭代速度快,但是有可能效果不佳
如果使用ReLU失效的情况下,考虑使用Leaky ReLu或者Maxout,此时一般情况都可以解决啦
tanh激活函数在某些情况下有比较好的效果,但是应用场景比较少
2、方法
Sigmoid
缺点:
梯度消失,具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个f’(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f’(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数无法被更新,很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在5层之内就会产生梯度消失现象
容易出现软饱和
均值不为零,即函数输出没有0中心化。
如果输入都是正数的话,那么对 w求局部梯度则都为正;结合梯度下降法:在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,这将会导致梯度下降权重更新时出现 z 字型(Zig Zag)的下降。使得收敛缓慢。
Tanh 双曲正切、双S函数
缺点;
tanh函数也存在梯度饱和问题(也具有软饱和性),造成梯度消失,导致训练效率低下。甚至终止梯度传递(死亡神经元)
与 sigmoid 不同的是,tanh输出是零均值的(0中心化)。
实际应用中,tanh 会比 sigmoid 使得模型收敛速度更快。
ReLU 修正线性单元
与传统sigmoid激活函数相比,ReLU能有效缓解梯度消失问题。ReLU 在x<0 时硬饱和。x>0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减。f(x) = max(0, x )
均值不为零
计算速度快。正向传播过程中,sigmoid和tanh函数计算激活值时需要计算指数,而Relu函数仅需要设置阈值就可以得到激活值,而不用去算复杂的(指数)运算。如果x<0, f(x)=0,如果x>0, f(x)=x。加快了正向传播的计算速度。
Relu激活函数可以极大地加快收敛速度,相比tanh函数,收敛速度可以加快6倍。
随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。
没有梯度消失和梯度爆炸,收敛速度快,但是有死亡神经元(可以用较小学习率避免)
Leaky ReLU
f(x) = max(σx, x )
用来解决 ReLU“神经元死亡” 的问题。与 ReLU 不同的是ReLU 中当 x<0 时,函数值为 0 。而 Leaky ReLU 则是给出一个很小的负数梯度值,比如 0.01
PReLU
PReLU 是ReLU 和 Leaky ReLU的改进版本,具有非饱和性:
与ReLU相比,PReLU收敛速度更快(因为PReLU的输出更接近0均值)。
RReLU
核心思想:在训练过程中,aji是从一个高斯分布中随机出来的,然后再在测试过程中进行修正。
ELU
右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱和能够让ELU对输入变化或噪声更鲁棒。
ELU的输出均值接近于零(相比sigmoid和ReLU),所以收敛速度更快。
融合了sigmoid和ReLU:左侧具有软饱和性,右侧无饱和性。
Maxout
无神经元饱和,无神经元死亡,计算复杂。
Maxout能够缓解梯度消失,又由于不会陷入硬饱和区
Maxout的拟合能力非常强:它可以拟合任意的的凸函数。
规避了ReLU神经元死亡的缺点。但增加了参数和计算量。