神经网络中warmup策略

训练模型常规策略是初始使用较大的学习率,随着训练的逐渐进行学习率衰减(learning rate decay)。而wramup则是刚开始使用较小的学习率,然后增大到设定的学习率,最后又随着训练的进行慢慢减小学习率。这个类似我们跑步的速度一样,先提高速度,快到终点又降低速度。

常见的warmup方式有constant(先用较小学习率,训练误差达到一定值时再调整为指定值)、linear(学习率从一个小的值线性增大到指定值)、exponent(指数增长到指定值),如下图。

神经网络中warmup策略_第1张图片

Transformer中的warmup将学习率看作是迭代次数t的函数:学习率 LR会以某种方式递减,学习率从0开始增长,经过 Twarmup 次迭代达到最大。

5419f291b1024b16b53630bd0f255627.png

学习率衰减的方法有分段常数衰减、反时限衰减、多项式衰减、指数衰减、自然指数衰减、余弦衰减、线性余弦衰减等。

warmup主要解决的问题或者说是作用:

  1. 有助于减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳
  2. 有助于保持模型深度的稳定性

 

神经网络中warmup策略_第2张图片

 由小变大:由于刚开始训练的时候,模型的权重是随机初始化的,模型对数据的分布理解为零,或者是说均匀分布(初始化一般都是以均匀分布来初始化),此时如果选择一个较大的学习率,可能带来模型的不稳定(震荡),很有可能在刚刚开始就会导致过拟合,后期需要要通过多轮训练才能拉回来。选择预热学习率的方式,可以使得开始训练的几个epoch或者一些step内学习率较小,在预热的小学习率下,模型可以慢慢的趋于稳定,或者说对当前的batch而言有了一些正确的先验,较大的学习率就不那么容易会使模型学偏,所以可以适当调大学习率。等模型相对稳定后再去选择预先设定的学习率进行训练,使得模型收敛的速度变得更快,模型的效果更好。

由大变小: 我们正常训练时候,学习率降低有助于更好的收敛,当模型学习到一定的程度,模型的分布就学习的比较稳定了。如果还用较大的学习率,就会破坏这种稳定性,导致网络波动比较大,现在已经十分接近了最优了,为了靠近这个最优点,就要用很小的学习率了。

改进:论文On Layer Normalization in the Transformer Architecture中对Transformer中的warmup进行深入分析:原始 Transformer 结构的每一层中分别经过了带残差连接的 Multi-Head Attention 和 FFN 两个子层,在两子层之后分别放置了层归一化(Layer Normalization)层,这样的结构称作 Post-LN Transformer。如果将Layer Normalization放到残差连接中的两个子层之前,并且在整个网络最后输出之前也增加一个 Layer Normalization 层来对梯度进行归一化,称这样的结构为 Pre-LN Transformer,两种结构如下。

神经网络中warmup策略_第3张图片

当对Post-LN Transformer进行初始化后,通过对各隐层梯度值进行分析可以证明,在初始化点附近的Post-LN Transformer结构最后一层的梯度值非常大,同时随着反向传播的前传会导致梯度值迅速衰减。这种在各层之间不稳定的梯度分布必然会影响优化器的收敛效果,导致训练过程初始阶段的不稳定。造成Post-LN Transformer梯度分布出现问题的核心原因在于各子层之后的Layer Normalization层会使得各层的输入尺度与层数L无关,因此当Layer Normalization对梯度进行归一化时,也与层数 L 无关。 

 使用相同的方法对Pre-LN Transformer结构进行分析后,发现最后一层Layer Normalization层的输入尺寸的量级只有Post-LN的根号(1/L)倍,并且每个LN层都会对梯度以根号L的比例归一化。所以对于Pre-LN结构来说,其每层梯度范数都近似不变。

所以当使用Pre-LN结构时,warm-up阶段已经不再是必需,并且Pre-LN结构可以大幅提升 Transformer的收敛速度。

 

 

你可能感兴趣的:(神经网络,transformer,深度学习)