指数移动平均(EMA)是一种加权平均方法,用于计算一组时间序列数据的平滑平均值。它在计算平均值时,对近期数据赋予更高的权重,而对较早的数据赋予较低的权重。相对于简单平均值,EMA 更敏感于最新的数据变化。
假设我们有一个时间序列数据 x 1 , x 2 , … , x t x_1, x_2, \dots, x_t x1,x2,…,xt,其指数移动平均(EMA)可以递归地计算为: E M A t = α ⋅ x t + ( 1 − α ) ⋅ E M A t − 1 , EMA_t = \alpha \cdot x_t + (1 - \alpha) \cdot EMA_{t-1}, EMAt=α⋅xt+(1−α)⋅EMAt−1, 其中, E M A t EMA_t EMAt 为时间 t t t 的指数移动平均值, x t x_t xt 是时间 t t t 的实际数据值, E M A t − 1 EMA_{t-1} EMAt−1 是时间 t − 1 t-1 t−1 的指数移动平均值。 α \alpha α 是平滑因子超参数,通常 α ∈ ( 0 , 1 ) \alpha \in (0, 1) α∈(0,1),来控制新数据与历史数据的权重分配, α \alpha α 越大,EMA 对近期数据变化越敏感, α \alpha α 越小,EMA 趋于更加平滑,更依赖历史数据。常用公式计算 α \alpha α: α = 2 N + 1 \alpha = \frac{2}{N + 1} α=N+12 其中, N N N 是用户定义的时间窗口大小(即考虑多少个数据点)。
EMA 的递归公式可以展开为: E M A t = α ⋅ x t + α ⋅ ( 1 − α ) ⋅ x t − 1 + α ⋅ ( 1 − α ) 2 ⋅ x t − 2 + … , EMA_t = \alpha \cdot x_t + \alpha \cdot (1 - \alpha) \cdot x_{t-1} + \alpha \cdot (1 - \alpha)^2 \cdot x_{t-2} + \dots, EMAt=α⋅xt+α⋅(1−α)⋅xt−1+α⋅(1−α)2⋅xt−2+…, 从公式可以看出,最近的数据 x t x_t xt 权重最高,为 α \alpha α,较早的数据权重按指数递减(如 α ( 1 − α ) \alpha (1 - \alpha) α(1−α))。
EMA 在深度学习中有广泛的应用,以下是几个主要场景:
-
权重更新
在对比学习方法,如MoCo中,动量编码器的参数通过 EMA 更新: θ k = m ⋅ θ k + ( 1 − m ) ⋅ θ q , \theta_k = m \cdot \theta_k + (1 - m) \cdot \theta_q, θk=m⋅θk+(1−m)⋅θq, 其中, θ k \theta_k θk 是动量编码器的参数, θ q \theta_q θq是主编码器的参数, m m m 是动量因子(通常 m = 0.999 m = 0.999 m=0.999)。通过 EMA 平滑动量编码器的参数更新,保证其特征表示的稳定性,避免频繁变化导致训练不稳定。 -
模型参数的移动平均
在训练过程中,EMA 用于对模型权重进行平滑,计算每次更新后的 历史平均权重: θ t E M A = α ⋅ θ t + ( 1 − α ) ⋅ θ t − 1 E M A , \theta^{EMA}_t = \alpha \cdot \theta_t + (1 - \alpha) \cdot \theta^{EMA}_{t-1}, θtEMA=α⋅θt+(1−α)⋅θt−1EMA, 训练结束后,可以直接使用 EMA 权重进行推理(而不是最新的权重),以提升模型的泛化能力。YOLO 等目标检测模型中使用 EMA 提升检测性能。 -
学习率的动态调整
EMA 可以用于平滑地计算梯度变化,从而动态调整优化器的学习率(如 Adam 优化器中的二阶动量估计)。
相较于简单移动平均,EMA 对最新数据更敏感,对最新数据的权重更高,可以更快地反映数据的趋势变化。而且,EMA的递归计算效率高,只需要最新的数据点和之前的 EMA 值,不需要存储整个时间窗口的数据。
此外,EMA 能够有效地减少时间序列中的噪声,突出长期趋势,同时对短期波动不敏感。常用于金融市场的股票价格趋势分析,以及动态系统的控制。