思想上的共同基因
两者都使用一个带有'遗忘因子'的更新公式,也就是:
new_value = β * old_value + (1 - β) * something_new
β 在 0 到 1 之间,是'记忆长度'。β 越大,记忆越长,越平滑。
这个形式其实就是指数加权平均的通用形式,也就是 EMA 的本质。
这也是为什么很多人说'动量本质上就是在梯度上做指数加权'。这句话并没错,但它没有说明它们功能级别的差别。
关键分歧:它们的'意图'完全不同
可以用一句非常精炼的话区分它们:
动量是给参数更新添加物理意义上的'惯性'; EMA 是用指数衰减方式做'平滑',用于统计意义上的噪声抑制。
这就像一个是冲刺时前倾身体的惯性,一个是把噪声滤掉的平滑器。
动量优化(Momentum)侧重:加速下降,减少震荡
动量算法把梯度当成'力',把你正在优化的 θ 想象成物体。
公式(标准 SGD + Momentum):
v_t = β * v_{t-1} + (1 - β) * ∇L(θ_t)
θ_t = θ_t - α * v_t
你可以把 v_t 理解为'速度',它累积了之前的下降方向,使下降更稳定:
- 在狭长的峡谷(如鞍点附近)——减少左右摇摆。
- 在下降方向一致的区域——让你越滚越快,加速收敛。
动量关心的是'方向与速度'。
EMA(指数加权平均)侧重:平滑、去噪
EMA 通常用于统计、监控、推理阶段,而不是用于改变下降方向。
最常见的场景:
- 平滑训练曲线 比如把 loss 曲线画得不那么尖锐。
- 模型参数 EMA(如 YOLO、Transformers 中常用) 让推理用到的是'平均过的权重',比瞬时梯度噪声更稳定。
- 估计梯度的一阶/二阶统计特征(如 Adam)
Adam 里的
m_t和v_t都是 EMA。
公式结构类似:
S_t = β * S_{t-1} + (1 - β) * x_t
但它不会直接改变参数更新方向,而是作为'估计器'或'平滑器'。
EMA 关心的是'信号质量'。
最直观的对比表(无术语版)
| 项目 | 动量优化(Momentum) | 指数加权平均(EMA) |
|---|---|---|
| 用途 | 加速优化、减少梯度震荡 | 平滑数据、获得更稳的估计 |
| 操作的对象 | 梯度 + 参数更新方向 | 任意数据:损失、梯度、权重、统计量 |
| 更新结果会改变参数吗? | 会,直接影响下降 | 不一定,通常不会直接影响下降 |
| 数学形式 | EMA 形式,但用于'速度' | 纯 EMA,用于平滑 |
| β 的意义 | 控制惯性大小 | 控制记忆长度和平滑程度 |
| 类比 |

