(本文主要学习自该博主的文章:http://blog.csdn.net/itplus,以下是本人的笔记,主要记录了结论部分,省略了推导的部分。对具体推导过程有兴趣的同学请访问原博主的博客~)
拟牛顿法是求解非线性优化问题最有效的方法之一,其中DFP方法,BFGS方法以及L-BFGS方法都是重要的拟牛顿法。我们现在考虑如下无约束的极小化问题:
minxf(x),其中x=(x1,x2,...,xN)T∈RN
这里我们假定f为凸函数,且两阶连续可微,并且记该极小化问题的解为 x∗ 。
基本思想:在现有极小点估计值的附近对f(x)做二阶泰勒展开,进而找到极小点的下一个估计值。
当特征向量长度N=1时,可以构造如下的迭代格式,使f(x)收敛到极小点:
牛顿法
1.给定初值 x0 和精度阈值 ϵ ,并令 k:=0 .
2.计算 gk 和 Hk .
3.若 ||gk||<ϵ ,则停止迭代;否则确定搜索方向 dk=−H−1k∗gk .
4.计算新的迭代点 xk+1:=xk+dk .
5.令 k:=k+1 ,转至步2.
牛顿法具有二次收敛性,比梯度下降收敛速度要快得多。
牛顿法缺点:原始牛顿法由于迭代公式中没有步长因子,而是定步长迭代,对于非二次型目标函数,有时会使函数值上升,即出现 f(xk+1)>f(xk) 的情况。这表明原始牛顿法不能保证函数值稳定地下降,在严重的情况下甚至可能造成迭代点列 xk 的发散而导致计算失败。
为了消除原始牛顿法定步长的弊端,后来人们又提出了”阻尼牛顿法”。阻尼牛顿法每次迭代的方向仍采用 dk ,但每次迭代需沿此方向做一维搜索,寻求最优的步长因子 λk ,即
阻尼牛顿法
1.给定初值 x0 和精度阈值 ϵ ,并令 k:=0 .
2.计算 gk 和 Hk .
3.若 ||gk||<ϵ ,则停止迭代;否则确定搜索方向 dk=−H−1k∗gk .
4.计算迭代步长 λk ,并令 xk+1:=xk+λkdk
5.令 k:=k+1 ,转至步2.
但是牛顿法还存在着以下问题:
对目标函数有较严格的要求。函数必须具有连续的一、二阶偏导数,海森矩阵必须正定。
计算相当复杂。除需计算梯度以外,还需要计算二阶偏导数矩阵和它的逆矩阵。计算量、存储量均很大,且均以维数N的平方比增加,当N很大时这个问题更加突出。
为了克服牛顿法的缺点,人们又提出了拟牛顿法。这个方法的基本思想是:不用二阶偏导数而构造出可以近似海森矩阵(或海森矩阵的逆)的正定对称阵,在“拟牛顿”的条件下优化目标函数。而不同的构造方法就产生了不同的拟牛顿法。
在介绍具体的拟牛顿法之前,我们先推导一个拟牛顿条件。我们用B表示对海森矩阵H本身的近似,而用D表示对海森矩阵的逆 H−1 的近似,即 B≈H,D≈H−1 。 那么拟牛顿条件为:
这就是所谓的拟牛顿条件,它对迭代过程中的海森矩阵 Hk+1 作约束,因此分别用B和D作近似,可以将:
接下来,我们依次介绍几种常见的拟牛顿法。
该算法是最早的拟牛顿法,算法的名称是由3位作者的名字首字母命名的。该算法的核心是:通过迭代的方法,对 H−1k+1 做近似。迭代格式为:
DFP算法
1.给定初值 x0 和精度阈值 ϵ ,并令 D0=I,K:=0
2.确定搜索方向 dk=−Dk∗gk
3.利用阻尼牛顿法的公式得到步长 λk ,令 sk=λkdk,xk+1:=xk+sk
4.若 ||gk+1||<ϵ ,则算法结束
5.计算 yk=gk+1−gk
6.计算 Dk+1=Dk+sksTksTkyk−DkykyTkDkyTkDkyk
7.令 k:=k+1 ,转至步2
由于对 H−1 做了近似,因此最后能够以较快的速度得到近似解 xk 。可以看出,该算法的近似矩阵也是随着x的迭代不断的更新的。
BFGS算法也是由发明者的首字母命名的。与DFP算法相比,BFGS算法性能更佳,目前已经成为求解无约束非线性优化问题最常用的方法之一。BFGS算法已有较完善的局部收敛理论,对其全局收敛性的研究也取得了重要成果。
BFGS算法中核心公式的推导过程和DFP完全类似,只是互换了其中 sk 和 yk 的位置。BFGS是直接对海森矩阵做近似,即 Bk≈Hk ,且仍采用迭代方法,迭代格式为:
BFGS算法
1.给定初值 x0 和精度阈值 ϵ ,并令 B0=I,K:=0
2.确定搜索方向 dk=−B−1k∗gk
3.利用阻尼牛顿法的公式得到步长 λk ,令 sk=λkdk,xk+1:=xk+sk
4.若 ||gk+1||<ϵ ,则算法结束
5.计算 yk=gk+1−gk
6.计算 Bk+1=Bk+ykyTkyTksk−BksksTkBksTkBksk
7.令 k:=k+1 ,转至步2
可以看出,BFGS算法的过程也和DFP十分的类似。上述过程中的步2通常是通过求解线性代数方程组 Bkdk=−gk 来进行,然而,更一般的做法是对步6中的递推关系应用Sherman-Morrison公式,直接给出 B−1k+1 与 B−1K 之间的关系式:
设 A∈Rn 为非奇异方阵, u,v∈Rn ,若 1+VTA−1u≠0 ,则有:
BFGS算法(改进)
1.给定初值 x0 和精度阈值 ϵ ,并令 D0=I,K:=0
2.确定搜索方向 dk=−Dk∗gk
3.利用阻尼牛顿法的公式得到步长 λk ,令 sk=λkdk,xk+1:=xk+sk
4.若 ||gk+1||<ϵ ,则算法结束
5.计算 yk=gk+1−gk
6.计算 Dk+1=(I−skyTkyTksk)Dk(I−yksTkyTksk)+sksTkyTksk
7.令 k:=k+1 ,转至步2
可以看出,BFGS算法实际上和DFP算法的区别仅仅是D的迭代公式不同罢了。
最后,再补充谈一谈以为搜索的问题。之前的算法计算步长 λk 都属于一种精确搜索。实际应用中,还有像Wolfe型搜索,Armijo搜索以及满足Goldstein条件的非精确搜索。
在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.初始化:
δ={0,若k≤mk−m,若k>m;L={K,若k≤mm,若k>m;qL=gk
3.后向循环:
FORi=L−1,L−2,...,1,0DO{j=i+δ;αi=ρjsTjqi+1;qi=qi+1−αiyi;}
4:前向循环:
r0=D0∗q0;FORi=0,1,...,L−2,L−1DO{j=i+δ;βj=ρjyTjri;ri+1=ri+(αi−βi)sj;}
5.确定搜索方向 dk=−Dk∗gk=−rL6.利用阻尼牛顿法的公式得到步长 λk ,令 sk=λkdk,xk+1:=xk+sk
7.若 ||gk+1||<ϵ ,则算法结束。否则重新转到步2。
可以看出,L-BFGS和BFGS的区别就在于,L-BFGS可以用快速的方法算出搜索方向 −Dkgk ,其余的部分和BFGS是一样的。由于其较低的时空复杂度,L-BFGS是现在最广泛应用于大数据环境下的求解非线性优化的算法之一了。