指数加权平均(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 非常适合用于趋势分析,而不是精确拟合每一个瞬时值。

更多推荐