本章总结优化学习率的知识,而前置知识就是“线性回归、梯度下降算法”,因此如果这一章你看的云里雾里甚至连学习率是什么都不知道的话就需要先吧前置知识搞定了。
其他说明
因为本总结的前置知识是“线性回归、梯度下降算法”,所以之后的内容都是以“求目标函数f(x)的极小值”为目的。
不过不用担心求极大值的话该怎么办,因为直接给f(x)加个负号就将问题转换为了求极小值问题了。
在顺便一提,个人感觉正因为研究了这么多求极小值的东西,于是大伙为了省事,就凡是遇到求极大值的问题则先将其转成求极小值,于是乎会经常看到这句话“习惯上我们将其转换成求极小值”....
牛顿法
首先先问个问题:如果搜索方向不是梯度方向的话,是否可以?即:使用另外一个方向来求函数的极小值可以吗?
答案是肯定的,如下图所示:
我在xk点处拟合一条二次曲线,然后对该二次曲线求极值后找到xk+1 = xk+dk点,这样就找到了一个比f(xk)更小的值f(xk+1),之后迭代此过程就找到最小值了。
而上面这个二次曲线的方向就是牛顿方向,这种方法就是牛顿法。
不过因为牛顿法可能会产生下图所示的问题
即名为在xk处拟合一条二次曲线后求得的xk+1 = xk+dk“跑过了”,从而无法使函数收敛,再加上其他一些原因,所以实际工作中一般不使用牛顿法而使用拟牛顿法。
不过为了记录,牛顿法的xk+1 的求法还是贴这里:
xk+1= xk - f’(xk)/f’’(xk) 式1
这个公式的来历如下:
利用Taylor公式对f(x)进行二次展开(当然,前提是f(x)的二阶导连续):
φ(x) = f(xk) + f’(xk)(x-xk)+ (1/2)f’’(xk)(x-xk)2 + R2(x)
舍弃高阶余子式后求导:
φ’(x) = f’(xk) + f’’(xk)(x-xk)
另φ’(x) = 0:
xk+1= xk - f’(xk)/ f’’(xk)
PS1:把上面的公式推广到多维的方法是“用方向导数代替一阶导,用Hessian矩阵代替二阶导”,即: xk+1 = xk - H-1▽f(xk),这里xk和xk+1都是向量,H-1代表Hessian矩阵的逆矩阵。
PS2:为什么式1能对应上牛顿方向的曲线不太明白,如果你知道的话可否在评论里告诉我,或者发个链接,或者告诉让我查什么知识点都好,不胜感激。
拟牛顿
正如上图所示,牛顿法的缺点是:本来我们在xk处沿着梯度方向是可以下降并找到极值点的(这是一阶,只求了个一阶导嘛),但沿着二阶收敛(还有二阶导,为什么?再看看牛顿法的公式)的方向去优化时反而升上去了。即:本来一阶能收敛的,可到了二阶可能不收敛,于是就在想:能不能搞一个比一阶梯度下降快一点,但效率有达不到二阶的牛顿法那样,但是却实实在在能收敛的方法呢?于是就做了个像牛顿的方向,这就有了拟牛顿法。
为了方便说明,这里在贴下牛顿法的公式:
xk+1= xk - H-1▽f(xk),这里xk和xk+1都是向量
而拟牛顿就是用一个近似矩阵代替Hessian矩阵或者Hessian矩阵的逆矩阵。
实践中常用的拟牛顿算法有:
DFP:Davidon - Fletcher - Powell
BFGS:Broyden - Fletcher - Goldfarb - Shanno
DFP
首先在回顾一下下面两个知识点:
一阶梯度下降:xk+1 = xk - α▽f’(xk)
二阶牛顿法:xk+1 = xk - α▽f’(xk)/ ▽f’’(xk)
然后开始讲解DFP的推导过程。
PS:下面的θ相当于上面的x,即之前都是说函数f(x),下面就说函数f(θ)了,这没什么特别含义,就是一会需要截图....
记函数f(θ)的梯度为g(θ),二阶导函数为H(θ)。
PS:若θ是n维向量,那g(θ)也是n维向量,H(θ)是n*n的矩阵。
接下来就和利用Taylor展开求得牛顿法的公式一样,利用Taylor展开来推导DFP,从而有了下面的推导过程:
解释:
第一行:Taylor展开
第二行:舍弃高阶余子式得到
第三行:求导得到,其中第二行最后一部分的求导利用了这个知识点:当矩阵A是对称阵(A = AT)时,xT·A·x 对x求偏导的结果是: 2A·x,而Hession矩阵就是对称阵。
第四行:既然这个式子对θi成立,那对θi-1也一定成立
第五行:把g(θi)简写成gi,g(θi-1)简写成gi-1
第六行到第七行:使用图右下角的式子对第六行做个替换。
结果, 就是上面的最后一个式子:
Ci△gi = △θi
即:
Hession矩阵的逆 * 梯度的变化量 = 自变量的变化量
现在就知道了,我们的目标是算Ci,因为:
对于牛顿法:xk+1 = xk - H-1▽f(xk),如果能求出H-1,那这个式子就完全搞定了。
而这个也同理啊,就Ci最欠求....
那怎么求Ci呢?方法就是对Ci做下面这个近似计算,即:Ci可能和Ci-1有点关系,即:
Ci= Ci-1 + △C。
因为Ci是Hession矩阵,所以△C也需要是一个方阵,于是另:
△C =av·vT,u是个列向量
即:
Ci= Ci-1 + av·vT
但是在实践时发现Ci 和 Ci-1 + av·vT
过于近似了,于是把上面的式子修改为:
Ci= Ci-1 +ai-1v i-1·v i-1T+ b i-1ui-1·u i-1T 式2
好了,现在就有下面两个式子:
把上面的第二个式子代入第一个式子就有:
Ci-1△gi + ai-1vi-1vi-1T△gi + b i-1u i-1·u i-1T△gi = △θi 式3
现在看看上面的式子,其中已知的有:
△θi(当前的自变量 - 上一次的自变量)
△gi(当前的梯度 - 上一次的梯度)
Ci-1(上一次用到的Ci-1)
未知的有:α、v、β、u
而因为,如果令式3的
Ci-1△gi = -b i-1u i-1·u i-1T△gi
ai-1vi-1vi-1T△gi = △θi
的话,式3的等号就满足了。
于是定义:
ui-1 = Ci-1△gi ①
b i-1u i-1T△gi = -1
vi-1= △θi ②
ai-1vi-1T△gi = 1
从而求出
ai-1= 1/(vi-1T△gi) ③
bi-1 = -1/(u i-1T△gi) ④
将①②③④代入式2后就得到了DFP算法的迭代公式:
式4
于是还记得牛顿法的公式吗?即:
xk+1= xk - H-1▽f(xk)
现在使用DFP找到了一个可以近似代替H-1的矩阵Ci,那就用Ci代替H-1,从而得到拟牛顿的式子:
xk+1 = xk -Ci▽f(xk)
不过实际使用中往往给Ci▽f(xk)加上一个很小的参数α,如α=0.01,从而形成带阻尼的拟牛顿,即:
xk+1 = xk - αCi▽f(xk)
DFP算法的迭代公式的代码(来自小象学院的邹博老师)
A和B就是式4等号的右边的第二项和第三项
BFGS
数学家使用了DFP几年后发现可以这么考虑:
对于DFP算法,我们已经知道其由下面的式子
式子组1
求得最终结果
式5
那如果把式子组1的第一个式子两边同时乘以Ci-1后得到:
△gi = Hi△θi
PS:因为Ci =Hi-1
式子组1的第二个式子做同样的思考,让Hession矩阵等于这样的迭代的话就有:
Hi= Hi-1 +ai-1v i-1·v i-1T+ b i-1ui-1·u i-1T
即,有式子组
那同理啊,我们可以得出下面的结论:
式6
对比下式5和式6,可以看出:
式5求得是Hession矩阵的逆矩阵
式6求得就是Hession矩阵
既然如此,那有没有办法直接求Hession的逆呢?有,答案就是BFGS算法。
PS:DFP算法的Ci虽然也是Hession的逆,但DFP算法会产生一些问题,于是就沿着DFP的方向研究出了BFGS算法,就好像IPv4和IPv6的关系一样。
下面的目标就是求式6的的逆。
这里我们利用Sherman-Morrisong公式,即:若A是n阶可逆矩阵,u、v为n维列向量,若 vTA-1u≠ -1,则
式7
然后:
1,把式6等号右边的前两项看成A
2,式6的Hi-1△θi看成x,第三项分母看成是a的话(分母的结果是个数),第三项就是(x/a) * xT,再把x/a看成u,x看成v
3,这样式6就对应到式7了,此时进行使用一次Sherman-Morrisong公式
4,在把式6等号右边前两项的Hi-1看成A,△gi/(△giT△θi)看成u,△gi看成v后在使用一次Sherman-Morrisong公式,最终得到下面的结果:
这就是BFGS算法的公式。
代码(来自小象学院的邹博老师)
使用方法,如下面的Logistics回归:
代码中的C就是BFGS算法的公式中的Ci,如果C是单位阵那拟牛顿就退化为了梯度下降,反之就是拟牛顿,即,对于w = w + alpha * C.dot(g),如果C是单位阵,那C.dot(g)就是g本身,如果C不是单位阵,那就用hessian_r求Hession的逆矩阵就好。
最后
有个L-BFGS有兴趣可以自己搜搜,这个我还没研究。