梯度在神经网络中的作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了梯度在神经网络中的作用相关的知识,希望对你有一定的参考价值。
参考技术A 在谈梯度消失和梯度爆炸的问题之前,我们先来考虑一下为什么我们要利用梯度,同时铺垫一些公式,以便于后面的理解。存在梯度消失和梯度爆炸问题的根本原因就是我们在深度神网络中利用反向传播的思想来进行权重的更新。即根据损失函数计算出的误差,然后通过梯度反向传播来减小误差、更新权重。
我们假设,存在一个如图所示的简单神经网络,我们可以得到相关的公式如右侧所示:
其中函数 g 是激活函数,c 是偏置值,t 是目标值,E 是损失函数,这里利用的是平方误差损失函数。我们可以很清晰的看出,其实整个神经网络就是一个复合函数:
z=g((c+v1(g(b1+w11x1+w12x2))+v2g(b2+w21x1+w22x2)))z=g((c+v1(g(b1+w11x1+w12x2))+v2g(b2+w21x1+w22x2)))
带入到损失函数中,公式如下:
E=12∑(g((c+v1(g(b1+w11x1+w12x2))+v2g(b2+w21x1+w22x2)))−t)2E=12∑(g((c+v1(g(b1+w11x1+w12x2))+v2g(b2+w21x1+w22x2)))−t)2
为了便于讨论,我们对上面的神经网络进行简化,简化为每一层只有一个节点的网络,这样我们的公式也可以相应的简化:
z=g((c+v1(g(b1+w11x1))))z=g((c+v1(g(b1+w11x1))))
E=12∑(g((c+v1(g(b1+w11x1))))−t)2E=12∑(g((c+v1(g(b1+w11x1))))−t)2
这样我们的目的就变得更加明确,整个函数中需要调整的就是 cc 和 b1b1 这两个偏置值以及 v1v1 和 w11w11 这两个权重。
我们假设权重空间如图所示,其中 cost function 就是上面的 E, State Space 就是上面的 cc 和 b1b1 这两个偏置值以及 v1v1 和 w11w11 这两个权重:
因为我们知道我们的目的是找到最小的 E,所以需要通过调整 cc 和 b1b1 这两个偏置值以及 v1v1 和 w11w11 这两个权重的值,来找到图中的 Global Minimum,即 E 最小的点。这一类寻找最小值的问题,在数学上利用梯度下降算法可以有效的解决。
梯度消失的原因#
我们利用上面提到的公式来说明梯度消失产生的原因,求代价函数对 w11w11 的偏导数:
δEδw11=(z−t)∗g′(s)∗v1∗g′(u1)∗x1δEδw11=(z−t)∗g′(s)∗v1∗g′(u1)∗x1
假设,当我们的激活函数使用 Sigmoid 函数的时候,如果 Sigmoid 公式为:
S(x)=11+e−x,S′(x)=S(x)(1−S(x))S(x)=11+e−x,S′(x)=S(x)(1−S(x))
带入替换 g() 后,公式变为:
δEδw11=(z−t)∗S(s)∗(1−S(s))∗v1∗S(u)∗(1−S(u))∗x1δEδw11=(z−t)∗S(s)∗(1−S(s))∗v1∗S(u)∗(1−S(u))∗x1
根据上述公式,我们可以得出,Sigmoid函数的导数图像如下所示:
而我们神经网络中的初始权值也一般是小于 1 的数,所以相当于公式中是多个小于 1 的数在不断的相乘,导致乘积和还很小。这只是有两层的时候,如果层数不断增多,乘积和会越来越趋近于 0,以至于当层数过多的时候,最底层的梯度会趋近于 0,无法进行更新,并且 Sigmoid 函数也会因为初始权值过小而趋近于 0,导致斜率趋近于 0,也导致了无法更新。
除了这个情况以外,还有一个情况会产生梯度消失的问题,即当我们的权重设置的过大时候,较高的层的激活函数会产生饱和现象,如果利用 Sigmoid 函数可能会无限趋近于 1,这个时候斜率接近 0,最终计算的梯度一样也会接近 0, 最终导致无法更新。
可以参考如下图片,底层要比高层的学习速度低特别多。
梯度爆炸的原因#
当我们取得的权重值为一个中间值的时候,如果这个中间值使 S′(s)w>1S′(s)w>1 ,那么会导致网络的底层会比高层的梯度变化更快,则就会导致梯度爆炸(激增)的问题。
避免梯度消失和梯度爆炸的方案#
使用新的激活函数
Sigmoid 函数 和 双曲正切函数都会导致梯度消失的问题。ReLU 函数当 x < 0,的时候一样会导致无法学习。
利用一些改进的 ReLU 可以在一定程度上避免梯度消失的问题。例如,ELU 和 Leaky ReLU,这些都是 ReLU 的变体。
权重初始化
在初始化权重的时候,使权重满足如下公式:
G1noutiVar[w(i)]=1G1nioutVar[w(i)]=1
其中 G1G1 是估计的激活函数的平均值,noutiniout 是第 i 层神经网络上向外连接的平均值
批量规范化
我们要规范化一个特定层节点的激活,利用如下公式:
x^(i)k=x(i)k−Mean[x(i)k]Var[x(i)k]−−−−−−−√x^k(i)=xk(i)−Mean[xk(i)]Var[xk(i)]
然后我们利用自己的自定义平均值和方差来移动和调整它,并且用反向传播进行训练
y(i)k=β(i)k+γ(i)k×x^(i)kyk(i)=βk(i)+γk(i)×x^k(i)
长短记忆网络(LSTM)
逐层无监督预训练(layer-wise unsupervised pre-training)
残差网络(Residual Network)
在传统网络的基础,在两个连续的堆叠层上增加一个到输出的直接连接,也叫跳过连接,使这些层分流。
F(x)F(x) 被称为一个 residual component,主要是纠正以前层的错误或者提供前一层计算不出的额外的细节
如果超过了 100 层需要在添加残差之前就使用 ReLU 而不是之后。这个过程被叫做 identity skip connection。
参考资料:
https://xiaohaijing.lofter.com/
https://baike.1688.com/doc/view-d47524421.html
https://baike.1688.com/doc/view-d47524434.html
https://www.jianshu.com/p/22789f3341ed
https://blog.csdn.net/fenwei88/article/details/120972658
https://zhuanlan.zhihu.com/p/425926622
深度学习中的梯度消失与梯度爆炸及解决方案
1.梯度消失与梯度爆炸
反向传播算法在神经网络中非常常见,可以说是整个深度学习的基石。在反向传播中,经常会出现梯度消失与梯度爆炸的问题。梯度消失产生的原因一般有两种情况:一是结构较深的网络,二是采用了不太合适的激活函数。而梯度爆炸一般也有两种情况:一是结构较深的网络,二是初始化权重不合适,权重值太大。
从网上找了一张深度网络示例图,简单说明一下梯度消失或者爆炸的问题。
其中 σ ′ ( z 4 ) \\sigma'(z_4) σ′(z4)表示激活层的导数, w 4 w_4 w4是该层的权重。 σ ′ ( z 4 ) w 4 \\sigma'(z_4) w_4 σ′(z4)w4这部分如果大于1,那么层数增多的时候,最终的梯度会以指数方式增加,这个时候会发生梯度爆炸。而如果这部分小于1,那么层数增多的时候,最终的梯度会以指数的形式衰减,这个时候就会发生梯度消失。
2.梯度消失/爆炸的解决方案
2.1 梯度裁剪
梯度裁剪主要是针对梯度爆炸提出。其思想也比较简单,训练时候设置一个阈值,梯度更新的时候,如果梯度超过阈值,那么就将梯度强制限制在该范围内,这时可以防止梯度爆炸。
权重正则化(weithts regularization)也可以解决梯度爆炸的问题,其思想就是我们常见的正则方式。
L o s s = ( y − w T x ) 2 + α ∣ ∣ w ∣ ∣ 2 Loss = (y-w^T x) ^ 2 + \\alpha ||w||^2 Loss=(y−wTx)2+α∣∣w∣∣2
α \\alpha α是正则化系数。如果发生梯度爆炸,||w||的平方会变得非常大,这样就可以一定程度避免梯度爆照。
2.2.relu等激活函数
relu我们就非常常见了,在AlexNet网络中最先提出。relu激活函数的导数为1,那么就不存在梯度消失爆炸的问题,不同层之间的梯度基本保持一致。
而relu的缺点则是,负数部分恒为0,所以存在一定‘死区’,会导致一些神经元无法被激活,可以通过elu等来改善死区的问题。
2.3.batch normalization
batch normalization目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果.BN本质上是解决反向传播过程中的梯度问题,通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性。
在我们前面推导的反向传播求导公式中,含有 w w w项,所以w的大小影响了梯度的消失和爆炸。BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题。
2.4 ResNet 残差结构
Residual Net中包含残差的shortcut(捷径)部分,shortcut的网络结构为
残差网络主要是为了解决梯度消失的问题。从上面的网络结构可以看出,由于shortcut的存在,残差网络的输出在对于输入求导时,总有一个x保证有一个常数梯度1(除非F(X)刚好求导为-1这样导数求和为0,但这种概率太小),所以一定程度能解决梯度消失的问题。如果从输入到输出,恒等映射是最优解,那么将残差F(x)直接设置为0即可。
以上是关于梯度在神经网络中的作用的主要内容,如果未能解决你的问题,请参考以下文章