转载自https://www.2cto.com/kf/201607/526447.htmlhtml
本章总结优化学习率的知识,而前置知识就是“线性回归、梯度降低算法”,所以若是这一章你看的云里雾里甚至连学习率是什么都不知道的话就须要先吧前置知识搞定了。算法
由于本总结的前置知识是“线性回归、梯度降低算法”,因此以后的内容都是以“求目标函数f(x)的极小值”为目的。函数
不过不用担忧求极大值的话该怎么办,由于直接给f(x)加个负号就将问题转换为了求极小值问题了。学习
在顺便一提,我的感受正由于研究了这么多求极小值的东西,因而大伙为了省事,就凡是遇到求极大值的问题则先将其转成求极小值,因而乎会常常看到这句话“习惯上咱们将其转换成求极小值”....优化
以梯度降低说明。spa
假设我将学习率固定为1时须要迭代10次才会收敛的话,那若是我将学习率改成第一次步长为8,第二次步长为2,则可能两次就收敛了。(这里的数字不太准确,但大概是这样的意思)htm
很明显,后者的收敛速度更快,而上面对学习率的调整就是优化学习率。blog
PS:就好像一我的下山,若是他以每步1M步伐下山可能要走10小时,那若他一开始以每步8M,而后等走了一半多了在每步2M的话,则到达山脚的时间会明显缩短。ci
话说,虽然在写这片文章时我还没入这一行,但我听到的都是些“工做时不少时候就拍脑门选一个学习率就好,若感受收敛太慢就调大些”这样的内容,感受不必在这上面花费太多功夫。table
不过我的感受,若是能把这个知识掌握了,那工做起来会事半功倍。
这个得一点点讲了。
既然咱们的目标是优化学习率,那咱们须要先转换下视角:你看啊,对于某个函数,若是咱们的目标就是求函数中的参数x,那咱们就将函数当作是关于x的函数。同理,既然这里的目标是函数中的学习率α,那咱们就将函数看做是关于α的函数。又由于通常函数模型是:f(xk+αdk),其中dk是搜索方向(如对梯度降低来讲,dk是负梯度方向),因此在转换视角后,咱们将其看做是关于α的函数h(α),即:
h(α)= f(xk+αdk)
PS:通常学习率是大于0的,即α>0
既然已是关于α的函数了,那对于梯度降低来讲咱们的目标就从“x为多少时函数的值最小 -- 注:样本xk是已知的,当前的搜索方向dk即梯度也能够求出来,只不过哪一个xk会使函数最小不知道”,即:
arg_xmin f(xk+αdk)
变成了“在给定xk和dk的前提下,寻找α为多少时,能让函数降低的最快”,即:求对关于α的函数h(α)求“α = ? 时,函数h(α)最小”。
这就简单了,对h(α)求导并另导数为0呗,即:
h’(α)= ▽f(xk+αdk)Tdk= 0
这样求得的α就是一个对当前xk的一个十分优秀的学习率α。
画个图的话就像这样:
之前学习率固定时,可能每次只降低这么多:
经过上面的方法就能一次性降低这么多(粉线是切线)
不过,若是你细心的话如今应该有点绕,即:h(α) 不就是 f(xk+αdk) 吗?那我对h(α) 求导后找到个最小值不就是f(xk+αdk)的最小值吗?按照这里理论,我不就一次性让函数收敛了?怎么上面的图尚未一次性收敛?你画错了吧!
嘛,上面的图的确有些不许确,是帮助理解而已,所以我要补充下面这句话:对h(α)求导并让导数为0后能够获得一个对当前xk的十分优秀的学习率α,但这个α可能并不能让原函数一次性收敛。
缘由是:咱们以前经过“视角转换”将函数变成了关于α的函数h(α),因此若是画坐标轴的话,那坐标轴的x轴就变成了α轴,即:函数图像会变成关于α的图像(这和原函数的图像是不一样的)。因而对h(α)求导并让导数为0后能够得出一个关于α的图像的极小值点,这时就获得了一个“对当前xk的一个十分优秀的学习率α”,但由于“关于α的图像和原函数的关于x的图像是两个图像”,因此这个α可能并不能让原函数一次性收敛。
不过,虽然不能让原函数一次性收敛,但不管如何,也比固定α好,对吧。
一、使用原函数对α求导,求出学习率α;
二、按照搜索方向更新函数(如梯度降低)
三、重复上面两步直到收敛。
说实话啊,虽然上面的步骤没问题,但若是计算h’(α)=0十分恶心咋办?
难道(╯‵□′)╯︵┻━┻不求了?
固然能够!
且听我一一道来。
首先,对于f(xk+αdk),若是令α = 0的话就有:
h’(0)= ▽f(xk +0*dk)Tdk = ▽f(xk)Tdk
上面的▽f(xk)是梯度(这是对原函数求导啊),dk是搜索方向,若是令dk为负梯度方向即:dk = -▽f(xk) 的话,就有:h’(0) < 0,即α = 0时,h’(0) < 0。
这时若是咱们找到一个足够大的α,使得h’(α)>0的话,则必存在某α,可使h’(α)=0,而这个α就是咱们要寻找的学习率。
于!是!使用折半查找就OK了!如:
对于h’(α1)< 0、h’(α2) > 0
若h’( (α1+α2)/2 ) < 0,那就另a1 = (α1+α2)/2
若h’( (α1+α2)/2 ) > 0,那就另a2 = (α1+α2)/2
重复上面的步骤,直到找到h’(α)=0,这样就找到了α。
上面的折半查找已经很方便了,但以h’(α)=0做为是否找到α的条件还有些麻烦,而使用回溯线性搜索的Arimijo准则做为判断条件就很方便了。
首先是Armijo准则:首先给一个较大的学习率,而后不断缩减学习率,若是对于函数f(xk+αdk)当前的学习率使函数从当前的位置f(xk)的减少必定程度后还大于预设的指望值,那这个学习率就符合要求了。
什么意思?你看,对于函数f(xk+αdk),既然是求最小值,那对于当前的值f(xk)减少必定程度后就有个新值f(xk+1),因而,若是咱们将f(xk+1)做为预设的指望值,即咱们但愿f(xk)在某个学习率α的状况下减少必定程度后能够到达f(xk+1),那这个α就是咱们但愿获得的α了对吧。而由于 这个减少程度在Armijo准则中是公式:
c1α▽f(xk)Tdk,c1∈(0, 1)
由于dk通常取梯度负方向,因此用式子表达上面的话的话就是:
f(xk+1)= f(xk) + c1α▽f(xk)Tdk,c1∈(0, 1)
可是在计算中实现上面的等号挺麻烦的,由于咱们是不断缩减学习率,只要咱们缩减的程度没把握好,就会有“上一个还f(xk+1) < f(xk) + c1α▽f(xk)Tdk,下一个就f(xk+1) > f(xk) +c1α▽f(xk)Tdk”的状况。
因而为了方便,只要f(xk+1) ≤ f(xk) + c1α▽f(xk)Tdk就OK了,而这就是Armijo准则的方程。
PS:为何要给一个较大的学习率后还不停的缩减?直接选这个较大的学习率不就行了? 看下图: 若是学习率太大一会儿从x1走到了x2的话,那还求个屁的最小值啊。 因而咱们就先规定个指望值,好比:你此次降低到f(x3)就好了。这样就能控制学习率为一个咱们指望的值了。 |
二分线性搜索的目标是求得知足h’(α)≈0的最优步长近似值,而回溯线性搜索放松了对步长的约束,只要步长能使函数值有足够大的变化便可。
二分线性搜索能够减小降低次数,但在计算最优步长上花费了很多代价;回溯线性搜索找到一个差很少的步长便可。
红框:若传来的学习率a不知足h’(a) > 0就将a扩大2倍,所以到达绿色框的代码时a已经知足h’(a) > 0。或者说红框中是为了找到“第一个”不知足函数降低的学习率。正常状况下,只要沿着负梯度方向降低微小的值,next<now是恒成立的,所以,不断执行红框的代码,能够不断抬高学习率,直到发现不知足条件的(即:“步子太大”),从而保证接下来绿框中的有效执行。< p="">
绿框: 若是学习率不知足Armijo准则,就把学习率a降一半,看看新的学习率是否知足。
最后返回学习率。
怎么还没完啊?
我也这样想过,但改进是永无止境的,认命吧- -....
不过在介绍插值法以前还得再说个很简单的预备知识,以下:
若是知道3个点,那就能够肯定一个二次曲线通过这三个已知点,换句话说为了肯定一个二次曲线就须要3个类型的信息,所以咱们就能够这样想:若是题目给定了在一个点x1处的函数值y1=f(x1)、在该点处的切线值即x1处的导数值f’(x1)、x2点处的函数值y2=f(x2),那么也是能惟一的肯定一个二次函数,看下图:
而若是x1=0,x2=a的话,那这个二次函数的方程就是下面的样子:
PS:这个是这样算出来的: 假设这个二次函数的方程是 f(x) = px2 + qx + z,由于f(0)、f’(0)、f(a)是已知的,f’(x)的能够求出来,即f’(x) = 2px + q,那把这三个值代入f(x)和f’(x)就能够把p、q、z求出来了,就得出上面的式子了。
对这个式子求极值的方法是:
假设式子为:h(a) = qx2 + px + z
则x在 - p/(2q) 处能够取得极值
这是初中的知识,因此别问为何,像初中生同样直接拿去用就好。
好了预备知识说完了,下面介绍插值法。
通过前面的内容已经知道:咱们找学习率a的方法是,找一个h’(a) < 0,一个h’(a) > 0,而后不停的二分查找,直到h’(a) = 0。
那有没有一个更好的方法?有的。
首先,对于学习率a,其函数h(a)是一个二次函数。
PS:一个a代入h(a)有一个值,最后就是在以a为横轴h(a)为纵轴的坐标轴上画了一条弯曲的曲线,这是个二次曲线没问题吧
而后对于这个二次函数咱们总结下已知的信息:
1,h(a)必定通过两个点:a=0处的值h(0)、当前的准备尝试的学习率a0的值h(a0)。其中h(0)就是当前的函数值f(xk),由于对于h(α) = f(xk+αdk),若是a=0,就有h(0) = f(xk);而当前准备尝试的学习率若是知足Armijo准则就直接返回该学习率,不然才须要找个更好的学习率。
2,当前xk处的的导数能够求出来,即f’(xk)已知,也就是h’(0)已知。
即 :已知h(0)、h’(0)、h(a0)
接下来利用刚才的预备知识,咱们就能够构造出一个二次函数来近似学习率a的曲线了,即:
PS:这个只是近似,由于只是经过3个数据来肯定的曲线,和真正的h(a)是有些不一样的,不过,虽然这条曲线和真正的曲线有些偏差,但可使用,这就足够了。
而咱们的目标是什么来着?对,求h’(a)=0时的a,也就是求h(a)的极值,那就直接利用初中的知识
式1
求hq(a)的极值就OK了,这多简单,初中生都会。
1,利用式1求a1
2,若a1知足Armijo准则,则输出该学习率,不然继续迭代。
通常的说,回溯线性搜索和二次插值线性搜索可以基本知足实践中的须要。