神经网络梯度消失

什么是梯度消失?

定义:

  • 梯度消失 (Vanishing Gradients)
    在梯度下降中, 随着算法反向的反馈, 梯度会越来越小,最终没有变化,此时并没有收敛到比好的解,这就是梯度消失的问题。
  • 梯度爆炸
    梯度爆炸原理跟梯度消失一样,反向传播时,导数大于1,导致梯度增加。

解释:

梯度消失,好比你在往下走楼梯,楼梯的梯度很小,你感觉不到在下楼......

放在ml里面,就是在梯度下降公式里

wi = wi−α∂l∂wi 导数部分很小很小,可能接近于0, 导致训练极度缓慢( wi 变化很小),这种现象就叫梯度消失,一般是由训练层的激活函数导致的。

以下用一个简单的神经网络和 sigmoid激活函数来解析梯度消失的现象。

神经网络梯度消失_第1张图片

 (推导过程来自知乎:梯度消失(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))

依次把这三个函数用图像来表示,如图

神经网络梯度消失_第2张图片

 从图三可看到,如果无论x的取值多大,导函数的最大值也只能是0.25,在x=0的时候。

把三个图浓缩成一个图,可以用如下表示

神经网络梯度消失_第3张图片

 

可以看到,当x在0和4之间变化时,导函数的值的变换非常非常小。可以扩展的理解为,即使是很大很大的数,使用sigmod激活函数后,那么会压缩得很小很小,导致变化率也很小很小。

回到前面的公式

神经网络梯度消失_第4张图片

 解决方法:

更换激活函数
ELU > leaky ReLU > ReLU > tanh > logistic

sigmoid激活函数

神经网络梯度消失_第5张图片

 神经网络梯度消失_第6张图片

函数两侧十分平滑,两端无限接近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学习过程,釜底抽薪。

ReLU

 神经网络梯度消失_第7张图片

负数一侧永远为0,正数一侧导数永远为1。ReLU的优势在于:1)不饱和;2)计算效率高;3)收敛速度快。

 Leaky ReLU

神经网络梯度消失_第8张图片

Leaky ReLU与ReLU十分类似,只不过在负数一侧并不完全抑制,而是给予一个小的导数。

实际上,由于激活函数对于神经网络的影响巨大,对其改进和研究非常多,比如还有Maxout、PReLU等激活函数,一份实践指南:

  • 使用ReLU,并注意学习速率的调整
  • 试试Leaky ReLU / Maxout
  • 试试tanh,但不要抱太大希望
  • 不要使用sigmoid 

对ReLU和sigmoid两者的感悟:

  • sigmoid函数在压缩数据“幅度”方面有优势,对于深度网络,使用sigmoid函数可以保证数据幅度不会有问题,幅度稳住后就不会有太大失误
  • sigmoid存在梯度消失的问题,在反向传播上有劣势
  • ReLU不会对数据做幅度压缩,所以随着深度网络层数加深,数据的幅度会越来越大,最终影响模型的表现
  • 但是ReLU在反向传导时,能够将梯度信息“完完全全”地传递到浅层网络
  • 参考文献:神经网络中的梯度消失 - 冬色 - 博客园

你可能感兴趣的:(deep,learning,神经网络,深度学习,人工智能)