深度学习中的优化器之NovoGrad算法原理与二阶矩修正机制
题目描述:
NovoGrad是一种自适应优化算法,由Jasper Snoek等人于2019年提出。它在Adam的基础上进行了改进,主要特点是:1)采用更轻量化的方式估计梯度的一阶矩(动量)和二阶矩(自适应学习率系数);2)特别针对像Transformer这样的大规模模型,在训练稳定性和内存效率之间取得更好的平衡。许多实验表明,NovoGrad在训练大型模型时能够比Adam获得更快的收敛速度和更好的泛化性能。我们需要理解NovoGrad的核心原理、它与Adam的区别,以及其“二阶矩修正机制”的具体实现方式。
解题过程循序渐进讲解:
步骤1:理解优化问题的背景与挑战
在深度学习训练中,优化算法的目标是最小化损失函数L(θ)关于参数θ的值。标准的随机梯度下降(SGD)使用固定的学习率更新参数:θ_t = θ_{t-1} - η * g_t,其中g_t是当前批次的梯度。然而,固定学习率可能不适应所有参数的变化,尤其当梯度尺度在不同维度上差异巨大时。Adam通过为每个参数维护一个自适应学习率(基于梯度的一阶矩和二阶矩估计)来缓解此问题,但它需要存储每个参数的动量(一阶矩)和方差(二阶矩)两个状态,这在大模型中会消耗较多内存。此外,Adam中二阶矩估计的初始化偏差校正可能导致训练初期的不稳定。NovoGrad旨在解决这些问题。
步骤2:回顾Adam算法的核心步骤(作为对比基础)
为了更好地理解NovoGrad,我们先简要回顾Adam的更新规则:
- 计算当前梯度g_t。
- 更新一阶矩估计(动量):m_t = β1 * m_{t-1} + (1-β1) * g_t。
- 更新二阶矩估计(未中心化的方差):v_t = β2 * v_{t-1} + (1-β2) * (g_t)^2(逐元素平方)。
- 对一阶和二阶矩进行偏差校正:m̂_t = m_t / (1-β1^t),v̂_t = v_t / (1-β2^t)。
- 参数更新:θ_t = θ_{t-1} - η * m̂_t / (√v̂_t + ε)。
Adam通过除以√v̂_t来为每个参数尺度自适应调整学习率。但其二阶矩v_t是针对每个参数单独估计的,需要存储与参数同样大小的张量。
步骤3:NovoGrad的核心创新点——重新设计二阶矩估计
NovoGrad的关键思想是:将二阶矩估计从“每个参数维度”改为“每个层(layer-wise)甚至全局(global)的标量或向量”。具体来说:
- NovoGrad不再像Adam那样为每个参数维护一个完整的二阶矩张量v_t,而是为每个参数组(例如神经网络的一层)计算一个标量的梯度二阶矩(即梯度的L2范数的平方)。
- 这样,存储二阶矩所需的内存从O(n)降低到O(L),其中n是参数量,L是层数。对于拥有数百万甚至数十亿参数的大型模型,这能显著减少内存占用。
步骤4:NovoGrad的算法步骤详解
假设我们有一个参数组(例如神经网络的一层),其参数为θ,梯度为g_t。NovoGrad的更新过程如下:
-
计算层级二阶矩(自适应学习率系数):
v_t = β2 * v_{t-1} + (1-β2) * ||g_t||^2
这里||g_t||^2是当前梯度g_t的L2范数的平方(对整个参数组的梯度张量计算)。v_t是一个标量,而不是像Adam那样与g_t同形状的张量。 -
计算参数级一阶矩(动量):
m_t = β1 * m_{t-1} + (1-β1) * (g_t / √(v_t + ε))
注意:这里在计算动量之前,先将梯度g_t除以√(v_t + ε)进行缩放。这一步是NovoGrad与Adam的一个本质区别:在动量计算中引入了自适应归一化。这样,动量m_t直接吸收了自适应学习率的信息。 -
参数更新:
θ_t = θ_{t-1} - η_t * m_t
其中η_t是学习率,可能包含学习率调度(如热身warmup)。更新时不再需要额外除以二阶矩的平方根,因为已经在步骤2中隐含地处理了。
步骤5:深入分析“二阶矩修正机制”
所谓的“二阶矩修正机制”,实际上指的是NovoGrad如何利用重新设计的二阶矩来稳定和加速训练:
- 修正梯度尺度:通过使用层级的梯度范数√v_t来归一化梯度,NovoGrad确保了每个参数组的更新幅度相对一致。这可以防止某些层因梯度爆炸或消失而过快或过慢更新,提高了训练的稳定性。
- 减少噪声影响:由于v_t是基于整个参数组的梯度范数估计的,它比逐元素的二阶矩估计更鲁棒,受个别维度的梯度噪声影响更小。
- 内存与计算效率:标量v_t大大减少了状态存储开销。同时,计算||g_t||^2比计算逐元素平方(g_t)^2(如Adam)在实现上更高效,尽管计算量差异不大。
步骤6:NovoGrad与Adam的对比总结
- 二阶矩形式:Adam使用逐元素的二阶矩(每个参数一个值);NovoGrad使用层级的标量二阶矩(每层一个值)。
- 更新顺序:Adam先计算动量,再在更新时用二阶矩归一化;NovoGrad先用二阶矩归一化梯度,再计算动量。
- 内存占用:NovoGrad显著更低,尤其适合参数巨大的模型(如Transformer)。
- 偏差校正:NovoGrad论文中通常省略偏差校正(即不使用1/(1-β^t)),因为其层级二阶矩的初始化通常设为零,且实验显示不加校正也能稳定训练。这也是一个简化。
步骤7:NovoGrad的扩展与实际应用
- 可以进一步将二阶矩从“每层”扩展到“每个参数组”甚至“全局”(整个模型一个标量),但实践中每层设定通常效果较好。
- NovoGrad被广泛应用于训练大型Transformer模型(如BERT、GPT系列),因为它能在保持Adam自适应优点的同时,减少内存消耗并提高数值稳定性。
- 学习率调度(如线性warmup)通常与NovoGrad结合使用,以进一步稳定训练初期。
总结:NovoGrad通过将二阶矩估计从逐元素改为层级标量,实现了内存高效的梯度自适应归一化,并在动量计算中整合了归一化步骤,形成一种独特的“二阶矩修正”机制。这使得它在训练大型深度学习模型时,能更稳定、更快地收敛,成为现代大规模模型训练中的重要优化器选择之一。