深度学习Day04 指数加权平均(Exponential Weighted Average, EWA)
指数加权平均(EWA)
在实际的数据分析和模型训练过程中,我们经常会遇到这样一种情况:
数据本身存在较大的随机波动(噪声),如果只关注当前值,结果会非常不稳定;但如果对所有历史数据一视同仁地求平均,又会对最新变化反应迟钝。
指数加权平均(EWA) 正是为了解决这一矛盾而提出的一种平滑方法。
假如现在生成30天的“随机气温”:
ELEMENT_NUMBER = 30
# 1. 实际平均温度
def demo01():
# 固定随机数种子
torch.manual_seed(0)
# 产生30天的随机温度
temperature = torch.randn(size=[ELEMENT_NUMBER, ]) * 10
print(temperature)
# 绘制平均温度
days = torch.arange(1, ELEMENT_NUMBER + 1, 1)
plt.plot(days, temperature, color='r')
plt.scatter(days, temperature)
plt.show()
画出来的图是这样的:

可以发现这个折线有以下特点:
📈 有波动
🌧️ 有噪声
❄️ 偶尔会突然高 / 低一天
👉 这是 真实世界中“原始数据”的典型样子
那使用「普通平均值」行不行?
比如:
前 n 天的平均温度
这会出现以下问题:
1、历史太久的值权重和昨天一样
2、新变化反应很慢
3、趋势被“冲淡”
👉 普通平均回答的是:
“到目前为止总体情况如何”
但很多时候,我们真正想问的是:
“最近情况在往哪个方向走?”
EWA就是来解决这个问题的:
| 需求 | 是否满足 |
|---|---|
| 平滑数据、减少噪声 | ✅ |
| 更关注最近数据 | ✅ |
| 不完全丢掉历史信息 | ✅ |
EWA的核心思想
EWA 的核心思想可以概括为一句话:
越新的数据权重越大,越旧的数据权重越小,并且这种权重衰减是指数形式的。
在 EWA 中,每一步的更新规则为:
$$ v_t = \beta \cdot v_{t-1} + (1 - \beta) \cdot x_t $$
其中:
$x_t$ 表示当前时刻的观测值
$v_{t-1}$ 表示当前的指数加权平均值
$\beta∈(0,1)$ 是衰减系数,用于控制历史信息的保留程度
从直觉上理解:
$\beta$ 越大,历史信息保留得越多,曲线越平滑
$\beta$ 越小,模型对最新数据越敏感
衰减系数 $\beta$ 决定了 EWA 的“性格”:
较小的 $\beta$:
更关注当前数据,响应迅速,但平滑效果较弱较大的 $\beta$:
更关注历史趋势,曲线更加平滑,但对新变化反应较慢在实际应用中,常见的取值范围为:
β 性格 效果 0.3 急性子 跟着最新数据跑 0.9 稳重 趋势平滑、抗噪声 0.99 非常稳 长期趋势
这里回到30天的“随机气温”的例子,我们使用EWA求指数加权温度试试。
def demo02(beta=0.9):
# 固定随机数种子
torch.manual_seed(0)
# 产生30天的随机温度
temperature = torch.randn(size=[ELEMENT_NUMBER, ]) * 10
print(temperature)
exp_weight_avg = []
# idx从1开始
for idx, temp in enumerate(temperature, 1):
# 第一个元素的 EWA 值等于自身
if idx == 1:
exp_weight_avg.append(temp)
continue
# 第二个元素的 EWA 值等于上一个 EWA 乘以 β + 当前气温乘以 (1-β)
# idx-2:2-2=0,exp_weight_avg列表中第一个值的下标值
new_temp = exp_weight_avg[idx - 2] * beta + (1 - beta) * temp
exp_weight_avg.append(new_temp)
days = torch.arange(1, ELEMENT_NUMBER + 1, 1)
plt.plot(days, exp_weight_avg, color='r')
plt.scatter(days, temperature)
plt.show()
设置$\beta$=0.3,画出的图如下:

设置$\beta$=0.9,得到的图如下:

根据公式,我们可以发现 EWA 并不是简单地“取平均”,而是一个不断更新的过程:
当前结果主要继承过去的趋势
新数据会对趋势产生影响,但不会立刻完全改变它
这种机制使得 EWA 既能有效抑制噪声,又能逐步反映数据的变化方向。
因此,EWA 非常适合用于趋势分析,而不是精确拟合每一个瞬时值。
更多推荐
所有评论(0)