1. 前向传播与反向传播
参考:https://medium.com/usf-msds/deep-learning-best-practices-1-weight-initialization-14e5c0295b94
https://www.cnblogs.com/shine-lee/p/11809979.html
https://www.cnblogs.com/shiyublog/p/10542682.html
所以,激活函数的偏导、权重矩阵、当前层的输入(前一层的输出),这些项的取值均会对偏导数产生影响,偏导数为这些因子项共同作用的结果,特别地:
2. 梯度消失与梯度爆炸的原理
梯度为偏导数构成的向量。
损失函数收敛至极小值时,梯度为0(接近0),损失函数不再下降。我们不希望在抵达极小值前,梯度就为0了,也不希望下降过程过于震荡,甚至不收敛。梯度消失与梯度爆炸分别对应这2种现象,
-
梯度消失(vanishing gradients):指的是在训练过程中,梯度(偏导)过早接近于0的现象,导致(部分)参数一直不再更新,整体上表现得像损失函数收敛了,实际上网络尚未得到充分的训练。
-
梯度爆炸(exploding gradients):指的是在训练过程中,梯度(偏导)过大甚至为NAN(not a number)的现象,导致损失剧烈震荡,甚至发散(divergence)。
由上一节的分析可知,在梯度(偏导)计算中,主要的影响因素来自激活函数的偏导、当前层的输入(前一层的输出)、以及权重的数值等,这些因子连续相乘,带来的影响是指数级的。训练阶段,权重在不断调整,每一层的输入输出也在不断变化,梯度消失和梯度爆炸可能发生在训练的一开始、也可能发生在训练的过程中。
因子项中当前层的输入仅出现一次,下面着重看一下激活函数和权重的影响。
2.1 激活函数的影响
2.2 权重矩阵的影响
2.3 不良初始化
至此,一些权重不良初始化导致的问题就不难解释了,
-
过小,导致梯度消失
-
过大,导致梯度爆炸
-
全常数初始化,即所有权重WW都相同,则z(2)=W1xz(2)=W1x相同,导致后面每一层的输入和输出均相同,即aa和zz相同,回到反向传播的公式,每层的偏导相同,进一步导致每层的权重会向相同的方向同步更新,如果学习率只有一个,则每层更新后的权重仍然相同,每层的效果等价于一个神经元,这无疑极大限制了网络的能力。
-
特别地,全0初始化,根据上式,如果激活函数g(0)=0g(0)=0,如ReLU,则初始状态所有激活函数的输入zz和输出aa都为0,反向传播时所有的梯度为0,权重不会更新,一直保持为0;如果激活函数g(0)≠0g(0)≠0,则初始状态激活层的输入为0,但输出a≠0a≠0,则权重会从最后一层开始逐层向前更新,改变全0的状态,但是每层权重的更新方向仍相同,同上。
3. 权重初始化方法
参考:https://www.cnblogs.com/shine-lee/p/11908610.html
Keras 各层权重随机初始值的方法:https://keras.io/zh/initializers/
3.1 Xavier Initialization
- Xavier Glorot & Yoshua Bengio: http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
- 适用条件:使用关于0的对称并且值域是(-1,1)的激活函数
- Xavier初始化将一个层的权值设置为从随机均匀分布中取值,这个分布是有界的
- nᵢ是输入该层的网络连接的数量(fan-in),nᵢ+₁是从该层输出的网络连接的数量(fan-out)
- Xavier初始化能够维持激活的方差和反向传播的梯度
- 在他们的实验中,Xavier初始化使5层网络在各层之间保持几乎相同的参数梯度,相反,使用正态分布初始化会导致某些层的梯度趋于0
- 为了进一步阐明这一点,作者还演示了使用Xavier初始化的网络在CIFAR-10图像分类任务中取得了更快的收敛速度和更高的精度
3.2 Kaiming Initialization
当使用关于0的对称并且值域是(-1,1)的激活函数式时,我们希望每层的激活输出均值为0,平均标准差为1左右,这是我们自己的方法和Xavier都能做到的,但如果使用的是ReLU激活函数呢? 以同样的方式缩放初始权重值是否有效?
- Kaiming He et:propose their own initialization scheme
- 该方案专为使用这类非对称、非线性激活的激活函数网络而设计
- 在2015年的论文中证明,如果采用以下输入权值初始化策略,深度网络(例如22层的CNN)会更早地收敛:
- 用从标准正态分布创建一个张量;
- 将每个随机选择的数乘以√2/√n,其中n为fan-in ;
- Bias矩阵为0