视觉算法工程师面经3:一文看懂 EMA(指数移动平均)的核心原理

在深度学习的源码和论文中,我们经常会遇到一个词——EMA(Exponential Moving Average,指数移动平均)。无论是 Adam 优化器、BatchNorm 层的统计量更新,还是自监督学习(如 MoCo)中的动量编码器,以及模型权重平滑(Model EMA),它的身影无处不在。

本文将避开复杂的数学推导,用最直观的方式为你拆解 EMA 的底层逻辑、数学原理以及它在深度学习中备受青睐的核心优势。


一、 什么是 EMA?

EMA 最初在统计学和金融学中被用来平滑时间序列数据(比如股票价格的波动)。在深度学习中,它是一种极其常用的**“平滑更新策略”**。

一句话概括它的核心思想:计算平均值时,越新的数据权重越大,越老的数据权重呈“指数级”衰减,且永远保留一小部分历史记忆。

它的核心更新公式非常简洁:
vt=βvt−1+(1−β)θtv_t=\beta v_{t-1}+(1-\beta)\theta_tvt=βvt1+(1β)θt

  • vtv_tvt:当前时刻更新后的平滑值(比如最新的模型权重、特征等)。
  • vt−1v_{t-1}vt1:上一时刻的旧平滑值(历史累积状态)。
  • θt\theta_tθt:当前时刻刚刚计算出的新观测值(比如当前 Batch 算出的特征或梯度)。
  • β\betaβ:衰减率(Momentum 或 Decay rate),通常是一个接近 111 的常数,例如 0.90.90.90.990.990.990.9990.9990.999

二、 为什么叫“指数(Exponential)”?

为了理解这个名字的由来,我们可以把公式在时间维度上层层展开。

假设当前的时刻是 ttt
vt=βvt−1+(1−β)θtv_t=\beta v_{t-1}+(1-\beta)\theta_tvt=βvt1+(1β)θt

如果我们把前一时刻的 vt−1v_{t-1}vt1 也用同样的公式代入展开,会得到:
vt=(1−β)θt+β[(1−β)θt−1+βvt−2]v_t=(1-\beta)\theta_t+\beta[(1-\beta)\theta_{t-1}+\beta v_{t-2}]vt=(1β)θt+β[(1β)θt1+βvt2]

继续不断往下展开,最终可以得到:
vt=(1−β)[θt+βθt−1+β2θt−2+β3θt−3+… ]v_t=(1-\beta)[\theta_t+\beta\theta_{t-1}+\beta^2\theta_{t-2}+\beta^3\theta_{t-3}+\dots]vt=(1β)[θt+βθt1+β2θt2+β3θt3+]

看这里的 β\betaββ2\beta^2β2β3\beta^3β3……(假设 β=0.9\beta=0.9β=0.9 ,那么它们就是 0.90.90.90.810.810.810.7290.7290.729……):

  1. 当前最新的观测值 θt\theta_tθt 权重最大。
  2. 上一轮的观测值 θt−1\theta_{t-1}θt1 权重衰减了 β\betaβ 倍。
  3. 上上轮的观测值 θt−2\theta_{t-2}θt2 权重衰减了 β2\beta^2β2 倍。

越久远的历史数据,其权重以“指数形式”迅速衰减,这就是“指数移动平均”名字的由来。


三、 EMA 在深度学习中的三大核心优势

相比于直接把所有样本加起来算“简单平均(Simple Average)”,EMA 有着不可替代的工程与算法优势:

1. 天然的抗噪能力(极其平滑)

在深度学习训练中,单个 Batch 的数据往往带有极大的随机性或噪声,直接使用当前 Batch 算出的参数会导致模型剧烈震荡。
而在 EMA 机制下(假设 β=0.9\beta=0.9β=0.9),新观测值的权重只有 1−β=0.11-\beta=0.11β=0.1。这意味着任何单次极端的异常数据,都无法瞬间推翻历史累积下来的高质量状态,起到了极好的“低通滤波”和缓冲作用。

2. 免存储,极低的显存开销

如果要算严谨的普通平均数,你需要把过去所有的特征或梯度 θ1,θ2…θn\theta_1, \theta_2 \dots \theta_nθ1,θ2θn 都存到显存里,最后除以 nnn。这在参数量动辄上亿的深度学习中是不可能的。
而 EMA 只需要在显存中保存上一时刻的状态 vt−1v_{t-1}vt1。每次进来一个新的 θt\theta_tθt,算完直接覆盖旧值,空间复杂度仅为 O(1)O(1)O(1),极其优雅。

3. 自动遗忘过时信息(自适应更新)

在网络训练的初期,模型提取的特征往往质量很差。如果用普通平均,初期的“垃圾特征”会一直拉低整体平均水平。
而 EMA 机制下,随着时间的推移,早期质量差的特征权重会指数级衰减趋近于 000。状态变量会自动“滚动更新”为网络最新、最佳状态下的信息。


四、 形象类比:熬一锅百年老汤

如果你觉得公式还是有些抽象,不妨把 EMA 想象成饭店里熬“百年老汤”的过程:

  • vt−1v_{t-1}vt1 就是昨天这锅老汤的味道。
  • β=0.9\beta=0.9β=0.9 意味着你每天倒掉一点,只保留锅里 90%90\%90% 的原汤。
  • 1−β=0.11-\beta=0.11β=0.1 意味着你每天往锅里加入 10%10\%10% 的新水和新料(θt\theta_tθt)。

这锅汤今天喝起来,味道是由“今天的新料”和“过去的底蕴”共同决定的。昨天的料影响很大,前天的料影响稍微小点,十天前的料影响已经微乎其微了,但它依然构成了老汤整体的风味。

β=0.9\beta=0.9β=0.9 时,这锅汤等效的“记忆窗口”大约是 11−β=10\frac{1}{1-\beta}=101β1=10 天。通过调节 β\betaβ,你就可以精准控制这锅汤是“更重底蕴”(β\betaβ 趋近于 111)还是“更重尝鲜”(β\betaβ 较小)。


总结:
EMA 是一种兼顾了“历史状态平滑”与“极低内存开销”的统计算法。掌握了它的运行机制,在阅读涉及到特征库更新、动量对比学习等方向的前沿顶会论文时,就能瞬间看懂其背后的设计哲学。

更多推荐