指数移动平均(EMA,Exponential Moving Average) 是一种加权平均的技术,常用于平滑数据序列,特别是在深度学习中,用来跟踪模型参数的平滑版本。它在每次更新模型参数时,赋予最近的更新较大的权重,历史更新的权重则逐渐减小。
EMA 的更新公式如下:
θ E M A ( t ) = α ⋅ θ ( t ) + ( 1 − α ) ⋅ θ E M A ( t − 1 ) \theta_{EMA}^{(t)} = \alpha \cdot \theta^{(t)} + (1 - \alpha) \cdot \theta_{EMA}^{(t-1)} θEMA(t)=α⋅θ(t)+(1−α)⋅θEMA(t−1)
- θ E M A ( t ) \theta_{EMA}^{(t)} θEMA(t) 是第 t t t 次更新后的 EMA 参数。
- θ ( t ) \theta^{(t)} θ(t) 是第 t t t 次更新后的模型原始参数。
- α \alpha α 是平滑因子(通常取一个较小的值,如 0.001),表示新参数更新的权重。
- θ E M A ( t − 1 ) \theta_{EMA}^{(t-1)} θEMA(t−1) 是前一次的 EMA 参数。
相比于简单移动平均(SMA),EMA 更加重视最近的参数更新,这使得它能更快速地响应最新的变化,同时依然保留历史信息的平滑效果。
举个例子:
假设我们有一个模型参数的序列,每次训练后更新为以下值:
- 第1次更新:原始参数 = 10
- 第2次更新:原始参数 = 20
- 第3次更新:原始参数 = 15
- 第4次更新:原始参数 = 30
如果我们设定平滑因子 α = 0.5 \alpha = 0.5 α=0.5,那么指数移动平均参数的变化如下:
-
初始化:第 1 次更新时, θ E M A ( 1 ) = 10 \theta_{EMA}^{(1)} = 10 θEMA(1)=10 (因为第一次没有历史参数,EMA 就等于初始参数)。
-
第 2 次更新:
θ E M A ( 2 ) = 0.5 × 20 + ( 1 − 0.5 ) × 10 = 10 + 5 = 15 \theta_{EMA}^{(2)} = 0.5 \times 20 + (1 - 0.5) \times 10 = 10 + 5 = 15 θEMA(2)=0.5×20+(1−0.5)×10=10+5=15
这意味着 EMA 对最新参数 20 20 20 给予了一半的权重,但也保持了历史信息 10 10 10 的影响。 -
第 3 次更新:
θ E M A ( 3 ) = 0.5 × 15 + ( 1 − 0.5 ) × 15 = 15 \theta_{EMA}^{(3)} = 0.5 \times 15 + (1 - 0.5) \times 15 = 15 θEMA(3)=0.5×15+(1−0.5)×15=15
由于这次的更新和历史 EMA 参数相同,EMA 不发生变化。 -
第 4 次更新:
θ E M A ( 4 ) = 0.5 × 30 + ( 1 − 0.5 ) × 15 = 15 + 7.5 = 22.5 \theta_{EMA}^{(4)} = 0.5 \times 30 + (1 - 0.5) \times 15 = 15 + 7.5 = 22.5 θEMA(4)=0.5×30+(1−0.5)×15=15+7.5=22.5
EMA 迅速跟随最新的更新,但不会完全达到新参数 30 30 30 的值,而是趋于平滑变化。
更加复杂的情况:
这张图展示了更多数据点情况下,原始参数(蓝色虚线)和指数移动平均EMA(绿色实线)的变化情况。可以明显看到,原始参数的波动较大,而EMA曲线表现出更平滑的趋势,随着时间逐渐跟随原始参数变化但不会完全达到其波动幅度。这样,通过EMA,可以更好地抑制参数中的噪声,实现更加稳定的更新过程。
在深度学习中的应用:
在训练神经网络时,由于参数不断更新,有时模型的最新状态并不是最好的。这时,EMA 可以帮助生成一个平滑的模型版本,它比最新的模型参数更加稳定、泛化能力更强。
使用场景:
- 稳定模型:在训练过程中,模型参数可能波动较大,EMA 可以生成一个更稳定的模型。
- 提升泛化能力:EMA 模型在验证集或测试集上通常表现得更好,因为它对过拟合的抑制效果较好。
EMA 的这种平滑效果能够有效缓解训练过程中的抖动,并且能够在训练结束时提供更优的模型版本。