Wikipeidia:Conjugate gradient method
参见:[工程优化]梯度下降(Gradient descent):SGD/BGD
设有 x T A x x^TAx xTAx对 ∀ x = ( x 1 , ⋯   , x n ) T \forall x=(x_1,\cdots,x_n)^T ∀x=(x1,⋯,xn)T都有 x T A x > 0 x^TAx>0 xTAx>0,则称矩阵 A A A是正定矩阵;若都有 x T A x ≥ 0 x^TAx\ge0 xTAx≥0,则称其为半正定矩阵。
同时,若一个矩阵 A A A正定,则 A A A的特征值均为正数(半正定则为大于零的数),一定存在逆矩阵 A − 1 A^{-1} A−1。
设有对称、正定矩阵 A ∈ R n × n A \in \R^{n \times n} A∈Rn×n和非零列向量 x , b ∈ R n x,b \in \R^n x,b∈Rn满足 A x = b Ax=b Ax=b,称其为一个线性方程组(System of Linear Equations)。将其唯一解记为 x ∗ x^* x∗。
若非零列向量 a , b ∈ R n a,b \in \R^n a,b∈Rn满足 a T b = 0 a^Tb=0 aTb=0,则将这两个向量互为正交向量。当其正交,则其在空间上互为垂直的两个向量。
Tip:亦有文献将其称为直交。
众所周知,矩阵可以看作是一种运动、映射,当 u , v u,v u,v关于 A A A共轭时,实际上是值当 u , v u,v u,v经过对称正定矩阵 A A A的运动之后在空间上互相垂直(正交)。
特别的,当 A A A取得单位阵时,实际上下文提到的二阶拟合函数就是一个圆球,共轭方向为过圆心且互相垂直的若干组直径。
引理:非0共轭方向组显然线性无关。(可用反证法证明)
证明:设有一组标量 α i \alpha_i αi使得 ∑ α i p i = 0 \sum \alpha_ip_i=0 ∑αipi=0,则 ∀ k , p k ∈ p ^ = { p 1 , ⋯   , p n } \forall k,p_k \in \hat p=\{ p_1, \cdots, p_n\} ∀k,pk∈p^={p1,⋯,pn},有:
p k T A ∑ α i p i = 0 α k p k T A p k = 0 \begin{aligned} p_k^TA\sum \alpha_ip_i&=0 \\ \alpha_k p_k^TAp_k&=0 \end{aligned} pkTA∑αipiαkpkTApk=0=0∵ 矩阵 A A A正定有 p k T A p k > 0 p_k^TAp_k>0 pkTApk>0, ∴ α k = 0 ∴\alpha_k=0 ∴αk=0
牛顿法是对二阶泛函的近似求解。
Ref:[工程优化]牛顿法的缺陷及拟牛顿法(Newton’s method)
由于共轭方向法同样采用了用二次泛函拟合函数极值微分点的做法,因此理解牛顿法对理解共轭方向法及其有效性有直接帮助。
换句话说,一般情况下,在极值点附近,原目标函数可以近似于一个二次函数。当我们对二次函数建立一个有效的模型,那么,它对非二次模型也应当是有效的。(ps:要注意,不是所有函数都可以很好地用二次函数拟合。)
>返回目录
共轭方向法是一种介于梯度下降法和牛顿法之间的算法,它不像牛顿法一样需要二阶导数,又避免了梯度下降中的锯齿现象。
注:这一小节偏向白话,是比较形而上的理解内容。可以选择性阅读。
考虑 n n n维空间上的二次函数 ϕ ( x ) \phi(x) ϕ(x),它应当是一个超椭球体:
ϕ ( x ) ≈ f ( x ) = 1 2 x T A x + b T x + c ▽ ϕ ( x ) = A x + b T ▽ 2 ϕ ( x ) = A \begin{aligned} \phi(x) \approx f(x)&=\frac{1}{2}x^TAx+b^Tx+c \\ \triangledown \phi(x)&=Ax+b^T \\ \triangledown^2 \phi(x)&=A \end{aligned} ϕ(x)≈f(x)▽ϕ(x)▽2ϕ(x)=21xTAx+bTx+c=Ax+bT=A
其中, f ( x ) f(x) f(x)是原目标函数在极值点处的二阶拟合、矩阵 A ∈ R n A \in \R^n A∈Rn对称且正定。在此基础上,我们从几何出发,来说明共轭方向法的有效性。
补充:一般情况下,在极值点附近,原目标函数可以近似于一个二次函数。当我们对二次函数建立一个有效的模型,那么,它对非二次模型也应当是有效的。(但是,不是所有函数都可以很好地用二次函数拟合。)
对于共轭方向,在上文中提到它其实是正交的一种变形。在正交方向 a , b ∈ R n a,b \in \R^n a,b∈Rn上当沿着方向 a a a移动时,就意味着在 b b b方向上不会发生任何位移。例如 a = ( 0 , 1 ) T a=(0,1)^T a=(0,1)T和 b = ( 1 , 0 ) T b=(1,0)^T b=(1,0)T、 c = ( 1 , 1 ) T c=(1,1)^T c=(1,1)T, a a a与 c c c不正交,当在 a a a上移动时,实际上在 c c c方向上也发生了移动;但 b b b方向则不会。
空间的扭曲
现在,存在一个扭曲的空间,我们把这个扭曲的运动记为 A ∈ R n A \in \R^n A∈Rn, u T A v = 0 u^TAv=0 uTAv=0,
例如对上文中的 a , b , c a,b,c a,b,c向量, A = ( ( − 1 , 1 ) , ( 1 − 1 ) ) A=((-1, 1), (1 -1)) A=((−1,1),(1−1))时,会发现 a T A = ( 1 , − 1 ) a^TA=(1,-1) aTA=(1,−1), a a a向量被扭曲(旋转)到了与 c c c相垂直的方向上:
而超椭球体实际上就是当 A A A不为单位矩阵时的偏球体,它在若干个“正交基”上所下降的尺度经过 A A A的扭曲,因此使用共轭方向可以还原出这种“正交”属性。
梯度下降的最大问题在于锯齿现象的诱因:当沿着某个方向下降时已经找到了某个维度的极小点,而下一次下降又会破坏该维度的极小点,从而使得搜索路径来回震荡,不断处于“找到某一维度极小点-破坏该维度极小点”的恶性病态循环过程中。
在上文中,提到了在正交方向上,沿着某个正交方向移动在其它正交方向上不会产生位移。而这就避免了梯度下降的恶性病态过程。(下文中会证明共轭方向法 n n n步收敛,实际上也是这个理解一个体现)
>返回目录
上一小节简单理解了共轭方向法在几何上的理解,下面要开始介绍共轭梯度的效率和与工程优化的结合方式。
共轭方向法对于 n n n阶对称正定矩阵 A A A(即 n n n维优化目标),理论上至多只要 n n n次迭代就能得到最优解。
证明:
- 采用二次泛函 ϕ ( x ) = 1 2 x T A x + b T x + c \phi(x)=\frac{1}{2}x^TAx+b^Tx+c ϕ(x)=21xTAx+bTx+c 拟合 f ( x ) f(x) f(x),记迭代点的更新公式为: x ( t + 1 ) = x ( t ) + λ ( t ) p ( t ) x^{(t+1)}=x^{(t)}+\lambda^{(t)} p_{(t)} x(t+1)=x(t)+λ(t)p(t)(该更新方式的有效性将在下文中证明), t = 0 , 1 , 2 , ⋯   , n t=0,1,2,\cdots,n t=0,1,2,⋯,n,则只需证明至多到 n n n 步时 g ( n + 1 ) = 0 g_{(n+1)}=0 g(n+1)=0。其中, g ( i ) g_{(i)} g(i)是函数在第 i i i个迭代点处的梯度: g ( i ) = A x ( i ) + b T g_{(i)}=Ax^{(i)}+b^T g(i)=Ax(i)+bT、 λ ( t ) , p ( t ) \lambda^{(t)}, p_{(t)} λ(t),p(t)分别为其下降步长和共轭方向。
- 若对 1 ≤ i ≤ n 1 \le i \le n 1≤i≤n,使得 g ( i ) = ̸ 0 g_{(i)}=\not0 g(i)≠0(否则此时原命题已成立),则需补证:
g ( n + 1 ) = g ( n ) + λ ( n ) A p ( n ) = g ( 1 ) + ⋯ + λ ( k ) A p ( k ) + ⋯ + λ ( n − 1 ) A p ( n − 1 ) + λ ( n ) A p ( n ) = 1 ≤ k ≤ n g ( k + 1 ) + ∑ i = k + 1 n ( λ ( i ) A p ( i ) ) p ( k ) T g ( n + 1 ) = p ( k ) T g ( k + 1 ) + p ( k ) T ∑ i = k + 1 n ( λ ( i ) A p ( i ) ) \begin{aligned} g_{(n+1)}&=g_{(n)}+\lambda_{(n)}Ap_{(n)}\\ &=g_{(1)}+\cdots+\lambda_{(k)}Ap_{(k)}+\cdots+\lambda_{(n-1)}Ap_{(n-1)}+\lambda_{(n)}Ap_{(n)}\\ &\mathop=\limits_{1\le k\le n}g_{(k+1)}+\sum_{i=k+1}^n(\lambda_{(i)}Ap_{(i)}) \\ p_{(k)}^Tg_{(n+1)}&=p_{(k)}^Tg_{(k+1)}+p_{(k)}^T\sum_{i=k+1}^n(\lambda_{(i)}Ap_{(i)}) \end{aligned} g(n+1)p(k)Tg(n+1)=g(n)+λ(n)Ap(n)=g(1)+⋯+λ(k)Ap(k)+⋯+λ(n−1)Ap(n−1)+λ(n)Ap(n)1≤k≤n=g(k+1)+i=k+1∑n(λ(i)Ap(i))=p(k)Tg(k+1)+p(k)Ti=k+1∑n(λ(i)Ap(i))- 其中,任取 1 ≤ k ≤ n 1\le k\le n 1≤k≤n,根据一维搜索的性质(会在下文进行证明),都有: g ( k + 1 ) T p ( k ) = p ( k ) T g ( k + 1 ) = 0 g_{(k+1)}^Tp_{(k)}=p_{(k)}^Tg_{(k+1)}=0 g(k+1)Tp(k)=p(k)Tg(k+1)=0。
- ∵ 根据共轭方向组的性质有 p ( i ) T A p ( j ) = 0 , ( i = ̸ j ) p_{(i)}^TAp_{(j)}=0,(i=\not j) p(i)TAp(j)=0,(i≠j)
- ∴ p ( k ) T g ( n + 1 ) = 0 p_{(k)}^Tg_{(n+1)}=0 p(k)Tg(n+1)=0 即 g ( n + 1 ) = 0 g_{(n+1)}=0 g(n+1)=0 得证。
上一小节中提到了——根据一维搜索的性质可以得到:
g ( k + 1 ) T p ( k ) = p ( k ) T g ( k + 1 ) = 0 g_{(k+1)}^Tp_{(k)}=p_{(k)}^Tg_{(k+1)}=0 g(k+1)Tp(k)=p(k)Tg(k+1)=0
实际上这个式子可以进一步进行泛化,即当( 1 ≤ i ≤ t 1\le i \le t 1≤i≤t):
g ( t + 1 ) T p ( i ) = p ( i ) T g ( t + 1 ) = 0 g_{(t+1)}^Tp_{(i)}=p_{(i)}^Tg_{(t+1)}=0 g(t+1)Tp(i)=p(i)Tg(t+1)=0
证明:
记一维搜索 min λ ( t ) ≥ 0 f ( x ( t ) + λ ( t ) p ( t ) ) \min \limits_{\lambda_{(t)}\ge0} f(x^{(t)}+\lambda_{(t)}p_{(t)}) λ(t)≥0minf(x(t)+λ(t)p(t)),当搜索结束时,此时驻点的梯度为0,因此有 ▽ f ( x ( t ) + λ ( t ) p ( t ) ) = g ( t ) = 0 \triangledown f(x^{(t)}+\lambda_{(t)}p_{(t)})=g_{(t)}=0 ▽f(x(t)+λ(t)p(t))=g(t)=0。
显然,当 k < t k < t k<t,必有 ▽ f ( x ( t ) + λ ( t ) p ( t ) ) T p ( k ) = 0 \triangledown f(x^{(t)}+\lambda_{(t)}p_{(t)})^Tp^{(k)}=0 ▽f(x(t)+λ(t)p(t))Tp(k)=0,即 g ( t ) T p ( i ) = p ( i ) T g ( t ) = 0 g_{(t)}^Tp_{(i)}=p_{(i)}^Tg_{(t)}=0 g(t)Tp(i)=p(i)Tg(t)=0得证。
>返回目录
共轭方向法是共轭梯度法的基础,后者是对前者的一种实现。
现在,要构造一组 p ( i ) p_{(i)} p(i)使得其关于矩阵 A A A共轭,以使得上上小节推定的 n n n步之内下降到驻点的算法效率必要条件得以成立。
调整等号两边的式子得到:
α ( t ) = g ( t + 1 ) T A p ( t ) p ( t ) T A p ( t ) \alpha_{(t)}= \frac{g_{(t+1)}^TAp_{(t)}}{p_{(t)}^TAp_{(t)} } α(t)=p(t)TAp(t)g(t+1)TAp(t)
该方法为 Daniel 在1967年提出,该方法构造的方向向量组合是关于 A A A的共轭方向组可由数学归纳法证明。
此处由数学归纳法还可以得到一个较为重要的结论,该方法得到的迭代点具有以下性质: g ( i ) T g ( t + 1 ) = g ( t + 1 ) T g ( i ) = 0 , 1 ≤ i ≤ t g_{(i)}^Tg_{(t+1)}=g_{(t+1)}^Tg_{(i)}=0,1 \le i \le t g(i)Tg(t+1)=g(t+1)Tg(i)=0,1≤i≤t,即各个迭代点的梯度互相正交。该式子将被用于求 α \alpha α的等价形式中。
① 先证明 g ( t ) T g ( i ) = 0 , 1 ≤ i ≤ t − 1 g_{(t)}^Tg_{(i)}=0,1 \le i \le t-1 g(t)Tg(i)=0,1≤i≤t−1:
由数学归纳法,显然 t = 1 t=1 t=1时成立,假设 t = k − 1 t=k-1 t=k−1时成立,欲证 t = k t=k t=k时成立:
g ( k ) T g ( i ) = ( − g ( k − 1 ) + λ ( k − 1 ) A p ( k − 1 ) ) T g ( i ) = − g ( k − 1 ) T g ( i ) + λ ( k − 1 ) p ( k − 1 ) T A g ( i ) = 0 + λ ( k − 1 ) p ( k − 1 ) T A g ( i ) = λ ( k − 1 ) p ( k − 1 ) T A g ( i ) \begin{aligned} g_{(k)}^Tg_{(i)}&=(-g_{(k-1)}+\lambda_{(k-1)}Ap_{(k-1)})^Tg_{(i)} \\ &=-g_{(k-1)}^Tg_{(i)}+\lambda_{(k-1)}p_{(k-1)}^TAg_{(i)} \\ &=0+\lambda_{(k-1)}p_{(k-1)}^TAg_{(i)}\\ &=\lambda_{(k-1)}p_{(k-1)}^TAg_{(i)} \end{aligned} g(k)Tg(i)=(−g(k−1)+λ(k−1)Ap(k−1))Tg(i)=−g(k−1)Tg(i)+λ(k−1)p(k−1)TAg(i)=0+λ(k−1)p(k−1)TAg(i)=λ(k−1)p(k−1)TAg(i)∵ 由求共轭方向组的方法可知: p ( n + 1 ) = − g ( n + 1 ) + α ( n ) p ( n ) p_{(n+1)}=-g_{(n+1)}+\alpha_{(n)}p_{(n)} p(n+1)=−g(n+1)+α(n)p(n),代入上式:
g ( k ) T g ( i ) = λ ( k − 1 ) p ( k − 1 ) T g ( i ) = λ ( k − 1 ) p ( k − 1 ) T A ( − p ( i ) + α ( i − 1 ) p ( i − 1 ) ) = 0 \begin{aligned} g_{(k)}^Tg_{(i)}&=\lambda_{(k-1)}p_{(k-1)}^Tg_{(i)} \\ &=\lambda_{(k-1)}p_{(k-1)}^TA(-p{(i)}+\alpha_{(i-1)}p_{(i-1)}) \\ &=0 \end{aligned} g(k)Tg(i)=λ(k−1)p(k−1)Tg(i)=λ(k−1)p(k−1)TA(−p(i)+α(i−1)p(i−1))=0∴ 命题证明完毕。
② 接着证明 p ( t ) T A p ( i ) = 0 , 1 ≤ i ≤ t − 1 p_{(t)}^TAp_{(i)}=0,1 \le i \le t-1 p(t)TAp(i)=0,1≤i≤t−1:
同样由数学归纳法,推导前序步骤,接着证明:
p ( k ) T A p ( i ) = ( − g ( k ) + α ( k − 1 ) p ( k − 1 ) ) T A p ( i ) = − g ( k ) T A p ( i ) \begin{aligned} p_{(k)}^TAp_{(i)} &= (-g_{(k)}+\alpha_{(k-1)}p_{(k-1)})^TAp_{(i)}\\ &= -g_{(k)}^TAp_{(i)} \end{aligned} p(k)TAp(i)=(−g(k)+α(k−1)p(k−1))TAp(i)=−g(k)TAp(i)∵ 由求共轭方向组的方法可知: g ( n + 1 ) − g ( n ) = λ ( n ) A p ( n ) g_{(n+1)}-g{(n)}=\lambda_{(n)}Ap_{(n)} g(n+1)−g(n)=λ(n)Ap(n),同时结合①的结论,代入上式:
p ( k ) T A p ( i ) = − g ( k ) T A p ( i ) = − g ( k ) T ( g ( i + 1 ) − g ( i ) λ ( i ) ) = 0 \begin{aligned} p_{(k)}^TAp_{(i)} &= -g_{(k)}^TAp_{(i)}\\ &= -g_{(k)}^T(\frac{g_{(i+1)}-g_{(i)}}{\lambda_{(i)}}) \\ &= 0 \end{aligned} p(k)TAp(i)=−g(k)TAp(i)=−g(k)T(λ(i)g(i+1)−g(i))=0∴ 命题证明完毕。
用在工程优化上,其迭代求解的思路大致如下:
α的几种等价形式
根据上文的推断,已知:
α ( t ) = g ( t + 1 ) T A p ( t ) p ( t ) T A p ( t ) ⋯ ① \alpha_{(t)}=\frac{g_{(t+1)}^TAp_{(t)}}{p_{(t)}^TAp_{(t)}} \cdots① α(t)=p(t)TAp(t)g(t+1)TAp(t)⋯①
A p ( t ) = λ ( t ) ( g ( t + 1 ) − g ( t ) ) ⋯ ② Ap_{(t)}=\lambda_{(t)}(g_{(t+1)}-g_{(t)})\cdots② Ap(t)=λ(t)(g(t+1)−g(t))⋯②
p ( i ) T g ( t + 1 ) = g ( t + 1 ) T p ( i ) = 0 , 1 ≤ i ≤ t ⋯ ③ p_{(i)}^Tg_{(t+1)}=g_{(t+1)}^Tp_{(i)}=0,1\le i\le t \cdots③ p(i)Tg(t+1)=g(t+1)Tp(i)=0,1≤i≤t⋯③
g ( i ) T g ( t + 1 ) = g ( t + 1 ) T g ( i ) = 0 , 1 ≤ i ≤ t ⋯ ④ g_{(i)}^Tg_{(t+1)}=g_{(t+1)}^Tg_{(i)}=0,1\le i\le t \cdots④ g(i)Tg(t+1)=g(t+1)Tg(i)=0,1≤i≤t⋯④
由①②得到①的变形(Sorenson-Wolfe,1972):
α ( t ) = g ( t + 1 ) T ( g ( t + 1 ) − g ( t ) ) p ( t ) T ( g ( t + 1 ) − g ( t ) ) ⋯ ⑤ \alpha_{(t)}=\frac{g_{(t+1)}^T(g_{(t+1)}-g_{(t)})}{p_{(t)}^T(g_{(t+1)}-g_{(t)})} \cdots⑤ α(t)=p(t)T(g(t+1)−g(t))g(t+1)T(g(t+1)−g(t))⋯⑤
由③④⑤得到①的变形(Myers,1972):
α ( t ) = − g ( t + 1 ) T g ( t + 1 ) p ( t ) T g ( t ) = − ∣ ∣ g ( t + 1 ) ∣ ∣ 2 p ( t ) T g ( t ) ⋯ ⑥ \begin{aligned} \alpha_{(t)}&=-\frac{g_{(t+1)}^Tg_{(t+1)}}{p_{(t)}^Tg_{(t)}}\\ &=-\frac{{||g_{(t+1)}||}_2}{p_{(t)}^Tg_{(t)}} \end{aligned} \cdots⑥ α(t)=−p(t)Tg(t)g(t+1)Tg(t+1)=−p(t)Tg(t)∣∣g(t+1)∣∣2⋯⑥
将 p ( t ) = − g ( t ) + α ( t − 1 ) p ( t − 1 ) p_{(t)}=-g_{(t)}+\alpha_{(t-1)}p_{(t-1)} p(t)=−g(t)+α(t−1)p(t−1)代入⑥,注意到 p ( t − 1 ) T g ( t ) = 0 p_{(t-1)}^Tg_{(t)}=0 p(t−1)Tg(t)=0,得到①的等价形式(Flecher-Reeves,1964):
α ( t ) = ∣ ∣ g ( t + 1 ) ∣ ∣ 2 ∣ ∣ g ( t ) ∣ ∣ 2 ⋯ ⑦ \alpha_{(t)}=\frac{{||g_{(t+1)}||}^2}{{||g_{(t)}||}^2} \cdots⑦ α(t)=∣∣g(t)∣∣2∣∣g(t+1)∣∣2⋯⑦
Tips:该等式易记好求,在下文的代码中也使用这种形式。
同样,由⑤和⑦得到①的变形(Polyak-Polak-Ribiere,1969):
α ( t ) = g ( t + 1 ) T ( g ( t + 1 ) − g ( t ) ) ∣ ∣ g ( t ) ∣ ∣ 2 ⋯ ⑧ \alpha_{(t)}=\frac{g_{(t+1)}^T(g_{(t+1)}-g_{(t)})}{{||g_{(t)}||}^2} \cdots⑧ α(t)=∣∣g(t)∣∣2g(t+1)T(g(t+1)−g(t))⋯⑧
>返回目录
对 f ( x 0 , x 1 ) = x 0 2 + x 1 2 f(x_0,x_1)=x_0^2 + x_1^2 f(x0,x1)=x02+x12,分别进行梯度下降和共轭方向下降,结果如下:
核心代码如下:
def cd_alg(x_init, epsilon=1e-1, m_lambda=0.01):
xt = x_init
gt = grad(xt)
pt = -gt
costs = [cost(xt)]
while abs(gt[0]) > epsilon or abs(gt[1]) > epsilon:
xt1 = xt.T + m_lambda*pt # 此处简单使用定步长替代一维搜索
gt1 = grad(xt1)
alpha_t = alpha(gt1, gt)
pt1 = -gt1 + alpha_t*pt
current_cost = cost(xt1)
costs.append(current_cost)
xt = xt1
gt = gt1
pt = pt1
return costs, xt
完整代码见此:Conjugate Direction vs. Gradient Descent
运行算法发现,在同样的收敛精度和下降步长下,共轭方向法只用了12次就完成了收敛,而梯度下降法则用了20+次。
在>Preliminaries<中,我们提到:
在极值点附近,原目标函数可以近似于一个二次函数。当我们对二次函数建立一个有效的模型,那么,它对非二次模型也应当是有效的。
下面对 f ( x 0 , x 1 ) = x 0 2 + sin ( π x 1 ) f(x_0,x_1)=x_0^2 + \sin(\pi x_1) f(x0,x1)=x02+sin(πx1)尝试使用共轭方向法进行优化:
# 修改上文给出的代码
f = lambda x: np.power(x[:, 0], 2) + np.sin(np.pi*x[:, 1]) # 给定新的非二次目标函数
def grad(x):
gx0 = 2 * x[:, 0]
gx1 = np.pi* np.cos(np.pi*x[:, 1]) # 求取新的梯度
return np.array([np.sum(gx0), np.sum(gx1)]).reshape((2, 1))