引出Adagrad
在使用梯度下降来求取合适的预测函数的参数的时候我们要设置合适的学习率(learning rate)η\etaη。η\etaη的取值过大的话会使得每次步子太大,从而导致损失函数(loss function)不能达到最小值,甚至有可能越来越大;而η\etaη的取值过小的话会导致梯度下降的速度太慢很费时间。因为刚开始进行梯度下降的时候我们所选择的参数的初始值会使得损失函数离它所能达到的最小值比较远,所以我们可以在刚开始进行梯度下降的时候设置较大的η\etaη,当经过几轮梯度下降后我们的损失函数离它所能达到的最小值比较近了我们就可以设置较小的η\etaη。当然最理想的情况就是在每一次执行梯度下降的时候都有不同的学习率,这就引出了Adagrad。
Adagrad的具体实现
先定义:
ηt=ηt+1\eta^t=\frac{\eta}{\sqrt{t+1}}ηt=t+1η ·····································································(1)
t代表迭代次数,这个式子部分实现了随着梯度下降执行次数的增加,学习率下降的目标,但还不够。
定义:
gt=∂L(wt)∂wg^t=\frac{\partial L(w^t)}{\partial w}gt=∂w∂L(wt)······································································(2)
∙\bullet∙用每个参数上一次迭代之后的学习率来除以之前这次迭代之前的每一次迭代所计算出的梯度的均方根。
Vanilla Gradient descent:
wt+1←wt−ηtgtw^{t+1}\gets w^t-\eta^tg^twt+1←wt−ηtgt·································································(3)
Adagrad:
wt+1←wt−ηtσtgtw^{t+1}\gets w^t-\frac{\eta^t}{\sigma^t}g^twt+1←wt−σtηtgt·································································(4)
σt=1t+1∑i=1t(gi)2\sigma^t=\sqrt{\frac{1}{t+1}\sum_{i=1}^{t}(g^i)^2}σt=t+11∑i=1t(gi)2····························································(5)
将(1)和(5)代入(4)中得:
wt+1←wt−η∑i=0t(gi)2gtw^{t+1}\gets w^t-\frac{\eta}{\sqrt{{\sum_{i=0}^t}(g^i)^2}}g^twt+1←wt−∑i=0t(gi)2ηgt······················································(6)
∙\bullet∙这时候就出现一个问题,我们可以看到在(3)中gtg^tgt的值越大那么在参数一定的情况下梯度下降的越快,但在(6)中gtg^tgt越大的话这一项的分母也会越大,这在一定程度上阻值了梯度下降的速度,那么这样设计有什么好处吗?
看一下下面这张图:

上面这个坐标系的横轴是xxx,纵轴是yyy;
下面这个坐标系的横轴是xxx,纵轴是y′y'y′。
可以看到,这个函数的最低点在x=−b2ax=-\frac{b}{2a}x=−2ab处,当刚开始处于x0x_0x0点时想要一下子就到达最低点那么
最优路线就是移动∣x0+b2a∣=∣2ax0+b∣2a|x_0+\frac{b}{2a}|=\frac{|2ax_0+b|}{2a}∣x0+2ab∣=2a∣2ax0+b∣的步长。
从这里可以总结出一个比较普遍的规律,那就是微分越大,该点的离最低点的距离就越大。但这只适用于参数个数为1的情况,当参数个数比较多的时候就不行了。

这个图中右边的w1w_1w1和w2w_2w2放反了。
这种情况下如果只看w1w_1w1这个参数(或者只看w2w_2w2)的话我们可以将它跟损失函数的关系曲线画出来,a点的梯度大于b点的梯度,同时a比b离最低点远(同理c点梯度大于d点梯度,c比b离最低点远)。但是如果比较c和a的话就会发现c的梯度大于a的梯度,但是c离最低点比较近。那么当有多个参数时该怎么办呢,下面来讨论一下。
这里的分子正是∣dydx0∣=∣2ax0+b∣|\frac{dy}{dx_0}|=|2ax_0+b|∣dx0dy∣=∣2ax0+b∣,而分母是d2ydx2\frac{d^2y}{dx^2}dx2d2y,即函数的二阶导数。
从图中可以看到如果求函数的二阶导数的话,w1w_1w1的二阶导数会比w2w_2w2的二阶导数小,故一阶导数和二阶导数相除就可以更好地确定学习率的大小了。
但是因为计算一个比较复杂的函数的导数就比较费劲儿了,如果再计算二阶导数的话就会更费劲,所以这里用∑i=0t(gi)2\sqrt{\sum_{i=0}^t(g^i)^2}∑i=0t(gi)2来代替二阶导数。
如上图所示,上面为原函数的图像,下面为它的导数的图像。可以看到函数对w1w_1w1求导总体上比函数对w2w_2w2求导要小,所以在左下方图像中取几个点做均方根的值小于在右下方取的。故一阶导数的均方根可以近似代替二阶导数。
Adagrad算法通过调整学习率解决梯度下降过程中速度与精度的矛盾。在参数距离最小值较远时采用较大η\etaη加速收敛,接近最小值时减小η\etaη避免震荡。Adagrad引入ηt=ηt+1\eta^t=\frac{\eta}
1349

被折叠的 条评论
为什么被折叠?



