
既然我们已经聊过了RMSprop那么理解AdamAdaptive Moment Estimation自适应矩估计就顺理成章了。如果说深度学习优化器里有一个“统治级”的明星那绝对非 Adam 莫属。自 Diederik Kingma 和 Jimmy Ba 在 2014 年提出以来它几乎成为了无数深度学习工程师和研究员日常训练模型的默认首选优化器。简单来说Adam Momentum动量 RMSprop自适应步长。它同时继承了这两者的核心优势。一、 为什么要结合 Momentum 和 RMSprop在训练复杂的深度学习网络尤其是带有鞍点或高维极值点时优化器通常面临两个大敌震荡与迟缓在陡峭的方向上疯狂震荡在平坦的方向上推进缓慢。山谷与局部极值在遇到平坦的“鞍点”或者微小的“局部起伏”时优化器容易失去动力停滞不前。为了解决这两个问题Momentum动量引入了“惯性”给梯度加了一个一阶动量。这让它能够冲过平坦的鞍点并在方向一致时加速前进。RMSprop引入了“自适应缩放”通过梯度的二阶动量平方移动平均来压制剧烈震荡的方向放大平缓推进的方向。Adam 的核心思想就是把这两种机制合二为一既要“惯性”冲坡又要“自适应”微调步长。二、 Adam 的数学原理四步拆解假设在第ttt步参数为θ\thetaθ当前计算出的梯度为gtg_tgt。Adam 的更新过程非常严密分为以下四步1. 计算一阶动量Momentum 部分mtβ1⋅mt−1(1−β1)⋅gtm_t \beta_1 \cdot m_{t-1} (1 - \beta_1) \cdot g_tmtβ1⋅mt−1(1−β1)⋅gtmtm_tmt是梯度的指数移动平均期望值值。它模拟了物体的惯性通常β1\beta_1β1设为0.9。2. 计算二阶动量RMSprop 部分vtβ2⋅vt−1(1−β2)⋅gt2v_t \beta_2 \cdot v_{t-1} (1 - \beta_2) \cdot g_t^2vtβ2⋅vt−1(1−β2)⋅gt2vtv_tvt是梯度平方的指数移动平均未中心化的方差。它用于调节步长通常β2\beta_2β2设为0.999。3. 偏差修正Bias CorrectionAdam 的独特精妙之处在训练刚开始时ttt较小m0m_0m0和v0v_0v0通常初始化为 0。这会导致初始阶段的mtm_tmt和vtv_tvt严重偏向 0被低估。为了消除这个初始化带来的偏差Adam 对它们进行了修正m^tmt1−β1t\hat{m}_t \frac{m_t}{1 - \beta_1^t}m^t1−β1tmtv^tvt1−β2t\hat{v}_t \frac{v_t}{1 - \beta_2^t}v^t1−β2tvt随着迭代步数ttt的增大β1t\beta_1^tβ1t和β2t\beta_2^tβ2t会迅速趋近于 0分母趋近于 1修正系数失去作用。但在前几步这个修正能保证更新步长不会因为初始化为 0 而溃缩。4. 参数更新θt1θt−ηv^tϵ⋅m^t\theta_{t1} \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} \epsilon} \cdot \hat{m}_tθt1θt−v^tϵη⋅m^t这里不再像传统算法那样直接乘梯度gtg_tgt而是乘引入了惯性的m^t\hat{m}_tm^t同时分母依然用v^t\sqrt{\hat{v}_t}v^t来做各维度的步长自适应缩放。三、 为什么 Adam 这么受欢迎从优化路径的对比中可以看出相比于其他算法Adam 展现出了极其优秀的综合素质调参友好Robust to Hyperparameters经典的超参数设置β10.9,β20.999,η0.001\beta_10.9, \beta_20.999, \eta0.001β10.9,β20.999,η0.001在绝大多数各类模型从 CNN、RNN 到 Transformer中都能跑出相当不错的结果极大地节省了炼丹师的调参时间。高效省内存计算基于一阶和二阶矩时空复杂度都是O(1)O(1)O(1)。非常适合稀疏梯度或大规模数据自适应步长的特性使得它在处理稀疏特征如 NLP 中的 Embedding时表现极其强悍。四、 PyTorch 核心源码逻辑演练在 PyTorch 的底层实现中Adam 的更新逻辑依然严格遵循上述公式。我们可以用如下简化版的 Python 代码来理解其内核importtorchdefadam_update(parameters,gradients,m_list,v_list,t,lr0.001,beta10.9,beta20.999,eps1e-8): m_list: 历史一阶动量列表 v_list: 历史二阶动量列表 t: 当前的迭代步数 (从 1 开始) forparam,grad,m,vinzip(parameters,gradients,m_list,v_list):# 1. 更新一阶动量 m beta1 * m (1 - beta1) * gradm.mul_(beta1).add_(grad,alpha1-beta1)# 2. 更新二阶动量 v beta2 * v (1 - beta2) * grad^2v.mul_(beta2).addcmul_(grad,grad,value1-beta2)# 3. 计算偏差修正的系数bias_correction11-beta1**t bias_correction21-beta2**t# 4. 计算修正后的步长分母step_sizelr/bias_correction1 denom(v.sqrt()/(bias_correction2**0.5())).add_(eps)# 5. 参数更新 param param - (step_size / denom) * mparam.addcdiv_(m,denom,value-step_size)五、 Adam 的完美终点吗衍生与避坑虽然 Adam 很强但它并不是完美的。在实际工程和研究中你可能会经常听到它的变体AdamW权重衰减修正在处理L2L_2L2正则化Weight Decay时原版 Adam 错把正则项的梯度也一起带入了二阶矩vtv_tvt的计算中导致正则化的效果大打折扣。AdamW将 Weight Decay 隔离出来直接作用于参数更新步骤。如今在训练 Transformer如 BERT、GPT 等 LLM时AdamW 是绝对的统治级优化器。泛化性问题SGDM 的反扑有研究表明在某些纯计算机视觉CV任务如 ResNet 图像分类中配合了良好学习率策略的SGD with Momentum (SGDM)最终收敛的泛化极限往往比 Adam 更好。通常的直觉快速验证、NLP/Transformer 任务优先选AdamW追求 CV 模型的极致精度上限可以尝试SGDM。