NovoGrad:使用层级自适应二阶矩进行梯度归一化.

作者提出了NovoGrad,一种大批量训练时的自适应随机梯度下降方法。该方法的特点是逐层梯度归一化和解耦权重衰减,对学习率和初始化权重的选择具有鲁棒性,且内存占用量只有Adam的一半。

1. Adam算法的缺点

Adam在更新过程中累积低阶矩(忽略偏差修正):

\[m_t = \beta_1 \cdot m_{t-1} + (1-\beta_1) \cdot g_t \\ v_t = \beta_2 \cdot v_{t-1} + (1-\beta_2) \cdot g_t^2 \\ \theta_t = \theta_{t-1} - \alpha \cdot \frac{m_t}{\sqrt{v_t}+\epsilon}\]

在实践中,二阶矩的累积可能会消失或爆炸,尤其是在训练的初始阶段。此外,Adam的训练准确性通常低于动量SGD算法。

作者将Adam中二阶矩的计算替换为逐层计算,并使用经过二阶矩归一化的梯度来计算一阶矩,从归一化梯度中解耦权重衰减因子,从而提出了NovoGrad算法。

2. NovoGrad

NovoGrad对网络的每一层分别计算二阶矩:

\[v_t^l = \beta_2 \cdot v_{t-1}^l + (1-\beta_2) \cdot ||g_t^l||^2\]

使用上述二阶矩进行梯度归一化,计算一阶矩:

\[m_t^l = \beta_1 \cdot m_{t-1}^l + \frac{g_t^l}{\sqrt{v_t^l}+\epsilon}\]

进一步将权重衰减增加到一阶矩的计算中:

\[m_t^l = \beta_1 \cdot m_{t-1}^l + (\frac{g_t^l}{\sqrt{v_t^l}+\epsilon}+\lambda w_t^l)\]

参数更新公式如下:

\[w_{t+1} = w_t-\eta m_t\]

使用下列初始化消除偏差:

\[v_1^l=||g_1^l||^2, m_1^l=\frac{g_1^l}{\sqrt{v_1^l}}+\lambda w_1^l\]

NovoGrad在一阶矩的计算中使用梯度归一化,而不是在权值更新中对步长归一化,以提高算法对非常大的梯度“异常值”的鲁棒性。

3. 实验分析

作者训练了四种模型:ResNet-50用于图像分类,Transformer-big用于机器翻译,Jasper用于语音识别,Transformer-XL用于语言模型。

实验结果表明,NovoGrad的表现与Adam类似,但只需要大约一半的内存。