有一些算法比梯度下降算法更有效,为了学习这些算法,我们需要先了解一个概念——指数加权平均(Exponentially weighted averages)
我会先讲指数加权平均的具体做法,然后再讲这么做的原因。
指数加权平均
假设我们收集了一个在北半球的地区一年中每天的温度,像这样:
- t(1) = 4°C
- t(2) = 9°C
- t(3) = 6°C
- …
- t(180) = 15°C
- …
将这些温度作出一张图是这样的:

可以发现,一年中开头和结尾气温较低,中间气温较高,整体趋势是这样的,但是噪声很大。
下面我们来计算指数加权平均:
- v0=0
- v1=0.9×v0+0.1×t(1)=0.4
- v2=0.9×v1+0.1×t(2)=1.26
- v3=0.9×v2+0.1×t(3)=1.734
- …
如果按照这个公式一直计算下去,将得到的结果也画出来,可以得到下面的结果:

其中红色的线就是利用指数加权平均计算出的结果,比之前的结果要平滑了很多。
具体来讲,在这个例子中,指数加权平均的一般公式为
vt=β×vt−1+(1−β)×θ(t)
这里的 $\beta $ 是一个超参数,上面的例子中 β=0.9.
稍后会讲到,这里的 vt 相当于粗略计算了前 1−β1 天的平均气温,即在这个例子中,vt 相当于前 10 天的平均气温。
让我们把 β 的值设置得更接近 1,比如说 0.98,那此时的 vt 便相当于粗略计算了前50 天的平均气温,也将其画出来,便得到了下面的绿线:

可以发现,当 β 更大时,得到的曲线更加光滑,因为我们对更多天数的温度做了平均处理,因此曲线就波动更小,更加光滑。但另一方面,曲线会右移,因为这时我们在一个更大的窗口内计算平均值,这导致温度变化时曲线会适应地更加缓慢,这就造成了一些延迟。
如果将 /beta 减小呢,比如取 β=0.5,那么这时 vt 只相当于前两天的平均天气,将曲线画出来就如下面的黄线所示:

可以发现,由于只对前两天的温度进行平均计算,曲线的波动会更大,有更多的噪声,但是也能更快适应温度的变化。
总之,使用 vt=β×vt−1+(1−β)×θ(t) 这个公式就能实现指数加权平均,在统计学中,这也被称为指数加权滑动平均,但我们可以简称为指数加权平均,通过调整 beta 这个参数,我们可以得到一些略微不同的结果,在这个温度的例子中,这条红色的线要更好一些。
下面我们来理解一下指数加权平均的本质以及它为什么有效。
为什么要用指数加权平均
先看一下这几个式子:
v100=0.9⋅v99+0.1⋅θ100 · · · · · · ①
v99=0.9⋅v98+0.1⋅θ99 · · · · · · ②
v98=0.9⋅v97+0.1⋅θ98 · · · · · · ③
…
将 ③ 式代入 ② 式,再将 ② 式代入 ① 式可以得到:
v100=0.1⋅θ100+0.1⋅0.9⋅θ99+0.1⋅0.92⋅θ98
如果继续向下递推,最终可以得到下式
v100=0.1⋅(θ100+0.9⋅θ99+0.92⋅θ98+⋅⋅⋅+0.999⋅θ1)
从这个式子中可以发现,运用指数加权平均后,第 100 天的温度受到了前面所有天温度的影响,随着向前的天数减小,影响也减小,总之,这就使得处理后的数据更加平滑,噪声更少。
但是为什么说 β=0.9 时,这里的 v100 是对前 10 天气温平均值的粗略计算呢?
观察 v100=0.1⋅(θ100+0.9⋅θ99+0.92⋅θ98+⋅⋅⋅+0.999⋅θ1) 中的系数可以发现,θ90 前面的系数应为 0.910≈0.34,由于这些项系数呈指数级减少,从该项开始,后面项的系数逐渐减小到了可以忽略不计的地步,因此我们如果只考察从 θ91 到 θ100,并把 0.1 写作分数的形式,就有
v100≈10θ100+0.9⋅θ99+0.92⋅θ98+⋅⋅⋅+0.99⋅θ91≈10θ100+θ99+⋅⋅⋅+θ91
这便是对前 10 天平均气温的粗略计算。
事实上有,
x→0lim(1−x)x1=e1≈0.37
因此在上面的例子中,可以认为 θ90 的系数 0.910=(1−0.1)0.11≈0.34≈e1,这有什么意义呢?这可以说明在计算 v100 选择保留 θ91 至 θ100 而去掉 θ90 以及之后的项是有道理和规律的,因为只要 β 接近 1,就有一个接近 0 的数 ϵ=1−β 使得 β1−β1=(1−ϵ)ϵ1≈e1≈0.37 可以忽略不计,也就是说系数为 β1−β1 及其之后的项都可丢弃,不参与 v100 的计算,从而参与计算的只有系数为 β1−β1 之前的项,而这些项的数目正好为 1−β1,因此最后计算的便是前 1−β1 天温度的平均值。比如在上面的例子中 1−β1=10,v100 便是前 10 天温度平均值的粗略计算。
所以对于计算 vt,更一般的式子为
KaTeX parse error: No such environment: align at position 8:
\begin{̲a̲l̲i̲g̲n̲}̲
v_{t} & = \cfr…
最终结果就是对前 1−β1 天气温平均值的粗略计算。
如果对于具体原理仍感迷惑也没关系,因为这并不影响实际运用。
当然,这里是用气温举的例子,以上算法和理论对其他类型的数据也是成立的。
偏差修正
在之前的例子中,如果取 β=0.98,我们应该得到下图中的绿线:

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

可以发现,绿线和紫线在后半部分基本贴合,但在开始阶段,紫线要低于绿线,下面我们来解释为什么会出现这种情况以及如何应对。
回想一下指数加权平均的过程:
- v0=0
- v1=0.98×v0+0.02×t(1)=0.08
- v2=0.98×v1+0.02×t(2)=0.2584
- …
我们把 v0 设置为 0,所以 v1 其实等于 0.02×t(1),远远小于第一天的真实温度,这就是一个偏差,亦即紫线一开始比较低的原因,我们可以通过偏差修正的方法来解决这个问题。
所谓偏差修正,就是在计算 vt 的时候增加一个步骤:
vt:=1−βtvt
注意观察这个式子,在这个例子中,当 t = 1 时,1−βt 的值为 0.02,故应用上面这个式子后相当于使 vt 放大了 50 倍。随着 t 增大,1−βt 增大,且最后会接近于 1,这时 vt 基本就不再变化了。
总结一下,偏差修正就是找一个方法,在开始阶段放大 vt ,使上图中的紫线在开始阶段与绿线进行拟合。