← 返回笔记列表
深度学习 第 21 / 49 篇

深度学习:指数加权平均 — 用一行代码做时间序列预测

查看“深度学习”专题目录(21/49)
本文目录 14 个小节

1. 从预测收入开始

天数营业金额
第 1 天100
第 2 天114
第 3 天118
第 4 天117
第 5 天120
第 6 天122
第 7 天?

1.1 方法一:简单平均

全部 6 天等权重:

预测=100+114+118+117+120+1226\text{预测} = \frac{100 + 114 + 118 + 117 + 120 + 122}{6}

问题:第 1 天和第 6 天重要性相同,但显然最近的经营情况更有参考价值。

1.2 方法二:加权平均

越近的数据给越大权重:

第 1 天第 2 天第 3 天第 4 天第 5 天第 6 天
权重 0.050.100.150.200.250.25

思想:越新的数据越能反映当前趋势。


2. 指数加权平均(Exponentially Weighted Average)

2.1 递推公式

Vt=β⋅Vt−1+(1−β)⋅θtV_t = \beta \cdot V_{t-1} + (1-\beta) \cdot \theta_t
  • VtV_t:前 tt 天的指数加权平均值
  • θt\theta_t:第 tt 天的实际值
  • β\beta:衰减系数(超参数),β∈[0,1)\beta \in [0, 1)

2.2 初始条件与逐天计算

设 V0=0V_0 = 0, β=0.7\beta = 0.7:

V₁ = 0.7 × V₀ + 0.3 × θ₁
V₂ = 0.7 × V₁ + 0.3 × θ₂
V₃ = 0.7 × V₂ + 0.3 × θ₃
...

2.3 展开后看到”指数衰减”

把 V6V_6 展开到 θ\theta 的表达式:

V6=0.3×0.75⋅θ1+0.3×0.74⋅θ2+⋯+0.3×θ6V_6 = 0.3 \times 0.7^5 \cdot \theta_1 + 0.3 \times 0.7^4 \cdot \theta_2 + \dots + 0.3 \times \theta_6

天数权重系数
θ1\theta_1(最早)0.3×0.75≈0.05040.3 \times 0.7^5 \approx 0.0504
θ2\theta_20.3×0.74≈0.07200.3 \times 0.7^4 \approx 0.0720
…\dots…\dots
θ6\theta_6(最近)0.30.3

权重按 β\beta 的指数衰减 — 名字”指数加权平均”的由来。

2.4 β\beta 的含义

β\beta效果含义
0.9衰减慢近似过去 10 天的平均(11−0.9=10\frac{1}{1-0.9} = 10)
0.98衰减很慢近似过去 50 天的平均
0.5衰减飞快近似过去 2 天的平均

经验公式:β\beta 对应的有效窗口 ≈ 11−β\frac{1}{1-\beta}。


3. 偏差修正(Bias Correction)

3.1 早期值偏小的问题

V0=0V_0 = 0 导致前几天的 VtV_t 严重偏低:

天数θ\theta原始 VV
第 1 天10030(远小于 100)
第 2 天11455.2

前几天的 VV 受 V0=0V_0=0 影响太大,不准确。

3.2 修正公式

Vtcorrect=Vt1−βtV_t^\text{correct} = \frac{V_t}{1 - \beta^t}

修正后:

天数原始 VV1−βt1-\beta^t修正后 VV
第 1 天300.3100
第 2 天55.20.51108.2
…………
第 6 天104.39470.882351118.31

当 tt 足够大时 1−βt→11 - \beta^t \to 1,修正自动失效——说明偏差只是一个”冷启动”问题。

3.3 实现中的简洁写法

不需要存 V0,V1,…,V6V_0, V_1, \dots, V_6 一堆变量,只需要一个变量不断更新:

V = 0.0
for theta in daily_revenue:
    V = beta * V + (1 - beta) * theta          # 一步更新
    # V_corrected = V / (1 - beta ** t)        # 可选偏差修正

优点:算法简单,只存一个变量 VV,极省内存。


4. 在深度学习中的应用

这一节是为后续内容做铺垫。指数加权平均被用在:

应用说明
动量优化器(Momentum)对梯度做指数加权平均,平滑更新方向
Adam 优化器对梯度的一阶矩和二阶矩都做指数加权平均
Batch Normalization训练时用指数加权平均维护 running mean / running var

5. 总结

指数加权平均 = 一行代码的平滑预测

公式:V = β·V + (1-β)·θ
       ├── 新 V = β × 旧 V + (1-β) × 当前值
       ├── β 大 → 窗口长,平滑但滞后
       ├── β 小 → 窗口短,灵敏但波动
       └── 只需存一个变量,内存友好

偏差修正:V_correct = V / (1-βᵗ)
       └── 解决 V₀=0 导致的冷启动偏差
       └── 序列足够长后自动失效
继续学习本专题