「最优化算法」共轭梯度法

共轭方向(Conjugate Direction)

设 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A 为 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 阶对称正定矩阵 ,若有一组非令向量组 <math xmlns="http://www.w3.org/1998/Math/MathML"> u ( 1 ) , u ( 2 ) , ⋯   , u ( n ) ∈ R n u^{(1)},u^{(2)},\cdots,u^{(n)} \in \mathbb R^n </math>u(1),u(2),⋯,u(n)∈Rn 满足
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ( u ( i ) ) T A u ( j ) = 0 ( i ≠ j ; i , j = 1 , 2 , ⋯   , n ) (u^{(i)})^{\text T}Au^{(j)}=0\quad(i\neq j; \quad i,j = 1,2,\cdots,n) </math>(u(i))TAu(j)=0(i=j;i,j=1,2,⋯,n)

则称该向量组为 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A 共轭。若 <math xmlns="http://www.w3.org/1998/Math/MathML"> A = I A=I </math>A=I 则上述条件即为通常的正交条件。因此可以将 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A 共轭的概念视为正交概念的推广。

若向量组 <math xmlns="http://www.w3.org/1998/Math/MathML"> u ( 1 ) , u ( 2 ) , ⋯   , u ( n ) u^{(1)},u^{(2)},\cdots,u^{(n)} </math>u(1),u(2),⋯,u(n) 为 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A 共轭的非零向量,则可证这一组向量线性独立。

<math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 阶对称正定矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A 的特征向量组为 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A 共轭。

比如

上图就是关于某一对称正定矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A 共轭的两个向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> u , v u,v </math>u,v,记为 <math xmlns="http://www.w3.org/1998/Math/MathML"> ⟨ u , v ⟩ A \langle u,v \rangle_A </math>⟨u,v⟩A。可以看出向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> u , v u,v </math>u,v 关于某条对称轴对称,则它们经过正交变换的向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> A u , A v Au,Av </math>Au,Av 也关于这条对称轴对称。这可能就是"共轭"的几何含义吧。

既然 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A 的某一完备的共轭的向量组 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 1 , u 2 , ⋯   , u n u_{1},u_{2},\cdots,u_{n} </math>u1,u2,⋯,un 线性无关,那么任一向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> x ∈ R n \mathbb x \in \mathbb R^n </math>x∈Rn 都可以用这组向量表示,有
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x = ∑ i = 1 n α i u ( i ) \mathbb x = \sum_{i=1}^n \alpha_iu^{(i)} </math>x=i=1∑nαiu(i)

将上式左右同乘 <math xmlns="http://www.w3.org/1998/Math/MathML"> u k T A u_{k}^TA </math>ukTA,有
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> u k T A x = u k T A ∑ i = 1 n α i u i = α k u k T A u k \begin{align} u_{k}^TA\mathbf x &= u_{k}^TA \sum_{i=1}^n \alpha_iu_{i}\\ &=\alpha_ku_{k}^TA u_{k} \end{align} </math>ukTAx=ukTAi=1∑nαiui=αkukTAuk

可得
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> α k = u k T A x u k T A u k \alpha_k = \frac{u_{k}^TA\mathbf x }{u_{k}^TAu_{k}} </math>αk=ukTAukukTAx

进而可得 <math xmlns="http://www.w3.org/1998/Math/MathML"> x \mathbb x </math>x 表达式
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x = ∑ i = 1 n u i T A x u i T A u i u i \mathbb x = \sum_{i=1}^n \frac{u_{i}^TA\mathbf x}{u_{i}^TA u_{i}}u_i </math>x=i=1∑nuiTAuiuiTAxui

如果有方程组 <math xmlns="http://www.w3.org/1998/Math/MathML"> A x = b A\mathbf x = b </math>Ax=b,且 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A 存在共轭的向量组 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 1 , u 2 , ⋯   , u n u_{1},u_{2},\cdots,u_{n} </math>u1,u2,⋯,un,那么对满足方程组的解 <math xmlns="http://www.w3.org/1998/Math/MathML"> x \mathbf x </math>x,会有
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x = ∑ i = 1 n u i T A x u i T A u i u i = ∑ i = 1 n u i T b u i T A u i u i \mathbb x = \sum_{i=1}^n \frac{u_{i}^TA\mathbf x}{u_{i}^TA u_{i}}u_i = \sum_{i=1}^n \frac{u_{i}^Tb}{u_{i}^TA u_{i}}u_i </math>x=i=1∑nuiTAuiuiTAxui=i=1∑nuiTAuiuiTbui

共轭梯度法(Conjugate Gradient)

共轭梯度算法用于处理无约束的多元二次函数的极小值
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> f ( x ) = 1 2 x T A x + b T x + c f(x) = \frac 1 2x^\text TAx+b^\text Tx+c </math>f(x)=21xTAx+bTx+c

其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> x , b ∈ R n x,b\in \mathbb R^n </math>x,b∈Rn;A为对称正定矩阵, <math xmlns="http://www.w3.org/1998/Math/MathML"> A ∈ R n × n A\in \mathbb R^{n\times n} </math>A∈Rn×n; <math xmlns="http://www.w3.org/1998/Math/MathML"> c c </math>c 为常数。

刚在接触这个算法的时候一脸懵逼,哪来的这么好的式子让我求解?哪来的刚好对称正定的方阵?要解释这个问题,以及这个式子代表着什么,还得联系着牛顿法,将两种方法串联起来。

说到牛顿法,这个问题我也想了好久,到底这个关键的二阶泰勒展开 到底是什么意思?到底能近似到什么程度?关于这个问题想要继续讨论,可以花些时间看一下 这个视频👈,简单来说
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> f ( x ) ≈ f ( x k ) + f ′ ( x k ) ( x − x k ) + f ′ ′ ( x k ) 2 ( x − x k ) 2 f(x) \approx f(x_k) + f'(x_k)(x-x_k) + \frac {f''(x_{k})}{2}(x-x_k)^2 </math>f(x)≈f(xk)+f′(xk)(x−xk)+2f′′(xk)(x−xk)2

是在 <math xmlns="http://www.w3.org/1998/Math/MathML"> x k x_k </math>xk 点附近关于 <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( x ) f(x) </math>f(x) 的一阶以及二阶导数的大小变化进行提取,并且赋给一个二次曲线,这个二次曲线可以在某些区间内完美的模拟原函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( x ) f(x) </math>f(x) 的一、二阶导数的变化情况。当然,关于比较复杂的函数,这种低阶展开的对曲线的模拟效果不是很好,只能在展开点的附近才能有较小的误差。而关于牛顿法,因为牛顿法可以完美解决二次函数极小值的求解问题,所以牛顿法就需要用到目标函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( x ) f(x) </math>f(x) 的二阶泰勒展开啦。

再来看在 <math xmlns="http://www.w3.org/1998/Math/MathML"> x k x_k </math>xk 点处二阶泰勒展开的矩阵形式
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> f ( x ) = f ( x k ) + ∇ f ( x k ) T ( x − x k ) + 1 2 ( x − x k ) T H ( x k ) ( x − x k ) f(x) = f(x_k) + \nabla f(x_k)^\text T(x-x_k) + \frac 1 2 (x-x_k)^\text TH(x_{k})(x-x_k) </math>f(x)=f(xk)+∇f(xk)T(x−xk)+21(x−xk)TH(xk)(x−xk)

是不是很像共轭梯度法要解决的二次函数
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> f ( x ) = c + b T x + 1 2 x T A x f(x) = c+b^\text Tx+\frac 1 2x^\text TAx </math>f(x)=c+bTx+21xTAx

其实牛顿法的本质就是用二次曲线来拟合目标函数的某一局部,并求出最优点 <math xmlns="http://www.w3.org/1998/Math/MathML"> x ∗ x^* </math>x∗。而共轭梯度法可以被视作基于这一思想的另一种算法。海塞矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> H H </math>H 正定可以保证 <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( x ) f(x) </math>f(x) 存在极小点,这似乎可以解释为什么共轭梯度法上来就让我们算这么奇怪的式子。(别忘了,任何一个多元函数二次项都可以写成带有对称矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A 的 <math xmlns="http://www.w3.org/1998/Math/MathML"> x T A x x^\text TAx </math>xTAx 形式)

已知牛顿法的表达式
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x k + 1 = x k − H − 1 ( x k ) ⋅ ∇ f ( x k ) x_{k+1} = x_k -H^{-1}(x_k) \cdot \nabla f(x_k) </math>xk+1=xk−H−1(xk)⋅∇f(xk)

都知道这个算法中 <math xmlns="http://www.w3.org/1998/Math/MathML"> − H − 1 ( x k ) ⋅ ∇ f ( x k ) -H^{-1}(x_k) \cdot \nabla f(x_k) </math>−H−1(xk)⋅∇f(xk) 计算困难,那么令 <math xmlns="http://www.w3.org/1998/Math/MathML"> d = H − 1 ( x k ) ⋅ ∇ f ( x k ) d = H^{-1}(x_k) \cdot \nabla f(x_k) </math>d=H−1(xk)⋅∇f(xk) ,则有
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> H ( x k ) ⋅ d = − ∇ f ( x k ) H(x_k)\cdot d = -\nabla f(x_k) </math>H(xk)⋅d=−∇f(xk)

如果有 <math xmlns="http://www.w3.org/1998/Math/MathML"> H H </math>H 的共轭的向量组 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 1 , u 2 , ⋯   , u n u_{1},u_{2},\cdots,u_{n} </math>u1,u2,⋯,un,类比共轭方向解方程组,有
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> d = ∑ i = 1 n − u i T ∇ f ( x k ) u i T H u i u i d = \sum_{i=1}^n -\frac{u_{i}^T\nabla f(x_k)}{u_{i}^TH u_{i}}u_i </math>d=i=1∑n−uiTHuiuiT∇f(xk)ui

别忘了,我们现在求解的是二次函数,使用牛顿法一步就能就解决问题,有
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x ∗ = x 0 − H − 1 ∇ f ( x 0 ) = x 0 + d = x 0 + ∑ i = 1 n u i T ∇ f ( x 0 ) u i T H u i u i \begin{align} x^* &= x_0 - H^{-1} \nabla f(x_0)\\ &= x_0+d\\ &= x_0 + \sum_{i=1}^n \frac{u_{i}^T\nabla f(x_0)}{u_{i}^TH u_{i}}u_i \end{align} </math>x∗=x0−H−1∇f(x0)=x0+d=x0+i=1∑nuiTHuiuiT∇f(x0)ui

将式子展开
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x ∗ = x 0 + ∑ i = 1 n u i T ∇ f ( x 0 ) u i T H u i u i x^* = x_0 + \sum_{i=1}^n \frac{u_{i}^T\nabla f(x_0)}{u_{i}^TH u_{i}}u_i </math>x∗=x0+i=1∑nuiTHuiuiT∇f(x0)ui

上式也可以可以换一种表达形式:

假设有一组 <math xmlns="http://www.w3.org/1998/Math/MathML"> H H </math>H 的共轭的向量组 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 1 , u 2 , ⋯   , u n u_{1},u_{2},\cdots,u_{n} </math>u1,u2,⋯,un,可以写出迭代式
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x k = x 0 + β 1 u 1 + β 2 u 2 + ⋯ + β k u k x_k = x_0 + \beta_1u_1 + \beta_2u_2+\dots+\beta_ku_k </math>xk=x0+β1u1+β2u2+⋯+βkuk

那么最优解就可以用 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 次迭代之后的迭代式来表示
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x ∗ = x 0 + β 1 u 1 + β 2 u 2 + ⋯ + β n u n x^* = x_0 + \beta_1u_1 + \beta_2u_2+\dots+\beta_nu_n </math>x∗=x0+β1u1+β2u2+⋯+βnun

上式如果除去 <math xmlns="http://www.w3.org/1998/Math/MathML"> x 0 x_0 </math>x0 项明显是一个方程组,那么 <math xmlns="http://www.w3.org/1998/Math/MathML"> β k \beta_k </math>βk 可以用共轭向量法求解出来,有
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> β k = u k T H ( x ∗ − x 0 ) u k T H u k \beta_k = \frac{u_{k}^TH(x^*-x_0)}{u_{k}^TH u_{k}} </math>βk=ukTHukukTH(x∗−x0)

令 <math xmlns="http://www.w3.org/1998/Math/MathML"> x ∗ − x 0 = ( x ∗ − x k − 1 ) + ( x k − 1 − x 0 ) x^*-x_0 = (x^*-x_{k-1})+(x_{k-1}-x_0) </math>x∗−x0=(x∗−xk−1)+(xk−1−x0),则
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> u k T H ( x ∗ − x 0 ) = u k T H ( x ∗ − x k − 1 ) + u k T H ( x k − 1 − x 0 ) = u k T H ( x ∗ − x k − 1 ) + u k T H ( β 1 u 1 + β 2 u 2 + ⋯ + β k − 1 u k − 1 ) = u k T H ( x ∗ − x k − 1 ) \begin{align} u_{k}^TH(x^*-x_0) &= u_{k}^TH(x^*-x_{k-1})+u_{k}^TH(x_{k-1}-x_0)\\ &= u_{k}^TH(x^*-x_{k-1}) + u_k^TH(\beta_1u_1+\beta_2u_2+\cdots+\beta_{k-1}u_{k-1})\\ &= u_{k}^TH(x^*-x_{k-1}) \end{align} </math>ukTH(x∗−x0)=ukTH(x∗−xk−1)+ukTH(xk−1−x0)=ukTH(x∗−xk−1)+ukTH(β1u1+β2u2+⋯+βk−1uk−1)=ukTH(x∗−xk−1)

根据
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> f ( x ) = f ( x k ) + ∇ f ( x k ) T ( x − x k ) + 1 2 ( x − x k ) T H ( x − x k ) f(x) = f(x_k) + \nabla f(x_k)^\text T(x-x_k) + \frac 1 2 (x-x_k)^\text TH(x-x_k) </math>f(x)=f(xk)+∇f(xk)T(x−xk)+21(x−xk)TH(x−xk)

对其求导,并且将 <math xmlns="http://www.w3.org/1998/Math/MathML"> x ∗ x^* </math>x∗ 代入式子中
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ∇ f ( x ∗ ) = ∇ f ( x k ) + H ( x ∗ − x k ) = 0 \nabla f(x^*) = \nabla f(x_k) +H(x^*-x_k)=0 </math>∇f(x∗)=∇f(xk)+H(x∗−xk)=0

将其代入 <math xmlns="http://www.w3.org/1998/Math/MathML"> u k T H ( x ∗ − x 0 ) u_{k}^TH(x^*-x_0) </math>ukTH(x∗−x0),得
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> u k T H ( x ∗ − x 0 ) = u k T H ( x ∗ − x k − 1 ) = − u k T ∇ f ( x k − 1 ) \begin{align} u_{k}^TH(x^*-x_0) &= u_{k}^TH(x^*-x_{k-1})\\ &= -u_{k}^T\nabla f(x_{k-1}) \end{align} </math>ukTH(x∗−x0)=ukTH(x∗−xk−1)=−ukT∇f(xk−1)

也那么
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> β k = u k T H ( x ∗ − x 0 ) u k T H u k = − u k T ∇ f ( x k − 1 ) u k T H u k \beta_k = \frac{u_{k}^TH(x^*-x_0)}{u_{k}^TH u_{k}} = -\frac{u_{k}^T\nabla f(x_{k-1})}{u_{k}^TH u_{k}} </math>βk=ukTHukukTH(x∗−x0)=−ukTHukukT∇f(xk−1)

怎么回事?由于是同一组基,那么势必 <math xmlns="http://www.w3.org/1998/Math/MathML"> α k = β k \alpha_k = \beta_k </math>αk=βk,那也就代表着
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> u k T ∇ f ( x k − 1 ) = u k T ∇ f ( x 0 ) u_{k}^T\nabla f(x_{k-1}) = u_{k}^T\nabla f(x_0) </math>ukT∇f(xk−1)=ukT∇f(x0)

我们可以将 <math xmlns="http://www.w3.org/1998/Math/MathML"> ∇ f ( x k ) \nabla f(x_k) </math>∇f(xk) 拆解
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ∇ f ( x k ) = − H ( x ∗ − x k ) = − H ( x ∗ − ( x k − 1 + H β k u k ) ) = ∇ f ( x k − 1 ) + H β k u k = ∇ f ( x k − 2 ) + H β k − 1 u k − 1 + H β k u k = ... = ∇ f ( x 0 ) + H ∑ i = 1 k β i u i \begin{align} \nabla f(x_k) &= -H(x^*-x_{k})\\ &= -H(x^*-(x_{k-1}+H\beta_ku_k))\\ &= \nabla f(x_{k-1})+H\beta_ku_k\\ &= \nabla f(x_{k-2})+H\beta_{k-1}u_{k-1}+H\beta_ku_k\\ &= \dots\\ &= \nabla f(x_{0})+H\sum_{i=1}^k\beta_iu_i\\ \end{align} </math>∇f(xk)=−H(x∗−xk)=−H(x∗−(xk−1+Hβkuk))=∇f(xk−1)+Hβkuk=∇f(xk−2)+Hβk−1uk−1+Hβkuk=...=∇f(x0)+Hi=1∑kβiui

这样我们就可以得出一个递推式,不仅能解决上面的问题,如果我们将 <math xmlns="http://www.w3.org/1998/Math/MathML"> ∇ f ( x k ) \nabla f(x_k) </math>∇f(xk) 左乘 <math xmlns="http://www.w3.org/1998/Math/MathML"> x k T x_k^\text T </math>xkT,会有
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> u k T ∇ f ( x k ) = u k T ∇ f ( x 0 ) + u k T H ∑ i = 1 k β i u i = − u k T H ( x ∗ − x 0 ) + β k u k T H u k = − β k u k T H u k + β k u k T H u k = 0 \begin{align} u_k^\text T\nabla f(x_k) &= u_k^\text T\nabla f(x_{0})+u_k^\text TH\sum_{i=1}^k\beta_iu_i\\ &= -u_k^\text TH(x^*-x_0) + \beta_ku_k^\text THu_k\\ &= -\beta_ku_k^\text THu_k + \beta_ku_k^\text THu_k\\ &= 0 \end{align} </math>ukT∇f(xk)=ukT∇f(x0)+ukTHi=1∑kβiui=−ukTH(x∗−x0)+βkukTHuk=−βkukTHuk+βkukTHuk=0

也就是说,点 <math xmlns="http://www.w3.org/1998/Math/MathML"> x k x_k </math>xk 处的梯度与第 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 次的搜索方向正交。

如果将 <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( x k ) f(x_k) </math>f(xk) 写成 <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( x k − 1 + β k u k ) f(x_{k-1}+\beta_ku_k) </math>f(xk−1+βkuk),那么如果需要求在 <math xmlns="http://www.w3.org/1998/Math/MathML"> u k u_k </math>uk 方向的最优步长,即
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> min ⁡ β k f ( x k − 1 + β k u k ) \min_{\beta_k}f(x_{k-1}+\beta_ku_k) </math>βkminf(xk−1+βkuk)

需要对 <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( x k ) f(x_k) </math>f(xk) 求偏导
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ∂ f ( x k − 1 + β k u k ) ∂ β k = u k T ∇ f ( x k ) = 0 \begin{align} \frac{\partial f(x_{k-1}+\beta_ku_k)}{\partial \beta_k} &= u_k^\text T\nabla f(x_{k})= 0 \end{align} </math>∂βk∂f(xk−1+βkuk)=ukT∇f(xk)=0

得到了同样的结论。在解释之前,先看下面一幅图

以目标函数 <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( x ) = x 1 2 + x 2 2 f(x) = x_1^2 + x_2^2 </math>f(x)=x12+x22 为例,在沿着 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 1 u_1 </math>u1 方向搜索时,选择了在这个方向上的最优解,也就是 <math xmlns="http://www.w3.org/1998/Math/MathML"> min ⁡ β 1 f ( x 0 + β 1 u 1 ) \min_{\beta_1}f(x_0+\beta_1u_1) </math>minβ1f(x0+β1u1),这样也就注定点 <math xmlns="http://www.w3.org/1998/Math/MathML"> x 1 x_1 </math>x1 处的斜率不会再 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 1 u_1 </math>u1 方向的分量上还有偏移。这与我们刚开始提出的方程组的结果 <math xmlns="http://www.w3.org/1998/Math/MathML"> α \alpha </math>α 不谋而合。

那么另一个问题出现了,上哪里去找一组关于 <math xmlns="http://www.w3.org/1998/Math/MathML"> H H </math>H 的共轭向量呢?在线性代数中有提到过一个向量正交化的过程:Gram-Schmidt 正交化

施密特正交化中的投影算子 是正交化的关键,投影算子 <math xmlns="http://www.w3.org/1998/Math/MathML"> proj u ( v ) \text{proj}_u(v) </math>proju(v) 来表示向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> v v </math>v 在向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 方向上的分量
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> proj u ( v ) = ⟨ v , u ⟩ ⟨ u , u ⟩ u \text{proj}_u(v) = \frac{\langle v,u \rangle}{\langle u,u \rangle}u </math>proju(v)=⟨u,u⟩⟨v,u⟩u

这样,我们就可以根据一组向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> v 1 , v 2 , ⋯   , v n v_{1},v_{2},\cdots,v_{n} </math>v1,v2,⋯,vn 来得到一组正交基 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 1 , u 2 , ⋯   , u n u_{1},u_{2},\cdots,u_{n} </math>u1,u2,⋯,un:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> u 1 = v 1 u 2 = v 2 − ⟨ v 2 , u 1 ⟩ ⟨ u 1 , u 1 ⟩ u 1 u 3 = v 3 − ⟨ v 3 , u 1 ⟩ ⟨ u 1 , u 1 ⟩ u 1 − ⟨ v 3 , u 2 ⟩ ⟨ u 2 , u 2 ⟩ u 2 ⋯ u k = v k − ∑ i = 1 k − 1 ⟨ v k , u i ⟩ ⟨ u i , u i ⟩ u i \begin{align} u_1 &= v_1\\ u_2 &= v_2 - \frac{\langle v_2,u_1 \rangle}{\langle u_1,u_1 \rangle}u_1\\ u_3 &= v_3 - \frac{\langle v_3,u_1 \rangle}{\langle u_1,u_1 \rangle}u_1-\frac{\langle v_3,u_2 \rangle}{\langle u_2,u_2 \rangle}u_2\\ \cdots\\ u_k &= v_k - \sum_{i=1}^{k-1}\frac{\langle v_k,u_i \rangle}{\langle u_i,u_i \rangle}u_i \end{align} </math>u1u2u3⋯uk=v1=v2−⟨u1,u1⟩⟨v2,u1⟩u1=v3−⟨u1,u1⟩⟨v3,u1⟩u1−⟨u2,u2⟩⟨v3,u2⟩u2=vk−i=1∑k−1⟨ui,ui⟩⟨vk,ui⟩ui

上面这个过程我们应该很熟悉了。同样的,可以根据一组向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> v 1 , v 2 , ⋯   , v n v_{1},v_{2},\cdots,v_{n} </math>v1,v2,⋯,vn 来得到一组关于 <math xmlns="http://www.w3.org/1998/Math/MathML"> A A </math>A 的共轭向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> u 1 , u 2 , ⋯   , u n u_{1},u_{2},\cdots,u_{n} </math>u1,u2,⋯,un:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> u 1 = v 1 u 2 = v 2 − ⟨ v 2 , u 1 ⟩ A ⟨ u 1 , u 1 ⟩ A u 1 u 3 = v 3 − ⟨ v 3 , u 1 ⟩ A ⟨ u 1 , u 1 ⟩ A u 1 − ⟨ v 3 , u 2 ⟩ A ⟨ u 2 , u 2 ⟩ A u 2 ⋯ u k = v k − ∑ i = 1 k − 1 ⟨ v k , u i ⟩ A ⟨ u i , u i ⟩ A u i \begin{align} u_1 &= v_1\\ u_2 &= v_2 - \frac{\langle v_2,u_1 \rangle_A}{\langle u_1,u_1 \rangle_A}u_1\\ u_3 &= v_3 - \frac{\langle v_3,u_1 \rangle_A}{\langle u_1,u_1 \rangle_A}u_1-\frac{\langle v_3,u_2 \rangle_A}{\langle u_2,u_2 \rangle_A}u_2\\ \cdots\\ u_k &= v_k - \sum_{i=1}^{k-1}\frac{\langle v_k,u_i \rangle_A}{\langle u_i,u_i \rangle_A}u_i \end{align} </math>u1u2u3⋯uk=v1=v2−⟨u1,u1⟩A⟨v2,u1⟩Au1=v3−⟨u1,u1⟩A⟨v3,u1⟩Au1−⟨u2,u2⟩A⟨v3,u2⟩Au2=vk−i=1∑k−1⟨ui,ui⟩A⟨vk,ui⟩Aui

我们以 <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( x 0 ) f(x_0) </math>f(x0) 的负梯度方向作为初始方向,有搜索方向的迭代式
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> u k = − ∇ f ( x k − 1 ) + ∑ i = 1 k − 1 γ i u i , γ i k = ⟨ ∇ f ( x k − 1 ) , u i ⟩ H ⟨ u i , u i ⟩ H u_k = -\nabla f(x_{k-1}) + \sum_{i=1}^{k-1}\gamma_iu_i,\quad\gamma_i^k =\frac{\langle \nabla f(x_{k-1}),u_i \rangle_H}{\langle u_i,u_i \rangle_H} </math>uk=−∇f(xk−1)+i=1∑k−1γiui,γik=⟨ui,ui⟩H⟨∇f(xk−1),ui⟩H

这样还是有点太复杂了,随着迭代步数的增多,计算次数也会不断上涨,能不能再简化一下呢?

我们定义残差 <math xmlns="http://www.w3.org/1998/Math/MathML"> e k = x k − x ∗ e_k = x_k-x^* </math>ek=xk−x∗,有
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> e k = x k − x ∗ = ( x 0 + ∑ i = 1 k β i u i ) − ( x 0 + ∑ i = 1 n β i u i ) = ∑ i = k + 1 n β i u i \begin{align} e_k &= x_k-x^*\\ &=\left(x_0 +\sum_{i=1}^k\beta_iu_i\right) - \left(x_0 +\sum_{i=1}^n\beta_iu_i\right)\\ &= \sum_{i=k+1}^n\beta_iu_i \end{align} </math>ek=xk−x∗=(x0+i=1∑kβiui)−(x0+i=1∑nβiui)=i=k+1∑nβiui

这样我们可以得出一个结论:前 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 步的搜索方向均与残差 <math xmlns="http://www.w3.org/1998/Math/MathML"> e k e_k </math>ek 关于 <math xmlns="http://www.w3.org/1998/Math/MathML"> H H </math>H 共轭,即
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> u i T H e k = 0 , i = 1 , 2 , ... , k u_i^\text THe_k = 0,\quad i=1,2,\dots,k </math>uiTHek=0,i=1,2,...,k

又因为 <math xmlns="http://www.w3.org/1998/Math/MathML"> H ( x k − x ∗ ) = ∇ f ( x k ) H(x_k-x^*) = \nabla f(x_k) </math>H(xk−x∗)=∇f(xk),代入上式
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> 0 = u i T H e k = u i T ∇ f ( x k ) = − ∇ f ( x k ) T ∇ f ( x i ) − ∑ j = 1 i − 1 γ j i ∇ f ( x k ) T u j = − ∇ f ( x k ) T ∇ f ( x i ) , i = 1 , 2 , ... , k \begin{align} 0&=u_i^\text THe_k\\ & = u_i^\text T\nabla f(x_k)\\ &= -\nabla f(x_k)^\text T\nabla f(x_i) - \sum_{j=1}^{i-1}\gamma_j^i \nabla f(x_k)^\text Tu_j\\ &= -\nabla f(x_k)^\text T\nabla f(x_i),\quad i=1,2,\dots,k \end{align} </math>0=uiTHek=uiT∇f(xk)=−∇f(xk)T∇f(xi)−j=1∑i−1γji∇f(xk)Tuj=−∇f(xk)T∇f(xi),i=1,2,...,k

这样我们就得出了第二个结论:梯度方向相互正交

在共轭梯度法迭代过程中有迭代式
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x k = x k − 1 + β k u k x_{k} = x_{k-1}+\beta_{k}u_{k} </math>xk=xk−1+βkuk

左右同减 <math xmlns="http://www.w3.org/1998/Math/MathML"> x ∗ x^* </math>x∗ 再左乘 <math xmlns="http://www.w3.org/1998/Math/MathML"> H H </math>H,有
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> H ( x k − x ∗ ) = H ( x k − 1 − x ∗ ) + β k H u k ∇ f ( x k ) = ∇ f ( x k − 1 ) + β k H u k \begin{align} H(x_{k}-x^*) &= H(x_{k-1}-x^*) + \beta_{k}Hu_{k}\\ \nabla f(x_k)&= \nabla f(x_{k-1}) + \beta_{k}Hu_{k} \end{align} </math>H(xk−x∗)∇f(xk)=H(xk−1−x∗)+βkHuk=∇f(xk−1)+βkHuk

那么
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> H u k = 1 β k ( ∇ f ( x k ) − ∇ f ( x k − 1 ) ) Hu_k = \frac 1 \beta_k(\nabla f(x_k) - \nabla f(x_{k-1})) </math>Huk=β1k(∇f(xk)−∇f(xk−1))

左乘 <math xmlns="http://www.w3.org/1998/Math/MathML"> ∇ f ( x i ) T \nabla f(x_i)^\text T </math>∇f(xi)T,根据梯度方向相互正交,
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ∇ f ( x i ) T H u k = 1 β k ( ∇ f ( x i ) T ∇ f ( x k ) − ∇ f ( x i ) T ∇ f ( x k − 1 ) ) = { − 1 β k ∇ f ( x k − 1 ) T ∇ f ( x k − 1 ) , i = k − 1 1 β k ∇ f ( x k ) T ∇ f ( x k ) , i = k 0 , otherwise \begin{align} \nabla f(x_i)^\text THu_k &= \frac 1 \beta_k(\nabla f(x_i)^\text T\nabla f(x_k) - \nabla f(x_i)^\text T\nabla f(x_{k-1}))\\ &= \begin{cases} -\frac 1 \beta_k\nabla f(x_{k-1})^\text T\nabla f(x_{k-1}) ,&i=k-1\\ \frac 1 \beta_k\nabla f(x_k)^\text T\nabla f(x_k) ,&i=k\\ 0,&\text {otherwise} \end{cases} \end{align} </math>∇f(xi)THuk=β1k(∇f(xi)T∇f(xk)−∇f(xi)T∇f(xk−1))=⎩ ⎨ ⎧−β1k∇f(xk−1)T∇f(xk−1),β1k∇f(xk)T∇f(xk),0,i=k−1i=kotherwise

我们再来看搜索方向的迭代式系数
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> γ i k = ⟨ ∇ f ( x k − 1 ) , u i ⟩ H ⟨ u i , u i ⟩ H = ∇ f ( x k − 1 ) T H u i u i T H u i \gamma_i^k =\frac{\langle \nabla f(x_{k-1}),u_i \rangle_H}{\langle u_i,u_i \rangle_H} = \frac{\nabla f(x_{k-1})^\text THu_i}{u_i^\text THu_i} </math>γik=⟨ui,ui⟩H⟨∇f(xk−1),ui⟩H=uiTHui∇f(xk−1)THui

当 <math xmlns="http://www.w3.org/1998/Math/MathML"> k < i − 1 k < i-1 </math>k<i−1 时, <math xmlns="http://www.w3.org/1998/Math/MathML"> γ i k = 0 \gamma_i^k = 0 </math>γik=0,那么
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> u k = − ∇ f ( x k − 1 ) + ∑ i = 1 k − 1 γ i k u i = − ∇ f ( x k − 1 ) + γ k − 1 k u k − 1 = − ∇ f ( x k − 1 ) + ∇ f ( x k − 1 ) T H u k − 1 u k − 1 T H u k − 1 u k − 1 = − ∇ f ( x k − 1 ) + ∇ f ( x k − 1 ) T ∇ f ( x k − 1 ) β k u k − 1 T H u k − 1 u k − 1 \begin{align} u_k &= -\nabla f(x_{k-1}) + \sum_{i=1}^{k-1}\gamma_i^{k}u_i\\ &= -\nabla f(x_{k-1})+\gamma_{k-1}^{k}u_{k-1}\\ &= -\nabla f(x_{k-1})+\frac{\nabla f(x_{k-1})^\text THu_{k-1}}{u_{k-1}^\text THu_{k-1}}u_{k-1}\\ &=-\nabla f(x_{k-1})+\frac{\nabla f(x_{k-1})^\text T\nabla f(x_{k-1})}{\beta_ku_{k-1}^\text THu_{k-1}}u_{k-1} \end{align} </math>uk=−∇f(xk−1)+i=1∑k−1γikui=−∇f(xk−1)+γk−1kuk−1=−∇f(xk−1)+uk−1THuk−1∇f(xk−1)THuk−1uk−1=−∇f(xk−1)+βkuk−1THuk−1∇f(xk−1)T∇f(xk−1)uk−1

由此可以看出,根据 Gram-Schmidt 方法,第 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 个共轭向量只与第 <math xmlns="http://www.w3.org/1998/Math/MathML"> k − 1 k-1 </math>k−1 个共轭向量有关系,关于共轭向量的计算被大大的简化了。

相关推荐
xiaobai12 3几秒前
二叉树的遍历【C++】
开发语言·c++·算法
吱吱鼠叔25 分钟前
MATLAB数学规划:2.线性规划
算法·机器学习·matlab
声学黑洞仿真工作室32 分钟前
Matlab Delany-Bazley和Miki模型预测多孔材料吸声性能
开发语言·人工智能·算法·matlab·微信公众平台
机器学习之心37 分钟前
选址模型 | 基于混沌模拟退火粒子群优化算法的电动汽车充电站选址与定容(Matlab)
算法·选址模型
MogulNemenis1 小时前
力扣春招100题——队列
数据结构·算法·leetcode
码上一元1 小时前
【百日算法计划】:每日一题,见证成长(017)
java·算法
菜鸟求带飞_2 小时前
算法打卡:第十一章 图论part01
java·数据结构·算法
浅念同学2 小时前
算法.图论-建图/拓扑排序及其拓展
算法·图论
是小Y啦2 小时前
leetcode 106.从中序与后续遍历序列构造二叉树
数据结构·算法·leetcode
liuyang-neu2 小时前
力扣 42.接雨水
java·算法·leetcode