有一些算法比梯度下降算法更有效,为了学习这些算法,我们需要先了解一个概念——指数加权平均(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=β×vt−1+(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=β×vt−1+(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.9⋅v99+0.1⋅θ100 · · · · · · ①
v 99 = 0.9 ⋅ v 98 + 0.1 ⋅ θ 99 v_{99} = 0.9·v_{98} + 0.1 · \theta_{99} v99=0.9⋅v98+0.1⋅θ99 · · · · · · ②
v 98 = 0.9 ⋅ v 97 + 0.1 ⋅ θ 98 v_{98} = 0.9·v_{97} + 0.1 · \theta_{98} v98=0.9⋅v97+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.1⋅0.9⋅θ99+0.1⋅0.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.910≈0.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} v100≈10θ100+0.9⋅θ99+0.92⋅θ98+⋅⋅⋅+0.99⋅θ91≈10θ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 x→0lim(1−x)x1=e1≈0.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=(1−0.1)0.11≈0.34≈e1,这有什么意义呢?这可以说明在计算 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−ϵ)ϵ1≈e1≈0.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 ,使上图中的紫线在开始阶段与绿线进行拟合。