共轭方向法是介于最速下降法和Newton法之间的一种方法。克服了最速下降法的锯齿现象,从而提高了收敛速度;同时,共轭方向法的迭代公式比较简单,不必求目标函数的Hesse矩阵,比Newton法减少了计算量和存储量。是一种比较实用而且有效的方法。
在讲共轭方向法和共轭梯度法之前,先对共轭向量进行说明。
共轭向量及其性质
定义1:(共轭方向) Q是
当
定理1: 若非零向量 p0,p1,⋅⋅⋅,pm−1是 Q共轭的,则他们是线性无关的。
推论1: 在n维的向量空间中,非零的共轭向量个数不超过n。
定义2: 设
基本思想
在考虑普通函数之前,我们首先用2元正定二次函数进行讲解。首先考虑如下的正定二次函数
在第二次迭代过程中我们不适用 −∇f(x1)作为这次迭代的搜索方向,我们想直在第二次迭代之后能直接到达最优点 x∗,那么这次的迭代方向 p1应该满足什么条件呢?
首先根据迭代公式我们有
现在我们假设
综上所述,对于n元正定二次函数,我们可以从任意点出发,然后沿着这n个共轭方向最多做n次直线搜索(原因将在下一小节进行讲解),就可以求的目标函数的最优点。
共轭方向法
定理2: 假设:
(1)Q为
(2)非零向量p0,p1,⋅⋅⋅,pm−1是Q共轭向量;
(3)对二次目标函数(3)顺次进行m次直线搜索
i)pTi∇f(xm)=0, 0≤j<m;
ii)xm是二次函数(3)在线性流行L[x0;p0,p1,⋅⋅⋅,pm−1]上的极小点。
(个人理解,如有错误,请指正)前面已经说过,共轭是正交的推广,对于n维空间,我们可以把
推论2: 在定理2中,当m=n时,xn是正定二次函数在Rn中的极小点。
推论3: 在定理2中,p0,p1,⋅⋅⋅,pm−1的任意线性组合∑i=0m−1βipi都与∇f(xm)正交。
对于正定二次函数(3),从任意点出发,顺次沿n个
下面是对于正定二次函数的共轭方向法的算法描述。
已知:正定二次目标函数
f(x)=12xTQx+bTx+c 和终止限ϵ
(1)选定初始点x0和下降方向p0;置k=0
(2)做直线搜索xk+1=1s(xk,pk)
(3)判别||∇f(xk+1)||<ϵ是否满足:若满足,输出xk+1;否则转(4)
(4)提供共轭方向pk+1,使得pTjQpk+1=0 j=0,1,⋅⋅⋅,k
(5)置 k=k+1,转(2)对于正定二次函数,第(2)步可以采取如下显示计算公式
xk+1=xk−pTk∇f(xk)pTkQpkpk公式推导如下。
⇒⇒⇒⇒⇒xk+1QXk+1+b∇f(xk+1)pTkf(xk+1)0tk=xk+tkpk=Qxk+tkQpk+b=∇f(xk)+tkQpk=pTkf(xk)+tkpTkQpk=pTkf(xk)+tkpTkQpk=pTk∇f(xk)pTkQpk(10)
在第4步中,只是说要求得共轭方向,并没有说明如何求共轭方向,不同求共轭方向的方法对应了不同的共轭方向法。共轭梯度法
共轭梯度法是一种共轭方向法,在求每一个迭代点的搜索方向时,与改点的梯度有关,故叫做共轭梯度法。共轭梯度法:在初始点x0的搜索方向p0为初始点x0的负梯度方向−∇f(x0);之后迭代点xk的搜索方向pk为该点的负梯度方向−∇f(xk)与已经得到的搜索方向pk−1的线性组合(即pk=−gk+αk−1pk−1)。
首先对正定二次函数做说明。用于正定二次函数的共轭梯度法
对于目标函数为(3)的正定二次函数来说。我们规定gk=∇f(xk)
* 第一个迭代点
我们可以任意指定一个初始点x0,那么初始点处的搜索方向p0=−g0(11),从x0出发沿着p0方向做直线搜索x1=x0+t0p0,可以求得(可以参照公式(10)的推导)时的推导)t0=−pT0g0pT0Qp0=gT0g0pT0Qp0故x1=x0+gT0g0pT0Qp0p0由此我们便得到了第一个迭代点。
* 第二个迭代点
由直线搜索的特性我们可以知道 p0g1=0(可以想一下最速下降法中的锯齿现象),故 p0和 g1是线性无关的。根据共轭梯度法的特性我们可以得到在点 x1处的搜索方向 p1为p1=−g1+α0p0(12)。再由共轭方向法的特性我们知道 p1,p1是 Q共轭方向。故便可以得到pT1Qp0=−gT1Qp0+α0pT0Qp0=0 α0=gT1Qp0pT0Qp0由此我们便确定了迭代点 x1处的搜索方向 p1,之后便是从 x1开始沿搜索方向 p1做直线搜索 x2=x1+t1p1,根据公式(10)和(12),可以得到t1=−pT1g1pT1Qp1=−−gT1g1+α0p0g1pT1Qp1=gT1g1pT1Qp1由此我们便得到了第二个迭代点 x2
* 第三个迭代点
同理,我们可以得到 p1g2=0,可以得到点 x2处的搜索方向为p2=−g2+α1p1(13)同理, p2和 p1是 Q共轭方向,故能够得到便可得到pt2Qp1=−gT2Qp1+α1pT1Qp1=0 α0=gT2Qp1pT1Qp1至此,我们便得到了点 x2处的搜索方向 p2,然后从 x2开始沿 p2方向做直线搜索,与上相同便可得到 x3=x2+t2p2,求得t2=gT2g2pT2Qp2至此我们便得到了第三个迭代点 x3。
但是上面在求第三个迭代点时有一个小小的问题便是,以上求得 p3的方法能保证 p2和 p0共轭吗?即 p0,p1,p2是 Q共轭向量(根据共轭向量定义我们知道共轭向量之间需要亮亮共轭)吗?答案是肯定的,接下来推导pT2Qp0=0 ,如下。pT2Qp0=−gT2Qp0+α1pT1Qp0=−gT2Qp0=−gT2(g1−g0)t0=−gT2g1−gT2g0t0由于 g0与 g1都可以表示成 p0和 p1的线性组合,故有 gT2g1=gT2g0=0(因为可以把 g0和 g1看作是由 p0和 p1确定的超平面上线,由于 gT2p1=0,故有 gT2g1=gT2g0=0)。
关于为什么 Qp0=(g1−g0)t0,可以参考公式(10)的推导过程,有 ∇f(xk+1)=∇f(xk)+tkQpk,由此得到。
* 第 k+1个迭代点
与前面相似,我们可以得到pk=−gk+αk−1pk−1(14)可以得到αk−1=gkQpk−1ptk−1Qpk−1,我们便能得到 xk处的搜索方向 pk,在 xk处沿 pk方向做直线搜索,同理我们能得到tk=gTkgkptkQpk同理我们能够证出 p0,p1,⋅⋅⋅,pk是 Q共轭向量。所以可以按照上述方法,依次构造出共轭向量,最多经过
n 次迭代就能找到最优点 x∗。
共轭梯度法的算法描述如下。已知:二次函数公式(3),终止限ϵ
(1)选定初始点x0;计算p0=−∇f(x0);置k=0
(2)做直线搜索xk+1=1s(xk,pk),或者采用如下公式计算tk=∇f(xk)T∇f(xk)pTkQpk(15)xk+1=xk+tkpk(16)
(3)判断 ||∇f(xk+1||<ϵ)是否满足要求。满足则输出 xk+1停止;否则转(4)
(4)计算αk=∇f(xk+1)TQpkpTkQpk(17)pk+1=−∇f(xk+1)+αkpk(18)
(5)置 k=k+1,转(2)用于非二次函数的共轭梯度法
上面所讲的迭代公式要想适用于非二次函数,就要将迭代公式(17)中的Q去掉,那么根据的推到我们可以得到
,由此,我们能得到迭代公式Qpk=∇f(xk+1)−∇f(xk)tk αk=gTk+1(gk+1−gk)pTk(gk+1−gk)(19)在公式(14)两边同时乘以 gk+1,得pTkgk+1=−gTkgk+1+αk−1pTk−1gk−1(20)由直线搜索的性质,我们知道pTkgk+1=0(21)于是,公式(19)变为gTk+1gk=0(21)另外pTkgk=−gTkgk+αk−1pk−1gk=−gTkgk(22)
* 将公式(20)(21)(22)带入到公式(19)之后,我们得到αk=gTk+1gk+1gTkgk=||gk+1||2||gk||2(23)这个公式称为 Fletcher-Reeves公式。
* 将公式(21)(22)带入到公式(19)后得到αk=−gTk+1gk+1pTkpk(24)这个公式称为 Dixon-Myers公式。
* 将公式(21)(23)带入到公式(19)后得到αk=gTk+1(gk+1−gk)gTkgk(25)这个公式称为 Polak-Ribiere公式。
将公式(23)(24)(25)替换公式(17)对应了不同的共轭梯度法。共轭梯度法不要求精确的直线搜索,但是不精确的直线搜索可能会造成之后迭代出来的向量不再是共轭的,这将会降低共轭梯度法的效能,解决方法就是重设初始点,即经过 n+1次迭代后得到的 xn+1作为初始点,开始新一轮的迭代。
用于一般函数的Fletcher-Reeves共轭梯度法描述如下。已知:目标函数f(x)以及梯度函数g(x),问题的维数N以及H终止准则的终止限
ϵ1,ϵ2,ϵ3 以及终止限ϵ
(1)选定初始点x0;计算p0=−∇f(x0);置k=0(2)进行直线搜索x_{k+1}=1s(x_k,p_k),计算f_{k+1}=f(x_{k+1}),g_{k+1}=g(x_{k+1})$(2)进行直线搜索xk+1=1s(xk,pk),计算fk+1=f(xk+1),gk+1=g(xk+1)
(3)判断H终止准则是否满足。满足:输出xk+1,停止;否则:转(4)
(4)判断k=n是否成立,即是否已经迭代了n+1次。是:重置x0=xk+1,f0=fk+1,g0=gk+1,p0=−g0,k=0,然后转(2);不是:转(5)
(5)按照Fletcher-Reeve公式计算αk=||gk+1||2||gk||2pk+1=−gk+αkpk
(6)判断 pTk+1gk+1≥0是否成立(检查 pk+1是不是下降方向,由于实际计算中无法精确求解,可能会出现不是下降方向的情况;在精确求解中, pk+1一定是下降法向)。做三种情况处理:i)若 pTk+1gk+1>ϵ,这时则改取 −pk+1作为搜索方向,并置 k=k+1,转(2);ii)若 |pTk+1gk+1|≤ϵ|,则重置 x0=xk+1,f0=fk+1,g0=gk+1,p0=−g0,k=0,转(2);iii)若 pTk+1gk+1<−ϵ,则 pk+1就作为搜索方向,并置 k=k+1,转(2)