本文主要参考自:李宏毅Machine Learning P5(Gradient Descent),在此基础上融入一些自己的理解.
Adaptive Learning Rates 自适应学习率
前因:”不管是机器学习还是深度学习,学习率都是一个非常重要的超参数。如果学习率过大,模型将无法收敛,过小又收敛过慢,那有没有自动调整学习率的办法呢?
a. 一个简单的想法: Reduce the Learning Rate by some factor every epochs. (合适的学习率应该随着参数的更新变得越来越小)
通常在初始状态,参数距离最优参数点距离较远,这时候需要迈大步子。而经过一段时间的更新之后,离最优点的距离越来越紧,这时又需要迈小步子。例如,可以设置如下Learning Rate更新公式可以达到这种效果:
![](https://i-blog.csdnimg.cn/blog_migrate/0601f28451501d8cf686d3c12901bcfd.png)
其中,t为迭代次数
b. 学习率设置不能一刀切: 模型中不同的参数应该设置不同的学习率,例如Adagrad,其核心思想在于每个参数都与之前的梯度相关,将学习率除以累积梯度的均方根,下面详细讲一讲Adagrad。
Adagrad 优化器
首先看普通的梯度下降是如何进行的,其中w为模型的一个参数:
![](https://i-blog.csdnimg.cn/blog_migrate/eb49a3c865bba46144276204dd909672.png)
再看Adagrad是怎么做的:
![](https://i-blog.csdnimg.cn/blog_migrate/b995810f7ed5d5db5f3dd4c18a651f58.png)
每次更新时,学习率会除以一个σt,σt为参数w在之前更新过程中所产生的梯度累积。
Adagrad参数更新实例:
![](https://i-blog.csdnimg.cn/blog_migrate/ab43436a53120bf398c7a22592573c43.png)
要注意每个参数的梯度累积都是不一样的,所以能满足上一节提到的
想法b
然后再融合想法a,随着参数更新的进行学习率逐渐衰减。Adagrad的最终的形式为:
![](https://i-blog.csdnimg.cn/blog_migrate/f0d080f016e8f435b3ba1f4efa71d143.png)
问题:在普通的梯度下降中,梯度越大,每次更新的步子也就越大,这是符合常理的,因为gradient越大,往往当前参数距离最优点也越远。但在Adagrad
中,由于η
的分母部分与梯度成正比,这样会导致梯度越大,步长反而越小。
解释:
- Adagrad表示
How Surperise it is(体现反差)
,示例如下,Adagrad
会强调当前的反差,如果梯度突然变大或变小,通过Adagrad会表现出它的反差(比如,对于突然变大的梯度,我们给予更多的关注,步长也就越大;对于突然变小的导数,步长越小)。
![](https://i-blog.csdnimg.cn/blog_migrate/2415441640773267aa01e694887cbf39.png)
其实对于这个解释我不是很赞同,可能是我还理解得不够清楚,希望大佬在评论区指点。
- 其次当前梯度越大,其离最优点越远是相对于只考虑一个参数来说的,如下图a。但目前的模型中通常含有非常多的参数,很难在特征空间中衡量距离最优点的远近,如下图b。
a 单参数图:
![](https://i-blog.csdnimg.cn/blog_migrate/438bb500671041d79f9950d0fb72e5ae.png)
多参数:
![](https://i-blog.csdnimg.cn/blog_migrate/2b0e8106f6fa6dabea9b3d5c384f6388.png)
只考虑单参数,对于
w1
来说,a的导数比b大,因此a比b距离optimal更远;对于w2
来说,c的导数比d大,c比d距离optimal更远。但考虑多个参数之后,即使c的导数比a大,但说c比a距离最优点更远显然是错的。
上面的例子反映了如果仅靠梯度来衡量距离的远近,对于多参数的模型来说是不可靠的。那么,怎么才能正确反映参数与最优点之间的距离,从而决定步长的大小呢?
- 衡量距离时不单单要考虑一阶导,还需要考虑二阶导,如下图所示,x0与最优点的距离其实是一阶导除以二阶导。
![](https://i-blog.csdnimg.cn/blog_migrate/fe324d109dfa3fc049498e13d0c6b048.png)
- 但在很多时候,求二阶导是复杂的,需要耗费很多时间,甚至有些时候根本无法计算二次微分。因此,Adagrad要做的事情就是,让分母部分起到二阶导的效果(使用一次微分估计二次微分)。
Adagrad的分母部分将之前所有的一阶导结果考虑进来求
L2范数
。但这样为什么能代表二次微分呢?
![](https://i-blog.csdnimg.cn/blog_migrate/c75622685ec2f32aa7e8557ff541638b.png)
如上图所示,求得两个函数的一阶导数形式,在一阶导上采集一批样本并得到对应的值,求得这批数据的L2范式能在一定程度上代表它们对应的二阶导大小。例如蓝色函数上采样求L2范式的结果要比绿色函数小,这也反应了它们的二阶导差异。
Feature Scaling 尺度归一化
在机器学习中,通常会进行尺度来使得各特征拥有相同的尺度,主要起到以下两点作用:
- 消除特征间单位和尺度差异的影响,同等看待每维特征:
![](https://i-blog.csdnimg.cn/blog_migrate/0ca8b6cbdc07e4d73cedaf7e1834200c.png)
- 在使用梯度下降时,归一化后的损失函数会更趋向于圆形,这使得梯度下降效率更高,减少了更新时的loss震荡,从而更快到达圆心(最优点)。
![](https://i-blog.csdnimg.cn/blog_migrate/e72af08e309b501855fc28dbf20b412e.png)
关于Feature Scaling的深层理解可以参考这个blog,写得很好.
https://www.cnblogs.com/shine-lee/p/11779514.html