营销网站科技,siren模板wordpress,十个源码网站,网站建设优化保定文章目录 0. 前言1. 为什么会出现梯度衰减和梯度爆炸#xff1f;2. 如何提高数值稳定性#xff1f;2.1 随机初始化模型参数2.2 梯度裁剪#xff08;Gradient Clipping#xff09;2.3 正则化2.4 Batch Normalization2.5 LSTM#xff1f;Short Cut#xff01; 0. 前言 按照… 文章目录 0. 前言1. 为什么会出现梯度衰减和梯度爆炸2. 如何提高数值稳定性2.1 随机初始化模型参数2.2 梯度裁剪Gradient Clipping2.3 正则化2.4 Batch Normalization2.5 LSTMShort Cut 0. 前言 按照国际惯例首先声明本文只是我自己学习的理解虽然参考了他人的宝贵见解但是内容可能存在不准确的地方。如果发现文中错误希望批评指正共同进步。 本文的主旨是说明深度学习网络模型中关于数值稳定性的常见问题梯度衰减vanishing和爆炸explosion以及常见的解决方法。
本文的部分内容、观点及配图借鉴了多伦多大学计算机科学学院讲座——Lecture 15: Exploding and Vanishing Gradients内容以及Dive into deep learning第3.15章节《数值稳定性和模型初始化》。
1. 为什么会出现梯度衰减和梯度爆炸
用下面简化的全连接神经元网络讲解这个全连接神经元网络每层只有一个神经元可以看作是一串神经元连接而成的网络。 在前向传播中由于数值的传递需要经过非线性的激活函数 σ ( ) \sigma() σ()例如Sigmoid、Tanh函数其数值大小被限制住了因此前向传播一般不存在数值稳定性的问题。
在反向传播中例如求解输出 y y y对权重 w 1 w_1 w1的偏导为 ∂ y ∂ w 1 σ ′ ( z n ) w n ⋅ σ ′ ( z n − 1 ) w n − 1 ⋅ ⋅ ⋅ σ ′ ( z 1 ) x \frac{\partial y}{\partial w_1}\sigma(z_n)w_n · \sigma(z_{n-1})w_{n-1} ··· \sigma(z_{1})x ∂w1∂yσ′(zn)wn⋅σ′(zn−1)wn−1⋅⋅⋅σ′(z1)x z n { w n ⋅ h n − 1 b n , n 1 w 1 ⋅ x b 1 , n 1 z_n \left \{\begin{array}{cc} w_n·h_{n-1}b_n, n1\\ w_1·xb_1, n1 \end{array} \right. zn{wn⋅hn−1bn,w1⋅xb1,n1n1 这里就可以看出如果权重 w n w_n wn的初始选择不合理或者 w n w_n wn在逐渐优化过程中出现导致 σ ′ ( z n ) w n \sigma(z_n)w_n σ′(zn)wn大部分或全部大于1或者小于1的情况且网络足够深就会导致反向传播的偏导出现数值不稳定——梯度衰减或者梯度爆炸。 再简化点理解假设 σ ′ ( z n ) w n 0.8 \sigma(z_n)w_n0.8 σ′(zn)wn0.8有50层网络深度 0. 8 50 0.000014 0.8^{50}0.000014 0.8500.000014假设 σ ′ ( z n ) w n 1.2 \sigma(z_n)w_n1.2 σ′(zn)wn1.2有50层网络深度 1. 2 50 9100 1.2^{50}9100 1.2509100。 参考Lecture 15: Exploding and Vanishing Gradients的另一种解释数值稳定性的方法是深度学习网络类似于非线性方程的迭代使用例如 f ( x ) 3.5 x ( 1 − x ) f(x)3.5x(1-x) f(x)3.5x(1−x)经过多次迭代 y f ( f ( ⋅ ⋅ ⋅ f ( x ) ) ) yf(f(···f(x))) yf(f(⋅⋅⋅f(x)))后的情况如下图 可见非线性函数再经历多次迭代后会呈现复杂且混沌的表现在这个实例中仅经历6次迭代后就出现了偏导很大的情况对应梯度爆炸。 我们也应该注意到经历6次迭代后也出现了 ∂ y ∂ x ≈ 0 \frac{\partial y}{\partial x}≈0 ∂x∂y≈0的区域对应梯度衰减。 2. 如何提高数值稳定性
2.1 随机初始化模型参数
这是最简单、最常用的对抗梯度衰减和梯度爆炸的方法。上文已经说明 σ ′ ( z n ) w n \sigma(z_n)w_n σ′(zn)wn大部分或全部大于1或者小于1的情况且网络足够深就容易发生数值不稳定的情况。如果随机初始化模型参数就会很大程度上避免因为 w n w_n wn的初始选择不合理导致的梯度衰减或爆炸。
Xavier随机初始化是一种常用的方法假设某隐藏层输入个数为 a a a输出个数为 b b bXavier随机初始化会将该层中的权重参数随机采样于 ( − 6 a b , 6 a b ) (-\sqrt{\frac{6}{ab}},\sqrt{\frac{6}{ab}}) (−ab6 ,ab6 )。
2.2 梯度裁剪Gradient Clipping
这是一种人为限制梯度过大或过小的方法其思路是给原本的梯度 g g g加上一个系数在 g g g的绝对值过大时对其进行缩小反之亦然。这个系数为: η ∣ ∣ g ∣ ∣ \frac{\eta}{||g||} ∣∣g∣∣η
其中 η \eta η为超参数 ∣ ∣ g ∣ ∣ ||g|| ∣∣g∣∣为梯度的二范数。
增加这个系数后虽然会导致这个结果并非是真正的损失函数对于权重的偏导数但是能够维持数值稳定性。
2.3 正则化
这是一种抑制梯度爆炸的方法。我之前介绍过正则化方法基于PyTorch实战权重衰减——L2范数正则化方法附代码其思想是在损失函数中增加权重的范数作为惩罚项 l o s s 1 n Σ ( y − y ^ ) 2 λ 2 n ∣ ∣ w ∣ ∣ 2 loss \dfrac{1}{n} \Sigma (y - \widehat{y})^2 \dfrac{\lambda}{2n}||w||^2 lossn1Σ(y−y )22nλ∣∣w∣∣2 在深度学习模型不断地迭代学习过程中 l o s s loss loss越来越小导致权重的范数也越来越小也就抑制了梯度爆炸。
2.4 Batch Normalization
Batch Normalization批标准化是基于Normalization归一化增加scaling和shifting的一种数据标准化处理方式其具体作用原理可以参考关于Batch Normalization的说明。
Batch Normalization能维持数值稳定性的基本原理与梯度裁剪类似都是对数值人为增加缩放维持数值保持在一个不大不小的合理范围内。两者的区别是梯度裁剪在反向传播过程中直接作用于损失函数对权重的偏导数而Batch Normalization在正向传播中对某层的输出进行标准化处理间接维持对权重偏导的稳定性。
这里需要指出的是由于输入 x x x也参与了偏导的计算如果 x x x是一个高维向量那对于输入 x x x的Batch Normalization处理也是必要的。
2.5 LSTMShort Cut
很多文章说明LSTM长短周期记忆网络有助于维持数值稳定性我最初看到这些文章时大为不解——因为我们是需要通用的方法来改进提高现有模型的数值稳定性而不是直接替换成LSTM网络模型况且LSTM也不是万能的深度学习模型不可能遇到梯度衰减或者梯度爆炸就把模型替换成LSTM。 如果不知道LSTM是什么可以看下LSTM长短期记忆网络的算法介绍及数学推导 后来我看到Lecture 15: Exploding and Vanishing Gradients明白了其中的误解这篇文章通篇都在用RNN为例来说明数值稳定性。对于RNN来说LSTM确实是一个改进的模型因为其内部维持“长期记忆”的“门”结构确实有助于提升数值稳定性。 我想大部分把LSTM单列出来说明可以提升数值稳定性的文章都误会了。 而Short Cut这种结构才是提升数值稳定性的普适规则LSTM仅是改善RNN的一个特例而已。 Short Cut的具体作用机理可以参考He Kaiming的原文Deep Residual Learning for Image Recognition