这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
本文介绍二次型优化方法中比较优秀的迭代方法——共轭梯度法。
问题描述
重述我们需要优化的问题:
f(x)=21xTAx−bTx+c\label1(1)
- 矩阵A正定对称
- 目标为优化x,使得f(x)取得最小值
最速下降法的问题
- 贪心计算局部最小值
- 没有全局视野,没有使用真正的模型建模
- 导致优化过程需要反复迭代才能逐步逼近最优值
轭
轭是一个汉字,读作è,本意是指驾车时套在牲口脖子上的曲木,引申义是束缚,控制。该文字在《仪礼·既夕礼》和《荀子·正论》等文献均有记载。 ——百度百科

- 数学中很多轭相关的内容,此处的共轭表示相互约束,在某个条件下可以相互作用的意思。
共轭梯度法思想来源
- 为解决最速下降法来回往复的问题,人们开始思考是否有可以直接在需要优化的二次函数定义下直接对其进行优化,是否可以通过有限步计算得到真正的最优解
- 那么假设我们使用关于该问题精确的模型而不是近似的局部最优模型,我们如果可以在某个N维空间中,分别计算出最优解的各个维度的坐标,就可以达到上述目的
- 那么如何设计这个空间,如何可以分步计算并且可以整合成真正的结果,是共轭梯度法来解决的问题
- 该方法的核心思想是建立一组N维空间线性无关的一组基,理论上这组基的线性组合可以表示空间中任意一点,共轭梯度法通过多次计算,精确求解目标在空间中位置在这组基空间中的各个系数分量,达到求解最优值的目的
- 该方法和最速下降法却别在精确建模,有了上帝视角,每次迭代计算将该方向需要调整的分量值调整到极致,也就是说之后的计算再也不用考虑该方向上的运动分量了,这是一个精确求解问题的过程,不是逐步简单建模向最优值挪动的逼近过程
共轭基的定义
设A为n阶实对称正定矩阵,如果有两个n维列向量s1和s2满足
{% raw %}
s1TAs2=0\label2(2)
{% endraw %}
则称向量s1和s2对于矩阵A共轭。如果A为单位矩阵,则式\eqref2即成为\bf{s}_1$$\bf{s}_2,这样两个向量的点积为零,此二向量在几何上是正交的,它是共轭的一种特例。
设A为对称正定矩阵,若一组非零向量s1,s2,…,sn满足
{% raw %}
siTAsj=0(i=j)(3)
则称向量系si(1≤i≤n)为关于矩阵A共轭。
若si(1≤i≤n)之间线性无关,那么我们称该向量集合为n维空间中关于矩阵A的一组共轭基。
{% endraw %}
共轭基的作用
- 假设有一组关于矩阵A的共轭基D:
D={d1,d2,...,dn}(4)
- 设二次型函数\eqref1的极值为x∗,用D表似为:
{% raw %}
x∗=λ1d1+λ2d2+⋯+λndn(5)
{% endraw %}
{% raw %}
f′(x∗)=Ax∗−b=0⇒Ax∗=b(6)
{% endraw %}
- {% raw %}我们计算diTAx∗,根据不同共轭基之间相互共轭:{% endraw %}
{% raw %}
diTAx∗=diTA(λ0d0+…+λn−1dn−1)=λidiTAdi+0(7)
{% endraw %}
{% raw %}
λi=diTAdidiTAx∗=diTAdidiTb\label8(8)
{% endraw %}
- 对于λi的求解,我们已知的变量为b和A,如果我们已经得到了空间中关于A的共轭基(任意一组),我们都可以直接解得λi
- 这是一个令人振奋的结论,所以我们当前的工作重点转为了如何快速地求得一组关于A的共轭基
根据定义获取共轭基
graph TB
A(随机生成n个n维向量)
B{i=1-n循环}
C[剔除向量j=1-i的分量]
E[收集向量1-n]
D[得到向量i]
A-->B
C --> D
D --> B
B-- 循环结束 --> E --> F(输出共轭基)
B-- 循环未结束 -->C
- 这套方法下来,我们就可以得到根据定义计算出来的共轭基,带入\eqref8计算得到极值,没有任何问题
- 但事实上这个运算量与代数法解{% raw %}Ax=b{% endraw %}的过程具有相当的运算复杂度,没有给该优化问题带来性能收益
共轭梯度法
此算法核心步骤与最速下降法相同,分别为寻找共轭方向与计算运动步长。
寻找共轭方向
由于计算梯度简单,寻找共轭梯度的过程依附于梯度方向的计算。
- 优化目标为x∗,初始位置为x1,需要求得的共轭基为 D={d1,d2,...,dn}
- 计算初始x1位置的梯度,第一个共轭基为梯度的反方向:
{% raw %}
d1=−g1=−(Ax1−b)=b−Ax1(9)
{% endraw %}
- 第i个梯度若要剔除掉第j个共轭基(j<i)方向的分量,需要减去该方向的βj分量:
{% raw %}
djTA(gi−βjdj)=0djTAgi=βjdjTAdjβj=djTAdjdjTAgi\label10(10)
{% endraw %}
{% raw %}
dk=gk−i=1∑k−1diTAdidiTAgkdidk=gk−i=1∑k−1βidi\label11(11)
{% endraw %}
- 目前,我们如果可以确定每一次迭代移动的xi的位置,求得gi,那么就可以根据第1到第i−1个共轭基确定当前第i个共轭基
- 因此当前我们的目标是在有了共轭方向后,如何确定在该方向上的运动距离
确定运动距离
{% raw %}已经运动到了xk的位置,下一个前进方向为dk,前进步长αk,误差为ek=x∗−xk,也就是说:
xk+1=xk+αkdk(12)
{% endraw %}
这里介绍两种求前进步长αk的思路。
方法一
确定第k步的运动步长αk,也就是一个共轭基的系数,限制该系数的条件为:
- {% raw %}当前共轭基的方向dk与误差向量ek+1=x∗−xk+1共轭:
dkT′Aek+1=dkTA(x∗−xk+1)=dkTA(x∗−xk+xk−xk+1)=dkTA(ek−αkdk)=dkTAek−αkdkTAdk=0\label13(13)
{% endraw %}
{% raw %}
αk=dkTAdkdkTAek=dkTAdkdkTA(x∗−xk)=dkTAdkdkT(Ax∗−Axk)=dkTAdkdkT(b−Axk)=−dkTAdkdkTgk(14)
{% endraw %}
方法二
{% raw %}对f(xk+1)中的αk求导,使得导数为0,计算αk:{% endraw %}
- {% raw %}用xk表示xk+1:
f(xk+1)=f(xk+αkdk)=21xk+1TAxk+1−bT(xk+αkdk)+c(15)
{% endraw %}
- {% raw %}对f(xk+1)中αk求导:
f′(xk+1∣αk)=∂xk+1∂f(xk+1)∂αk∂xk+1=(Axk+1−b)Tdk=(Axk+αkAdk−b)Tdk=(αkAdk+gk)Tdk=αkdkTAdk+gkTdk(16)
{% endraw %}
αkdkTAdk+gkTdk=0αk=−dkTAdkgkTdk=−dkTAdkdkTgk(17)
{% endraw %}
此时我们已经计算得到了一系列计算共轭梯度的方法,能够依次求得一套共轭基了,但是其中有些步骤仍然可以继续简化计算。
简化计算与一些推论
推论一
- {% raw %}第k步计算的梯度gk和前k−1步的共轭向量d1,d1,...,dk−1正交:{% endraw %}
- {% raw %}证明,当i<j时:
diTgj=diT(Axj−b)=diT(Axj−Ax∗)=−diT(Ax∗−xi+1+xi+1−xj)=−diTA(ei+1−k=i+1∑j−1αkdk)=−diTAei+1+k=i+1∑j−1αkdiTAdk\label18(18)
{% endraw %}
- 式\eqref18左边由于di计算过程\eqref13为0,右边由于不同的共轭向量间两两共轭值为0,所以最终的值也为0
- {% raw %}因此证明了:第k步计算的梯度 gk 和前k−1步的共轭向量 d1,d1,...,dk−1正交。{% endraw %}
推论二
-
{% raw %}第k步计算的梯度gk和前k−1步的梯度g1,g1,...,gk−1正交:{% endraw %}
-
{% raw %}证明,当i<j时:{% endraw %}
-
由\eqref11得:
{% raw %}
gi=di+k=1∑i−1βkdk(19)
{% endraw %}
{% raw %}
giTgj=(di+k=1∑i−1βkdk)Tgj=k=1∑iβkdkTgj(βi=1)\label20(20)
{% endraw %}
- 根据推论一,式\eqref20值为0
- {% raw %}证得结论:第k步计算的梯度gk和前k−1步的梯度g1,g1,...,gk−1正交。{% endraw %}
- {% raw %}那么对于两个不同的梯度gi,gj(i=j),那么二者必分前后,因此各个梯度之间相互正交,即G={g1,g2,...,gn}组成了n维空间中的一组正交基{% endraw %}
推论三
- {% raw %}计算gj+1Tgi:
gj+1TgidjTAgi=(Axj+1−b)Tgi=(A(xj+αjdj)−b)Tgi=(Axj−b+αjAdj)Tgi=(gj+αjAdj)Tgi=gjTgi+αjdjTAgi=αj1(gj+1Tgi−gjTgi)\label21(21)
{% endraw %}
- 根据式\eqref21和推论二,{% raw %}由于一般情况下αj不为0,因此对于所有情况为保证\eqref20成立,需要当i=j且i=j+1时,djTAgi=0 {% endraw %}
- 这意味着当前的梯度方向与上一个共轭方向之前的和当前之后的所有共轭方向共轭正交
简化计算
- 对于式\eqref11中,在求解dk过程中产生的系数β,此处强调一下\eqref10:
{% raw %}
βi=diTAdidiTAgk
{% endraw %}
- 由推论三{% raw %},\eqref10中当i=k且i=k−1时,diTAgk值为0 {% endraw %}
- {% raw %}因此式\eqref11可以简化为:
dk=gk−i=1∑k−1βidi=gk−βk−1dk−1\label22(22)
{% endraw %}
- 即在求解第k个共轭基时,仅需要在当前梯度gk上减去第k−1个共轭基的共轭分量即可
推论四
- 根据简化计算的公式\eqref22,有:
{% raw %}
dk=gk−βk−1dk−1=gk−βk−1(gk−1−βk−2dk−2)=gk+γk−1gk−1+γk−2gk−2+⋯γ1g1=i=1∑kγigi(23)
{% endraw %}
- 其中固定的常数系数用γ表示
- 那么有:
{% raw %}
giTdj=giTk=1∑jγkgk=k=1∑jγkgiTgk\label24(24)
{% endraw %}
- 式\eqref24根据推论二的结论,值为:
{% raw %}
{\bf{g}}_i^T{{\bf{d}}_j} = \left\{ {\begin{array}{*{20}{c}}
{0,i > j}\\
{\gamma_i{\bf{g}}_i^T{{\bf{g}}_i},i \le j}
\end{array}} \right. \tag{25}
{% endraw %}
- 即某个梯度与所有共轭基的投影为0或一个常数(对该方法来说不是一个有实用性的结论)
共轭梯度法实操步骤
- 初始条件:已知A,b,初始位置x1
- {% raw %}g1=Ax1−b {% endraw %}
- {% raw %}d1=−g1 {% endraw %}
- k=1
- whilek≤n:
- {% raw %}αk=−dkTAdkdkTgk {% endraw %}
- {% raw %}xk+1=xk+αkdk {% endraw %}
- {% raw %}gk+1=Axk+1−b {% endraw %}
- {% raw %}βk=dkTAdkdkTAgk+1 {% endraw %}
- {% raw %}dk+1=gk+1−βkdk {% endraw %}
- k=k+1
- returnxn+1
参考资料