让训练更加稳定
目标:让梯度值在合理的范围内,比如 [1×10−6,1×103]
- 常用方法:
- 将乘法变成加法(ResNet、LSTM)
- 归一化(梯度归一化、梯度裁剪)
- 合理的权重初始和激活函数
让每层的方差是一个常数
将每层的输出和梯度都看作随机变量,让它们的均值和方差都保持一致
正向:
E[hit]=0Var[hit]=a∀i,t
反向:
E[∂hit∂ℓ]=0Var[∂hit∂ℓ]=b∀i,t
权重初始化
在合理值区间范围里随机初始化参数
- 训练开始时更容易有数值不稳定
- 远离最优解的地方损失函数表面可能很复杂
- 最优解附近表面会比较平
使用 N(0,0.01) 来初始可能对小网络没问题,但不能保证深度神经网络
以 MLP 为例
假设 wi,jt 是独立同分布,那么 E[wi,jt]=0,Var[wi,jt]=γt
假设 wi,jt 独立于 hjt−1
假设没有激活函数 ht=Wtht−1 ,这里 Wt∈Rnt×nt−1
E[hit]=E[j∑wi,jthjt−1]=j∑E[wi,jt]E[hjt−1]=0
正向方差
Var[hit]=E[(hit)2]−E[hit]2=E⎣⎡(j∑wi,jthjt−1)2⎦⎤=E⎣⎡j∑(wi,jt)2(hjt−1)2+j=k∑wi,jtwi,kthjt−1hkt−1⎦⎤=j∑E[(wi,jt)2]E[(hjt−1)2]=j∑Var[wi,jt]Var[hjt−1]=nt−1γtVar[hjt−1]
需要 nt−1γt=1
反向均值和方差
∂ht−1∂ℓ=∂ht∂ℓWt→(∂ht−1∂ℓ)T=(Wt)T(∂ht∂ℓ)T
E[∂hit−1∂ℓ]=0
Var[∂hit−1∂ℓ]=ntγtVar[∂hjt∂ℓ]
需要 ntγt=1
Xavier 初始化
难以同时满足 nt−1γt=1 和 ntγt=1
Xavier 使得 γt(nt−1+nt)/2=1→γt=2/(nt−1+nt)
正态分布 N(0,2/(nt−1+nt))
均匀分布 U(−6/(nt−1+nt),6/(nt−1+nt))
适配权重形状变换,特别是 nt
激活函数
为了方便分析假设线性的激活函数 σ(x)=αx+β
h′=Wtht−1 and ht=σ(h′)
E[hit]=E[αhi′+β]=β→β=0
Var[hit]=E[(hit)2]−E[hit]2=E[(αhi′+β)2]−β2=E[α2(hi′)2+2αβhi′+β2]−β2=α2Var[hi′]→α=1
检查常用激活函数
使用泰勒展开:
sigmoid(x)tanh(x)relu(x)=21+4x−48x3+O(x5)=0+x−3x3+O(x5)=0+x for x≥0
调整 sigmoid 为 4×sigmoid(x)−2
总结
- 合理的权重初始值和激活函数的选取可以提升数值稳定性