无约束优化问题求解笔记(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,一经查实,立即删除!

相关文章

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() - 场景 …

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

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

线程(四)

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

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…

【git学习笔记 01】打标签

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

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

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

Backtrader 文档学习-Data Feeds(下)

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

C++的泛型编程—模板

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

MySQL的安装及如何连接到Navicat和IntelliJ IDEA

MySQL的安装及如何连接到Navicat和IntelliJ IDEA 文章目录 MySQL的安装及如何连接到Navicat和IntelliJ IDEA1 MySQL安装1.1 下载1.2 安装(解压)1.3 配置1.3.1 添加环境变量1.3.2 新建配置文件1.3.3 初始化MySQL1.3.4 注册MySQL服务1.3.5 启动MySQL服务1.3.6 修改默认账户密码 1…

Windows中安装nvm进行Node版本控制

1.nvm介绍 nvm英文全程也叫node.js version management&#xff0c;是一个node.js的版本管理工具。nvm和npm都是node.js版本管理工具&#xff0c;但是为了解决node各种不同之间版本存在不兼容的问题&#xff0c;因此可以通过nvm安装和切换不同版本的node。 2.nvm下载 可在点…

6个免费设计资源站,设计师们赶紧收藏!

本期给大家分享5个免费的设计资源站&#xff0c;设计师必备的设计设计神奇&#xff0c;绝对能帮助你在工作中事半功倍&#xff0c;赶紧收藏吧~ 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站&#xff0c;主要是站内素材多&#xff0c;像…

PHPStorm一站式配置

phpstorm安装好之后&#xff0c;先别急着编码。工欲善其事&#xff0c;必先利其器&#xff0c;配置好下面这些之后让编码事半功倍。 主题 Appearance & Behavior -> Appearance -> Theme 选中 [Light with Light Header] 亮色较为护眼 关闭更新 Appearance & …

C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# 方法

C# 入门基础知识 - 方法 第8节 方法8.1 C# 函数/方法简介8.2 方法的声明及调用8.2.1 参数列表方法的声明及调用8.2.2 参数数组方法的声明及调用8.2.3、引用参数与值参数 8.3 静态方法和实例方法8.3.1 静态、实例方法的区别8.2.3 静态、实例方法的声明及其调用 8.4 虚方法8.4.1 …

Linux学习(3)——基本命令-文件

1、cat&#xff1a;查看文件内容--上下合并文件 注意&#xff1a;cat只能查看普通的文本文件 如果文件内容过多会显示不全 选项效果-n显示行号包括空行-b跳过空白行编号&#xff1b;注意&#xff0c;在一行打了空格不算空白行&#xff0c;enter键直接跳过这一行才算-s将所有连续…

【JAVA】CyclicBarrier源码解析以及示例

文章目录 前言CyclicBarrier源码解析以及示例主要成员变量核心方法 应用场景任务分解与合并应用示例 并行计算应用示例 游戏开发应用示例输出结果 数据加载应用示例 并发工具的协同应用示例 CyclicBarrier和CountDownLatch的区别循环性&#xff1a;计数器的变化&#xff1a;用途…

[c]用指针进行四个数排序

#include<stdio.h> void swap(int*p1,int*p2)//定义函数&#xff0c;实现两个数值交换 {int temp;temp*p1;*p1*p2;*p2temp; } void psort( int *pa, int *pb,int *pc,int *pd) {int i1;for(i1;i<3;i)//对四个数排序&#xff0c;至少3次循环&#xff0c;交换过后是升序…

DDPM推导笔记

各位佬看文章之前&#xff0c;可以先去看看这个视频&#xff0c;并给这位up主点赞投币&#xff0c;这位佬讲解的太好了&#xff1a;大白话AI 1.前置知识的学习 1.1 正态分布特性 ​ &#xff08;1&#xff09;正态分布的概率密度函数 f ( x ) 1 2 π σ e − ( x − μ ) …

Android13音频录制适配

Android13音频录制适配 前言&#xff1a; 之前写过一篇音频录制的文章&#xff0c;当时是在Android10以下的手机可以成功录制和播放&#xff0c;但是Android10及以上手机提示创建文件失败&#xff0c;最近做过Android13的适配&#xff0c;索性一起把之前的录音也适配了&#…