⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议。
Skip to content

2.2 动量与自适应优化器 ​

核心问题: 如何利用历史梯度调整更新方向和每个参数的步长?

在线 Notebook

对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明。


Momentum ​

Momentum 对历史梯度做指数加权:

vt=βvt−1+(1−β)gt,θt+1=θt−ηvt

它可以平滑小批量梯度噪声,并在方向持续一致时累积更新。β 越大,历史影响越长,但对方向变化的响应也越慢。

RMSprop ​

RMSprop 维护平方梯度的移动平均:

st=ρst−1+(1−ρ)gt2θt+1=θt−ηgtst+ϵ

平方和开方均按元素计算。近期梯度尺度较大的参数会得到较小的有效步长。

Adam 与 AdamW ​

Adam 同时估计一阶矩和二阶矩:

mt=β1mt−1+(1−β1)gtvt=β2vt−1+(1−β2)gt2

初始化为零会让早期估计偏小,因此使用偏差修正:

m^t=mt1−β1t,v^t=vt1−β2tθt+1=θt−ηm^tv^t+ϵ

AdamW 将权重衰减作为独立更新项,而不是把 L2 项直接混入自适应梯度。它是 Transformer 训练中的常见起点,但学习率、权重衰减、β 和调度仍需验证。

选择依据 ​

方法使用历史方向按参数调整尺度额外状态
SGD否否无
Momentum是否1 份
RMSprop否是1 份
Adam / AdamW是是2 份

自适应优化器增加优化器状态显存,也不保证所有任务上泛化更好。比较时应固定数据、初始化、训练预算和调度策略。


代码实验 ​

LMS vs Adam

图2.2:LMS 与 Adam 在一个参数估计任务上的收敛和误差。

代码文件: code/ch02_optimization/lms_vs_adam.py

bash
python code/ch02_optimization/lms_vs_adam.py

至少比较两组学习率,并同时记录最终测试误差。若 Adam 更快下降,也要检查是否使用了相同更新次数和停止条件。


本节小结 ​

  • Momentum 平滑并累积历史方向;RMSprop 按近期梯度尺度调整步长。
  • Adam 组合一阶矩与二阶矩,AdamW 另行处理权重衰减。
  • 优化器是实验变量,不应仅凭默认参数或训练损失选定。

下一节: 2.3 优化器与模型的分工

本教程采用 CC BY-NC-SA 4.0 许可协议