学习自知乎:https://www.zhihu.com/question/27157047 and wikipedia and 非线性规划课
在数值线性代数中,共轭梯度法是一种求解对称正定线性方程组Ax=b的迭代方法。
事实上,求解Ax=b等价于求解: min||Ax−b||22min||Ax−b||22 。于是解方程问题就转化为了求解二次规划问题(QP)。
共轭梯度法是介于梯度下降法与牛顿法之间的一个方法,是一个一阶方法。它克服了梯度下降法收敛慢的缺点,又避免了存储和计算牛顿法所需要的二阶导数信息。
在n维的优化问题中,共轭梯度法最多n次迭代就能找到最优解(是找到,不是接近),但是只针对二次规划问题。
共轭梯度法的思想就是找到n个两两共轭的共轭方向,每次沿着一个方向优化得到该方向上的极小值,后面再沿其它方向求极小值的时候,不会影响前面已经得到的沿哪些方向上的极小值,所以理论上对n个方向都求出极小值就得到了n维问题的极小值。
目标函数的标准形式:
minx∈Rn12xTQx−bTxminx∈Rn12xTQx−bTx
Q-conjugate: 对于正定矩阵Q,如果非零向量x,y是Q-conjugate的,那么
xTQy=0xTQy=0
我们需要找到n个相互Q-conjugate的基向量d1,d2,…,dnd1,d2,…,dn,它们相互共轭且线性无关。
因此空间中任意向量x都可以用这组基向量表示:
x=∑ni=1aidix=∑i=1naidi
因此我们的目标函数可以改写为:
为了看的清楚点,我们把求和分开来写:
第一项是一个二次函数,求最小值我们直接求导即可:
a1=bTd1dT1Qd1a1=bTd1d1TQd1 ,同样可得:
ai=bTdidTiQdiai=bTdidiTQdi
所以最优解x∗=∑ni=1aidix∗=∑i=1naidi,将上式代入可得
x∗=∑ni=1bTdidTiQdidix∗=∑i=1nbTdidiTQdidi
现在,我们只需要构建Q-conjugate向量组 d1,d2,…,dnd1,d2,…,dn。下面给出完整的共轭梯度算法。
输入:正定矩阵Q(A),初始向量x0x0,向量b
输出:最优解对应的向量xk+1xk+1
r0:=b−Qx0r0:=b−Qx0 (r_i为第i次迭代的误差)
d0:=r0d0:=r0 (d_i是我们要求的共轭向量)
k:=0k:=0 (k表示第几次迭代)
repeat
αk:=rTkrkdTkQdkαk:=rkTrkdkTQdk (该项为学习率,是求出来的,对应的是之前说的a_i)
xk+1:=xk+αkdkxk+1:=xk+αkdk
rk+1:=rk−αkQdkrk+1:=rk−αkQdk
如果rk+1rk+1足够小,则提前退出循环 (也就是认为已经找到最优解了)
βk:=rTk+1rk+1rTkrkβk:=rk+1Trk+1rkTrk
dk+1:=rk+1+βkdkdk+1:=rk+1+βkdk (Gram-Schmidt过程求d_k)
k:=k+1
end repeat
The result is xk+1xk+1