吴恩达深度学习deeplearning.ai学习笔记(二)2.3 2.4 2.5

2.3 指数加权平均

后面的算法需要用到指数加权平均,在统计中也叫指数加权移动平均(Moving\ average),所以先讲这个;

老吴生在英国,他拿到了英国去年伦敦每一天的气温数据,比如第一天是40华氏度……用数据作图,结果如下:

如果要计算趋势的话,也就是温度的局部平均值(或者说移动平均值),你要先让v_0=0,然后之后的每天温度需要用0.9的加权数乘之前一天的温度,在加上0.1的加权数乘以当日温度:

v_0=0

v_1=0.9v_0+0.1\theta_1

v_2=0.9v_1+0.1\theta_2

v_3=0.9v_2+0.1\theta_3

\cdots

v_t=0.9v_{t-1}+0.1\theta_t

然后按此公式将v_1,v_2,\cdots计算完后画在图中,便得到如红线所示的结果,这个结果叫每日温度的移动平均值,也可以叫指数加权平均值:

那么进一步将v_t的公式更加一般化,把0.9视作一个参数,可以调整成其他值:

v_t=\beta 0.9v_{t-1}+(1-\beta )\theta_t

在计算时,v_t可视为大概是过去\frac{1}{1-\beta}天的平均温度值,比如\beta=0.9的话就是过去10天的温度值,而\beta=0.98的话就是过去50天的温度值,计算\beta=0.98的情况画在图中如绿线所示:

注意到绿线比红线要平坦一些,这是因为你多平均了几十天的温度,所以曲线变得更加平坦,波动更小,缺点是曲线进一步右移了,平均的天数越多,公式在温度变化时适应的速度就会更慢一些,出现了一定的延迟,公式本身在\beta=0.98时,只给了当天温度0.02的权重,温度上下起伏变化很大时,指数加权平均就适应得慢一些;

如果取另一个极端点的值\beta=0.5,那么就只相当于平均了两天的气温,得到黄线,但由于平均的天数太少,画出的曲线波动很大,噪声更多,更有可能出现异常值,但是这个曲线能够更快地适应温度变化:

\beta是一个重要的超参数,往往存在一个中间值比较好,比如对应红线的\beta=0.9,比起绿线和黄线更好地平均了温度。

2.4 理解指数加权平均

\because v_{100}=0.9v_{99}+0.1\theta_{100},v_{99}=0.9v_{98}+0.1\theta_{99},\cdots

\therefore v_{100}=0.1\theta_{100}+0.9(0.9v_{98}+0.1\theta_{99})\\ =0.1\theta_{100}+0.1\times0.9\theta_{99}+(0.9)^2(0.9v_{97}+0.1\theta_{98})\\=0.1\theta_{100}+0.1\times0.9\theta_{99}+0.1\times(0.9)^2\theta_{98}+\cdots+\\(0.1)^2\times(0.9)^{98}\theta_2+0.1\times(0.9)^{99}\theta_1+(0.9)^{100}v_0

也就是说理论上v_{100}需要是前100天都有关联计算得出,画图的话,假设我们有一些日期的温度,纵轴为\theta,横轴为t,将这些天的温度画到图中;然后我们构造一个指数衰减函数,从第一百天对应的指数0.1开始,第99天对应的指数是0.1×0.9,第98天对应0.1\times(0.9)^2,等,于是计算v_100就是通过把两个函数图像对应的元素相乘,然后求和:

但是式子中\theta_{100},\theta_{99},\cdots前面的权重系数0.1,0.1\times0.9,0.1\times(0.9)^2,\cdots加起来逼近于1,我们称之为偏差修正,正是偏差修正才使它成为指数加权平均;

到底需要平均多少天温度?

事实证明,\beta=0.9时,\frac{1}{1-\beta}=10,同时0.9^{10}\approx 0.35\approx \frac{1}{e},且0.9^{10}可以看作(1-\varepsilon )^{\frac{1}{\varepsilon }},当\varepsilon =1-\beta=0.1时,所以换句话说,指数衰减函数大概在10天(对应第90天)时下降到原来高度的\frac{1}{e},就好像在计算时指数加权平均只关注最近10天的气温值,而10天开外,当天气温对应的权重指数下降到不到三分之一以下,小到可以忽略不计了;

而如果\beta=0.98,大约要50次方才能降到约\frac{1}{e}0.98^{0}\approx\frac{1}{e},我们大约平均了\frac{1}{1-\beta}=50天气温;

以上并不是严谨的数学证明,只是老吴的思考方式;

如何实际执行它呢?

v_\theta去表示它是用来计算\theta的指数加权平均数,对应于前面v_0,v_1,v_2,\cdots的计算公式,编码:

v_\theta:=0

v_\theta:=\beta v_\theta+(1-\beta)\theta_1

v_\theta:=\beta v_\theta+(1-\beta)\theta_2

\cdots

用for loop的思路写:

v_\theta=0

Repeat\{​

               Get\ next\ \theta_t

               v_\theta=\beta v_\theta+(1-\beta)\theta_t

              \}

所以指数加权平均公式的优点之一是它只占用极少内存,电脑内存中只占一行数字而已,只需要基于v_\theta=0,不断把最新的第t天的\theta_t代入公式里覆盖就可以了,正是这个原因,它基本只占一行代码,计算指数加权平均数也只占单行数字的内存和存储,虽然它不是最好、最精准的计算平均数的方法,如果你要计算一个移动窗口,直接对近10天或50天的气温进行求和,再除以10或50可能给了一个更精确的估计值,但是缺点就是你要保存所有气温值以及近10天气温的总和,占用了更多的内存,更难实现,花费更高;

2.5 指数加权平均的偏差修正(bias\ correction)

实际上当\beta=0.98时,理想曲线如图中的绿线,而实际曲线并不会和理想曲线一样,而是如紫色曲线一样,开始时曲线的起点会比较低:

因为一开始我们设v_0=0,v_1=0.98v_0+0.02\theta_1=0.02\theta_1,这就是为何第一天如果是40华氏度,而我们算出的v_1才等于0.8华氏度,得到的值会比真实温度小很多;v_2=0.98v_1+0.02\theta_2=0.0196\theta_1+0.02\theta_2,算出来的结果仍然要远小于\theta_1,\theta_2(\theta_1,\theta_2> 0)

有什么方法可以改变这一估计?特别是初期?

\frac{v_t}{1-\beta^t}代替v_t;比如,t=2时,1-\beta^t=0.0396,于是原来的v_2变为了\frac{v_2}{1-\beta^t}=\frac{0.0196\theta_1+0.02\theta_2}{0.0396},这样就进行了偏差的修正使得更接近于真实温度\theta_2;而随着t增加,1-\beta^t越来越 接近于1,因此t较大时偏差修正几乎没有用,且绿线和紫线基本上重合了;不过,这样的偏差修正对预测初期的曲线能很好地修正,更好地预测温度;

在机器学习中,在计算指数加权平均数的大部分时候,因为人们宁愿熬过初始时期,拿到具有偏差的预测,然后继续计算下去,如果你关心初始时期的偏差,在刚开始计算指数加权移动平均数的时候,偏差修正能够帮你在早期获得很好的估测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值