机器学习笔记之最优化理论与方法(七)无约束优化问题——常用求解方法(上)

机器学习笔记之最优化理论与方法——基于无约束优化问题的常用求解方法[上]

  • 引言
    • 总体介绍
    • 回顾:线搜索下降算法
    • 收敛速度的衡量方式
      • 线性收敛范围
      • 高阶收敛范围
    • 二次终止性
    • 朴素算法:坐标轴交替下降法
    • 最速下降法(梯度下降法)
      • 梯度下降法的特点
    • 针对最速下降法缺陷代码示例

引言

本节将介绍无约束优化问题的常用求解方法,包括坐标轴交替下降法、最速下降法

本节是对优化算法(十~十七)最速下降法(梯度下降法)的理论补充,其中可能出现一些定理的证明过程这里不再赘述,并在相应位置附加链接

总体介绍

从本节开始,将介绍四大类无约束优化问题的常用求解方法:

  • 坐标轴交替下降法
  • 最速下降法
  • 牛顿法
  • 拟牛顿法

这些方法的核心区别在于:下降方向选择策略的差异性。通过介绍各算法选择下降方向的方式,并延伸至该算法的特点。

回顾:线搜索下降算法

关于最小化目标函数 min ⁡ f ( x ) \min f(x) minf(x)无约束优化问题线搜索下降算法迭代步骤表示如下:

  • 给定数值解序列 { x k } k = 0 ∞ \{x_k\}_{k=0}^{\infty} {xk}k=0的迭代初始点 x 0 ( k = 0 ) x_0(k=0) x0(k=0)
    这仅是从数学角度对数值解序列进行描述。如果从算法角度,它不可能是一个长度为无穷大的序列。可以通过终止条件使迭代算法停止。
  • 判断 x k x_k xk是否满足终止条件:是,则终止;
  • 寻找 x k x_k xk位置的下降方向 D k \mathcal D_k Dk
  • 选择合适的步长 α k ≥ 0 \alpha_k \geq 0 αk0,使得:
    f ( x k + α k ⋅ D k ) < f ( x k ) f(x_k + \alpha_k \cdot \mathcal D_k) < f(x_k) f(xk+αkDk)<f(xk)
  • 令: x k + 1 = x k + α k ⋅ D k x_{k+1} = x_k + \alpha_k \cdot \mathcal D_k xk+1=xk+αkDk;并令 k = k + 1 k = k+1 k=k+1,转步骤 2 2 2

其中:

  • 常用终止条件 ∥ ∇ f ( x k ) ∥ ≤ ϵ \|\nabla f(x_k)\| \leq \epsilon ∥∇f(xk)ϵ
    • 其中 ϵ \epsilon ϵ是一个较小的正值。例如 1 0 − 6 10^{-6} 106
    • 如果满足该条件,意味着: x k x_k xk点处的梯度 ∇ f ( x k ) \nabla f(x_k) f(xk)已经充分接近于 0 0 0
  • 步长选择方式:基于区间的直接搜索法;非精确搜索准则(五~七);
    包括 Armijo,Glodstein,Wolfe \text{Armijo,Glodstein,Wolfe} Armijo,Glodstein,Wolfe准则。因为仅仅让 { f ( x k ) } k = 0 ∞ \{f(x_k)\}_{k=0}^{\infty} {f(xk)}k=0收敛并不是其达到最优解的充要条件。详见线搜索方法(步长角度;非精确搜索)
  • 下降方向

针对不同的下降方向选择方式,产生不同种类的算法。而我们更关心的是对应算法产生的数值解序列 { x k } k = 0 ∞ \{x_k\}_{k=0}^{\infty} {xk}k=0是否能够收敛至最优解 x ∗ x^* x,如果能够收敛至最优解 x ∗ x^* x,需要关心它的收敛速度情况

收敛速度的衡量方式

对应文章详见:优化算法(九)收敛速度的简单认识

线性收敛范围

假设数值解序列 { x k } k = 0 ∞ ⇒ x ∗ \{x_k\}_{k=0}^{\infty} \Rightarrow x^* {xk}k=0x,如果存在极限
很明显,关于 β \beta β的取值范围: β ∈ [ 0 , 1 ] \beta \in [0,1] β[0,1]

  • 其中当 β = 1 \beta=1 β=1时,分母与分子之间的差异性可视作完全相同;换句话说,当 k k k充分大时,两者之间的差距确实存在,但小到可以忽略不计。称这种收敛方式为次线性收敛
  • 0 < β < 1 0<\beta<1 0<β<1时,可以明显观察到分母与分子之间存在比值的大小关系;通过该比值 β \beta β可以明显观察到迭代过程中呈线性的收敛效果
  • β = 0 \beta = 0 β=0时,和 β = 1 \beta = 1 β=1相反,当 k k k充分大时,分母与分子之间的差距足够大,甚至分子与分母相比,小到可以忽略不计
    lim ⁡ k ⇒ ∞ ∥ x k + 1 − x ∗ ∥ ∥ x k − x ∗ ∥ = β \mathop{\lim}\limits_{k \Rightarrow \infty} \frac{\|x_{k+1} - x^*\|}{\|x_k - x^*\|} = \beta klimxkxxk+1x=β

根据 β \beta β的不同取值,有:

  • 0 < β < 1 0 < \beta < 1 0<β<1时,称数值解序列 { x k } \{x_k\} {xk}线性收敛
  • β = 0 \beta = 0 β=0时,则称数值解序列 { x k } \{x_k\} {xk}超线性收敛

示例:假设 β = 1 2 \begin{aligned}\beta = \frac{1}{2}\end{aligned} β=21,那么:
{ ∥ x k + 1 − x ∗ ∥ = 1 2 ∥ x k − x ∗ ∥ ∥ x k + 2 − x ∗ ∥ = 1 2 ∥ x k + 1 − x ∗ ∥ = 1 4 ∥ x k − x ∗ ∥ ⋮ \begin{cases} \begin{aligned} \|x_{k+1} -x^*\| & = \frac{1}{2} \|x_k - x^*\| \\ \|x_{k+2} - x^*\| & = \frac{1}{2} \|x_{k+1} - x^*\| = \frac{1}{4}\|x_k - x^*\| \\ \vdots \\ \end{aligned} \end{cases} xk+1xxk+2x=21xkx=21xk+1x=41xkx
可以明显观察到其呈线性的收敛效果。

高阶收敛范围

如果存在 p ≥ 1 p \geq 1 p1,有:
lim ⁡ k ⇒ ∞ ∥ x k + 1 − x ∗ ∥ ∥ x k − x ∗ ∥ p = β < + ∞ \mathop{\lim}\limits_{k \Rightarrow \infty} \frac{\|x_{k+1} - x^*\|}{\|x_k - x^*\|^p} = \beta < +\infty klimxkxpxk+1x=β<+
则称 { x k } \{x_k\} {xk} p p p阶收敛

  • 牛顿法在适当条件下被证明是二阶收敛
  • 可以想象,当 p > 1 p>1 p>1时,相比于线性收敛范围,高阶收敛必然是更高级别的收敛速度。从而有如下表达
    p > 1 p > 1 p>1时, p p p阶收敛必然为超线性收敛,但反之不一定成立。

验证:当 p > 1 p > 1 p>1时,可以将上式拆解为如下形式:
lim ⁡ k ⇒ ∞ ∥ x k + 1 − x ∗ ∥ ∥ x k − x ∗ ∥ p = lim ⁡ k ⇒ ∞ ( ∥ x k + 1 − x ∗ ∥ ∥ x k − x ∗ ∥ ⋅ 1 ∥ x k − x ∗ ∥ p − 1 ) \mathop{\lim}\limits_{k \Rightarrow \infty} \frac{\|x_{k+1} - x^*\|}{\|x_k - x^*\|^p} = \mathop{\lim}\limits_{k \Rightarrow \infty} \left(\frac{\|x_{k+1} - x^*\|}{\|x_k - x^*\|} \cdot \frac{1}{\|x_k - x^*\|^{p-1}}\right) klimxkxpxk+1x=klim(xkxxk+1xxkxp11)

  • 其中第一项描述的是线性收敛范围;观察第二项: lim ⁡ k ⇒ ∞ 1 ∥ x k − x ∗ ∥ p − 1 \begin{aligned}\lim_{k \Rightarrow \infty} \frac{1}{\|x_k - x^*\|^{p-1}}\end{aligned} klimxkxp11 p > 1 p>1 p>1条件下,其结果是 + ∞ +\infty +
  • 如果需要 lim ⁡ k ⇒ ∞ ∥ x k + 1 − x ∗ ∥ ∥ x k − x ∗ ∥ ⋅ ∞ = β < ∞ \begin{aligned}\mathop{\lim}\limits_{k \Rightarrow \infty} \frac{\|x_{k+1} - x^*\|}{\|x_k - x^*\|} \cdot \infty = \beta < \infty\end{aligned} klimxkxxk+1x=β<,必然需要 lim ⁡ k ⇒ ∞ ∥ x k + 1 − x ∗ ∥ ∥ x k − x ∗ ∥ = 0 \begin{aligned}\mathop{\lim}\limits_{k \Rightarrow \infty} \frac{\|x_{k+1} - x^*\|}{\|x_k - x^*\|} = 0\end{aligned} klimxkxxk+1x=0,即超线性收敛

二次终止性

关于判断一个算法的优劣性,除去收敛速度这个评价标准外,优化问题本身也可以作为算法优劣性的评价标准。算法针对某类简单问题

  • 可能无法在有限迭代步骤内实现收敛;
  • 可能会在有限迭代步骤内实现收敛,但计算代价过大

这样的算法本身存在问题。相反,如何衡量简单问题的基准 ? ? ?通常将目标函数为凸二次函数作为基准:
矩阵 Q \mathcal Q Q至少是半正定矩阵
f ( x ) = 1 2 x T Q x + C T x Q ≽ 0 f(x) = \frac{1}{2}x^T \mathcal Qx + \mathcal C^T x \quad \mathcal Q \succcurlyeq 0 f(x)=21xTQx+CTxQ0
如果针对上述问题在有限迭代步骤内接近最优解,我们称该算法具有二次终止性

朴素算法:坐标轴交替下降法

基本思想表示为:给定初始点 x 0 ∈ R n x_0 \in \mathbb R^n x0Rn,依次沿坐标轴 e 1 , e 2 , ⋯ , e n e_1,e_2,\cdots,e_n e1,e2,,en进行搜素

  • 关于坐标轴交替下降法,它并不想在迭代步骤中花费代价计算下降方向,而是直接选择坐标轴方向作为下降方向。
  • 这与吉布斯采样方法的思想——坐标上升法如出一辙。

对应算法框架表示如下:

  • 给定初始点 x 0 ; k = 0 ; x_0;k=0; x0;k=0;
  • 依然判断 ∥ ∇ f ( x k ) ∥ ≤ ϵ \|\nabla f(x_k)\| \leq \epsilon ∥∇f(xk)ϵ:如果满足,终止;
  • y 0 = x k y_0 = x_k y0=xk,令:
    { y i = y i − 1 + α i ⋅ e i α i = arg ⁡ min ⁡ f ( y i − 1 + α ⋅ e i ) i = 1 , 2 , ⋯ , n \begin{cases} y_i = y_{i-1} + \alpha_i \cdot e_i \\ \alpha_i = \mathop{\arg\min} f(y_{i-1} + \alpha \cdot e_i) \quad i=1,2,\cdots,n \end{cases} {yi=yi1+αieiαi=argminf(yi1+αei)i=1,2,,n
    解释:实际上该步骤是一个 n n n次循环。这里的 y i ( i = 1 , 2 , ⋯ , n ) y_i(i=1,2,\cdots,n) yi(i=1,2,,n)分别表示特征空间中的具体点。这里以二维特征 x k ∈ R 2 ⇒ ( e 1 , e 2 ) x_k \in \mathbb R^2 \Rightarrow (e_1,e_2) xkR2(e1,e2)为例,使用图像描述该过程:
    • 初始状态下, y 0 = x k : ( x 1 ( k ) , x 2 ( k ) ) y_0 = x_k:(x_1^{(k)},x_2^{(k)}) y0=xk:(x1(k),x2(k))
    • 除去 e 1 e_1 e1外,其他维度固定的条件下,此时固定优化方向 e 1 e_1 e1,在该方向上的最优步长 α 1 \alpha_1 α1可表示为关于步长变量 α \alpha α函数 ϕ ( α ) \phi(\alpha) ϕ(α)的最优解
      α 1 = arg ⁡ min ⁡ α ϕ ( α ) = arg ⁡ min ⁡ α f ( y 0 + α ⋅ e 1 ) \alpha_1 = \mathop{\arg\min}\limits_{\alpha} \phi(\alpha) = \mathop{\arg\min}\limits_{\alpha} f(y_0 + \alpha \cdot e_1) α1=αargminϕ(α)=αargminf(y0+αe1)
    • 找到 α 1 \alpha_1 α1后,通过 y 1 = y 0 + α 1 ⋅ e 1 y_1 = y_0 + \alpha_1 \cdot e_1 y1=y0+α1e1可以得到第一次循环结束后更新的位置
    • 同上,继续循环,寻找除去 e 2 e_2 e2外,其他维度固定的条件下,求出 e 2 e_2 e2方向上的最优步长 α 2 \alpha_2 α2,以此类推。直到 n n n个维度全部被遍历一次为止,得到 y n = x k + 1 y_n= x_{k+1} yn=xk+1。对应图像表示如下:
      当然这里 n = 2 n=2 n=2
      坐标轴交替下降法迭代过程描述
  • 在得到 x k + 1 = y n x_{k+1} = y_n xk+1=yn后, k = k + 1 k = k+1 k=k+1,并步骤 2 2 2,直到满足条件为止。

该算法的优势在于:

  • 不需要花费额外代价计算下降方向;
  • 步骤 3 3 3的循环中, e i ∈ R ( i = 1 , 2 , ⋯ , n ) e_i \in \mathbb R(i=1,2,\cdots,n) eiR(i=1,2,,n),因而计算上相对简单。
  • 目标函数 f ( x ) f(x) f(x)中的决策变量 x ∈ R n x \in \mathbb R^n xRn,其各分量 x i ( i = 1 , 2 , ⋯ , n ) x_i(i=1,2,\cdots,n) xi(i=1,2,,n)之间的交叉程度很小时,该算法框架会非常有效
    什么是交叉程度很小——可理解为各分量之间的关联关系较小,甚至是线性无关。例如各分量满足可分离函数各分量各算各的~
    min ⁡ f ( x ) = min ⁡ [ f 1 ( x 1 ) + f 2 ( x 2 ) + ⋯ + f n ( x n ) ] = ∑ i = 1 n min ⁡ f 1 ( x 1 ) \begin{aligned} \min f(x) & = \min [f_1(x_1) + f_2(x_2)+\cdots + f_n(x_n)] \\ & = \sum_{i=1}^n \min f_1(x_1) \end{aligned} minf(x)=min[f1(x1)+f2(x2)++fn(xn)]=i=1nminf1(x1)

相反,该算法的劣势在于:对于一般问题,该算法得到的数值解序列 { x k } k = 0 ∞ \{x_k\}_{k=0}^{\infty} {xk}k=0不一定收敛
如果决策变量内各分量之间的关联性程度较高,其产生的结果并不容易收敛,吉布斯采样同样存在这种缺陷。

一种改进方法描述:线搜索方法坐标轴交替下降法交替使用从而使数值解序列收敛。具体改进步骤如下:
前面步骤并没有发生变化,在通过坐标轴交替下降法找到 x ˉ k \bar{x}_k xˉk后,能够确定: f ( x ˉ k ) ≤ f ( x k ) f(\bar{x}_k) \leq f(x_k) f(xˉk)f(xk),也就是说: x k ⇒ x ˉ k x_k \Rightarrow \bar{x}_k xkxˉk的方向 D k \mathcal D_k Dk一定是下降方向

  • 给定初始点 x 0 ; k = 0 ; x_0;k=0; x0;k=0;

  • 依然判断 ∥ ∇ f ( x k ) ∥ ≤ ϵ \|\nabla f(x_k)\| \leq \epsilon ∥∇f(xk)ϵ:如果满足,终止;

  • y 0 = x k y_0 = x_k y0=xk,令:
    { y i = y i − 1 + α i ⋅ e i α i = arg ⁡ min ⁡ f ( y i − 1 + α ⋅ e i ) i = 1 , 2 , ⋯ , n \begin{cases} y_i = y_{i-1} + \alpha_i \cdot e_i \\ \alpha_i = \mathop{\arg\min} f(y_{i-1} + \alpha \cdot e_i) \quad i=1,2,\cdots,n \end{cases} {yi=yi1+αieiαi=argminf(yi1+αei)i=1,2,,n
    从而得到 x ˉ k \bar{x}_{k} xˉk

  • x ˉ k \bar{x}_k xˉk起始点 D k : x k ⇒ x ˉ k \mathcal D_k:x_k \Rightarrow \bar{x}_k Dk:xkxˉk下降方向使用线搜索方法选择合适步长,从而得到新的更新结果 x k + 1 x_{k+1} xk+1
    依然是基于 2 2 2维特征,对应示例图像表示如下。
    改进方法示例

  • 得到 x k + 1 x_{k+1} xk+1后, k = k + 1 k=k+1 k=k+1,并返回步骤 2 2 2

最速下降法(梯度下降法)

基本思想表示为:在迭代过程中,选择 x k x_k xk处的负梯度方向作为搜索方向。即: D k = − ∇ f ( x k ) \mathcal D_k = - \nabla f(x_k) Dk=f(xk)
而负梯度方向也被称作最速下降方向

  • 泰勒展开式的角度观察,根据线搜索方法(方向角度)的下降方向的推导过程可知:若判断 x k x_k xk处的某方向 D \mathcal D D是否为下降方向,只需判断:
    [ ∇ f ( x k ) ] T D < 0 [\nabla f(x_k)]^T \mathcal D < 0 [f(xk)]TD<0
    那么方向 D \mathcal D D就是 x k x_k xk位置的下降方向。当 D = − ∇ f ( x k ) \mathcal D = -\nabla f(x_k) D=f(xk)时,能够使 [ ∇ f ( x k ) ] T D [\nabla f(x_k)]^T \mathcal D [f(xk)]TD达到最小值
    这里仅关注向量 ∇ f ( x k ) , D \nabla f(x_k),\mathcal D f(xk),D的方向信息,因而设 ∥ ∇ f ( x k ) ∥ = ∥ D ∥ = 1 \|\nabla f(x_k)\| = \|\mathcal D\| = 1 ∥∇f(xk)=D=1
    [ ∇ f ( x k ) ] T D = ∥ ∇ f ( x k ) ∥ ⋅ ∥ D ∥ cos ⁡ θ [\nabla f(x_k)]^T \mathcal D = \|\nabla f(x_k)\| \cdot \|\mathcal D\| \cos \theta [f(xk)]TD=∥∇f(xk)Dcosθ
    其中 θ \theta θ表示向量 ∇ f ( x k ) , D \nabla f(x_k),\mathcal D f(xk),D(不分先后)之间的夹角。当 D , ∇ f ( x k ) \mathcal D,\nabla f(x_k) D,f(xk)之间夹角为 π 2 \begin{aligned}\frac{\pi}{2}\end{aligned} 2π时,能够取到 cos ⁡ θ \cos \theta cosθ最小值 − 1 -1 1
  • 如果从方向导数的角度观察: [ ∇ f ( x k ) ] T D [\nabla f(x_k)]^T \mathcal D [f(xk)]TD,它可以看作: x k x_k xk所在位置处关于 D \mathcal D D的方向导数。在凸函数铺垫:梯度与方向导数中介绍过,对应方向导数可表示为:
    这里示例 x k x_k xk是二维特征,坐标为 ( x , y ) (x,y) (x,y)
    ∂ Z ∂ D ∣ ( x , y ) = f x ( x k ) ⋅ cos ⁡ α + f y ( x k ) ⋅ cos ⁡ β = [ f x ( x k ) , f y ( x k ) ] ⏟ [ ∇ f ( x k ) ] T ( cos ⁡ α cos ⁡ β ) = [ ∇ f ( x k ) ] T D \begin{aligned} \frac{\partial \mathcal Z}{\partial \mathcal D}\mid_{(x,y)} & = f_x(x_k) \cdot \cos \alpha + f_y(x_k) \cdot \cos \beta \\ & = \underbrace{[f_x(x_k),f_y(x_k)]}_{[\nabla f(x_k)]^T} \begin{pmatrix} \cos \alpha \\ \cos \beta \end{pmatrix} \\ & = [\nabla f(x_k)]^T \mathcal D \end{aligned} DZ(x,y)=fx(xk)cosα+fy(xk)cosβ=[f(xk)]T [fx(xk),fy(xk)](cosαcosβ)=[f(xk)]TD
    关于方向导数的性质
    这意味着: [ ∇ f ( x k ) ] T D [\nabla f(x_k)]^T \mathcal D [f(xk)]TD达到最小值,意味着函数值下降的越剧烈
    • [ ∇ f ( x k ) ] T D > 0 ⇒ [\nabla f(x_k)]^T \mathcal D > 0 \Rightarrow [f(xk)]TD>0 x k x_k xk位置沿着 D \mathcal D D方向的函数值上升;反之, [ ∇ f ( x k ) ] T D < 0 ⇒ [\nabla f(x_k)]^T \mathcal D < 0 \Rightarrow [f(xk)]TD<0 x k x_k xk位置沿着 D \mathcal D D方向的函数值下降
    • ∣ ∇ f ( x k ) T D ∣ |\nabla f(x_k)^T \mathcal D| ∣∇f(xk)TD越大 ⇒ \Rightarrow 上升/下降的越猛烈;反之, ∣ ∇ f ( x k ) T D ∣ |\nabla f(x_k)^T \mathcal D| ∣∇f(xk)TD越小 ⇒ \Rightarrow 上升/下降的越平缓

梯度下降法的特点

优点
梯度下降法能够收敛,并且其下降方向被指定为负梯度方向 − ∇ f ( x k ) -\nabla f(x_k) f(xk)

缺陷

  • 收敛速度,即便是在凸函数甚至是强凸函数最快也只能达到线性收敛
    相关证明见:梯度下降法在强凸函数上的收敛性证明以及梯度下降法在凸函数上的收敛性。

    归纳:

    • 梯度下降法仅使用负梯度方向作为搜索方向,换句话说:在考虑搜索方向的过程中,仅考虑了一阶梯度 ∇ f ( ⋅ ) \nabla f(\cdot) f()信息;实际上,二阶梯度信息 ( Hessian Matrix ) (\text{Hessian Matrix}) (Hessian Matrix)也可以用来判断搜索方向

    • 其次,假设在最速下降法的过程中,由于方向 D k \mathcal D_k Dk已被确定,那么最优步长 α k \alpha_k αk是关于 ϕ ( α ) = f ( x k + α ⋅ D k ) \phi(\alpha) = f(x_k + \alpha \cdot \mathcal D_k) ϕ(α)=f(xk+αDk)精确最小点
      α k = arg ⁡ min ⁡ α ϕ ( α ) = arg ⁡ min ⁡ α f ( x k + α ⋅ D k ) \alpha_k = \mathop{\arg\min}\limits_{\alpha} \phi(\alpha) =\mathop{\arg\min}\limits_{\alpha} f(x_k + \alpha \cdot \mathcal D_k) αk=αargminϕ(α)=αargminf(xk+αDk)
      ϕ ′ ( α ) ≜ 0 \phi'(\alpha) \triangleq 0 ϕ(α)0,必然有:
      ϕ ′ ( α k ) = [ ∇ f ( x k + α k ⋅ D k ) ] T D k = [ ∇ f ( x k + 1 ) ] T [ − ∇ f ( x k ) ] = 0 \phi'(\alpha_k) = [\nabla f(x_k + \alpha_k \cdot \mathcal D_k)]^T \mathcal D_k = [\nabla f(x_{k+1})]^T[-\nabla f(x_k)] = 0 ϕ(αk)=[f(xk+αkDk)]TDk=[f(xk+1)]T[f(xk)]=0
      这意味着:梯度向量 ∇ f ( x k + 1 ) \nabla f(x_{k+1}) f(xk+1)与梯度向量 ∇ f ( x k ) \nabla f(x_k) f(xk)垂直。
      而这个垂直于 Z \mathcal Z Z字形的缺陷是同一个缺陷:它仅能在迭代步骤中找到局部最优方向,而不是全局最优方向。也就是说:梯度下降法是一个贪心算法

  • ZigZag \text{ZigZag} ZigZag现象:在迭代过程中,其收敛路径呈 Z \mathcal Z Z字形
    见下方代码示例与图像。可以看出:其搜索路径呈线 Z \mathcal Z Z字形,并且每一次迭代的方向均不是全局最优

  • 不具备二次终止性,也就是说:关于凸二次函数的最优化问题,仅仅通过有限次迭代步骤,无法收敛至最优解

针对最速下降法缺陷代码示例

针对梯度下降法上述缺陷问题,以凸二次函数最优化问题 min ⁡ f ( x , y ) = 1 2 x 2 + 2 y 2 \begin{aligned}\min f(x,y) = \frac{1}{2} x^2 + 2 y^2\end{aligned} minf(x,y)=21x2+2y2为例,使用最速下降法近似求解最优解。对应代码表示如下:

import numpy as np
import math
import matplotlib.pyplot as pltdef f(x,y):return 0.5 * (x ** 2) + 2 * (y ** 2)def ConTourFunction(x,Contour):return math.sqrt(0.5 * (Contour - (0.5 * (x ** 2))))def Derfx(x):return xdef Derfy(y):return 4 * ydef GradientDescent(stepTime=10,epsilon=0.1):Start = (2.0,1.0)LocList = list()LocList.append(Start)for _ in range(stepTime):DerStart = (Derfx(Start[0]),Derfy(Start[1]))for step in list(np.linspace(0.0,1.0,1000)):Next = (Start[0] - (DerStart[0] * step),Start[1] - (DerStart[1] * step))DerfNext = Derfx(Next[0]) * (-1 * DerStart[0]) + Derfy(Next[1]) * (-1 * DerStart[1])if abs(DerfNext) <= epsilon:LocList.append(Next)Start = Nextepsilon /= 5.0breakContourList = [0.1,0.2,0.5,1.0]LimitParameter = 0.0001plt.figure(figsize=(10,5))for Contour in ContourList:# 设置范围时,需要满足x的定义域描述。x = np.linspace(-1 * math.sqrt(2 * Contour) + LimitParameter,math.sqrt(2 * Contour) - LimitParameter,200)y1 = [ConTourFunction(i,Contour) for i in x]y2 = [-1 * j for j in y1]plt.plot(x,y1,'--',c="tab:blue")plt.plot(x,y2,'--',c="tab:blue")plotList = list()for (x,y) in LocList:plotList.append((x,y))plt.scatter(x,y,s=50,facecolor="none",edgecolors="tab:red",marker='o')if len(plotList) < 2:continueelse:plt.plot([plotList[0][0],plotList[1][0]],[plotList[0][1],plotList[1][1]],c="tab:red")plotList.pop(0)plt.plot([0,2],[0,1],'--',c="tab:green")plt.show()if __name__ == '__main__':GradientDescent()

对应图像结果表示如下:
梯度下降法示例
观察:其中绿色虚线表示全局最优方向;而红色线均与对应位置点所在等值线的切线相垂直;并且相邻路径间也垂直( Z \mathcal Z Z字形)。相比于全局最有方向,该方法过程中走了不少弯路~
而这里的弯路是指单次迭代步骤的最优方向

该函数是一个凸二次函数,由于函数简单,因而代码中通过采样的方式来找出每次迭代步骤的近似最优解。但如果使用 Wolfe \text{Wolfe} Wolfe准则方式寻找迭代优质解,可能不会找的那么精确。随着迭代步骤的增加,最速下降法后期在最优解附近振动,而不容易收敛至最优解。

Reference \text{Reference} Reference
最优化理论与方法-第六讲-无约束优化问题(二)

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

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

相关文章

不关闭Tamper Protection(篡改保护)下强制卸载Windows Defender和安全中心所有组件

个人博客: xzajyjs.cn 背景介绍 由于微软不再更新arm版本的win10系统&#xff0c;因此只能通过安装insider preview的镜像来使用。而能找到的win10 on arm最新版镜像在安装之后由于内核版本过期&#xff0c;无法打开Windows安全中心面板了&#xff0c;提示如下&#xff1a; 尝…

mysql技术文档--之与redo log(重做日志)庖丁解析-超级探索!!!

阿丹&#xff1a; 在刚开始写本文章的是还不太清楚要如何去细啃下这两个体系&#xff0c;在查阅资料的过程中。发现大厂阿里的庖丁解InnoDB系列&#xff0c;详细了的写了很多底层知识&#xff0c;于是基于这个这两个文章才有了阿丹的这篇文章。 整体认知&#xff1a; 在 MySQ…

分享一个python基于数据可视化的智慧社区服务平台源码

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1…

AI项目六:WEB端部署YOLOv5

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 最近接触网页大屏&#xff0c;所以就想把YOLOV5部署到WEB端&#xff0c;通过了解&#xff0c;知道了两个方法&#xff1a; 1、基于Flask部署YOLOv5目标检测模型。 2、基于Streamlit部署YOLOv5目标检测。 代码在…

GPT 内部 — I : 了解文本生成

年轻的陀思妥耶夫斯基被介绍给生成AI&#xff0c;通过Midjourney创建 一、说明 我经常与不同领域的同事互动&#xff0c;我喜欢向几乎没有数据科学背景的人传达机器学习概念的挑战。在这里&#xff0c;我试图用简单的术语解释 GPT 是如何连接的&#xff0c;只是这次是书面形式。…

Windows安装Neo4j

图数据库概述 图数据库是基于图论实现的一种NoSQL数据库&#xff0c;其数据存储结构和数据查询方式都是以图论&#xff08;它以图为研究对象图论中的图是由若干给定的点及连接两点的线所构成的图形&#xff09;为基础的&#xff0c; 图数据库主要用于存储更多的连接数据。 Neo…

Java集合(Collection、Iterator、Map、Collections)概述——Java第十三讲

前言 本讲我们将继续来讲解Java的其他重要知识点——Java集合。Java集合框架是Java编程语言中一个重要的部分,它提供了一套预定义的类和接口,供程序员使用数据结构来存储和操作一组对象。Java集合框架主要包括两种类型:一种是集合(Collection),存储一个元素列表,…

C++【C++学习笔记_Wang】

时间进度C是什么&#xff1f;多态什么是多态&#xff1f;生活中的多态C中的多态 赋值兼容赋值兼容规则实现安全转换 时间进度 Day101 ok Day804 ok Day805 ok C是什么&#xff1f; C大部分包含C语言。 C完全兼容C语言。 C在C语言的基础上添加&#xff1a;封装、继承、多态…

Could not find artifact com.mysql:mysql-connector-j:pom:unknown

在 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope> </dependency> 添加版本号 这里用的是8.0.33版本&#xff0c;输入5.0的版本依然会报错 我自身用的是5.0…

kubernetes(K8S)笔记

文章目录 大佬博客简介K8SDocker VS DockerDockerK8S简介K8S配合docker相比较单纯使用docker 大佬博客 Kubernetes&#xff08;通常缩写为K8s&#xff09;是一个用于自动化容器化应用程序部署、管理和扩展的开源容器编排平台。它的构造非常复杂&#xff0c;由多个核心组件和附加…

领域驱动设计:事件风暴构建领域模型

文章目录 事件风暴需要准备些什么&#xff1f;如何用事件风暴构建领域模型&#xff1f; 事件风暴是一项团队活动&#xff0c;领域专家与项目团队通过头脑风暴的形式&#xff0c;罗列出领域中所有的领域事件&#xff0c;整合之后形成最终的领域事件集合&#xff0c;然后对每一个…

【PowerQuery】Excel 一分钟以内刷新PowerQuery数据

当需要进行刷新的周期如果小于一分钟,采用数据自动刷新就无法实现自动刷新的目标。那就没有办法了吗?当然不是,这里就是使用VBA来实现自动刷新。这里实现VBA刷新的第一步就是将当前的Excel 保存为带有宏的Excel 文件,如果不带宏则无法运行带有宏代码的Excel文件,保存过程如…

数据结构与算法(一)数组的相关概念和底层java实现

一、前言 从今天开始&#xff0c;笔者也开始从0学习数据结构和算法&#xff0c;但是因为这次学习比较捉急&#xff0c;所以记录的内容并不会过于详细&#xff0c;会从基础和底层代码实现以及力扣相关题目去写相关的文章&#xff0c;对于详细的概念并不会过多讲解 二、数组基础…

分析udev自动创建设备结点的过程

当系统内核发现系统中添加了某个新的设备时&#xff0c;在内核空间中会对该驱动进行注册&#xff0c;并获取该驱动设备的信息&#xff0c;然后创建一个设备类&#xff08;向上提交目录信息&#xff09;&#xff0c;并申请struct class对象并且初始化&#xff0c;然后创建一个设…

SpringCloud:Feign实现微服务之间相互请求

文章目录 &#x1f389;欢迎来到Java学习路线专栏~SpringCloud&#xff1a;Feign实现微服务之间相互请求 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;Java学习路线&#x1f4dc;其他专栏&#xf…

2023大数据面试总结

文章目录 Flink&#xff08;SQL相关后面专题补充&#xff09;1. 把状态后端从FileSystem改为RocksDB后&#xff0c;Flink任务状态存储会发生哪些变化&#xff1f;2. Flink SQL API State TTL 的过期机制是 onCreateAndUpdate 还是 onReadAndWrite&#xff1f;3. watermark 到底…

使用IntelliJ IDEA本地启动调试Flink流计算工程的2个异常解决

记录&#xff1a;471 场景&#xff1a;使用IntelliJ IDEA本地启动调试Flink流计算时&#xff0c;报错一&#xff1a;加载DataStream报错java.lang.ClassNotFoundException。报错二&#xff1a;No ExecutorFactory found to execute the application。 版本&#xff1a;JDK 1.…

【Java基础篇 | 类和对象】--- 聊聊什么是内部类

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言 当一个事物的内部&…

Shell编程之定时任务

什么是定时任务 顾名思义&#xff0c;定时任务指的就是在指定/特定的时间进行工作&#xff0c;例如备份/归档数据、清理临时文件等。 在 Linux 中&#xff0c;可以使用 cron 定时器来定期执行任务。cron 是一个在后台运行的守护进程&#xff0c;用于根据指定的时间表自动执行任…

学习笔记|小数点控制原理|数码管动态显示|段码跟位码|STC32G单片机视频开发教程(冲哥)|第十集:数码管动态显示

文章目录 1.数码管动态刷新的原理2.动态刷新原理3.8位数码管同时点亮新建一个数组选择每个位需要显示的内容实战小练&#xff1a;简易10秒免单计数器将刷新动作写成函数 课后练习: 1.数码管动态刷新的原理 上述图片引用自&#xff1a;51单片机初学2-数码管动态扫描 用一排端口来…