[工程优化]共轭方向法(Conjugate direction method)的共轭梯度法(Conjugate gradient method)实现【附python代码】

文章目录

  • 引用
  • Preliminaries
    • 梯度与梯度下降
    • 矩阵(半)正定
    • 线性方程组
    • 正交向量
    • 共轭方向及共轭方向组
    • 牛顿法(Newton's method)
  • 共轭方向法
    • 从几何出发说明共轭方向法的有效性
      • 共轭方向的理解
      • 避免锯齿现象
    • 共轭方向法的数理基础
      • 共轭方向法的效率
      • 一维搜索的性质:共轭方向法的算法理论基础
    • 共轭方向法的共轭梯度法(Conjugate gradient method)实现
      • 共轭方向法与共轭梯度法的关系
      • 由梯度构造一组共轭方向
      • 基于共轭梯度法的共轭方向法迭代求解
    • 与梯度下降法的比对
      • 非二次模型泛化能力


引用

Wikipeidia:Conjugate gradient method

Preliminaries

梯度与梯度下降

  1. 对于一维函数 f ( x ) f(x) f(x),其导数定义为:
    f ′ ( x ) = lim ⁡ Δ x → 0 f ( x 0 + Δ x ) − f ( x 0 ) Δ x f'(x)=\lim \limits_{\Delta x \rightarrow 0} \frac{f(x_0+\small{\Delta} x)-f(x_0)}{\small{\Delta} x} f(x)=Δx0limΔxf(x0+Δx)f(x0)
  2. 对于多维函数 f ( x 1 , . . . , x n ) f(x_1,...,x_n) f(x1,...,xn),对 x i x_i xi求导数 d f d x i \frac{df}{dx_i} dxidf,将其记为偏导数 ∂ f ∂ x I \frac{\partial f}{\partial x_I} xIf。特别的,记录梯度 ▽ f ( x ) \triangledown f(x) f(x)或简记为 ▽ f \triangledown f f为对 x i x_i xi求偏导后的列向量:
    g ( x ) = ▽ f ( x ) = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . , ∂ f ∂ x 1 ) T g(x)=\triangledown f(x)=(\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2},..., \frac{\partial f}{\partial x_1})^T g(x)=f(x)=(x1f,x2f,...,x1f)T
  3. 梯度下降

参见:[工程优化]梯度下降(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 xTAx0,则称其为半正定矩阵

同时,若一个矩阵 A A A正定,则 A A A的特征值均为正数(半正定则为大于零的数),一定存在逆矩阵 A − 1 A^{-1} A1

线性方程组

设有对称、正定矩阵 A ∈ R n × n A \in \R^{n \times n} ARn×n和非零列向量 x , b ∈ R n x,b \in \R^n x,bRn满足 A x = b Ax=b Ax=b,称其为一个线性方程组(System of Linear Equations)。将其唯一解记为 x ∗ x^* x

正交向量

若非零列向量 a , b ∈ R n a,b \in \R^n a,bRn满足 a T b = 0 a^Tb=0 aTb=0,则将这两个向量互为正交向量。当其正交,则其在空间上互为垂直的两个向量。

Tip:亦有文献将其称为直交

共轭方向及共轭方向组

  1. 如果对于非零列向量 u , v ∈ R n u,v \in \R^n u,vRn存在 n × n n \times n n×n 对称、正定矩阵 A A A使得:
    u T A v = 0 u^TAv=0 uTAv=0则称 u , v u,v u,v为关于 A A A共轭方向

众所周知,矩阵可以看作是一种运动、映射,当 u , v u,v u,v关于 A A A共轭时,实际上是值当 u , v u,v u,v经过对称正定矩阵 A A A的运动之后在空间上互相垂直(正交)。
特别的,当 A A A取得单位阵时,实际上下文提到的二阶拟合函数就是一个圆球,共轭方向为过圆心且互相垂直的若干组直径。

  1. 设对于非零向量 p i , p j ∈ p ^ = { p 1 , ⋯   , p n } p_i ,p_j\in \hat p= \{ p_1, \cdots, p_n \} pipjp^={p1,,pn} p i , p j ∈ R n p_i,p_j \in \R^n pi,pjRn,若 p i T A p j = 0 p_i^TAp_j=0 piTApj=0 ( i = ̸ j ) (i =\not j) (i≠j),则称 p 1 , ⋯   , p n p_1,\cdots,p_n p1,,pn是关于 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,pkp^={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

牛顿法(Newton’s method)

牛顿法是对二阶泛函的近似求解。

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 ARn对称且正定。在此基础上,我们从几何出发,来说明共轭方向法的有效性。

补充:一般情况下,在极值点附近,原目标函数可以近似于一个二次函数。当我们对二次函数建立一个有效的模型,那么,它对非二次模型也应当是有效的。(但是,不是所有函数都可以很好地用二次函数拟合。)

共轭方向的理解

对于共轭方向,在上文中提到它其实是正交的一种变形。在正交方向 a , b ∈ R n a,b \in \R^n a,bRn上当沿着方向 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 ARn 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),(11))时,会发现 a T A = ( 1 , − 1 ) a^TA=(1,-1) aTA=(1,1) a a a向量被扭曲(旋转)到了与 c c c相垂直的方向上:
[工程优化]共轭方向法(Conjugate direction method)的共轭梯度法(Conjugate gradient method)实现【附python代码】_第1张图片
而超椭球体实际上就是当 A A A不为单位矩阵时的偏球体,它在若干个“正交基”上所下降的尺度经过 A A A的扭曲,因此使用共轭方向可以还原出这种“正交”属性。

避免锯齿现象

梯度下降的最大问题在于锯齿现象的诱因:当沿着某个方向下降时已经找到了某个维度的极小点,而下一次下降又会破坏该维度的极小点,从而使得搜索路径来回震荡,不断处于“找到某一维度极小点-破坏该维度极小点”的恶性病态循环过程中。

在上文中,提到了在正交方向上,沿着某个正交方向移动在其它正交方向上不会产生位移。而这就避免了梯度下降的恶性病态过程。(下文中会证明共轭方向法 n n n步收敛,实际上也是这个理解一个体现)

>返回目录


共轭方向法的数理基础

上一小节简单理解了共轭方向法在几何上的理解,下面要开始介绍共轭梯度的效率和与工程优化的结合方式。

共轭方向法的效率

共轭方向法对于 n n n阶对称正定矩阵 A A A(即 n n n维优化目标),理论上至多只要 n n n次迭代就能得到最优解。

  • 这种性质被称为二次收敛性

证明:

  1. 采用二次泛函 ϕ ( 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)分别为其下降步长和共轭方向。
  2. 若对 1 ≤ i ≤ n 1 \le i \le n 1in,使得 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)++λ(n1)Ap(n1)+λ(n)Ap(n)1kn=g(k+1)+i=k+1n(λ(i)Ap(i))=p(k)Tg(k+1)+p(k)Ti=k+1n(λ(i)Ap(i))
  3. 其中,任取 1 ≤ k ≤ n 1\le k\le n 1kn,根据一维搜索的性质(会在下文进行证明),都有: 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
  4. ∵ 根据共轭方向组的性质有 p ( i ) T A p ( j ) = 0 , ( i = ̸ j ) p_{(i)}^TAp_{(j)}=0,(i=\not j) p(i)TAp(j)=0,(i≠j)
  5. 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 1it):
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得证。

  • 这个式子将在下文中进行广泛应用,它直接说明了一个问题,由一维搜索得到的步长能够使得下一迭代点的梯度与之前所有的共轭方向正交。
  • 同时,该式子也是共轭梯度法的理论基础。

>返回目录


共轭方向法的共轭梯度法(Conjugate gradient method)实现

共轭方向法与共轭梯度法的关系

共轭方向法是共轭梯度法的基础,后者是对前者的一种实现。

  • 在下文中,共轭方向法试图找到一组共轭的方向使得优化目标 n n n步内收敛(满足二次收敛性)。而共轭梯度法则根据梯度来构建这一组共轭方向。换句话说,共轭方向法是算法的框架抽象类,而共轭梯度法则是其实现类。

由梯度构造一组共轭方向

现在,要构造一组 p ( i ) p_{(i)} p(i)使得其关于矩阵 A A A共轭,以使得上上小节推定的 n n n步之内下降到驻点的算法效率必要条件得以成立。

  1. 给定 x ( 0 ) x^{(0)} x(0)及初始方向向量 p ( 0 ) = − ▽ ϕ ( x ( 0 ) ) = ̸ 0 p_{(0)}=-\triangledown \phi(x^{(0)})=\not0 p(0)=ϕ(x(0))≠0
  2. p ( t + 1 ) = − g ( t + 1 ) + α ( t ) p ( t ) p_{(t+1)}=-g_{(t+1)}+\alpha_{(t)}p_{(t)} p(t+1)=g(t+1)+α(t)p(t)使得 p ( t + 1 ) p_{(t+1)} p(t+1) p ( t ) p_{(t)} p(t)互成关于 A A A的共轭方向。其中 α \alpha α是一个待定系数。
  3. 根据向量共轭的定义,有:
    p ( t + 1 ) T A p ( t ) = − g ( t + 1 ) T A p ( t ) + α ( t ) p ( t ) T A p ( t ) = 0 \begin{aligned} p_{(t+1)}^TAp_{(t)}&=-g_{(t+1)}^TAp_{(t)}+\alpha_{(t)}p_{(t)}^TAp_{(t)} \\ &=0 \end{aligned} p(t+1)TAp(t)=g(t+1)TAp(t)+α(t)p(t)TAp(t)=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)} } α(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,1it即各个迭代点的梯度互相正交。该式子将被用于求 α \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)=01it1:
由数学归纳法,显然 t = 1 t=1 t=1时成立,假设 t = k − 1 t=k-1 t=k1时成立,欲证 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(k1)+λ(k1)Ap(k1))Tg(i)=g(k1)Tg(i)+λ(k1)p(k1)TAg(i)=0+λ(k1)p(k1)TAg(i)=λ(k1)p(k1)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)=λ(k1)p(k1)Tg(i)=λ(k1)p(k1)TA(p(i)+α(i1)p(i1))=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)=01it1
同样由数学归纳法,推导前序步骤,接着证明:
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)+α(k1)p(k1))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∴ 命题证明完毕。

基于共轭梯度法的共轭方向法迭代求解

用在工程优化上,其迭代求解的思路大致如下:

  1. 给定 x ( 0 ) x^{(0)} x(0)及初始方向向量 p ( 0 ) = − ▽ ϕ ( x ( 0 ) ) p_{(0)}=-\triangledown \phi(x^{(0)}) p(0)=ϕ(x(0)),当 g ( x ( t ) ) < ϵ g(x^{(t)})<\epsilon g(x(t))<ϵ 时算法结束;否则重复步骤2~5。
  2. 一维搜索 min ⁡ ϕ ( x ( t ) ) \min \phi(x^{(t)}) minϕ(x(t)),得到 λ ( t ) \lambda_{(t)} λ(t)
  3. 迭代点的更新公式为: 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)
  4. g ( t ) = A x ( t ) g_{(t)}=Ax^{(t)} g(t)=Ax(t), 则 g ( t + 1 ) − g ( t ) = λ ( t ) A p ( t ) g_{(t+1)}-g_{(t)}=\lambda_{(t)}Ap_{(t)} g(t+1)g(t)=λ(t)Ap(t)
  5. 更新方向向量 p ( t + 1 ) = − g ( t + 1 ) + α ( t ) p ( t ) p_{(t+1)}=-g_{(t+1)}+\alpha_{(t)}p_{(t)} p(t+1)=g(t+1)+α(t)p(t),其中: α ( 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)

α的几种等价形式
根据上文的推断,已知:
α ( 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,1it

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,1it

由①②得到①的变形(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)+α(t1)p(t1)代入⑥,注意到 p ( t − 1 ) T g ( t ) = 0 p_{(t-1)}^Tg_{(t)}=0 p(t1)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)2g(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,分别进行梯度下降和共轭方向下降,结果如下:
[工程优化]共轭方向法(Conjugate direction method)的共轭梯度法(Conjugate gradient method)实现【附python代码】_第2张图片
核心代码如下:

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)) 

[工程优化]共轭方向法(Conjugate direction method)的共轭梯度法(Conjugate gradient method)实现【附python代码】_第3张图片
可以看到,共轭方向法依旧表现出了超越梯度下降法的效率。

你可能感兴趣的:(机器学习,数据挖掘,数学模型)