前言
按照时间上的迭代顺序,近些年神经网络先后出现了 Gradient Descent (GD)、Momentum、Adaptive Gradient (AdaGrad)、Root Mean Square prop (RMSprop)、Adaptive Moment estimation (Adam) 等优秀的优化器。到如今,大部分 NLP 预训练模型已不再使用这些方法,而是使用 Adam Weight Decay Regularization (AdamW) 和去年首度亮相的 Layer-wise Adaptive Moments optimizer for Batching training (LAMB)。为何最为传统的 GD,包括衍生的 stochastic GD、mini-batch GD 优化器已不再使用,下文会有详细的介绍。
Gradient Descent (GD)
梯度下降法是最为经典的凸优化优化器,思想也非常明确:通过 loss 反向传导计算参数的梯度,参数往哪个方向跑可以让 loss 下降,就让参数往哪个方向更新:
Δ W k = ∂ l o s s ∂ W k = ∂ l o s s ∂ Z n ∂ Z n ∂ Z n − 1 . . . ∂ Z k + 1 ∂ W k \Delta W_k=\frac{\partial loss}{\partial W_k}=\frac{\partial loss}{\partial Z_n}\frac{\partial Z_n}{\partial Z_{n-1}}...\frac{\partial Z_{k+1}}{\partial W_k} ΔWk=∂Wk∂loss=∂Zn∂loss∂Zn−1∂Zn...∂Wk∂Zk+1
W k ← W k − α Δ W k W_k\leftarrow W_k-\alpha \Delta W_k Wk←Wk−αΔWk
需要注意的是, W k W_k Wk 中的每一个浮点元素的梯度计算和梯度更新,相互之间是完全独立的,这对于理解梯度更新的机理非常重要。上式中, α \alpha α 为学习率,通常是一个固定的超参数,学习率越高,收敛越快。但需要注意控制范围。学习率过大,容易造成梯度跨过参数的局部最优点造成参数震荡;学习率过小,会导致训练过程过于漫长。为避免参数震荡,使用 GD 时,学习率通常设置在一个较低值,且训练的 batch_size 越大,学习率越低。梯度裁剪虽能一定程度上解决梯度震荡的问题,但由于输出的概率分布发生偏移,模型收敛也受到一定负面影响,因此需尽可能避免对梯度裁剪的依赖。
Adaptive Moment estimation (Adam)
为解决 GD 中固定学习率带来的不同参数间收敛速度不一致的弊端,AdaGrad 和 RMSprop 诞生出来,为每个参数赋予独立的学习率。计算梯度后,梯度较大的参数获得的学习率较低,反之亦然。此外,为避免每次梯度更新时都独立计算梯度,导致梯度方向持续变化,Momentum 将上一轮梯度值加入到当前梯度的计算中,通过某种权重对两者加权求和,获得当前批次参数更新的更新值。 Adam 结合了这两项考虑,既为每一个浮点参数自适应性地设置学习率,又将过去的梯度历史纳入考量:
m t = β 1 m t − 1 + ( 1 − β 1 ) Δ W m_t=\beta_1m_{t-1}+(1-\beta_1)\Delta W mt=β1mt−1+(1−β1)ΔW
v t = β 2 v t − 1 + ( 1 − β 2 ) Δ W 2 v_t=\beta_2v_{t-1}+(1-\beta_2)\Delta W^2 vt=β2vt−1+