无约束优化问题求解笔记(2):最速下降法

目录

  • 3. 最速下降法
    • 3.1 最速下降法的基本思想
    • 3.2 基于精确搜索的最速下降法
    • 3.3 基于精确搜索的最速下降法的程序实现
    • 3.4 基于精确搜索的最速下降法的缺点
  • Reference

3. 最速下降法

3.1 最速下降法的基本思想

最速下降法是典型的线搜索方法. 设 f f f R n \mathbb{R}^n Rn 上可微函数,在第 k k k 次迭代时,若 ∇ f ( x k ) = 0 \nabla f(x_k)=0 f(xk)=0,则认为 x k x_k xk 已经是 f f f 的极小点,否则令 d k = − ∇ f ( x k ) . \begin{align} d_k=-\nabla f(x_k).\end{align} dk=f(xk). ∇ f ( x k ) T d k = − ∥ ∇ f ( x k ) ∥ 2 < 0 \nabla f(x_k)^Td_k=-\|\nabla f(x_k)\|^2<0 f(xk)Tdk=∥∇f(xk)2<0.以 − ∇ f ( x k ) -\nabla f(x_k) f(xk) 为线搜索方向的方法称为最速下降法.

梯度方向是函数值增长最快的方向,那么梯度的负方向就是函数值下降最快的方向。也就是说梯度下降法选取了函数下降最快的方向来作为搜索方向.

需要说明的是,函数下降最快不代表函数值的下降幅度最大.下面证明这点.

设目标函数 f f f 连续可微,将 f f f x k x_k xk 处Taylor展开:
f ( x ) = f ( x k ) + ∇ f ( x k ) T ( x − x k ) + o ( ∣ ∣ x − x k ∣ ∣ ) f(x)=f(x_k)+\nabla f(x_k)^T(x-x_k)+o(||x-x_k||) f(x)=f(xk)+f(xk)T(xxk)+o(∣∣xxk∣∣) x = x k + 1 x=x_{k+1} x=xk+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 ) = f ( x k ) + α k ∇ f ( x k ) T d k + o ( ∣ ∣ x k + 1 − x k ∣ ∣ ) f(x_{k+1})=f(x_k)+\alpha_k\nabla f(x_k)^Td_k+o(||x_{k+1}-x_k||) f(xk+1)=f(xk)+αkf(xk)Tdk+o(∣∣xk+1xk∣∣)如果迭代的点列 { x k } \{x_{k}\} {xk} 是收敛的,那么很显然有 x k + 1 − x k → 0 ( k → ∞ ) x_{k+1}-x_k\to0(k\to\infty) xk+1xk0(k) 。因此,我们有: f ( x k + 1 ) = f ( x k ) + α k ∇ f ( x k ) T d k f(x_{k+1})=f(x_k)+\alpha_k\nabla f(x_k)^Td_k f(xk+1)=f(xk)+αkf(xk)Tdk

为了使得本次迭代有意义,即 f ( x k + 1 ) < f ( x k ) f(x_{k+1})<f(x_k) f(xk+1)<f(xk) ,需要确保 f ( x k + 1 ) f(x_{k+1}) f(xk+1) 随着 α k \alpha_k αk 的增大而减小 ( x t x_t xt
的小领域内),即 ∂ f ∂ α = ∇ f ( x k ) T d k < 0 \frac{\partial f}{\partial\alpha}=\nabla f(x_k)^Td_k<0 αf=f(xk)Tdk<0 ,由于希望 f ( x t + 1 ) f(x_{t+1}) f(xt+1) 下降得尽可能快,也就是想要的满足:
d k ∗ = arg ⁡ min ⁡ d k ∂ f ∂ α = arg ⁡ max ⁡ d k − ∂ f ∂ α d_k^*=\arg\min_{d_k}\frac{\partial f}{\partial\alpha}=\arg\max_{d_k}-\frac{\partial f}{\partial\alpha} dk=argdkminαf=argdkmaxαf由Cauchy不等式有: − ∂ f ∂ α = − ∇ f ( x k ) T d k ≤ ∣ ∣ ∇ f ( x k ) ∣ ∣ ⋅ ∣ ∣ d k ∣ ∣ -\frac{\partial f}{\partial\alpha}=-\nabla f(x_k)^Td_k\leq||\nabla f(x_k)||\cdot||d_k|| αf=f(xk)Tdk∣∣∇f(xk)∣∣∣∣dk∣∣根据Cauchy不等式成立的条件,当且仅当 d k d_k dk − ∇ f ( x t ) -\nabla f(x_t) f(xt) 同向时,上述不等式的等号成立。所以下降最快的方向 d k ∗ d_k^* dk − ∇ f ( x k ) -\nabla f(x_k) f(xk) 同向.也就是说梯度下降法只考虑了当前的函数关于 a l p h a alpha alpha 下降最快的方向,但不一定是函数值下降幅度最大的.

3.2 基于精确搜索的最速下降法

f ( x k + α d k ) f(x_k+\alpha d_k) f(xk+αdk) 关于 α \alpha α 可微时,精确搜索算法中由于 α k \alpha_k αk 是最优步长, 那么必然有 d d t f ( x k + t d k ) ∣ t = α k = 0 \frac d{dt}f(x_k+td_k)|_{t=\alpha_k}=0 dtdf(xk+tdk)t=α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 ) ≠ 0 \nabla f(x_k)\neq0 f(xk)=0 时,有
∇ f ( x k + 1 ) T d k = 0 , 其中 d k : = − ∇ f ( x k ) . \begin{align}\nabla f(x_{k+1})^Td_k&=0,\quad\text{其中}\quad d_k:=-\nabla f(x_k).\end{align} f(xk+1)Tdk=0,其中dk:=f(xk).考虑二次函数
f ( x ) = 1 2 x T A x + b T x + c , f(x)=\frac12x^TAx+b^Tx+c, f(x)=21xTAx+bTx+c,其中 A ∈ S + + n , b ∈ R n , c ∈ R A\in\mathbb{S}_{++}^n,\:b\in\mathbb{R}^n,\:c\in\mathbb{R} AS++n,bRn,cR.由于 ∇ f ( x k + 1 ) = A x k + 1 + b \nabla f(x_{k+1})=Ax_{k+1}+b f(xk+1)=Axk+1+b. 代入(2)便得 ( A x k + 1 + b ) T d k = 0. (Ax_{k+1}+b)^Td_k=0. (Axk+1+b)Tdk=0. x k + 1 = x k + α k d k x_{k+1}=x_k+\alpha_kd_k xk+1=xk+αkdk 代入上式,并利用 ∇ f ( x k ) = A x k + b \nabla f(x_k)=Ax_k+b f(xk)=Axk+b 整理便得
α 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 . \begin{align} \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}.\end{align} αk:=α>0argminf(xk+αdk)=dkTAdk(Axk+b)Tdk=dkTAdkf(xk)Tdk.

下面看看用最速下降法求二次函数之收敛速度的估计. 记
∥ x ∥ A 2 : = x T A x , ∀ x ∈ R n . \begin{aligned}\|x\|_A^2:=x^TAx,\quad\forall x\in\mathbb{R}^n.\end{aligned} xA2:=xTAx,xRn.实际上,最速下降法求二次函数的收敛速度是可求的,具体地如下面的命题所示.

命题 3.2 (精确搜索最速下降法之收敛速度) 设目标函数为 f ( x ) = 1 2 x T A x + b T x + c f(x)=\frac12x^TAx+b^Tx+c f(x)=21xTAx+bTx+c, 其中 A A A是一个 n n n 阶正定矩阵, b ∈ R n , c ∈ R b\in\mathbb{R}^n,\quad c\in\mathbb{R} bRn,cR. 那么,任取初值 x 0 ∈ R n x_0\in\mathbb{R}^n x0Rn, 使用精确搜索的最速下降法所得的点列 { x k } \{x_k\} {xk} x k ≠ x ∗ x_k\neq x^* xk=x 时,有 ∥ x k + 1 − x ∗ ∥ A ∥ x k − x ∗ ∥ A ≤ c o n d ( A ) 2 − 1 c o n d ( A ) 2 + 1 , \begin{align}\frac{\|x_{k+1}-x^*\|_A}{\|x_k-x^*\|_A}\leq\frac{\mathbf{cond}(A)_2-1}{\mathbf{cond}(A)_2+1},\end{align} xkxAxk+1xAcond(A)2+1cond(A)21,其中, x ∗ x^* x f f f 的极小值点,cond ( A ) 2 : = λ max ⁡ / λ min ⁡ ( A) _2: = \lambda_{\max }/\lambda_{\min } (A)2:=λmax/λmin 是矩阵 A A A 的条件数, λ max ⁡ , λ min ⁡ \lambda_{\max},\lambda_{\min} λmax,λmin 分别为 A A A 的最大和最小特征值.

.设 x ∗ : = argmin ⁡ x ∈ R n f ( x ) x^*:=\operatorname{argmin}_{x\in\mathbb{R}^n}f(x) x:=argminxRnf(x).则 ∇ f ( x ∗ ) = 0 \nabla f(x^*)=0 f(x)=0.由于 ∇ 2 f ( x k ) = A \nabla^2f(x_k)=A 2f(xk)=A ,且上文中我们规定了 ∥ x ∥ A 2 : = x T A x , ∀ x ∈ R n . \begin{aligned}\|x\|_A^2:=x^TAx,\quad\forall x\in\mathbb{R}^n.\end{aligned} xA2:=xTAx,xRn. ,于是可以得到
f ( x k ) = f ( x ∗ ) + 1 2 ( x k − x ∗ ) T A ( x k − x ∗ ) = f ( x ∗ ) + 1 2 ∥ x k − x ∗ ∥ A 2 . \begin{aligned}f(x_k)&=f(x^*)+\frac12(x_k-x^*)^TA(x_k-x^*)=f(x^*)+\frac12\|x_k-x^*\|_A^2.\end{aligned} f(xk)=f(x)+21(xkx)TA(xkx)=f(x)+21xkxA2. k k k 换成 k + 1 k+1 k+1, 有 f ( x k + 1 ) = f ( x ∗ ) + 1 2 ∥ x k + 1 − x ∗ ∥ A 2 . \begin{aligned}f(x_{k+1})=f(x^*)+\frac{1}{2}\|x_{k+1}-x^*\|_A^2.\end{aligned} f(xk+1)=f(x)+21xk+1xA2.两式相减,得 f ( x k + 1 ) − f ( x k ) = 1 2 ( ∥ x k + 1 − x ∗ ∥ A 2 − ∥ x k − x ∗ ∥ A 2 ) . f(x_{k+1})-f(x_k)=\frac12\big(\|x_{k+1}-x^*\|_A^2-\|x_k-x^*\|_A^2\big). f(xk+1)f(xk)=21(xk+1xA2xkxA2).所以 ∥ x k + 1 − x ∗ ∥ A 2 ∥ x k − x ∗ ∥ A 2 = 1 + 2 f ( x k + 1 ) − f ( x k ) ∥ x k − x ∗ ∥ A 2 . \begin{align}\frac{\|x_{k+1}-x^*\|_A^2}{\|x_k-x^*\|_A^2}=1+2\frac{f(x_{k+1})-f(x_k)}{\|x_k-x^*\|_A^2}.\end{align} xkxA2xk+1xA2=1+2xkxA2f(xk+1)f(xk). g k : = ∇ f ( x k ) g_{k} :=\nabla f(x_k) gk:=f(xk),可得 f ( x k + 1 ) − f ( x k ) = ∇ f ( x k ) T ( x k + 1 − x k ) + 1 2 ( x k + 1 − x k ) T A ( x k + 1 − x k ) = α k g k T d k + 1 2 α k 2 d k T A d k . \begin{align}\begin{aligned}f(x_{k+1})-f(x_{k})&=\nabla f(x_k)^T(x_{k+1}-x_k)+\frac{1}{2}(x_{k+1}-x_k)^TA(x_{k+1}-x_k)\\ &=\alpha_kg_k^Td_k+\frac12\alpha_k^2d_k^TAd_k.\end{aligned} \end{align} f(xk+1)f(xk)=f(xk)T(xk+1xk)+21(xk+1xk)TA(xk+1xk)=αkgkTdk+21αk2dkTAdk.

利用 d k = − g k d_k=-g_k dk=gk 和(3)有
α k = − g k T d k d k T A d k = g k T g k g k T A g k , α k g k T d k = − ( g k T g k ) 2 g k T A g k , 1 2 α k 2 d k T A d k = 1 2 ( g k T g k ) 2 g k T A g k . \begin{gathered} \alpha_{k}=-\frac{g_{k}^{T}d_{k}}{d_{k}^{T}Ad_{k}}=\frac{g_{k}^{T}g_{k}}{g_{k}^{T}Ag_{k}},\quad\alpha_{k}g_{k}^{T}d_{k}=-\frac{(g_{k}^{T}g_{k})^{2}}{g_{k}^{T}Ag_{k}},\quad\frac{1}{2}\alpha_{k}^{2}d_{k}^{T}Ad_{k}=\frac{1}{2}\frac{(g_{k}^{T}g_{k})^{2}}{g_{k}^{T}Ag_{k}}. \\\end{gathered} αk=dkTAdkgkTdk=gkTAgkgkTgk,αkgkTdk=gkTAgk(gkTgk)2,21αk2dkTAdk=21gkTAgk(gkTgk)2.代入(6)便得 f ( x k + 1 ) − f ( x k ) = − 1 2 ( g k T g k ) 2 g k T A g k . \begin{aligned}f(x_{k+1})-f(x_k)=-\frac{1}{2}\frac{(g_k^Tg_k)^2}{g_k^TAg_k}.\end{aligned} f(xk+1)f(xk)=21gkTAgk(gkTgk)2.

A ( x ∗ + b ) = ∇ f ( x ∗ ) = 0 A(x^*+b)=\nabla f(x^*)=0 A(x+b)=f(x)=0, 我们有 g k = A x k + b = A ( x k − x ∗ ) g_k=Ax_k+b=A(x_k-x^*) gk=Axk+b=A(xkx).即 x k − x ∗ = A − 1 g k . x_k-x^*=A^{-1}g_k. xkx=A1gk.所以有
∥ x k − x ∗ ∥ A 2 = g k T ( A − 1 ) T A A − 1 g k = g k T A − 1 g k . \begin{aligned}\|x_k-x^*\|_A^2&=g_k^T(A^{-1})^TAA^{-1}g_k&=g_k^TA^{-1}g_k.\end{aligned} xkxA2=gkT(A1)TAA1gk=gkTA1gk.
代入(5)便得
∥ x k + 1 − x ∗ ∥ A 2 ∥ x k − x ∗ ∥ A 2 = 1 − ( g k T g k ) 2 ( g k T A g k ) ( g k T A − 1 g k ) . \begin{gathered} \begin{aligned}\frac{\|x_{k+1}-x^*\|_A^2}{\|x_k-x^*\|_A^2}&=1-\frac{(g_k^Tg_k)^2}{(g_k^TAg_k)(g_k^TA^{-1}g_k)}.\end{aligned} \end{gathered} xkxA2xk+1xA2=1(gkTAgk)(gkTA1gk)(gkTgk)2.利用 Kantorovich 不等式
( x T x ) 2 ( x T A x ) ( x T A − 1 x ) ≥ 4 λ max ⁡ λ min ⁡ ( λ max ⁡ + λ min ⁡ ) 2 , ∀ x ∈ R n ∖ { 0 } , \begin{aligned}\frac{(x^Tx)^2}{(x^TAx)(x^TA^{-1}x)}\geq\frac{4\lambda_{\max}\lambda_{\min}}{(\lambda_{\max}+\lambda_{\min})^2},\quad\forall x\in\mathbb{R}^n\setminus\{0\},\end{aligned} (xTAx)(xTA1x)(xTx)2(λmax+λmin)24λmaxλmin,xRn{0},

其中 λ m a x , λ m i n λ_{max}, λ_{min} λmax,λmin分别为 A A A 的最大和最小特征值,化简即得(4).

根据上面的证明可以发现利用最速下降法求二次函数的极小点的收敛阶至少是线性的.并且由于矩阵 A A A 是对称正定矩阵,那么根据解析几何相关的知识可以知道 f ( x ) f(x) f(x) 的等值面是一个椭球,而椭球的轴长就是 A A A 的各特征值,并且其最长轴和最短轴之比恰为 A A A 的谱条件数 c o n d ( A ) 2 \mathbf{cond}(A)_2 cond(A)2,并且可以知道条件数的值越大,则 f ( x ) f(x) f(x) 的等高面的长轴与短轴相差越大(也就是说椭球会越扁), 迭代点列的收敛就越慢.当谱条件数 c o n d ( A ) 2 \mathbf{cond}(A)_2 cond(A)2接近 1 时,等高线接近一个球,此时收敛很快.特别地,当谱条件数 c o n d ( A ) 2 \mathbf{cond}(A)_2 cond(A)2 = 1 时 , ∥ x 1 − x ∗ ∥ A = 0 ∥x_1 − x∗∥A = 0 x1xA=0, 也就是说只需要一次迭代就可以达到精确解.

3.3 基于精确搜索的最速下降法的程序实现

最优步长的推导

在此之前我们还需要讨论一下基于精确搜索的二次目标函数的最优步长应该如何选取.设讨论的二次型函数如下: f ( x ) = 1 2 x T Q x + b T x + c f(x)=\frac12x^TQx+b^Tx+c f(x)=21xTQx+bTx+c其中​ x x x 是​ n n n 维列向量, A A A 是实对称正定矩阵, ​ b b b 是与​ x x x 维度相同的列向量, c ∈ R c \in \mathbb{R} cR.

我们记 g k = ∇ f ( x k ) g_k=\nabla f(x_k) gk=f(xk) 。由矩阵求导的性质以及 A A A 是对称矩阵,那么有 ∇ f ( x k ) = A x k + b \nabla f(x_k)=Ax_k+b f(xk)=Axk+b 时,就可以开始在 d k = − ∇ f ( x k ) d_k=-\nabla f(x_k) dk=f(xk) 的方向上实施精确线搜索,从而得到最优步长 α ∗ \alpha^* α 了: α ∗ = arg ⁡ min ⁡ α f ( x k + α d k ) = arg ⁡ min ⁡ α f ( x k − α g k ) = arg ⁡ min ⁡ α ( 1 2 g k T A g k α 2 − g k T g k α + f ( x k ) ) \begin{aligned} \alpha^{*}& =\arg\min_\alpha f(x_k+\alpha d_k) \\ &=\arg\min_\alpha f(x_k-\alpha g_k) \\ &=\arg\min_\alpha\left(\frac12g_k^TAg_k\alpha^2-g_k^Tg_k\alpha+f(x_k)\right) \end{aligned} α=argαminf(xk+αdk)=argαminf(xkαgk)=argαmin(21gkTAgkα2gkTgkα+f(xk))注意到上述函数是关于 α \alpha α 的二次函数,故最优步长 α ∗ \alpha^* α 为:
α ∗ = g k T g k g k T A g k \alpha^*=\frac{g_k^Tg_k}{g_k^TAg_k} α=gkTAgkgkTgk因此在对正定二次型做梯度下降时,通过上述上述上述的精确线搜索得到最优步长后,更新迭代式为 x k + 1 = x k − g k T g k g k T A g k ( A x k + b ) x_{k+1}=x_k-\frac{g_k^Tg_k}{g_k^TAg_k}(Ax_k+b) xk+1=xkgkTAgkgkTgk(Axk+b)下面做一个正定二次型的最速下降法实现的总结,已知迭代的终止条件参数 ϵ \epsilon ϵ。初始迭代点为 x 0 x_0 x0,记 g k = ∇ f ( x k ) g_k=\nabla f(x_k) gk=f(xk),重复以下操作 :

1.计算 d k = − ∇ f ( x k ) d_k=-\nabla f(x_k) dk=f(xk),若 ∣ ∣ d t ∣ ∣ < ϵ ||d_t||<\epsilon ∣∣dt∣∣<ϵ,迭代终止,否则执行下一步

2.计算精确线搜索的最优步长: α ∗ = g k T g k g k T A g k \alpha^*=\frac{g_k^Tg_k}{g_k^TAg_k} α=gkTAgkgkTgk

3.通过迭代式 x k + 1 = x k − g k T g k g k T A g k ( A x k + b ) x_{k+1}=x_k-\frac{g_k^Tg_k}{g_k^TAg_k}(Ax_k+b) xk+1=xkgkTAgkgkTgk(Axk+b) 更新得到下一个迭代点,然后回退到第一步

程序实现

实际上,可以证明利用最速下降法来求二次函数的最优化问题时,如果存在局部最优点,那么该点是一定全局最优点,也就是说该优化问题满足全局收敛性.

下面基于此事实,利用Python来看看基于精确所搜的最速下降法的程序实现.

设需要优化的目标二次函数如下: f ( x ) = 1 2 x T Q x + b T x , Q = ( 10 − 9 − 9 10 ) , b = ( 4 , − 15 ) T f(x)=\frac12x^TQx+b^Tx,Q=\begin{pmatrix}10&-9\\-9&10\end{pmatrix},b=(4,-15)^T f(x)=21xTQx+bTx,Q=(109910),b=(4,15)T为了检验迭代过程的可靠性,我们可以解析地求出该优化问题的最优点: x ∗ = − Q − 1 b = ( 5 , 6 ) T x^*=-Q^{-1}b=(5,6)^T x=Q1b=(5,6)T此外我们还需要定义目标函数中的 Q , b Q,b Q,b 还有原本的函数 f f f 和函数梯度 ∇ f \nabla f f 的映射funcgradient.准备工作部分的代码如下:

# 准备工作
import numpy as np
import matplotlib.pyplot as pltQ = np.array([[10, -9], [-9, 10]], dtype="float32") # 矩阵Q
b = np.array([4, -15], 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(Q, x)).squeeze() + np.dot(b.T, x).squeeze() # 利用lambda表达式定义目标函数:1/2 x^T*Q*x + b^Tx
gradient = lambda x: np.dot(Q, x) + b # 定义梯度 = f' = Qx + b
x_0 = np.array([5, 6]).reshape([-1, 1]) # 定义最优点

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

# GD algorithm
def gradient_descent(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是迭代点的序列,最后一个就是最后一次求的点while True:g_k = gradient(x_k_1).reshape([-1, 1])if np.sqrt(np.sum(g_k ** 2)) < epsilon:breakalpha_k = np.dot(g_k.T, g_k).squeeze() / (np.dot(g_k.T, np.dot(Q, g_k))).squeeze()x_k_2 = x_k_1 - alpha_k * g_kiter_num += 1xs.append(x_k_2)loss.append(float(np.fabs(func(x_k_2) - func(x_0))))if np.fabs(func(x_k_2) - func(x_k_1)) < epsilon:breakx_k_1 = x_k_2return xs, iter_num, loss

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

x0 = np.array([4,4], 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") # 对y轴取log
plt.show()

运行结果:

[[4.999424][5.998852]]

在这里插入图片描述

可以看到最终迭代点到达了最优点 ( 5 , 6 ) T (5,6)^T (5,6)T。当纵坐标取对数 l o g log log 时,收敛速率近似是线性的。也就是说梯度下降法用于优化是可行的,收敛速率也不错。但是结论还不能够下得太早,我们在更换几组初始点,并把相关的参数画在一个图像内看看效果.

我们再取四个迭代点:​ ( 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 GD
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 GD:[[4.99855], [5.99826]], loss:2.9518850226e-06, # iterations: 60------------------------------------------------------------2: start point:[[0.4], [0.0]], point after GD:[[4.99902], [5.99873]], loss:1.6873629107e-06, # iterations: 42------------------------------------------------------------3: start point:[[10.0], [0.0]], point after GD:[[5.0], [6.0]], loss:1.33369e-11, # iterations: 4------------------------------------------------------------4: start point:[[11.0], [0.0]], point after GD:[[5.0], [6.0]], loss:0.0, # iterations: 1------------------------------------------------------------

在这里插入图片描述

由上图可以看到可以看到不同的初值点,收敛速率不相同。也就是说不同的初始点到达最优点的所需的迭代次数不一样.为了更好滴感受不同初始点选取的差异,可以把上述过程在二维平面内可视化出来:

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("Line Search For Two-dimensional Diagrams", fontsize=18)
plt.xlabel("$x_1$", fontsize=12)
plt.ylabel("$x_2$", fontsize=12)
plt.legend()
plt.show()

运行结果:

在这里插入图片描述

这张图可以直观地感受四个迭代点的迭代步数的差距。究其原因,我们在命题 3.2中提到,等高线代表的椭圆的长轴和短轴比的含义,不同初始点的选取所位于的等高面是不一样的,如果位于狭长的区域则收敛的速度会相应地快些,这是因为梯度方向的值要大些,从上图中可以直观的感受.

3.4 基于精确搜索的最速下降法的缺点

首先拿简单的二次型来说,随着条件数 c o n d ( A ) 2 cond(A)_2 cond(A)2 的增大,等高线的椭圆族会越来越扁,那么靠近椭圆长轴的迭代初值迭代到最优点会更加困难;或者说,精确线搜的梯度下降法的迭代次数会对迭代初值的选取越来越敏感。由于实际计算中初始值的选取是随机的,我们并不希望算法对初始值的选取过于敏感而导致算法的不稳定性.

其次最速下降法的下降方向选取存在一定的问题:虽然最速下降法选取了函数下降最快的方向,但是这并不一定就是函数值幅度减少最大的方向.简要地说这是因为,最快的下降方向只是对于一个很小的领域而言,但是在这个领域之外的函数值改变的幅度并没有考虑进去 。此外加上精确线搜的要求,使得整个算法变得很不灵活,因为程序会每步都找到 的最小值,但是由于每次迭代的函数值下降的幅度并不是最大的,这样就造成了一种计算资源的浪费.

关于下降最快不代表下降幅度最大可以如下证明:

设目标函数 f f f 连续可微,将 f f f x k x_k xk 处Taylor展开:
f ( x ) = f ( x k ) + ∇ f ( x k ) T ( x − x k ) + o ( ∣ ∣ x − x k ∣ ∣ ) f(x)=f(x_k)+\nabla f(x_k)^T(x-x_k)+o(||x-x_k||) f(x)=f(xk)+f(xk)T(xxk)+o(∣∣xxk∣∣) x = x k + 1 x=x_{k+1} x=xk+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 ) = f ( x k ) + α t ∇ f ( x k ) T d t + o ( ∣ ∣ x k + 1 − x k ∣ ∣ ) f(x_{k+1})=f(x_k)+\alpha_t\nabla f(x_k)^Td_t+o(||x_{k+1}-x_k||) f(xk+1)=f(xk)+αtf(xk)Tdt+o(∣∣xk+1xk∣∣)如果迭代的序列点 { x k } \{x_{k}\} {xk} 是收敛的,那么很显然有 x k + 1 − x k → 0 ( t → ∞ ) x_{k+1}-x_k\to0(t\to\infty) xk+1xk0(t) 。因此,我们有: f ( x k + 1 ) = f ( x k ) + α k ∇ f ( x k ) T d k f(x_{k+1})=f(x_k)+\alpha_k\nabla f(x_k)^Td_k f(xk+1)=f(xk)+αkf(xk)Tdk

要是每次迭代都是有意义的,则要求 f ( x k + 1 ) < f ( x k ) f(x_{k+1})<f(x_k) f(xk+1)<f(xk) ,需要确保 f ( x k + 1 ) f(x_{k+1}) f(xk+1) 随着 α k \alpha_k αk 的增大而减小( x k x_k xk
的小领域内),即 ∂ f ∂ α = ∇ f ( x k ) T d k < 0 \frac{\partial f}{\partial\alpha}=\nabla f(x_k)^Td_k<0 αf=f(xk)Tdk<0 ,同时我们希望 f ( x k + 1 ) f(x_{k+1}) f(xk+1) 下降得尽可能快,也就是满足: d t ∗ = arg ⁡ min ⁡ d t ∂ f ∂ α = arg ⁡ max ⁡ d t − ∂ f ∂ α d_t^*=\arg\min_{d_t}\frac{\partial f}{\partial\alpha}=\arg\max_{d_t}-\frac{\partial f}{\partial\alpha} dt=argdtminαf=argdtmaxαf由Cauchy不等式:
− ∂ f ∂ α = − ∇ f ( x k ) T d k ≤ ∣ ∣ ∇ f ( x k ) ∣ ∣ ⋅ ∣ ∣ d k ∣ ∣ -\frac{\partial f}{\partial\alpha}=-\nabla f(x_k)^Td_k\leq||\nabla f(x_k)||\cdot||d_k|| αf=f(xk)Tdk∣∣∇f(xk)∣∣∣∣dk∣∣根据Cauchy不等式成立的条件,当且仅当 d k d_k dk − ∇ f ( x k ) -\nabla f(x_k) f(xk) 同向时,上述不等式中的等号成立.也就是说下降最快的方向 d k ∗ d_k^* dk − ∇ f ( x k ) -\nabla f(x_k) f(xk) 同向。

Reference

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2与vue3的区别

首先了解什么是vue3 Vue.js 3.0&#xff08;简称Vue 3&#xff09;是一个流行的JavaScript框架Vue.js的最新版本。Vue 3于2020年9月正式发布&#xff0c;带来了许多令人兴奋的新特性和改进。下面是Vue 3的一些主要特点&#xff1a; 更快的性能&#xff1a;Vue 3通过全新的响应…

【redis】redis系统实现发布订阅的标准模板

目录 简介参数配置代码模板 简介 Redis发布订阅功能是Redis的一种消息传递模式&#xff0c;允许多个客户端之间通过消息通道进行实时的消息传递。在发布订阅模式下&#xff0c;消息的发送者被称为发布者&#xff08;publisher&#xff09;&#xff0c;而接收消息的客户端被称为…

Easyexcel读取单/多sheet页

Easyexcel读取单/多sheet页 此文档会说明单个和多个的sheet页的读取方法&#xff0c;包括本人在使用过程中的踩坑点。 依赖不会的自行百度导入&#xff0c;话不多说&#xff0c;直接上干货。以下示例基于2.x&#xff0c;新版本基本类似 1、创建实体 实体是用来接收对应列的数据…

【QT】QGraphicsView和QGraphicsItem坐标转换

坐标转换 QGraphicsItem和QGraphicsView之间的坐标转换需要通过QGraphicsScene进行转换 QGraphicsView::mapToScene() - 视图 -> 场景QGraphicsView::mapFromScene() - 场景 -> 视图QGraphicsItem::mapToScene() - 图元 -> 场景QGraphicsItem::mapFromScene() - 场景 …

java连接oracle出现ORA-12505错误

问题 sqlplus可以连接;但java连接报错:ORA-12505 ORA-12505, TNS:listener does not currently know of SID given in connect descr 解析 原因: 数据库中实际使用的实例名并非与集群对外使用的相同&#xff0c;使用第三方构件或程序进行连接的时候&#xff0c;所给数据库运…

Arduino驱动LTR390-UV紫外线传感器(光照传感器篇)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序

C++ Qt开发:StringListModel字符串列表映射组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QStringListModel字符串映射组件的常用方法及…

Java-JDBC(重要)--待更新

1、第一个JDBC程序 步骤总结&#xff1a; 创建测试数据库加载驱动&#xff0c;固定写法连接数据库获得执行SQL的对象statement执行SQL对象去执行SQLresultset获得返回结果集释放连接 import java.sql.*;public class Jdbc {public static void main(String args[]) throws C…

线程(四)

线程(一) ~ 线程(四)章节导图 导图https://naotu.baidu.com/file/07f437ff6bc3fa7939e171b00f133e17 线程安全 什么是线程安全&#xff1f; 业务中多线程同时访问一个对象或方法时我们不需要做额外的处理&#xff08;像单线程编程一样&#xff09;程序可以正常运行并能获取…

11_12-Golang中的运算符

**Golang **中的运算符 主讲教师&#xff1a;&#xff08;大地&#xff09; 合作网站&#xff1a;www.itying.com** **&#xff08;IT 营&#xff09; 我的专栏&#xff1a;https://www.itying.com/category-79-b0.html 1、Golang 内置的运算符 算术运算符关系运算符逻辑运…

JS模块化规范之ES6及UMD

JS模块化规范之ES6及总结 前言ES6模块化概念基本使用ES6实现 UMD(Universal Module Definition)总结 前言 ESM在模块之间的依赖关系是高度确定的&#xff0c;与运行状态无关&#xff0c;编译工具只需要对ESM模块做静态分析&#xff0c;就可以从代码字面中推断出哪些模块值未曾被…

RocketMQ系统性学习-RocketMQ原理分析之Broker接收消息的处理流程

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 【11来了】文章导读地址&#xff1a;点击查看文章导读&#xff01; &#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f3…

Leetcode 53 最大子数组和

题意理解&#xff1a; 给定一个数列&#xff0c;求连续的子序列的和最大可以是多少&#xff1f; 子数组 是数组中的一个连续部分。 比如&#xff1a; nums [-2,1,-3,4,-1,2,1,-5,4] 最大子序列的和&#xff1a;6&#xff08;4-121&#xff09; 解题思路&#xff1a; 使用贪心的…

回溯法之计算操作符

问题: 设计一个算法在 1&#xff0c;2&#xff0c;……9(顺序不变)数值之间插入或者-或者什么都不插入&#xff0c; 使得计算结果总是 100 的程序。 //例如 1 2 34 - 5 67 - 8 9 100。 思路: 创建一个长度为9的数组arr&#xff0c;其中存放数字1到9。创建一个长度为9的字…

【git学习笔记 01】打标签

文章目录 一、声明二、对标签的基本认知什么是标签&#xff1f;为什么要打标签&#xff1f;如何生成类似github中readme的图标 三、标签相关命令四、示例操作 一、声明 本帖持续更新中如有纰漏&#xff0c;望批评指正&#xff01;参考视频链接&#xff0c;非常感谢原作者&…

HTMLCSS旋转的圣诞树源码附注释

css代码附注释 *{/* 初始化 */margin: 0;padding: 0; } body{align-content: center;align-items: center;background-color: #9f0000;

5 分钟内搭建一个免费问答机器人:Milvus + LangChain

搭建一个好用、便宜又准确的问答机器人需要多长时间&#xff1f; 答案是 5 分钟。只需借助开源的 RAG 技术栈、LangChain 以及好用的向量数据库 Milvus。必须要强调的是&#xff0c;该问答机器人的成本很低&#xff0c;因为我们在召回、评估和开发迭代的过程中不需要调用大语言…

ARFoundation系列讲解 - 93 绘制圆

案例中使用的软件版本 Unity2023.1.20.f1c1ARFoundtaion 5.1.0Apple ARKit XR Plugin 5.1.0 Google ARCore XR Plugin 5.1.0技术分析 我们可以实时检测用户手指触摸的屏幕位置,从触摸位置投射一条射线(Raycast),再射线命中的目标位置创建一个点,放置一个圆,手指拖动来设置…

Backtrader 文档学习-Data Feeds(下)

Backtrader 文档学习-Data Feeds&#xff08;下&#xff09; 1. Data Resampling 当数据仅在单个时间范围内可用&#xff0c;需要在不同的时间范围内进行分析时&#xff0c;就需要进行一些重采样。 “重采样”实际上应该称为“上采样”&#xff0c;因为它是从一个源时间区间到…

C++的泛型编程—模板

目录 一.什么是泛型编程&#xff1f; ​编辑 ​编辑 二.函数模板 函数模板的实例化 当不同类型形参传参时的处理 使用多个模板参数 三.模板参数的匹配原则 四.类模板 1.定义对象时要显式实例化 2.类模板不支持声明与定义分离 3.非类型模板参数 4.模板的特化 函数模板…