当前位置: 首页 > news >正文

无约束优化问题求解(3):共轭梯度法

目录

  • 4. 共轭梯度法
    • 4.1 共轭方向
    • 4.2 共轭梯度法
    • 4.3 共轭梯度法的程序实现
    • 4.4 非二次函数的共轭梯度法
  • Reference

4. 共轭梯度法

4.1 共轭方向

最速下降法的线搜索采取精确线搜索时,由精确线搜索需要满足的条件:迭代点列 x k + 1 = x k + α k d k x_{k+1}=x_k+\alpha_kd_k xk+1=xk+αkdk ∇ f ( x k + 1 ) T d k = 0 \nabla f(x_{k+1})^Td_k=0 f(xk+1)Tdk=0,其中 α k \alpha_{k} αk 是第 k k k 次迭代的最优步长, d k d_{k} dk是第 k k k 次迭代的负梯度方向 − ∇ f ( x k ) -\nabla f(x_k) f(xk),可以得到 ∇ f ( x k + 1 ) T ∇ f ( x k ) = − ∇ f ( x k + 1 ) T d k / ∥ ∇ f ( x k ) ∥ 2 = 0. \begin{align}\nabla f(x_{k+1})^T\nabla f(x_k)=-\nabla f(x_{k+1})^Td_k/\|\nabla f(x_k)\|_2=0.\end{align} f(xk+1)Tf(xk)=f(xk+1)Tdk/∥∇f(xk)2=0.

该式的含义即相邻两次的搜索方向是垂直的,如果我们考虑目标函数为二次多项式的形式,即
f ( x ) = 1 2 x T A x + b T x , b = ( b 1 , ⋯ , b n ) T ∈ R n , \begin{align} f(x)=\dfrac{1}{2}x^TAx+b^Tx,\quad b=(b_1,\cdots,b_n)^T\in\mathbb{R}^n,\end{align} f(x)=21xTAx+bTx,b=(b1,,bn)TRn,其中 A : = d i a g ( λ 1 , ⋯ , λ n ) A:=\mathbf{diag}(\lambda_1,\cdots,\lambda_n) A:=diag(λ1,,λn) 是一个对角矩阵, λ i > 0 , i = 1 , ⋯ , n . \lambda_i>0,\quad i=1,\cdots,n. λi>0,i=1,,n. 此时,函数的等高面为一椭球(圆),基于精确线搜索的最速下降法的迭代点列以锯齿方向前进,如图 4.1的黑色实线所示,这使得其收敛速度变得缓慢.也就是说尽管最速下降法采用当前点梯度下降最快的方向作为搜索方向, 但该方向未必是较大范围内下降最快的方向,也就是说该方向不一定是较大范围内函数值幅度变化最大方向,而如果我们按照平行于坐标轴的方向进行精确搜索,如图 4.1左边的红色虚线所示, 在二维情形只需要两次就达到了最小值点,那么我们可以断言:对 n n n 维的二次函数优化问题(2),最多经过 n n n 次迭代就可以达到最小值点,上面的断言就是共轭方向法的想法.


图 4.1:最速下降法的搜索方向 (黑色实线)

对形如(2)的目标函数,由于 A : = d i a g ( λ 1 , ⋯ , λ n ) , λ i > 0 , i = 1 , ⋯ , n A:=\mathbf{diag}(\lambda_1,\cdots,\lambda_n),\lambda_i>0,\:i=1,\cdots,n A:=diag(λ1,,λn),λi>0,i=1,,n. 我们有 f ( x ) = ∑ i = 1 n ( 1 2 λ i x i 2 + b i x i ) . f(x)=\sum_{i=1}^n\big(\frac12\lambda_ix_i^2+b_ix_i\big). f(x)=i=1n(21λixi2+bixi).也就是说对于每一个 i i i 而言,都是二次函数,根据二次函数的性质, 1 2 λ i x i 2 + b i x i \frac12\lambda_ix_i^2+b_ix_i 21λixi2+bixi 在无约束的情况下必然可以取到最值, x = ( x 1 , ⋯ , x n ) x=(x_1,\cdots,x_n) x=(x1,,xn) 使得 f ( x ) f(x) f(x) 达到最小值当且仅当对 i = 1 , ⋯ , n , x i i=1,\cdots,n,x_i i=1,,n,xi 使得 f i ( x i ) : = λ i x i 2 + b i x i f_i(x_i):=\lambda_ix_i^2+b_ix_i fi(xi):=λixi2+bixi 达到最小.

根据解析几何的知识,函数 f ( x ) f(x) f(x) 是二次曲面,且其等高面是一个椭球 (圆). 对 i = 1 , ⋯ , n i= 1, \cdots , n i=1,,n,记 e i e_i ei 表示 R n \mathbb{R}^n Rn 中第 i i i个坐标向量. ∀ x 0 ∈ R n \forall x_0\in \mathbb{R} ^n x0Rn,沿方向 d i = e i d_i=e_i di=ei 作精确搜索时,将搜索到 f i ( x i ) f_i(x_i) fi(xi) 的最小值点,而其余项不变,也就是说每次搜索只改变一个方向而保持其他方向不变,那么如此搜索最多 n n n 次后达到函数的最小值点,这也就是前面我们断言的内容.

但是这个时候可能又有疑问了,并不是所有的椭圆的轴都是和坐标轴平行的呀,那么如果这个时候还是以平行于坐标轴的方向来作为每次的搜索方向不一定会达到最快的效果呀。事实上确实如此,沿着坐标轴来搜索确实只是一种特殊的情况,如下图所示:


图 4.2:正交和共轭

如图 4.2所示,当我们还以坐标轴的方向来作为搜索方向的时候,沿着等高线移动的时候并不是最快的.但是如果我们旋转一下坐标轴会发现,我们可以用适当的旋转角度,旋转坐标轴后,使得坐标轴和椭圆的轴平行,实际上由线性代数的知识我们可以知道,旋转坐标轴本质上是做了一种线性变换.

简单地说共轭方向其实就是线性变化后的坐标轴和椭圆的轴平行的方向.下面我们用线性代数的知识来推导一下这个过程.

一般地,若二次函数
f ( x ) = 1 2 x T A x + b T x \begin{align}f(x)=\frac12x^TAx+b^Tx\end{align} f(x)=21xTAx+bTx (3) 中 A A A n n n 阶正定矩阵,但未必是对角矩阵,此时函数曲面的等高面仍是椭球,但主轴未必平行于坐标轴,如图 4.3(右) 所示. 这时,可以通过坐标变换将 A A A 对角化:取可逆矩阵 D D D,做坐标变换 x = D y x=Dy x=Dy,记 c = D T b c=D^Tb c=DTb,则
f ( x ) = 1 2 y T ( D T A D ) y + c T y . f(x)=\frac12y^T(D^TAD)y+c^Ty. f(x)=21yT(DTAD)y+cTy.因此,当 D T A D D^TAD DTAD 是一个对角矩阵时(并且对角线的元素均大于0),在 y y y 坐标系里沿坐标方向 e i , i = 1 , ⋯ , n e_i,~i=1,\cdots,n ei, i=1,,n, 做精确搜索,便可以在有限次内达到 f ( x ) f(x) f(x) 的最小值点.

y y y 坐标系中的迭代 y k + 1 = y k + α e k y_{k+1}=y_k+\alpha e_k yk+1=yk+αek ,根据坐标变换,等价于在原 x x x 坐标系中的迭代 x k + 1 = x_{k+1}= xk+1= x k + α D e k , k = 0 , 1 , . . . , n − 1 x_k+\alpha De_k,\:k=0,1,...,n-1 xk+αDek,k=0,1,...,n1.记 d k : = D e k , k = 0 , 1 , . . . , n − 1 d_k:=De_k,\:k=0,1,...,n-1 dk:=Dek,k=0,1,...,n1,那么
[ d 0 , . . . , d n − 1 ] = D , [d_0,...,d_{n-1}]=D, [d0,...,dn1]=D, d 0 , . . . , d n − 1 d_0,...,d_{n-1} d0,...,dn1 是矩阵 D D D的列向量.此时,迭代公式为 x k + 1 = x k + α d k x_k+ 1= x_k+ \alpha d_k xk+1=xk+αdk.这说明,只要我们在原坐标系中依次沿着 d 0 , ⋯ , d n − 1 d_0,\cdots,d_{n-1} d0,,dn1做精确搜索,便可在有限次达到 f ( x ) f(x) f(x) 的最小值点

为此,我们需要先求得方向 d 0 , d 1 , ⋯ , d n − 1 d_0,d_1,\cdots,d_{n-1} d0,d1,,dn1 使得 D T A D D^TAD DTAD 为对角矩阵.这等价于
d i T A d j = 0 , i , j = 0 , 1 , ⋯ , n − 1 ; i ≠ j . \begin{aligned}d_i^TAd_j=0,\quad i,j=0,1,\cdots,n-1;\:i\neq j.\end{aligned} diTAdj=0,i,j=0,1,,n1;i=j.由此,下面我们看看共轭方向的数学形式的定义。

定义 4.1 A ∈ R n × n A\in\mathbb{R}^{n\times n} ARn×n 是一个正定矩阵,非零向量 d 0 , ⋯ , d k − 1 ∈ R n d_0,\cdots,d_{k-1}\in\mathbb{R}^n d0,,dk1Rn 称为是彼此 ( A ) (A) (A) 共轭的,如果它们满足
d i T A d j = 0 , i , j = 0 , 1 , ⋯ , k − 1 ; i ≠ j . \begin{aligned}d_i^TAd_j=0,\quad i,j=0,1,\cdots,k-1;\:i\neq j.\end{aligned} diTAdj=0,i,j=0,1,,k1;i=j.显然,向量 d i d_i di d j d_j dj 共轭其实就是它们在内积 ⟨ x , y ⟩ : = x T A y ⟨x, y⟩ := x^TAy x,y:=xTAy 下为正交,由此两两 (A) 共轭的向量组是在上述内积意义下两两正交的向量组,所以必定线性无关.除此此外,如果
d 0 , ⋅ ⋅ ⋅ , d k − 1 ∈ R n d_0, ··· , d_k−1 ∈ \mathbb{R}^n d0,⋅⋅⋅,dk1Rn 是彼此 (A) 共轭的,那么改变这些向量的符号仍然是彼此 (A) 共轭的.所以每一个 d i d_i di 未必是目标函数 f ( x ) f(x) f(x) 下降的方向,这是因在沿着该方向进行搜索时需要同时考虑其反方向.

命题 4.1 A A A n n n 阶正定矩阵, f f f 如(3) 所述, k ≥ 1 , d 0 , ⋯ , d k − 1 ∈ R n k\geq1,d_0,\cdots,d_{k-1}\in\mathbb{R}^n k1,d0,,dk1Rn 是一组是彼此 ( A ) (A) (A) 共轭的向量.任取 x 0 ∈ R n x_0\in\mathbb{R}^n x0Rn,记 x j + 1 = x j + α j d j , j = 0 , 1 , ⋯ , k − 1 x_{j+1}=x_j+\alpha_jd_j, j=0,1,\cdots,k-1 xj+1=xj+αjdj,j=0,1,,k1,为精确搜索的点列 (由于不能保证 d j d_j dj 为下降方向,故搜索时允许 α j \alpha_j αj 为负数), 那么

( i ) ∇ f ( x k ) T d j = 0 , j = 0 , 1 , ⋯ , k − 1 ; (i)\:\nabla f(x_k)^Td_j=0,\:j=0,1,\cdots,k-1; (i)f(xk)Tdj=0,j=0,1,,k1;

( i i ) x k = argmin ⁡ x ∈ X k f ( x ) (ii)\:x_k=\operatorname{argmin}_{x\in X_k}f(x) (ii)xk=argminxXkf(x),其中 X k : = x 0 + s p a n { d 0 , ⋯ , d k − 1 } ; X_k:=x_0+\mathbf{span}\{d_0,\cdots,d_{k-1}\}; Xk:=x0+span{d0,,dk1};

( i i i ) (iii) (iii) k = n k=n k=n 时, x n x_n xn f f f R n \mathbb{R} ^n Rn 上的全局极小点.

首先不加证明,我们先看看这个命题说了个什么事情.由上述的命题我们可以看出​ X k X_k Xk 是​由向量组 { d 0 , ⋯ , d k − 1 } \{d_0,\cdots,d_{k-1}\} {d0,,dk1} 张成的线性空间。从上述命题我们可以简述一下共轭方向法的基本流程:从初始点 x 0 x_0 x0开始,根据精确线搜索找到最优步长 α 0 \alpha_0 α0,根据迭代式 x 1 = x 0 + α 0 d 0 , j = 0 , 1 , ⋯ , k − 1 x_{1}=x_0+\alpha_0d_0, j=0,1,\cdots,k-1 x1=x0+α0d0,j=0,1,,k1 以及条件 x 1 = argmin ⁡ x ∈ X 1 f ( x ) x_1=\operatorname{argmin}_{x\in X_1}f(x) x1=argminxX1f(x),计算得到 x 1 x_1 x1,其中 X 1 = x 0 + s p a n { d 0 } X_1 = x_0 + \mathbf{span}\{d_0\} X1=x0+span{d0},这样就完成了一维的情况 R \mathbb{R} R .类似地从一维的情况 R \mathbb{R} R 逐步推广到 R n \mathbb{R}^n Rn,由于每一个“新添加”的维度都是与之前维度共轭的(这一性质由命题的条件给出,后续证明),所以自然线性无关,于是这样便能逐步地从初始点找到整个空间 R n \mathbf{R}^n Rn的共轭序列点.下面我们再看看命题是怎么样证明的.

. ( i ) (i) (i) 根据精确搜索条件,有 ∇ f ( x j + 1 ) T d j = 0 , ∀ j = 0 , 1 , ⋯ , k − 1. \nabla f(x_{j+1})^Td_j=0,\:\forall j\:=\:0,1,\cdots,k-1. f(xj+1)Tdj=0,j=0,1,,k1. 于是, ∇ f ( x k ) T d k − 1 = 0 \nabla f(x_k)^Td_{k-1}=0 f(xk)Tdk1=0.而对于 j = 0 , 1 , ⋯ , k − 2 j=0,1,\cdots,k-2 j=0,1,,k2,有
∇ f ( x k ) = A x k + b = A ( x k − 1 + α k − 1 d k − 1 ) + b = ∇ f ( x k − 1 ) + α k − 1 A d k − 1 = ⋯ = ∇ f ( x j + 1 ) + α j + 1 A d j + 1 + ⋯ + α k − 1 A d k − 1 , \begin{aligned} \nabla f(x_{k})& \begin{aligned}&=Ax_k+b=A(x_{k-1}+\alpha_{k-1}d_{k-1})+b=\nabla f(x_{k-1})+\alpha_{k-1}Ad_{k-1}\end{aligned} \\ &=\cdots \\ &=\nabla f(x_{j+1})+\alpha_{j+1}Ad_{j+1}+\cdots+\alpha_{k-1}Ad_{k-1}, \end{aligned} f(xk)=Axk+b=A(xk1+αk1dk1)+b=f(xk1)+αk1Adk1==f(xj+1)+αj+1Adj+1++αk1Adk1,上式两边取转置后再同时右乘 d j d_j dj ,利用 ∇ f ( x j + 1 ) T d j = 0 , ∀ j = 0 , 1 , ⋯ , k − 1. \nabla f(x_{j+1})^Td_j=0,\:\forall j\:=\:0,1,\cdots,k-1. f(xj+1)Tdj=0,j=0,1,,k1. 可以得到 ∇ f ( x k ) T d j = ∇ f ( x j + 1 ) T d j = 0 \nabla f( x_k) ^Td_j= \nabla f( {x_{j+ 1}}) ^Td_j= 0 f(xk)Tdj=f(xj+1)Tdj=0 ( i ) (i) (i) 得证.

下面证 ( i i ) (ii) (ii),首先对于 x k x_k xk,将其写开可以得到 x k = x k − 1 + α k − 1 d k − 1 = ⋯ = x 0 + ∑ j = 0 k − 1 α j d j ∈ X k x_{k}=x_{k-1}+\alpha_{k-1}d_{k-1}=\cdots=x_{0}+\sum_{j=0}^{k-1}\alpha_{j}d_{j}\in X_{k} xk=xk1+αk1dk1==x0+j=0k1αjdjXk

对任意的 x = x 0 + ∑ j = 0 k − 1 β j d j ∈ X k x= x_{0}+\sum_{j=0}^{k-1}\beta_{j}d_{j}\in X_{k} x=x0+j=0k1βjdjXk,根据 Taylor 展开,由于目标函数式二次函数,因此可以利用 Taylor展开得到
f ( x ) = f ( x k ) + ∇ f ( x k ) T ( x − x k ) + 1 2 ( x − x k ) T A ( x − x k ) ≥ f ( x k ) + ∇ f ( x k ) T ( x − x k ) = f ( x k ) + ∇ f ( x k ) T [ ∑ j = 0 k − 1 ( β j − α k ) d j ] = f ( x k ) . \begin{aligned}f(x)&=f(x_k)+\nabla f(x_k)^T(x-x_k)+\frac{1}{2}(x-x_k)^TA(x-x_k) \\ &\geq f(x_k)+\nabla f(x_k)^T(x-x_k) \\ &=f(x_k)+\nabla f(x_k)^T\Big[\sum_{j=0}^{k-1}(\beta_j-\alpha_k)d_j\Big]=f(x_k). \\ \end{aligned} f(x)=f(xk)+f(xk)T(xxk)+21(xxk)TA(xxk)f(xk)+f(xk)T(xxk)=f(xk)+f(xk)T[j=0k1(βjαk)dj]=f(xk).上式中的不等号利用了结论:若矩阵 A A A 正定矩阵,则对于任意 x ∈ R n x\in\mathbb{R}^n xRn,都有 x T A x > 0 x^TAx >0 xTAx0;第二个等号将 x − x k x-x_k xxk展开计算即得.

所以, x k x_k xk f ( x ) f(x) f(x) X k X_k Xk 中的最小值点.

( i i i ) (iii) (iii) k = n k= n k=n 时,因为 d 0 , ⋯ , d n − 1 d_0, \cdots , d_n- 1 d0,,dn1 线性无关,所以 X n − 1 = R n X_{n-1}=\mathbb{R}^n Xn1=Rn.从而 x n x_n xn f f f R n \mathbb{R} ^n Rn 上的全局极小点.

基于给定的共轭方向的搜索方法称为共轭方向法. 如何快速地构造共轭方向组
d 0 , ⋯ , d n − 1 d_0,\cdots,d_{n-1} d0,,dn1 是该方法的关键所在. 虽然通过对矩阵 A A A 的特征分解可以得到共轭方向, 但其计算量为 O ( n 3 ) O(n^3) O(n3).实际上,若 x 0 x_{0} x0取得好,我们只需要少数几次迭代即可达到函数的极小值点.那么接下来我们就要看看一种在迭代过程中即时生成 d k d_k dk 的方法,称为共轭梯度法.

4.2 共轭梯度法

共轭梯度法是一种在迭代过程中利用梯度向量来逐步生成共轭向量组的方法,对于
目标函数 f ( x ) = 1 2 x T A x + b T x f(x)=\frac12x^TAx+b^Tx f(x)=21xTAx+bTx ,共轭梯度法按如下算法来生成共轭向量组.

首先,取充分小的数 ϵ > 0 \epsilon>0 ϵ>0. 任取初始点 x 0 ∈ R n x_0\in\mathbb{R}^n x0Rn,若不满足终止条件 ∥ ∇ f ( x 0 ) ∥ 2 < ϵ \|\nabla f(x_0)\|_2<\epsilon ∥∇f(x0)2<ϵ,令 d 0 : = − ∇ f ( x 0 ) d_0:=-\nabla f(x_0) d0:=f(x0),则 ∇ f ( x 0 ) T d 0 = − ∥ ∇ f ( x 0 ) ∥ 2 2 < 0 \nabla f(x_0)^Td_0=-\|\nabla f(x_0)\|_2^2<0 f(x0)Td0=∥∇f(x0)22<0,因而可以通过精确搜索得到该次迭代的最优步长 α 0 > 0 \alpha_0>0 α0>0,使得 x 1 = x 0 + α 0 d 0 x_1=x_0+\alpha_0d_0 x1=x0+α0d0 满足 ∇ f ( x 1 ) T d 0 = 0. \nabla f(x_1)^Td_0=0. f(x1)Td0=0.

一般地,如果已经构造出了彼此 (A) 共轭的向量组 d 0 , ⋯ , d k − 1 d_0,\cdots,d_{k-1} d0,,dk1 和通过精确搜索所得迭代点列 x j + 1 = x j + α j d j , j = 0 , 1 , . . . , k − 1 x_{j+1}=x_j+\alpha_jd_j,\:j=0,1,...,k-1 xj+1=xj+αjdj,j=0,1,...,k1, 其中
α j > 0 , ∇ f ( x j ) T d j < 0 , j = 0 , 1 , . . . , k − 1 \alpha_j>0,\quad\nabla f(x_j)^Td_j<0,\quad j=0,1,...,k-1 αj>0,f(xj)Tdj<0,j=0,1,...,k1 ∥ ∇ f ( x k ) ∥ 2 ≥ ϵ , \|\nabla f( x_k) \|_2\geq \epsilon, ∥∇f(xk)2ϵ, d k : = − ∇ f ( x k ) + ∑ i = 0 k − 1 β i d i \begin{align}d_k:=-\nabla f(x_k)+\sum_{i=0}^{k-1}\beta_id_i\end{align} dk:=f(xk)+i=0k1βidi,并希望选取合适的参数 β 0 , . . . , β k − 1 \beta_0,...,\beta_{k-1} β0,...,βk1 使得 d 0 , ⋯ , d k − 1 , d k d_0,\cdots,d_{k-1},d_k d0,,dk1,dk 彼此 (A) 共轭.也就是说这个过程是利用已知的彼此 (A) 共轭的向量组 d 0 , ⋯ , d k − 1 d_0,\cdots,d_{k-1} d0,,dk1,通过待定系数法来求解合适的参数,最终得到一个 d k d_k dk,使得 d k d_k dk与 向量组 d 0 , ⋯ , d k − 1 d_0,\cdots,d_{k-1} d0,,dk1两两共轭.

下面看看待定系数应该怎么求解, d 0 , ⋯ , d k − 1 , d k d_0,\cdots,d_{k-1},d_k d0,,dk1,dk 彼此 (A) 共轭当且仅当 d k T A d j = 0 , j = 0 , 1 , ⋯ , k − 1 d_k^TAd_j=0,~j=0,1,\cdots,k-1 dkTAdj=0, j=0,1,,k1, 即
( − ∇ f ( x k ) + ∑ i = 0 k − 1 β i d i ) T A d j = 0 , j = 0 , 1 , ⋯ , k − 1. \Big(-\nabla f(x_k)+\sum_{i=0}^{k-1}\beta_id_i\Big)^TAd_j=0,\quad j=0,1,\cdots,k-1. (f(xk)+i=0k1βidi)TAdj=0,j=0,1,,k1. t − 0 t-0 t0
由于 d 0 , ⋯ , d k − 1 d_0,\cdots,d_{k-1} d0,,dk1是彼此 ( A ) (A) (A) 共轭的,所以上式等价于 β j d j T A d j = ∇ f ( x k ) T A d j \beta_jd_j^TAd_j=\nabla f(x_k)^TAd_j βjdjTAdj=f(xk)TAdj,即
β j = ∇ f ( x k ) T A d j d j T A d j , j = 0 , 1 , ⋯ , k − 1. \begin{align} \beta_j=\frac{\nabla f(x_k)^TAd_j}{d_j^TAd_j},\quad j=0,1,\cdots,k-1.\end{align} βj=djTAdjf(xk)TAdj,j=0,1,,k1.因此,只要按(5)取值 { β j } j = 0 k − 1 \{\beta_j\}_{j=0}^{k-1} {βj}j=0k1,向量组 d 0 , ⋯ , d k − 1 , d k d_0,\cdots,d_{k-1},d_k d0,,dk1,dk 就是彼此 (A) 共轭的.而且,根据命题 4.1中的 ( i ) (i) (i), 有 ∇ f ( x k ) T d j = 0 , j = 0 , 1 , ⋯ , k − 1 \nabla f(x_k)^Td_j=0,\:j=0,1,\cdots,k-1 f(xk)Tdj=0,j=0,1,,k1. 从而
∇ f ( x k ) T d k = − ∥ ∇ f ( x k ) ∥ 2 2 < 0. \nabla f(x_k)^Td_k=-\|\nabla f(x_k)\|_2^2<0. f(xk)Tdk=∥∇f(xk)22<0.因而,通过精确搜索可得 α k > 0 \alpha_k>0 αk>0, 使得 x k + 1 = x k + α k d k x_{k+1}=x_k+\alpha_kd_k xk+1=xk+αkdk 满足 ∇ f ( x k + 1 ) T d k = 0. \nabla f(x_{k+1})^Td_k=0. f(xk+1)Tdk=0.

进一步,若 ∥ ∇ f ( x k + 1 ) ∥ 2 ≥ ϵ \|\nabla f(x_{k+1})\|_2\geq\epsilon ∥∇f(xk+1)2ϵ, 重复上述过程,直至满足停止条件. 此算法利用梯度向量构造共轭向量组,故称之为共轭梯度法.

实际上,我们可以化简 { β j } \{\beta_{j}\} {βj}的计算,首先根据目标函数的二次性可以知道:

∇ f ( x j + 1 ) = ∇ f ( x j ) + α j A d j , j = 0 , ⋯ , k − 1. \begin{align}\nabla f(x_{j+1})=\nabla f(x_j)+\alpha_jAd_j,\quad j=0,\cdots,k-1.\end{align} f(xj+1)=f(xj)+αjAdj,j=0,,k1.所以, 对 0 ≤ j ≤ k − 2 0\leq j\leq k-2 0jk2,因为 ∇ f ( x j ) = d j \nabla f(x_j)=d_j f(xj)=dj,有 A d j = α j − 1 [ ∇ f ( x j + 1 ) − ∇ f ( x j ) ] ∈ s p a n { d 0 , ⋯ , d k − 1 } . Ad_{j}=\alpha_{j}^{-1}[\nabla f(x_{j+1})-\nabla f(x_{j})]\in\mathbf{span}\{d_{0},\cdots,d_{k-1}\}. Adj=αj1[f(xj+1)f(xj)]span{d0,,dk1}.再根据命题 命题 4.1 ( i ) 命题 4.1(i) 命题4.1(i) ∇ f ( x k ) T d j = 0 , j = 0 , ⋯ , k − 1 \nabla f(x_k)^Td_j=0,j=0,\cdots,k-1 f(xk)Tdj=0,j=0,,k1,便可以得到 ∇ f ( x k ) ⊥ s p a n { d 0 , ⋯ , d k − 1 } \nabla f(x_k) \perp \mathbf{span}\{d_{0},\cdots,d_{k-1}\} f(xk)span{d0,,dk1},从而有 ∇ f ( x k ) T A d j = 0 \nabla f(x_{k})^{T}Ad_{j}=0 f(xk)TAdj=0,于是 β j = ∇ f ( x k ) T A d j d j T A d j = 0 \beta_j=\frac{\nabla f(x_k)^TAd_j}{d_{j}^TAd_j}=0 βj=djTAdjf(xk)TAdj=0.

类似地,根据 d k − 1 d_{k-1} dk1的定义式(4) d k : = − ∇ f ( x k ) + ∑ i = 0 k − 1 β i d i d_k:=-\nabla f(x_k)+\sum_{i=0}^{k-1}\beta_id_i dk:=f(xk)+i=0k1βidi,可以知道 ∇ f ( x k − 1 ) = − d k − 1 + ∑ i = 0 k − 1 β i d i = A x k − 1 + b ∈ s p a n { d 0 , ⋯ , d k − 1 } \nabla f(x_{k-1})=-d_{k-1}+\sum_{i=0}^{k-1}\beta_id_i=Ax_{k-1}+b \in \mathbf{span}\{d_{0},\cdots,d_{k-1}\} f(xk1)=dk1+i=0k1βidi=Axk1+bspan{d0,,dk1},所以有
A d k − 1 = α k − 1 − 1 [ ∇ f ( x k ) − ∇ f ( x k − 1 ) ] ∈ α k − 1 − 1 ∇ f ( x k ) + s p a n { d 0 , ⋯ , d k − 1 } . Ad_{k-1}=\alpha_{k-1}^{-1}[\nabla f(x_k)-\nabla f(x_{k-1})]\in\alpha_{k-1}^{-1}\nabla f(x_k)+\mathbf{span}\{d_0,\cdots,d_{k-1}\}. Adk1=αk11[f(xk)f(xk1)]αk11f(xk)+span{d0,,dk1}. ∇ f ( x k ) T A d k − 1 = α k − 1 − 1 ∥ ∇ f ( x k ) ∥ 2 2 \nabla f(x_k)^TAd_{k-1}=\alpha_{k-1}^{-1}\|\nabla f(x_k)\|_2^2 f(xk)TAdk1=αk11∥∇f(xk)22,从而 β k − 1 = ∥ ∇ f ( x k ) ∥ 2 2 α k − 1 d k − 1 T A d k − 1 . \beta_{k-1}=\frac{\|\nabla f(x_k)\|_2^2}{\alpha_{k-1}d_{k-1}^TAd_{k-1}}. βk1=αk1dk1TAdk1∥∇f(xk)22.根据最速下降法中的精确搜索公式即 α k : = argmin ⁡ α > 0 f ( x k + α d k ) = − ( A x k + b ) T d k d k T A d k = − ∇ f ( x k ) T d k d k T A d k \alpha_k:=\underset{\alpha>0}{\operatorname*{argmin}}f(x_k+\alpha d_k)=-\frac{(Ax_k+b)^Td_k}{d_k^TAd_k}=-\frac{\nabla f(x_k)^Td_k}{d_k^TAd_k} αk:=α>0argminf(xk+αdk)=dkTAdk(Axk+b)Tdk=dkTAdkf(xk)Tdk,可以得到 α k − 1 = − ∇ f ( x k − 1 ) T d k − 1 d k − 1 T A d k − 1 \alpha_{k-1}=-\frac{\nabla f(x_{k-1})^{T}d_{k-1}}{d_{k-1}^{T}Ad_{k-1}} αk1=dk1TAdk1f(xk1)Tdk1 又因为有 ∇ f ( x k − 1 ) T d k − 1 = − ∥ ∇ f ( x k − 1 ) ∥ 2 2 \nabla f(x_{k-1})^Td_{k-1}=-\|\nabla f(x_{k-1})\|_2^2 f(xk1)Tdk1=∥∇f(xk1)22,所以 β k − 1 = ∥ ∇ f ( x k ) ∥ 2 2 ∥ ∇ f ( x k − 1 ) ∥ 2 2 \beta_{k-1}=\frac{\|\nabla f(x_k)\|_2^2}{\|\nabla f(x_{k-1})\|_2^2} βk1=∥∇f(xk1)22∥∇f(xk)22以上便是 { β j } \{\beta_j\} {βj}的一种简化方法,这种方法称为Flecther-Reeves方法,简称为 F-R方法,实际上还有很多的关于待定系数 { β j } \{\beta_j\} {βj}的求法,在此不加证明指出各种求解待定系数的方法在函数为二次型,且使用精准线搜时完全等价.当然这里也列举一些,供读者查阅,各种方法如下所示(一般情况下,很多文章会以记号 g k g_k gk 来代替 f ( x k ) f(x_k) f(xk)
β k − 1 H S = ∇ f ( x k ) T A ∇ f ( x k − 1 ) d k − 1 T A d k − 1 (Hestenes − Stiefel公式) β k − 1 C W = ∇ f ( x k ) T ( ∇ f ( x k ) − ∇ f ( x k − 1 ) ) d k − 1 T ( ∇ f ( x k ) − ∇ f ( x k − 1 ) ) ( Crowder − Wolfe公式 ) β k − 1 F R = ∇ f ( x k ) T ∇ f ( x k ) ∇ f ( x k − 1 ) T ∇ f ( x k − 1 ) ( F letcher − R eeves公式 ) β k − 1 D = − ∇ f ( x k ) T ∇ f ( x k ) d k − 1 T ∇ f ( x k − 1 ) (Dixon公式) β k − 1 P R l P = ∇ f ( x k ) T ( ∇ f ( x k ) − ∇ f ( x k − 1 ) ) ∇ f ( x k − 1 ) T ∇ f ( x k − 1 ) ( P o l a k − R i b i e r e − P o l y a k 公式 ) β k − 1 D Y = ∇ f ( x k ) T ∇ f ( x k ) d k − 1 T ( ∇ f ( x k ) − ∇ f ( x k − 1 ) ) ( D a i − Y u a n 公式 ) \begin{aligned} \beta_{k-1}^{HS}& =\frac{\nabla f(x_{k})^TA\nabla f(x_{k-1})}{d_{k-1}^TAd_{k-1}}\quad\text{(Hestenes}-\text{Stiefel公式)} \\ \beta_{k-1}^{CW}& =\frac{\nabla f(x_{k})^T(\nabla f(x_{k})-\nabla f(x_{k-1}))}{d_{k-1}^T(\nabla f(x_{k})-\nabla f(x_{k-1}))}\quad(\textbf{Crowder}-\textbf{Wolfe公式}) \\ \beta_{k-1}^{FR}& =\frac{\nabla f(x_{k})^T\nabla f(x_{k})}{\nabla f(x_{k-1})^T\nabla f(x_{k-1})}\quad\quad(\mathbf{F}\text{letcher}-\mathbf{R}\text{eeves公式}) \\ \beta_{k-1}^{D}& =-\frac{\nabla f(x_{k})^T\nabla f(x_{k})}{d_{k-1}^T\nabla f(x_{k-1})}\quad\quad\quad\text{(Dixon公式)} \\ \beta_{k-1}^{PRl}& ^{P}=\frac{\nabla f(x_{k})^{T}(\nabla f(x_{k})-\nabla f(x_{k-1}))}{\nabla f(x_{k-1})^{T}\nabla f(x_{k-1})}\quad(\mathbf{Polak}-\mathbf{Ribiere}-\mathbf{Polyak}\text{公式}) \\ \beta_{k-1}^{DY}& =\frac{\nabla f(x_{k})^T\nabla f(x_{k})}{d_{k-1}^T(\nabla f(x_{k})-\nabla f(x_{k-1}))} (\mathbf{Dai}-\mathbf{Yuan}\text{公式}) \end{aligned} βk1HSβk1CWβk1FRβk1Dβk1PRlβk1DY=dk1TAdk1f(xk)TAf(xk1)(HestenesStiefel公式)=dk1T(f(xk)f(xk1))f(xk)T(f(xk)f(xk1))(CrowderWolfe公式)=f(xk1)Tf(xk1)f(xk)Tf(xk)(FletcherReeves公式)=dk1Tf(xk1)f(xk)Tf(xk)(Dixon公式)P=f(xk1)Tf(xk1)f(xk)T(f(xk)f(xk1))(PolakRibierePolyak公式)=dk1T(f(xk)f(xk1))f(xk)Tf(xk)(DaiYuan公式)

4.3 共轭梯度法的程序实现

现在总结一下,目标函数为二次型,基于F-R方法的共轭梯度算法如下:
算法 4.1 (共轭梯度法) 取充分小的数 ϵ > 0. \epsilon>0. ϵ>0.

1 \mathscr{1} 1 步:任取 x 0 ∈ R n x_0\in\mathbb{R}^n x0Rn,令 k = 0. k=0. k=0.

2 \mathscr{2} 2 步:若 ∥ ∇ f ( x k ) ∥ < ϵ \|\nabla f(x_k)\|<\epsilon ∥∇f(xk)<ϵ,转第 4 \mathscr{4} 4 步;否则,令 d k : = { − ∇ f ( x k ) k = 0 , − ∇ f ( x k ) + β k − 1 d k − 1 k ≥ 1 , 其中 β k − 1 : = ∥ ∇ f ( x k ) ∥ 2 ∥ ∇ f ( x k − 1 ) ∥ 2 d_k:=\begin{align}\begin{cases}-\nabla f(x_k)&k=0,\\-\nabla f(x_k)+\beta_{k-1}d_{k-1}&k\ge1,\end{cases}\quad\text{其中}\quad\beta_{k-1}:=\frac{\|\nabla f(x_k)\|^2}{\|\nabla f(x_{k-1})\|^2}\end{align} dk:={f(xk)f(xk)+βk1dk1k=0,k1,其中βk1:=∥∇f(xk1)2∥∇f(xk)2

3 \mathscr{3} 3 步:通过精确搜索计算 x k + 1 = x k + α k d k x_{k+1}=x_k+\alpha_kd_k xk+1=xk+αkdk,其中 α k = ∥ ∇ f ( x k ) ∥ 2 2 d k T A d k \alpha_k=\frac{\|\nabla f(x_k)\|_2^2}{d_k^TAd_k} αk=dkTAdk∥∇f(xk)22并计算 ∇ f ( x k + 1 ) : = A x k + 1 + b \nabla f(x_{k+1}):=Ax_{k+1}+b f(xk+1):=Axk+1+b.令 k = k + 1 k=k+1 k=k+1,转第 2 \mathscr{2} 2 步.

4 \mathscr{4} 4 步:输出极小值点 x k x_k xk. 程序结束.

设需要最小化的目标二次函数如下: f ( x ) = 1 2 x T A x + b T x , Q = ( 3 − 1 − 1 1 ) , b = ( 2 , 0 ) T f(x)=\frac12x^TAx+b^Tx,Q=\begin{pmatrix}3&-1\\-1&1\end{pmatrix},b=(2,0)^T f(x)=21xTAx+bTx,Q=(3111),b=(2,0)T min ⁡ f ( x ) = 3 2 x 1 2 + 1 2 x 2 2 − x 1 x 2 − 2 x 1 \min f(x)=\frac32x_1^2+\frac12x_2^2-x_1x_2-2x_1 minf(x)=23x12+21x22x1x22x1为了检验迭代过程的可靠性,我们可以解析地求出该优化问题的最优点: x ∗ = − A − 1 b = ( 1 , 1 ) T x^*=-A^{-1}b=(1,1)^T x=A1b=(1,1)T此外我们还需要定义目标函数中的 A , b A,b A,b 还有原本的函数 f f f 和函数梯度 ∇ f \nabla f f 的映射funcgradient.准备工作部分的代码如下:

# 准备工作
import numpy as np
import matplotlib.pyplot as pltA = np.array([[3, -1], [-1, 1]], dtype="float32") # 定义矩阵 A
b = np.array([-2, 0], dtype="float32").reshape([-1, 1]) # 向量b
# function and its gradient defined in the question
func = lambda x: 0.5 * np.dot(x.T, np.dot(A, x)).squeeze() + np.dot(b.T, x).squeeze() # 函数
gradient = lambda x: np.dot(A, x) + b # 梯度
x_0 = np.array([1, 1]).reshape([-1, 1]) # 最优点x_0

准备工作完成后,编写基于精确搜索的最速下降法的函数实现:

# FGCG algorithm
def FGCG(start_point, func, gradient, epsilon=0.01):""":param start_point: start point of GD 初始值:param func: map of plain function 目标函数:param gradient: gradient map of plain function 梯度函数:param epsilon: threshold to stop the iteration 迭代终止的阈值:return: converge point, # iterations"""assert isinstance(start_point, np.ndarray)  # assert that input start point is ndarrayglobal Q, b, x_0  # claim the global variencex_k_1, iter_num, loss = start_point, 0, []xs = [x_k_1]  # xs是迭代点的序列,最后一个就是最后一次求的点# 初始化g_k_list = []  # g_k = delta f(x_k),改变用来储存梯度向量g_k_list.append(gradient(start_point).reshape([-1, 1]))d_k_list = []  # 储存搜索方向的listd_k_list.append(-gradient(start_point).reshape([-1, 1]))while True:g_k = g_k_list[iter_num]d_k = d_k_list[iter_num]if np.sqrt(np.sum(g_k ** 2)) < epsilon:  # 终止条件(1)breakif len(g_k) > 1:g_k_1 = g_k_list[iter_num-1]  # 取出delta f_x_{k-1}beta = np.sum(g_k ** 2) / np.sum(g_k_1 ** 2)d_current = -g_k + beta * d_k # 当前迭代的搜索方向d_kd_k = d_currentd_k_list.append(d_k)alpha_k = np.dot(g_k.T, g_k).squeeze() / (np.dot(d_k.T, np.dot(A, d_k))).squeeze() # 精确搜索计算步长alpha_kx_k_2 = x_k_1 + alpha_k * d_k # 迭代式iter_num += 1xs.append(x_k_2) g_k_list.append(gradient(x_k_2).reshape([-1, 1])) # 计算delta f(x_{k+1}=Ax_{k+1}+b)loss.append(float(np.fabs(func(x_k_2) - func(x_0))))if np.fabs(func(x_k_2) - func(x_k_1)) < epsilon:breakif iter_num > 100: # 超过一定次数后停止迭代breakx_k_1 = x_k_2return xs, iter_num, loss

假设此处的迭代初值为​ x 0 = ( 4 , 5 ) T x_0=(4,5)^T x0=(4,5)T ,进行梯度下降法,并可视化迭代过程:

x0 = np.array([4,5], dtype="float32").reshape([-1, 1]) # 定义初始值
xs, iter_num, loss = gradient_descent(start_point=x0,func=func,gradient=gradient,epsilon=1e-6) # 传入参数
print(xs[-1])	# last point of the sequence 输出迭代点列的最后一个值
plt.style.use("seaborn") # 样式
plt.figure(figsize=[12, 6]) # 图像大小
plt.plot(loss)
plt.xlabel("# iteration", fontsize=12)
plt.ylabel("Loss: $|f(x_k) - f(x^*)|$", fontsize=12)
plt.yscale("log")
plt.show()def text_plot():# 画出点图print(xs[-1])	# last point of the sequence 输出迭代点列的最后一个值x = []y = []for i in xs:x.append( i[0]) y.append( i[1]) plt.style.use("seaborn") # 样式plt.figure(figsize=[12, 6]) # 图像大小plt.plot(x,y)plt.xlabel("x", fontsize=12)plt.ylabel("y", fontsize=12)# plt.yscale("log")plt.show()

运行结果:

[[0.9999299][1.0005273]]

在这里插入图片描述

可以看到最终迭代点到达了最优点 ( 1 , 1 ) T (1,1)^T (1,1)T。当纵坐标取对数 l o g log log 时,loss是在不断下降的。我们再更换几组初始点,并把相关的参数画在一个图像内看看效果.

我们再取四个迭代点:​ ( 0 , 0 ) , ( 0.4 , 0 ) , ( 10 , 0 ) , ( 11 , 0 ) (0,0),(0.4,0),(10,0),(11,0) (0,0),(0.4,0),(10,0),(11,0)

# create the list of all starting point x_0
starting_points = [np.array([num, 0]).astype(np.float).reshape([-1, 1]) for num in [0.0, 0.4, 10.0, 11.0]]plt.figure(dpi=150)xss = []
# implement FGCG
for idx, start_point in enumerate(starting_points):xs, iter_num, losses = gradient_descent(start_point, func, gradient, epsilon=1e-6)target_point = xs[-1]xss.append(xs)# plot the losses of $|f(x_k) - f(x^*)|$plt.plot(np.arange(len(losses)), np.array(losses), label=f"start point: ({start_point[0][0]}, {start_point[1][0]})")loss = np.fabs(func(target_point) - func(x_0))print(f"{idx + 1}: start point:{np.round(start_point, 5).tolist()}, "f"point after GD:{np.round(target_point, 5).tolist()}, "f"loss:{np.round(loss, 16)}, # iterations: {iter_num}")print("-" * 60)plt.grid(True)
plt.legend()
plt.xlabel("# iteration", fontsize=12)
plt.ylabel("Loss: $|f(x_k) - f(x^*)|$", fontsize=12)
plt.yscale("log")
plt.title("Loss-iteration given to different starting points of GD", fontsize=18)
plt.show()

输出结果:

1: start point:[[0.0], [0.0]], point after FGCG:[[0.99964], [0.99972]], loss:1.324470967e-07, # iterations: 19
------------------------------------------------------------
2: start point:[[0.4], [0.0]], point after FGCG:[[0.99978], [0.99922]], loss:2.053100269e-07, # iterations: 17
------------------------------------------------------------
3: start point:[[10.0], [0.0]], point after FGCG:[[0.9998], [1.00051]], loss:2.990393975e-07, # iterations: 19
------------------------------------------------------------
4: start point:[[11.0], [0.0]], point after FGCG:[[0.9998], [1.00062]], loss:3.793825739e-07, # iterations: 19
------------------------------------------------------------

在这里插入图片描述

由上图可以看到可以看到不同的初值点,收敛速率并不像最速下降法一样显著不相同。也就是说不同的初始点到达最优点的所需的迭代次数基本是相同的.下面把上述过程在二维平面内可视化出来:

plt.figure(dpi=150)
X = np.linspace(-2, 12, 200)
Y = np.linspace(-2, 12, 200)
XX, YY = np.meshgrid(X, Y)
Z = [func(np.array([XX[i, j], YY[i, j]], dtype="float32").reshape([-1, 1])).tolist() for i in range(200) for j in range(200)]
Z = np.array(Z).reshape([200, 200])
plt.contourf(XX, YY, Z, cmap=plt.cm.BuGn)plt.annotate(f"$(5.0, 6.0)$",xy=(5, 6),xytext=(5 - 2, 6 + 2),arrowprops={"color" : "black","shrink" : 0.1,"width" : 0.6})# plot the scatter
for idx, start_point in enumerate(starting_points):xx = [xss[idx][i][0] for i, _ in enumerate(xss[idx])]yy = [xss[idx][i][1] for i, _ in enumerate(xss[idx])]plt.plot(xx, yy, "o--", label=f"start point: ({start_point[0][0]}, {start_point[1][0]})")# add some tips for start pointplt.annotate(f"$({start_point[0][0]}, {start_point[1][0]})$",xy=(start_point[0][0], start_point[1][0]),xytext=(start_point[0][0] - 1.5, start_point[1][0] + idx + 2),arrowprops={"color" : "black","shrink" : 0.1,"width" : 0.6})plt.grid(True)
plt.title("FGCG For Two-dimensional Diagrams", fontsize=18)
plt.xlabel("$x_1$", fontsize=12)
plt.ylabel("$x_2$", fontsize=12)
plt.legend()
plt.show()

运行结果:

在这里插入图片描述

这张图可以直观地感受四个迭代点的迭代步数并没有显著的差距。究其原因,由于共轭梯度法中关于搜索方向的选择基本是一致的,所以初始点的选择对于迭代过程的影响很小,接下来我们看看非二次函数的共轭梯度法的以及F-R方法收敛性的证明.

4.4 非二次函数的共轭梯度法

共轭梯度法的迭代公式
d 0 : = − ∇ f ( x 0 ) , d k : = − ∇ f ( x k ) + β k − 1 d k − 1 , β k − 1 : = ∥ ∇ f ( x k ) ∥ 2 2 ∥ ∇ f ( x k − 1 ) ∥ 2 2 \begin{align}d_0:=-\nabla f(x_0),\quad d_k:=-\nabla f(x_k)+\beta_{k-1}d_{k-1},\quad\beta_{k-1}:=\frac{\|\nabla f(x_k)\|_2^2}{\|\nabla f(x_{k-1})\|_2^2}\end{align} d0:=f(x0),dk:=f(xk)+βk1dk1,βk1:=∥∇f(xk1)22∥∇f(xk)22中不含有矩阵 A A A,这说明当目标函数不是二次函数时,形式上基于F-G方法的共轭梯度法仍然可用而且当线搜索采用精确搜索时,它具有二次终止性.下面我们研究共轭梯度法公式(8)对于非二次函数的收敛性.对于一般的目标函数 f ( x ) f(x) f(x) 求精确搜索 x k + 1 = x k + α k d k x_{k+1} = x_k + α_kd_k xk+1=xk+αkdk 本身也是一个优化问题,且该优化问题具有较大的计算复杂性,所以,下面我们将步长的确定不限于精确搜索.

我们在之前的学习笔记中说到过,线搜索迭代方法的收敛的一个关键条件是所谓的一致锐角条件:记 g k : = ∇ f ( x k ) g_k:=\nabla f(x_k) gk:=f(xk) g k T d k = ∥ g k ∥ 2 cos ⁡ θ k ≥ ∥ g k ∥ 2 cos ⁡ ( π 2 − μ ) = ∥ g k ∥ 2 sin ⁡ μ g_k^Td_k=\|g_k\|_2\cos\theta_k\geq\|g_k\|_2\cos(\frac{\pi}{2}-\mu)=\|g_k\|_2\sin\mu gkTdk=gk2cosθkgk2cos(2πμ)=gk2sinμ,于是 g k T d k ≥ ∥ g k ∥ 2 sin ⁡ μ g_k^Td_k\geq\|g_k\|_2\sin\mu gkTdkgk2sinμ或较
弱一点的条件:若 ∥ ∇ f ( x k ) ∥ 2 ≠ 0 , ∀ k ≥ 0 \|\nabla f(x_k)\|_2\neq0,~\forall k\geq0 ∥∇f(xk)2=0, k0, 且满足条件 ∑ k = 1 ∞ cos ⁡ 2 θ k = ∞ . \sum_{k=1}^\infty\cos^2\theta_k=\infty. k=1cos2θk=∞.

为此我们看看如下的引理

引理 4.2 f ∈ C 1 ( R n ) , x 0 ∈ R n , ∥ ∇ f ( x 0 ) ∥ ≠ 0 f\in C^1(\mathbb{R}^n),~x_0\in\mathbb{R}^n,~\|\nabla f(x_0)\|\neq0 fC1(Rn), x0Rn, ∥∇f(x0)=0. 设 d k d_k dk 由共轭梯度法公式(8)求得,线搜索 x k = x k − 1 + α k − 1 d k − 1 x_k=x_{k-1}+\alpha_{k-1}d_{k-1} xk=xk1+αk1dk1,满足
∥ ∇ f ( x j ) ∥ ≠ 0 , ∣ ∇ f ( x j ) T d j − 1 ∣ ≤ − σ ∇ f ( x j − 1 ) T d j − 1 , j = 1 , ⋯ , k , \begin{align} \|\nabla f(x_j)\|\neq0,\quad|\nabla f(x_j)^Td_{j-1}|\le-\sigma\nabla f(x_{j-1})^Td_{j-1},\quad j=1,\cdots,k,\end{align} ∥∇f(xj)=0,∣∇f(xj)Tdj1σf(xj1)Tdj1,j=1,,k,其中 σ ∈ [ 0 , 1 ) \sigma\in[0,1) σ[0,1),那么 1 − 2 σ 1 − σ ∥ ∇ f ( x k ) ∥ 2 ≤ − ∇ f ( x k ) T d k ≤ 1 1 − σ ∥ ∇ f ( x k ) ∥ 2 , k = 1 , 2 , ⋯ \begin{align}\frac{1-2\sigma}{1-\sigma}\|\nabla f(x_k)\|^2\leq-\nabla f(x_k)^Td_k\leq\frac1{1-\sigma}\|\nabla f(x_k)\|^2,\quad k=1,2,\cdots\end{align} 1σ12σ∥∇f(xk)2f(xk)Tdk1σ1∥∇f(xk)2,k=1,2,且有 ∥ ∇ f ( x k ) ∥ 4 ∥ d k ∥ 2 ≥ 1 − σ 1 + σ ( ∑ j = 0 k ∥ ∇ f ( x j ) ∥ − 2 ) − 1 . \begin{align}\frac{\|\nabla f(x_k)\|^4}{\|d_k\|^2}\geq\frac{1-\sigma}{1+\sigma}\Big(\sum_{j=0}^k\|\nabla f(x_j)\|^{-2}\Big)^{-1}.\end{align} dk2∥∇f(xk)41+σ1σ(j=0k∥∇f(xj)2)1.

. 记 g k : = ∇ f ( x k ) , k = 0 , 1 , ⋯ g_k:=\nabla f(x_k),\:k=0,1,\cdots gk:=f(xk),k=0,1,. 先证(10). 不妨设 ∥ g k ∥ ≠ 0 \|g_k\|\neq0 gk=0. 等式 d k = d_k= dk= − g k + β k − 1 d k − 1 -g_k+\beta_{k-1}d_{k-1} gk+βk1dk1 两边与 g k g_k gk 做内积,得 ∣ g k T d k + g k T g k ∣ = β k − 1 ∣ g k T d k − 1 ∣ ≤ − σ β k − 1 g k − 1 T d k − 1 = − σ ( g k T g k ) ( g k − 1 T d k − 1 ) g k − 1 T g k − 1 . |g_k^Td_k+g_k^Tg_k|=\beta_{k-1}|g_k^Td_{k-1}|\leq-\sigma\beta_{k-1}g_{k-1}^Td_{k-1}=-\sigma\frac{(g_k^Tg_k)(g_{k-1}^Td_{k-1})}{g_{k-1}^Tg_{k-1}}. gkTdk+gkTgk=βk1gkTdk1σβk1gk1Tdk1=σgk1Tgk1(gkTgk)(gk1Tdk1). ∣ g k T d k g k T g k + 1 ∣ ≤ − σ g k − 1 T d k − 1 g k − 1 T g k − 1 = σ − σ ( g k − 1 T d k − 1 g k − 1 T g k − 1 + 1 ) ≤ σ + σ ∣ g k − 1 T d k − 1 g k − 1 T g k − 1 + 1 ∣ . \left|\frac{g_k^Td_k}{g_k^Tg_k}+1\right|\leq-\sigma\frac{g_{k-1}^Td_{k-1}}{g_{k-1}^Tg_{k-1}}=\sigma-\sigma\left(\frac{g_{k-1}^Td_{k-1}}{g_{k-1}^Tg_{k-1}}+1\right)\leq\sigma+\sigma\left|\frac{g_{k-1}^Td_{k-1}}{g_{k-1}^Tg_{k-1}}+1\right|. gkTgkgkTdk+1 σgk1Tgk1gk1Tdk1=σσ(gk1Tgk1gk1Tdk1+1)σ+σ gk1Tgk1gk1Tdk1+1 .据此递推关系,并注意到 g 0 T d 0 / ( g 0 T g 0 ) + 1 = 0 g_0^Td_0/(g_0^Tg_0)+1=0 g0Td0/(g0Tg0)+1=0, 可得

∣ g k T d k g k T g k + 1 ∣ ≤ σ + σ 2 + ⋯ + σ k = σ 1 − σ . \left|\frac{g_k^Td_k}{g_k^Tg_k}+1\right|\leq\sigma+\sigma^2+\cdots+\sigma^k=\frac\sigma{1-\sigma}. gkTgkgkTdk+1 σ+σ2++σk=1σσ.将不等式(10)化简即发现和该式等价.

下面证明不等式 ( 11 ) . k = 0 (11).\quad k=0 (11).k=0 时有 d 0 = − ∇ f ( x 0 ) d_0=-\nabla f(x_0) d0=f(x0), 不等式显然成立. 下面设 k ≥ 1 k\geq1 k1, 并假设不等式(11)对 k − 1 k-1 k1 成立. 利用(8)得 (注意,由于未必是精确搜索,条件 g k T d k − 1 = 0 g_k^Td_{k-1}=0 gkTdk1=0 不一定成立) ∥ d k ∥ 2 2 = ∥ g k ∥ 2 2 + β k − 1 2 ∥ d k − 1 ∥ 2 2 − 2 β k − 1 g k T d k − 1 ≤ ∥ g k ∥ 2 2 + β k − 1 2 ∥ d k − 1 ∥ 2 2 − 2 σ β k − 1 g k − 1 T d k − 1 = ∥ g k ∥ 2 2 + ( ∥ g k ∥ 2 ∥ g k − 1 ∥ 2 ) 4 ∥ d k − 1 ∥ 2 2 − 2 σ ( ∥ g k ∥ 2 ∥ g k − 1 ∥ 2 ) 2 g k − 1 T d k − 1 . \begin{aligned} \|d_{k}\|_{2}^{2}& =\|g_k\|_2^2+\beta_{k-1}^2\|d_{k-1}\|_2^2-2\beta_{k-1}g_k^Td_{k-1} \\ &\leq\|g_k\|_2^2+\beta_{k-1}^2\|d_{k-1}\|_2^2-2\sigma\beta_{k-1}g_{k-1}^Td_{k-1} \\ &=\|g_k\|_2^2+\left(\frac{\|g_k\|_2}{\|g_{k-1}\|_2}\right)^4\|d_{k-1}\|_2^2-2\sigma\Big(\frac{\|g_k\|_2}{\|g_{k-1}\|_2}\Big)^2g_{k-1}^Td_{k-1}. \end{aligned} dk22=gk22+βk12dk1222βk1gkTdk1gk22+βk12dk1222σβk1gk1Tdk1=gk22+(gk12gk2)4dk1222σ(gk12gk2)2gk1Tdk1.利用 k − 1 k-1 k1 情形的不等式(10),得 g k − 1 T d k − 1 ≤ 1 1 − σ ∥ g k − 1 ∥ 2 2 g_{k-1}^Td_{k-1}\leq\frac1{1-\sigma}\|g_{k-1}\|_2^2 gk1Tdk11σ1gk122.代入上式,有 ∥ d k ∥ 2 2 ≤ 1 + σ 1 − σ ∥ g k ∥ 2 2 + ∥ g k ∥ 2 4 ⋅ ∥ d k − 1 ∥ 2 2 ∥ g k − 1 ∥ 2 4 . \|d_k\|_2^2\leq\frac{1+\sigma}{1-\sigma}\|g_k\|_2^2+\|g_k\|_2^4\cdot\frac{\|d_{k-1}\|_2^2}{\|g_{k-1}\|_2^4}. dk221σ1+σgk22+gk24gk124dk122.
根据 k − 1 k-1 k1 情形的归纳假设,得
∥ d k ∥ 2 2 ≤ 1 + σ 1 − σ ∥ g k ∥ 2 2 + ∥ g k ∥ 2 4 1 + σ 1 − σ ∑ j = 0 k − 1 ∥ g j ∥ 2 − 2 = 1 + σ 1 − σ ∥ g k ∥ 2 4 ∑ j = 0 k ∥ g j ∥ 2 − 2 . \|d_k\|_2^2\leq\frac{1+\sigma}{1-\sigma}\|g_k\|_2^2+\|g_k\|_2^4\frac{1+\sigma}{1-\sigma}\sum_{j=0}^{k-1}\|g_j\|_2^{-2}=\frac{1+\sigma}{1-\sigma}\|g_k\|_2^4\sum_{j=0}^k\|g_j\|_2^{-2}. dk221σ1+σgk22+gk241σ1+σj=0k1gj22=1σ1+σgk24j=0kgj22. 所以,不等式(11)对 k k k 成立.引理证毕.
:显然,精确搜索和强 Wolfe 搜索均满足条件
∣ ∇ f ( x k ) T d k − 1 ∣ ≤ − σ ∇ f ( x k − 1 ) T d k − 1 , σ ∈ [ 0 , 1 ) . \begin{aligned}|\nabla f(x_k)^Td_{k-1}|\le-\sigma\nabla f(x_{k-1})^Td_{k-1},\quad\sigma\in[0,1).\end{aligned} ∣∇f(xk)Tdk1σf(xk1)Tdk1,σ[0,1).

命题 4.3 (F-R 方法的收敛性) 设 f ∈ C 1 ( R n ) f\in C^1(\mathbb{R}^n) fC1(Rn) 有下界, x 0 ∈ R n x_0\in\mathbb{R}^n x0Rn, 梯度向量 ∇ f ( x ) \nabla f(x) f(x) 在包含水平集 lev f ( x 0 ) ( f ) _{f(x_0)}(f) f(x0)(f) 的一个凸集 D D D L i p s c h i t z Lipschitz Lipschitz 连续. 设 d k d_k dk 由共轭梯度法公式(8.4.8)求得,线搜索 x k = x k − 1 + α k − 1 d k − 1 x_k=x_{k-1}+\alpha_{k-1}d_{k-1} xk=xk1+αk1dk1 为精确搜索或参数 σ ∈ [ 0 , 1 / 2 ) \sigma\in[0,1/2) σ[0,1/2) 的强 W o l f e Wolfe Wolfe 搜索,那么,或者存在 k ≥ 0 k\geq0 k0,使得 ∥ ∇ f ( x k ) ∥ 2 = 0 \|\nabla f(x_k)\|_2=0 ∥∇f(xk)2=0,或者 lim ⁡ k → ∞ ∥ ∇ f ( x k ) ∥ 2 ‾ = 0. \underline{\lim_{k\to\infty}\|\nabla f(x_k)\|_2}=0. limk∥∇f(xk)2=0.

. 若结论不成立,则存在 δ > 0 \delta>0 δ>0,使得 ∥ ∇ f ( x j ) ∥ 2 ≥ δ , ∀ j ≥ 0 \|\nabla f(x_j)\|_2\geq\delta,~\forall j\geq0 ∥∇f(xj)2δ, j0. 对任意的 k ≥ 0 k\geq0 k0,利用引理 4.2之结论 (10)可知 − ∇ f ( x k ) -\nabla f(x_k) f(xk) d k d_k dk 的夹角余弦满足
∥ ∇ f ( x k ) ∥ 2 2 cos ⁡ 2 θ k ≥ ( 1 − 2 σ 1 − σ ) 2 ∥ ∇ f ( x k ) ∥ 2 4 ∥ d k ∥ 2 2 . \|\nabla f(x_k)\|_2^2\cos^2\theta_k\geq\left(\frac{1-2\sigma}{1-\sigma}\right)^2\frac{\|\nabla f(x_k)\|_2^4}{\|d_k\|_2^2}. ∥∇f(xk)22cos2θk(1σ12σ)2dk22∥∇f(xk)24.进一步,利用(11)可得
∥ ∇ f ( x k ) ∥ 2 4 ∥ d k ∥ 2 2 ≥ 1 − σ 1 + σ ( ∑ j = 0 k ∥ ∇ f ( x j ) ∥ 2 − 2 ) − 1 ≥ 1 − σ 1 + σ ⋅ δ 2 k + 1 . \frac{\|\nabla f(x_k)\|_2^4}{\|d_k\|_2^2}\geq\frac{1-\sigma}{1+\sigma}\Big(\sum_{j=0}^k\|\nabla f(x_j)\|_2^{-2}\Big)^{-1}\geq\frac{1-\sigma}{1+\sigma}\cdot\frac{\delta^2}{k+1}. dk22∥∇f(xk)241+σ1σ(j=0k∥∇f(xj)22)11+σ1σk+1δ2.所以 ∑ k = 0 ∞ ∥ ∇ f ( x k ) ∥ 2 2 cos ⁡ 2 θ k = ∞ . \sum_{k=0}^\infty\|\nabla f(x_k)\|_2^2\cos^2\theta_k=\infty. k=0∥∇f(xk)22cos2θk=∞.

另一方面,由强 Wolfe 准则 ∣ ∇ f ( x k + 1 ) T d k ∣ ≤ − σ ∇ f ( x k ) T d k |\nabla f(x_{k+1})^Td_k|\leq-\sigma\nabla f(x_k)^Td_k ∣∇f(xk+1)Tdkσf(xk)Tdk 可知 ∇ f ( x k ) T d k < 0 \nabla f(x_k)^Td_k<0 f(xk)Tdk<0.根据命题 2.2.4我们有 ∑ k = 0 ∞ ∥ ∇ f ( x k ) ∥ 2 2 cos ⁡ 2 θ k < ∞ \sum_{k=0}^\infty\|\nabla f(x_k)\|_2^2\cos^2\theta_k<\infty k=0∥∇f(xk)22cos2θk<,矛盾.

Reference

本笔记内容的程序实现部分参考如下了文章:
最优化方法复习笔记(一)梯度下降法、精确线搜索与非精确线搜索(推导+程序)

相关文章:

  • 2023亚马逊云科技re:Invent用Amazon Q打造你的知识库
  • 力扣单调栈算法专题训练
  • ArcGIS基础:便捷查看外业照片及识别举证照片方位角
  • 案例125:基于微信小程序的个人健康数据管理系统的设计与实现
  • StringBuilder和StringBuffer区别是什么?
  • 2.3_2 进程互斥的软件实现方法
  • java类和对象的思想概述
  • .net core webapi 大文件上传到wwwroot文件夹
  • 微服务之配置中心与服务跟踪
  • 【Grafana】Grafana匿名访问以及与LDAP连接
  • Git常用命令分享
  • 论文笔记 | ICLR 2023 WikiWhy:回答和解释因果问题
  • Sentinel 流量治理组件教程
  • 用C#也能做机器学习?
  • 在MongoDB中使用数组字段和子文档字段进行索引
  • [PHP内核探索]PHP中的哈希表
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • const let
  • extjs4学习之配置
  • gf框架之分页模块(五) - 自定义分页
  • magento2项目上线注意事项
  • MYSQL 的 IF 函数
  • MySQL几个简单SQL的优化
  • Python3爬取英雄联盟英雄皮肤大图
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • SQL 难点解决:记录的引用
  • tab.js分享及浏览器兼容性问题汇总
  • 编写符合Python风格的对象
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 分享几个不错的工具
  • 坑!为什么View.startAnimation不起作用?
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端面试之CSS3新特性
  • 想写好前端,先练好内功
  • 新书推荐|Windows黑客编程技术详解
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • gunicorn工作原理
  • k8s使用glusterfs实现动态持久化存储
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #pragma once
  • #QT(智能家居界面-界面切换)
  • (02)vite环境变量配置
  • (14)Hive调优——合并小文件
  • (done) 两个矩阵 “相似” 是什么意思?
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions