定义:
解释:
梯度消失,好比你在往下走楼梯,楼梯的梯度很小,你感觉不到在下楼......
放在ml里面,就是在梯度下降公式里
wi = wi−α∂l∂wi 导数部分很小很小,可能接近于0, 导致训练极度缓慢( wi 变化很小),这种现象就叫梯度消失,一般是由训练层的激活函数导致的。
以下用一个简单的神经网络和 sigmoid激活函数来解析梯度消失的现象。
(推导过程来自知乎:梯度消失(vanishing gradient) - 知乎)
求 ∂l∂w1
根据链式规则求导,同一路径上各节点的导数相乘,不同路径上各节点的导数相加。可以得出以下导数变换
∂l∂w1=∂l∂σ(a3)∂σ(a3)∂σ(a2)∂σ(a2)∂σ(a1)∂σ(a1)∂w1
x输入,我们用y=x函数来表示。
σ 是sigmod函数。
f(x) = 11+e−x
sigmod函数的导函数是 f'(x) = f(x)(1-f(x))
依次把这三个函数用图像来表示,如图
从图三可看到,如果无论x的取值多大,导函数的最大值也只能是0.25,在x=0的时候。
把三个图浓缩成一个图,可以用如下表示
可以看到,当x在0和4之间变化时,导函数的值的变换非常非常小。可以扩展的理解为,即使是很大很大的数,使用sigmod激活函数后,那么会压缩得很小很小,导致变化率也很小很小。
回到前面的公式
更换激活函数
ELU > leaky ReLU > ReLU > tanh > logistic
函数两侧十分平滑,两端无限接近0和1,只有中间一段导数较大。当=0x=0时,其导数取最大值0.25。选择sigmoid函数作为激活函数的优势:1)可以引入非线性;2)容易求导;3)可以将实数压缩至(0,1)(0,1)
神经网络主要的训练方法是BP算法,BP算法的基础是导数的链式法则,也就是多个导数的乘积。而sigmoid的导数最大为0.25,且大部分数值都被推向两侧饱和区域,这就导致大部分数值经过sigmoid激活函数之后,其导数都非常小,多个小于等于0.25的数值相乘,其运算结果很小。随着神经网络层数的加深,梯度后向传播到浅层网络时,基本无法引起参数的扰动,也就是没有将loss的信息传递到浅层网络,这样网络就无法训练学习了。这就是所谓的梯度消失。
梯度消失的解决方式主要有:1)使用其它激活函数,如ReLU等;2)层归一化;3)优化权重初始化方式;4)构建新颖的网络结构,如highway net,而capsule net意图取消BP学习过程,釜底抽薪。
负数一侧永远为0,正数一侧导数永远为1。ReLU的优势在于:1)不饱和;2)计算效率高;3)收敛速度快。
Leaky ReLU与ReLU十分类似,只不过在负数一侧并不完全抑制,而是给予一个小的导数。
实际上,由于激活函数对于神经网络的影响巨大,对其改进和研究非常多,比如还有Maxout、PReLU等激活函数,一份实践指南:
对ReLU和sigmoid两者的感悟: