理解指数加权平均数(Understanding exponentially weighted averages)
上个笔记中,我们讲到了指数加权平均数,这是几个优化算法中的关键一环,而这几个优化算法能帮助你训练神经网络。本笔记中,我希望进一步探讨算法的本质作用。
回忆一下这个计算指数加权平均数的关键方程。
v_t=βv_(t-1)+(1-β)θ_t
比如β=0.9的时候,得到的结果是红线,如果它更接近于1,
比如β=0.98,结果就是绿线,如果β小一点,如果是0.5,结果就是黄线。
我们进一步地分析,来理解如何计算出每日温度的平均值。
同样的公式,v_t=βv_(t-1)+(1-β)θ_t
使β=0.9,写下相应的几个公式,所以在执行的时候,t从0到1到2到3,t的值在不断增加,为了更好地分析,我写的时候使得t的值不断减小,然后继续往下写。
首先看第一个公式,理解v_100是什么?我们调换一下这两项(0.9v_99 0.1θ_100),v_100=0.1θ_100+0.9v_99。
那么v_99是什么?我们就代入这个公式(v_99=0.1θ_99+0.9v_98),所以:
v_100=0.1θ_100+0.9(0.1θ_99+0.9v_98)。
那么v_98是什么?你可以用这个公式计算(v_98=0.1θ_98+0.9v_97),把公式代进去,所以:
v_100=0.1θ_100+0.9(0.1θ_99+0.9(0.1θ_98+0.9v_97))。
以此类推,如果你把这些括号都展开,
所以这是一个加和并平均,100号数据,也就是当日温度。
我们分析v_100的组成,也就是在一年第100天计算的数据,但是这个是总和,包括100号数据,99号数据,97号数据等等。画图的一个办法是,假设我们有一些日期的温度,所以这是数据,这是t,所以100号数据有个数值,99号数据有个数值,98号数据等等,t为100,99,98等等,这就是数日的温度数值。
然后我们构建一个指数衰减函数,从0.1开始,到0.1×0.9,到0.1×〖(0.9)〗^2,以此类推,所以就有了这个指数衰减函数。
计算v_100是通过,把两个函数对应的元素,然后求和,用这个数值100号数据值乘以0.1,99号数据值乘以0.1乘以〖(0.9)〗^2,这是第二项,以此类推,所以选取的是每日温度,将其与指数衰减函数相乘,然后求和,就得到了v_100。
结果是,稍后我们详细讲解,不过所有的这些系数(0.10.1×0.90.1×(0.9)^2 0.1×(0.9)^3…),相加起来为1或者逼近1,我们称之为偏差修正,下个笔记会涉及。
最后也许你会问,到底需要平均多少天的温度。实际上〖(0.9)〗^10大约为0.35,这大约是1/e,e是自然算法的基础之一。
大体上说,如果有1-ε,在这个例子中,ε=0.1,所以1-ε=0.9,(1-ε)^(1/ε)约等于1/e,大约是0.34,0.35,换句话说,10天后,曲线的高度下降到1/3,相当于在峰值的1/e。
又因此当β=0.9的时候,我们说仿佛你在计算一个指数加权平均数,只关注了过去10天的温度,因为10天后,权重下降到不到当日权重的三分之一。
相反,如果,那么0.98需要多少次方才能达到这么小的数值?
(0.98)^50大约等于1/e,所以前50天这个数值比1/e大,数值会快速衰减,所以本质上这是一个下降幅度很大的函数,你可以看作平均了50天的温度。
因为在例子中,要代入等式的左边,ε=0.02,所以1/ε为50,我们由此得到公式,我们平均了大约1/(1-β)天的温度,这里ε代替了1-β,也就是说根据一些常数,你能大概知道能够平均多少日的温度,不过这只是思考的大致方向,并不是正式的数学证明。
最后讲讲如何在实际中执行,还记得吗?我们一开始将v_0设置为0,然后计算第一天v_1,然后v_2,以此类推。
现在解释一下算法,可以将v_0,v_1,v_2等等写成明确的变量,不过在实际中执行的话,你要做的是,一开始将v初始化为0,然后在第一天使v:=βv+(1-β)θ_1,然后第二天,更新v值,v:=βv+(1-β)θ_2,以此类推,有些人会把v加下标,来表示v是用来计算数据的指数加权平均数。
再说一次,但是换个说法,v_θ=0,然后每一天,拿到第t天的数据,把v更新为v:=βv_θ+(1-β)θ_t。
指数加权平均数公式的好处之一在于,它占用极少内存,电脑内存中只占用一行数字而已,然后把最新数据代入公式,不断覆盖就可以了,正因为这个原因,其效率,它基本上只占用一行代码,计算指数加权平均数也只占用单行数字的存储和内存
当然它并不是最好的,也不是最精准的计算平均数的方法。如果你要计算移动窗,你直接算出过去10天的总和,过去50天的总和,除以10和50就好,如此往往会得到更好的估测。
但缺点是,如果保存所有最近的温度数据,和过去10天的总和,必须占用更多的内存,执行更加复杂,计算成本也更加高昂。
所以在接下来的笔记中,我们会计算多个变量的平均值,从计算和内存效率来说,这是一个有效的方法,所以在机器学习中会经常使用,更不用说只要一行代码,这也是一个优势。
现在你学会了计算指数加权平均数,你还需要知道一个专业概念,叫做偏差修正,下一个笔记我们会讲到它,接着你就可以用它构建更好的优化算法,而不是简单直接的梯度下降法。