一句话定义:Adam (Adaptive Moment Estimation) 优化器是一种在随机梯度下降 (Stochastic Gradient Descent, SGD) 基础上,用梯度的一阶矩 (first moment) 和二阶矩 (second moment) 的指数移动平均 (exponential moving average, EMA),为每个参数单独调整学习率的优化方法。
它到底在算什么
训练模型时,每个参数都会收到一个梯度,告诉它“往哪调、调多少”。Adam 给每个参数记两本账:
- 一阶矩 \(m\):梯度的 EMA,类似“最近往哪个方向走得多”,相当于动量。
- 二阶矩 \(v\):梯度平方的 EMA,类似“最近梯度的波动/能量有多大”。
更新时大致是:
\[
\theta \leftarrow \theta - lr \cdot \frac{\hat m}{\sqrt{\hat v}+\epsilon}
\]
直观理解:如果某个参数的梯度长期稳定地指向同一方向,\(m\) 大,\(\sqrt{v}\) 也大,步长接近 \(lr\);如果梯度来回震荡,\(m\) 被抵消变小,而 \(v\) 仍然大,步长就被压小。也就是说,Adam 会根据每个参数自己的“历史信噪比”自动踩油门或踩刹车。
生活化比方:一百个人同时调一百个水龙头。SGD 像所有人用同一个转动幅度;Adam 则让每个水龙头看自己最近的水流趋势和波动——水流稳定就大胆转,忽冷忽热就轻轻转。
偏差修正修什么
Adam 从 \(m_0=0\)、\(v_0=0\) 开始。如果直接拿初期移动平均去更新,它们会被这个“0 起点”拖低。比如常见默认 \(\beta_1=0.9\)、\(\beta_2=0.999\),第一次 \(m_1=0.1g_1\),\(v_1=0.001g_1^2\),一阶和二阶都被低估,但低估幅度不同,直接相除会让步长尺度异常。
偏差修正 (bias correction) 就是除以 \(1-\beta_1^t\) 和 \(1-\beta_2^t\),把初期估计拉回接近真实一阶矩、二阶矩。它修的是“从零启动造成的偏差”,不是改梯度本身。随着步数 \(t\) 变大,修正项趋近 1,影响自然消失。
和相邻概念的区别
| 方法 | 看什么历史 | 学习率特点 |
|---|---|---|
| SGD 动量 | 一阶矩 | 全局学习率,加惯性 |
| RMSProp | 二阶矩 | 按梯度波动缩放 |
| AdaGrad | 累积平方梯度 | 学习率单调变小 |
| Adam | 一阶矩 + 二阶矩 | 每个参数自适应,且用 EMA 忘记太久远的历史 |
对从业者,Adam 常被当作省心默认项,适合稀疏梯度、参数尺度差异大、快速实验等场景;若关心权重衰减 (weight decay),要注意 AdamW 这类解耦实现。对普通人,可以把它理解成:不是所有旋钮都用同一个力度拧,而是每个旋钮根据自己的历史自动决定力度。不同框架的默认超参可能略有差异,具体以官方页面为准。
