指数加权平均

有一些算法比梯度下降算法更有效,为了学习这些算法,我们需要先了解一个概念——指数加权平均(Exponentially weighted averages)

我会先讲指数加权平均的具体做法,然后再讲这么做的原因。

指数加权平均

假设我们收集了一个在北半球的地区一年中每天的温度,像这样:

  • t(1) = 4°C
  • t(2) = 9°C
  • t(3) = 6°C
  • t(180) = 15°C

将这些温度作出一张图是这样的:

可以发现,一年中开头和结尾气温较低,中间气温较高,整体趋势是这样的,但是噪声很大。

下面我们来计算指数加权平均:

  • v 0 = 0 v_0 = 0 v0=0
  • v 1 = 0.9 × v 0 + 0.1 × t ( 1 ) = 0.4 v_1 = 0.9 × v_0 + 0.1 × t(1) = 0.4 v1=0.9×v0+0.1×t(1)=0.4
  • v 2 = 0.9 × v 1 + 0.1 × t ( 2 ) = 1.26 v_2 = 0.9 × v_1 + 0.1 × t(2) = 1.26 v2=0.9×v1+0.1×t(2)=1.26
  • v 3 = 0.9 × v 2 + 0.1 × t ( 3 ) = 1.734 v_3 = 0.9 × v_2 + 0.1 × t(3) = 1.734 v3=0.9×v2+0.1×t(3)=1.734

如果按照这个公式一直计算下去,将得到的结果也画出来,可以得到下面的结果:

其中红色的线就是利用指数加权平均计算出的结果,比之前的结果要平滑了很多。

具体来讲,在这个例子中,指数加权平均的一般公式为

v t = β × v t − 1 + ( 1 − β ) × θ ( t ) v_t = \beta × v_{t-1} + (1 - \beta) × \theta(t) vt=β×vt1+(1β)×θ(t)

这里的 $\beta $ 是一个超参数,上面的例子中 β = 0.9 \beta = 0.9 β=0.9.

稍后会讲到,这里的 v t v_t vt 相当于粗略计算了前 1 1 − β \cfrac{1}{1 - \beta} 1β1 天的平均气温,即在这个例子中, v t v_t vt 相当于前 10 天的平均气温。

让我们把 β \beta β 的值设置得更接近 1,比如说 0.98,那此时的 v t v_t vt 便相当于粗略计算了前50 天的平均气温,也将其画出来,便得到了下面的绿线:

可以发现,当 β \beta β 更大时,得到的曲线更加光滑,因为我们对更多天数的温度做了平均处理,因此曲线就波动更小,更加光滑。但另一方面,曲线会右移,因为这时我们在一个更大的窗口内计算平均值,这导致温度变化时曲线会适应地更加缓慢,这就造成了一些延迟。

如果将 / b e t a /beta /beta 减小呢,比如取 β = 0.5 \beta = 0.5 β=0.5,那么这时 v t v_t vt 只相当于前两天的平均天气,将曲线画出来就如下面的黄线所示:

可以发现,由于只对前两天的温度进行平均计算,曲线的波动会更大,有更多的噪声,但是也能更快适应温度的变化。

总之,使用 v t = β × v t − 1 + ( 1 − β ) × θ ( t ) v_t = \beta × v_{t-1} + (1 - \beta) × \theta(t) vt=β×vt1+(1β)×θ(t) 这个公式就能实现指数加权平均,在统计学中,这也被称为指数加权滑动平均,但我们可以简称为指数加权平均,通过调整 b e t a beta beta 这个参数,我们可以得到一些略微不同的结果,在这个温度的例子中,这条红色的线要更好一些。

下面我们来理解一下指数加权平均的本质以及它为什么有效。

为什么要用指数加权平均

先看一下这几个式子:

v 100 = 0.9 ⋅ v 99 + 0.1 ⋅ θ 100 v_{100} = 0.9·v_{99} + 0.1 · \theta_{100} v100=0.9v99+0.1θ100   · · · · · ·    ①

v 99 = 0.9 ⋅ v 98 + 0.1 ⋅ θ 99 v_{99} = 0.9·v_{98} + 0.1 · \theta_{99} v99=0.9v98+0.1θ99   · · · · · ·    ②

v 98 = 0.9 ⋅ v 97 + 0.1 ⋅ θ 98 v_{98} = 0.9·v_{97} + 0.1 · \theta_{98} v98=0.9v97+0.1θ98   · · · · · ·    ③

将 ③ 式代入 ② 式,再将 ② 式代入 ① 式可以得到:

v 100 = 0.1 ⋅ θ 100 + 0.1 ⋅ 0.9 ⋅ θ 99 + 0.1 ⋅ 0. 9 2 ⋅ θ 98 v_{100} = 0.1·\theta_{100} + 0.1 · 0.9 · \theta_{99} + 0.1 · 0.9^2 · \theta_{98} v100=0.1θ100+0.10.9θ99+0.10.92θ98

如果继续向下递推,最终可以得到下式

v 100 = 0.1 ⋅ ( θ 100 + 0.9 ⋅ θ 99 + 0. 9 2 ⋅ θ 98 + ⋅ ⋅ ⋅ + 0. 9 99 ⋅ θ 1 ) v_{100} = 0.1·(\theta_{100} + 0.9 · \theta_{99} + 0.9^2 · \theta_{98} + ··· + 0.9^{99} · \theta_1) v100=0.1(θ100+0.9θ99+0.92θ98++0.999θ1)

从这个式子中可以发现,运用指数加权平均后,第 100 天的温度受到了前面所有天温度的影响,随着向前的天数减小,影响也减小,总之,这就使得处理后的数据更加平滑,噪声更少。

但是为什么说 β = 0.9 \beta=0.9 β=0.9 时,这里的 v 100 v_{100} v100 是对前 10 天气温平均值的粗略计算呢?

观察 v 100 = 0.1 ⋅ ( θ 100 + 0.9 ⋅ θ 99 + 0. 9 2 ⋅ θ 98 + ⋅ ⋅ ⋅ + 0. 9 99 ⋅ θ 1 ) v_{100} = 0.1·(\theta_{100} + 0.9 · \theta_{99} + 0.9^2 · \theta_{98} + ··· + 0.9^{99} · \theta_1) v100=0.1(θ100+0.9θ99+0.92θ98++0.999θ1) 中的系数可以发现, θ 90 \theta_{90} θ90 前面的系数应为 0. 9 10 ≈ 0.34 0.9^{10} ≈ 0.34 0.9100.34,由于这些项系数呈指数级减少,从该项开始,后面项的系数逐渐减小到了可以忽略不计的地步,因此我们如果只考察从 θ 91 \theta_{91} θ91 θ 100 \theta_{100} θ100,并把 0.1 0.1 0.1 写作分数的形式,就有

v 100 ≈ θ 100 + 0.9 ⋅ θ 99 + 0. 9 2 ⋅ θ 98 + ⋅ ⋅ ⋅ + 0. 9 9 ⋅ θ 91 10 ≈ θ 100 + θ 99 + ⋅ ⋅ ⋅ + θ 91 10 v_{100} ≈ \cfrac{\theta_{100} + 0.9 · \theta_{99} + 0.9^2 · \theta_{98} + ··· + 0.9^{9} · \theta_{91}}{10} ≈ \cfrac{\theta_{100} + \theta_{99} + ··· + \theta_{91}}{10} v10010θ100+0.9θ99+0.92θ98++0.99θ9110θ100+θ99++θ91

这便是对前 10 天平均气温的粗略计算。

事实上有,

lim ⁡ x → 0 ( 1 − x ) 1 x = 1 e ≈ 0.37 \lim_{x \to 0}(1-x)^\frac{1}{x} = \frac{1}{e} ≈ 0.37 x0lim(1x)x1=e10.37

因此在上面的例子中,可以认为 θ 90 \theta_{90} θ90 的系数 0. 9 10 = ( 1 − 0.1 ) 1 0.1 ≈ 0.34 ≈ 1 e 0.9^{10} = (1-0.1)^{\frac{1}{0.1}} ≈ 0.34 ≈ \cfrac{1}{e} 0.910=(10.1)0.110.34e1,这有什么意义呢?这可以说明在计算 v 100 v_{100} v100 选择保留 θ 91 \theta_{91} θ91 θ 100 \theta_{100} θ100 而去掉 θ 90 \theta_{90} θ90 以及之后的项是有道理和规律的,因为只要 β \beta β 接近 1,就有一个接近 0 的数 ϵ = 1 − β \epsilon = 1 - \beta ϵ=1β 使得 β 1 1 − β = ( 1 − ϵ ) 1 ϵ ≈ 1 e ≈ 0.37 \beta^{\frac{1}{1-\beta}} = (1-\epsilon)^{\frac{1}{\epsilon}} ≈ \cfrac{1}{e} ≈ 0.37 β1β1=(1ϵ)ϵ1e10.37 可以忽略不计,也就是说系数为 β 1 1 − β \beta^\frac{1}{1-\beta} β1β1 及其之后的项都可丢弃,不参与 v 100 v_{100} v100 的计算,从而参与计算的只有系数为 β 1 1 − β \beta^\frac{1}{1-\beta} β1β1 之前的项,而这些项的数目正好为 1 1 − β \frac{1}{1-\beta} 1β1,因此最后计算的便是前 1 1 − β \frac{1}{1-\beta} 1β1 天温度的平均值。比如在上面的例子中 1 1 − β = 10 \frac{1}{1-\beta} = 10 1β1=10 v 100 v_{100} v100 便是前 10 天温度平均值的粗略计算。

所以对于计算 v t v_{t} vt,更一般的式子为

KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ v_{t} & = \cfr…

最终结果就是对前 1 1 − β \cfrac{1}{1-\beta} 1β1 天气温平均值的粗略计算。

如果对于具体原理仍感迷惑也没关系,因为这并不影响实际运用。

当然,这里是用气温举的例子,以上算法和理论对其他类型的数据也是成立的。

偏差修正

在之前的例子中,如果取 β = 0.98 \beta = 0.98 β=0.98,我们应该得到下图中的绿线:

但实际上我们得到的是下面这条紫线:

可以发现,绿线和紫线在后半部分基本贴合,但在开始阶段,紫线要低于绿线,下面我们来解释为什么会出现这种情况以及如何应对。

回想一下指数加权平均的过程:

  • v 0 = 0 v_0 = 0 v0=0
  • v 1 = 0.98 × v 0 + 0.02 × t ( 1 ) = 0.08 v_1 = 0.98 × v_0 + 0.02 × t(1) = 0.08 v1=0.98×v0+0.02×t(1)=0.08
  • v 2 = 0.98 × v 1 + 0.02 × t ( 2 ) = 0.2584 v_2 = 0.98 × v_1 + 0.02 × t(2) = 0.2584 v2=0.98×v1+0.02×t(2)=0.2584

我们把 v 0 v_0 v0 设置为 0,所以 v 1 v_1 v1 其实等于 0.02 × t ( 1 ) 0.02 × t(1) 0.02×t(1),远远小于第一天的真实温度,这就是一个偏差,亦即紫线一开始比较低的原因,我们可以通过偏差修正的方法来解决这个问题。

所谓偏差修正,就是在计算 v t v_t vt 的时候增加一个步骤:

v t : = v t 1 − β t v_t := \frac{v_t}{1 - \beta^t} vt:=1βtvt

注意观察这个式子,在这个例子中,当 t = 1 时, 1 − β t 1 - \beta^t 1βt 的值为 0.02,故应用上面这个式子后相当于使 v t v_t vt 放大了 50 倍。随着 t 增大, 1 − β t 1 - \beta^t 1βt 增大,且最后会接近于 1,这时 v t v_t vt 基本就不再变化了。

总结一下,偏差修正就是找一个方法,在开始阶段放大 v t v_t vt ,使上图中的紫线在开始阶段与绿线进行拟合。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值