无约束优化问题求解(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 plt

A = 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 ndarray
    global Q, b, x_0  # claim the global varience
    x_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 = []  # 储存搜索方向的list
    d_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)
            break
        if 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_k
            d_k = d_current
            d_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_k
        x_k_2 = x_k_1 + alpha_k * d_k # 迭代式
        iter_num += 1
        xs.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:
            break
        if iter_num > 100: # 超过一定次数后停止迭代
            break
        x_k_1 = x_k_2
    return 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 point
    plt.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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/264019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中使用JTS实现WKB数据写入、转换字符串、读取

场景 Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内的方位角&#xff1a; Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内…

MFC静态链接+libtiff静态链接提示LNK2005和LNK4098

编译报错 1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_infoAAEABV0Z) 已经在 libcmtd.lib(typinfo.obj) 中定义 1>msvcrt.lib(ti_inst.obj) : error LNK2005: "pr…

电子说明书制作:零基础也可以轻松上手

引言&#xff1a; 在数字化时代&#xff0c;电子说明书成为了传统纸质说明书的现代替代品。电子说明书具有可交互性、易更新、环保等优势&#xff0c;越来越受到企业和个人的青睐。本文将介绍一些简单易用的工具和方法&#xff0c;帮助零基础的用户轻松上手电子说明书的制作。…

Sui 生态排名第一的头部流动性协议 NAVI Protocol 活动进行中

作为在熊市中启动的新生公链&#xff0c;Sui 正在稳步崛起。公链的 TVL 持续攀升&#xff0c;目前已经达到了 1.76亿美元&#xff0c;闯入了公链排名前20榜单。仅过去四个月内&#xff0c;TVL 增加了10倍&#xff0c;并且增长仍在继续&#xff0c;SUI 的价格在近期也有了很亮眼…

智能优化算法应用:基于瞬态优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于瞬态优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于瞬态优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.瞬态优化算法4.实验参数设定5.算法结果6.…

网络调优,部署内网备份冗余和负载分担---实验

目录 网络调优&#xff0c;部署内网备份冗余和负载分担---实验 拓扑 需求 配置步骤&#xff1a; 配置命令: 网络调优&#xff0c;部署内网备份冗余和负载分担---实验 拓扑 需求 主机获取IP地址&#xff0c;访问WEB服务器&#xff0c;WEB服务器网关在SW5上SW5作为VLAN10,V…

Qt配置opencv,cmake编译参考笔记,已成功

Qt版本&#xff1a;Qt5.14.2 opencv&#xff1a;4.5.4&#xff08;不要用4.5.5&#xff01;&#xff01;很坑别问我为什么知道&#xff09; cmake&#xff1a;下的最新版本 前言&#xff1a;为什么非得要用cmake编译呢&#xff1f;跳过cmake不好吗&#xff1f; 之前用的opencv…

PS里面怎么提取图上要的颜色然后用到另一个部位去

PS里面要提取图上要的颜色然后用到另一个部位去&#xff0c;具体步骤如下&#xff1a; 在ps里打开特定的图像文件&#xff1b; 想要提取图上的哪个颜色&#xff0c;就使用”吸管工具“在图上特定的位置上点击一下&#xff0c;就会看到前景色变成了相应的颜色&#xff1b; 然…

web网页端使用webSocket实现语音通话功能(SpringBoot+VUE)

写在前面 最近在写一个web项目&#xff0c;需要实现web客户端之间的语音通话&#xff0c;期望能够借助webSocket全双工通信的方式来实现&#xff0c;但是网上没有发现可以正确使用的代码。网上能找到的一个代码使用之后只能听到“嘀嘀嘀”的杂音 解决方案&#xff1a;使用Jso…

vue之router-link页面跳转及传参

文章目录 vue之router-link页面跳转及传参根据路由的路径跳转及传参(query)根据路由的名称跳转及传参(params)根据store传参 vue之router-link页面跳转及传参 <router-link> 是用于在 Vue.js 应用程序中进行路由导航的组件。它可以用来生成具有正确链接的<a> 标签…

我的应用我做主:扩展线程池

自定义线程创建&#xff1a;ThreadFactory 线程池中的线程是从哪里来的呢&#xff1f; ThreadPoolExecutor(int corePoolSize,//指定了线程池种的线程数量 int maximumPoolSize,//指定了线程池中的最大线程数量。 long keepAliveTime,// 当线程池数量超过了corePoolSize&#x…

【电路笔记】-串联电容器

串联电容器 文章目录 串联电容器1、概述2、示例13、示例34、总结 当电容器以菊花链方式连接在一条线上时&#xff0c;它们就串联在一起。 1、概述 对于串联电容器&#xff0c;流过电容器的充电电流 ( i C i_C iC​ ) 对于所有电容器来说都是相同的&#xff0c;因为它只有一条…

在x64上构建智能家居(home assistant)(二)(新版Debain12)连接Postgresql数据库

新版数据库安装基本和旧版相同,大部分可以参考旧版本在x64上构建智能家居(home assistant)&#xff08;二&#xff09;连接Postgresql数据库_homeassist 数据库-CSDN博客 新版本的home assistant系统安装,我在原来写的手顺上直接修改了,需要的可以查看在x64上构建智能家居(home…

心有暖阳,笃定前行,2024考研加油

2024考研学子&#xff0c;所有的付出终有收获&#xff0c;阳光终将穿透阴霾&#xff0c;终将上岸。 当曙光破晓的时候&#xff0c;你可曾记得那些星月为伴&#xff0c;孤独为友&#xff0c;理想为灯来指引前行之路的日子&#xff0c;那些默默扎根的日子终将化作星星在未来闪闪发…

java.lang.IllegalStateException: Duplicate key

序言 最近监控扫描出我们项目的某些异常信息&#xff0c;报错java.lang.IllegalStateException: Duplicate key xxx&#xff0c;看到异常来自stream流&#xff0c;然后定位看了一下是某位同事的代码使用stream流把List转Map集合出现重复的key异常信息。List集合A对象来源于某个…

01-黑马程序员大数据开发

一. Hadoop概述 1. 什么是大数据 &#xfeff;狭义上&#xff1a;对海量数据进行处理的软件技术体系&#xfeff;广义上&#xff1a;数字化、信息化时代的基础支撑&#xff0c;以数据为生活赋 2. 大数据的核心工作&#xff1a; &#xfeff;存储&#xff1a;妥善保存海量待…

Http---HTTP 请求报文

1. HTTP 请求报文介绍 HTTP最常见的请求报文有两种: GET 方式的请求报文POST 方式的请求报文 说明: GET: 获取web服务器数据POST: 向web服务器提交数据 2. HTTP GET 请求报文分析 HTTP GET 请求报文效果图: GET 请求报文说明: ---- 请求行 ---- GET / HTTP/1.1 # GET请…

Qt WebAssembly开发环境配置

目录 前言1、下载Emscripten SDK2、 安装3、环境变量配置4、QtCreator配置5、运行示例程序总结 前言 本文主要介绍 Qt WebAssembly 开发环境的配置。Qt for Webassembly 可以使Qt应用程序在Web上运行。WebAssembly&#xff08;简称Wasm&#xff09;是一种能够在虚拟机中执行的…

内存管理学习

内存管理 在计算系统中&#xff0c;通常存储空间分为两种&#xff1a;内部存储空间和外部存储空间。 内部存储空间通常访问速度比较快&#xff0c;能够按照变量地址随机访问&#xff0c;也就是我们通常所说的RAM&#xff08;随机存储器&#xff09;&#xff0c;可以把它理解为…

【原理图PCB专题】原理图图纸锁定/解锁与PCB文件加密方式

在工作中我们会遇到需要冻结原理图进行评审和加密图纸防止被他人盗用的需求。那么在OrCAD Capture中如何对图纸进行锁定与解锁,如何在Allegro中对PCB工程进行加密呢? 原理图锁定与解锁 打开原理图,在图纸中单击右键,选择lock/unlock就可以进行锁定与解锁。 锁定时图纸图…