从牛顿法到L-BFGS的算法演变

前言

(本文主要学习自该博主的文章:http://blog.csdn.net/itplus,以下是本人的笔记,主要记录了结论部分,省略了推导的部分。对具体推导过程有兴趣的同学请访问原博主的博客~)

  拟牛顿法是求解非线性优化问题最有效的方法之一,其中DFP方法,BFGS方法以及L-BFGS方法都是重要的拟牛顿法。我们现在考虑如下无约束的极小化问题:

minxf(x),x=(x1,x2,...,xN)TRN

  这里我们假定f为凸函数,且两阶连续可微,并且记该极小化问题的解为 x

牛顿法

  基本思想:在现有极小点估计值的附近对f(x)做二阶泰勒展开,进而找到极小点的下一个估计值。

  当特征向量长度N=1时,可以构造如下的迭代格式,使f(x)收敛到极小点:

xk+1=xkf(xk)f(xk),k=0,1,...

  当N>1的情况下,需要对二阶泰勒展开做推广。设 f 为f的梯度向量(记做 gk ), 2f 为f的海森矩阵(Hessian matrix,记做 Hk ),其定义分别为:
f=fx1fx2...fxN,2f=2fx212fx2x1...2fxNx12fx1x22fx22...2fxNx2............2fx1xN2fx2xN...2fx2NNN

  于是我们同样可以构造出迭代格式(需要 Hk 非奇异,即行列式不为0的方阵)
xk+1=xkH1kgkk=0,1,..

  接下来是完整的牛顿法算法描述:

牛顿法

1.给定初值 x0 和精度阈值 ϵ ,并令 k:=0 .

2.计算 gk Hk .

3.若 ||gk||<ϵ ,则停止迭代;否则确定搜索方向 dk=H1kgk .

4.计算新的迭代点 xk+1:=xk+dk .

5.令 k:=k+1 ,转至步2.

  牛顿法具有二次收敛性,比梯度下降收敛速度要快得多。

  牛顿法缺点:原始牛顿法由于迭代公式中没有步长因子,而是定步长迭代,对于非二次型目标函数,有时会使函数值上升,即出现 f(xk+1)>f(xk) 的情况。这表明原始牛顿法不能保证函数值稳定地下降,在严重的情况下甚至可能造成迭代点列 xk 的发散而导致计算失败。


阻尼牛顿法

  为了消除原始牛顿法定步长的弊端,后来人们又提出了”阻尼牛顿法”。阻尼牛顿法每次迭代的方向仍采用 dk ,但每次迭代需沿此方向做一维搜索,寻求最优的步长因子 λk ,即

λk=argminλRf(Xk+λdk)

  下面给出一个阻尼牛顿法的完整算法描述.

阻尼牛顿法

1.给定初值 x0 和精度阈值 ϵ ,并令 k:=0 .

2.计算 gk Hk .

3.若 ||gk||<ϵ ,则停止迭代;否则确定搜索方向 dk=H1kgk .

4.计算迭代步长 λk ,并令 xk+1:=xk+λkdk

5.令 k:=k+1 ,转至步2.

  但是牛顿法还存在着以下问题:

  • 对目标函数有较严格的要求。函数必须具有连续的一、二阶偏导数,海森矩阵必须正定。

  • 计算相当复杂。除需计算梯度以外,还需要计算二阶偏导数矩阵和它的逆矩阵。计算量、存储量均很大,且均以维数N的平方比增加,当N很大时这个问题更加突出。


拟牛顿法

  为了克服牛顿法的缺点,人们又提出了拟牛顿法。这个方法的基本思想是:不用二阶偏导数而构造出可以近似海森矩阵(或海森矩阵的逆)的正定对称阵,在“拟牛顿”的条件下优化目标函数。而不同的构造方法就产生了不同的拟牛顿法。

  在介绍具体的拟牛顿法之前,我们先推导一个拟牛顿条件。我们用B表示对海森矩阵H本身的近似,而用D表示对海森矩阵的逆 H1 的近似,即 BH,DH1 。 那么拟牛顿条件为:

ykHk+1skskH1k+1yksk=xk+1xk,yk=gk+1gk

  这就是所谓的拟牛顿条件,它对迭代过程中的海森矩阵 Hk+1 作约束,因此分别用B和D作近似,可以将:

yk=Bk+1sksk=Dk+1yk

  作为指导。

  接下来,我们依次介绍几种常见的拟牛顿法。


DFP算法

  该算法是最早的拟牛顿法,算法的名称是由3位作者的名字首字母命名的。该算法的核心是:通过迭代的方法,对 H1k+1 做近似。迭代格式为:

Dk+1=Dk+Dk,k=0,1,2,...

  其中的 D0 通常取为单位矩阵I。因此,关键是每一步的校正矩阵 Dk 如何构造。求解过程我这里就先略过了,以下是最后完整的DFP算法。

DFP算法

1.给定初值 x0 和精度阈值 ϵ ,并令 D0=I,K:=0

2.确定搜索方向 dk=Dkgk

3.利用阻尼牛顿法的公式得到步长 λk ,令 sk=λkdk,xk+1:=xk+sk

4.若 ||gk+1||<ϵ ,则算法结束

5.计算 yk=gk+1gk

6.计算 Dk+1=Dk+sksTksTkykDkykyTkDkyTkDkyk

7.令 k:=k+1 ,转至步2

  由于对 H1 做了近似,因此最后能够以较快的速度得到近似解 xk 。可以看出,该算法的近似矩阵也是随着x的迭代不断的更新的。


BFGS算法

  BFGS算法也是由发明者的首字母命名的。与DFP算法相比,BFGS算法性能更佳,目前已经成为求解无约束非线性优化问题最常用的方法之一。BFGS算法已有较完善的局部收敛理论,对其全局收敛性的研究也取得了重要成果。

  BFGS算法中核心公式的推导过程和DFP完全类似,只是互换了其中 sk yk 的位置。BFGS是直接对海森矩阵做近似,即 BkHk ,且仍采用迭代方法,迭代格式为:

Bk+1=Bk+Bk,k=0,1,2,...

  最后我们给出BFGS算法的完整描述:

BFGS算法

1.给定初值 x0 和精度阈值 ϵ ,并令 B0=I,K:=0

2.确定搜索方向 dk=B1kgk

3.利用阻尼牛顿法的公式得到步长 λk ,令 sk=λkdk,xk+1:=xk+sk

4.若 ||gk+1||<ϵ ,则算法结束

5.计算 yk=gk+1gk

6.计算 Bk+1=Bk+ykyTkyTkskBksksTkBksTkBksk

7.令 k:=k+1 ,转至步2

  可以看出,BFGS算法的过程也和DFP十分的类似。上述过程中的步2通常是通过求解线性代数方程组 Bkdk=gk 来进行,然而,更一般的做法是对步6中的递推关系应用Sherman-Morrison公式,直接给出 B1k+1 B1K 之间的关系式:

B1k+1=(IskyTkyTksk)B1k(IyksTkyTksk)+sksTkyTksk

   注:Sherman-Morrison公式:

  设 ARn 为非奇异方阵, u,vRn ,若 1+VTA1u0 ,则有:

(A+uvT)1=A1A1uvTA11+vTA1u

  注意,为了避免出现矩阵求逆符号,我们统一将 B1i 换成 Di (看过去更加简洁)。这样,整个算法中不再需要求解线性代数方程组,由矩阵-向量运算就可以完成了。

BFGS算法(改进)

1.给定初值 x0 和精度阈值 ϵ ,并令 D0=I,K:=0

2.确定搜索方向 dk=Dkgk

3.利用阻尼牛顿法的公式得到步长 λk ,令 sk=λkdk,xk+1:=xk+sk

4.若 ||gk+1||<ϵ ,则算法结束

5.计算 yk=gk+1gk

6.计算 Dk+1=(IskyTkyTksk)Dk(IyksTkyTksk)+sksTkyTksk

7.令 k:=k+1 ,转至步2

  可以看出,BFGS算法实际上和DFP算法的区别仅仅是D的迭代公式不同罢了。

  最后,再补充谈一谈以为搜索的问题。之前的算法计算步长 λk 都属于一种精确搜索。实际应用中,还有像Wolfe型搜索,Armijo搜索以及满足Goldstein条件的非精确搜索


L-BFGS算法

  在BFGS算法中,需要用到一个N*N的矩阵 Dk ,当N很大时,存储这个矩阵将变得很占计算机内存。那么,是否可以通过对BFGS算法进行改进,从而减少其迭代过程中所需的内存开销呢?

  答案是肯定的,L-BFGS(Limited-memory BFGS 或 Limited-storage BFGS)算法就是这样一种算法。它对BFGS算法进行了近似,其基本思想是:不再存储完整的矩阵D,而是存储计算过程中的向量序列{si},{yi},需要矩阵D时,利用向量序列{si},{yi}的计算来代替。而且,向量序列{si},{yi}也不是所有的都存,而是固定存最新的m个(参数m可由用户根据自己机器的内存自行指定)。每次计算D时,只利用最新的m个{si}和m个{yi}。显然,这样一来,空间复杂度由原来的 O(N2) 降到了 O(mN)

  这样其实是对D的一个近似计算,因为我们舍弃了一些向量,推导过程也很复杂,这里就不具体写了,我们只看结论。L-BFGS由于能够用近似算法得到搜索方向L-BFGS的具体算法如下:

L-GFGS算法

1.给定初值 x0 和精度阈值 ϵ ,并令 K:=0

2.初始化:

δ={0kmkm,k>m;L={Kkmmk>m;qL=gk

3.后向循环:
FORi=L1,L2,...,1,0DO{j=i+δ;αi=ρjsTjqi+1;qi=qi+1αiyi;}

4:前向循环:
r0=D0q0;FORi=0,1,...,L2,L1DO{j=i+δ;βj=ρjyTjri;ri+1=ri+(αiβi)sj;}

5.确定搜索方向 dk=Dkgk=rL

6.利用阻尼牛顿法的公式得到步长 λk ,令 sk=λkdk,xk+1:=xk+sk

7.若 ||gk+1||<ϵ ,则算法结束。否则重新转到步2。

  可以看出,L-BFGS和BFGS的区别就在于,L-BFGS可以用快速的方法算出搜索方向 Dkgk ,其余的部分和BFGS是一样的。由于其较低的时空复杂度,L-BFGS是现在最广泛应用于大数据环境下的求解非线性优化的算法之一了。

你可能感兴趣的:(知识整理,常用基本算法,数据挖掘,机器学习,数学建模)