最优化 - 线搜索

Line Search Methods 线搜索方法

  • Problem Description 问题描述
  • Optimality Conditions 最优化条件
  • Line Search Methods 线搜索方法
  • Trust Region Methods 信赖域方法
  • Direct Search Methods 直接搜索法
  • Nonlinear Least Squares(NLS) 非线性最小二乘法 – LMA


常见的优化算法存在一些问题包括 do not have global information; 线搜索算法在每个迭代步 k k k 选择一个合适的搜索 方向 p ‾ ( k ) \underline p^{(k)} p(k) ,以及从当前迭代沿这个方向的新的搜索点 θ ‾ ( k + 1 ) \underline \theta^{(k+1)} θ(k+1)

Result: 原多维极小化问题在每一次迭代中将其化为步长 α ( k ) \alpha^{(k)} α(k)一维极小化问题
θ ‾ ( k + 1 ) = θ ‾ ( k ) + α ( k ) p ‾ ( k ) \underline \theta^{(k+1)} = \underline \theta^{(k)} +\alpha^{(k)}\underline p^{(k)} θ(k+1)=θ(k)+α(k)p(k)

J ( θ ‾ ( k + 1 ) ) = min ⁡ α ( k ) ∈ R + { J ( θ ‾ ( k ) + α ( k ) p ‾ ( k ) ) } R + : p o s . , r e a l J(\underline \theta^{(k+1)}) = \min_{\alpha^{(k)}\in\R^+}\left\{J\left(\underline \theta^{(k)} +\alpha^{(k)}\underline p^{(k)}\right)\right\}\quad \R^+:\rm pos.,real J(θ(k+1))=α(k)R+min{J(θ(k)+α(k)p(k))}R+:pos.,real

线搜索基本算法框架

在本课程中这个过程描述为:

image-20200805220109845

: 通过某种搜索方式确定步长因子 α k \alpha_k αk, 使得目标函数值变小

算法 1 (无约束问题的一般算法框架)

  1. 给定初始化参数/初始迭代点 θ ‾ ( 0 ) \underline\theta^{(0)} θ(0) , 置 k : = 0 k:=0 k:=0

  2. 通过求解 θ ‾ ( k ) \underline\theta^{(k)} θ(k) 处的某个子问题确定下降/搜索方向(search direction) p ‾ ( k ) \underline p^{(k)} p(k)

  3. 通过某种 搜索方式 线搜索方法(one dimensional search) 确定 步长因子 α ( k ) \alpha^{(k)} α(k) , 使得满足线搜索算法:

  4. 更新迭代点,令
    θ ‾ ( k + 1 ) = θ ‾ ( k ) + α ( k ) p ‾ ( k ) \underline \theta^{(k+1)} = \underline \theta^{(k)} +\alpha^{(k)}\underline p^{(k)}\\ θ(k+1)=θ(k)+α(k)p(k)

  5. 检查,若点 θ ‾ ( k ) \underline\theta^{(k)} θ(k) 满足某种终止准则,停止迭代,以 θ ‾ ( k ) \underline\theta^{(k)} θ(k) 作为极小值点;否则:
    k = k + 1 k = k+1 k=k+1
    然后转第1步.

1. 最速下降法 Steepest Descent Method

在第 2 章关于无约束优化问题下降类算法的一般框架时提及, 用不同的方式 确定搜索方向或搜索步长, 就会得到不同的算法. 最速下降法是用负梯度方向。这里我们介绍SDM.

求线搜索方向
  • 如何选择搜索方向 p ‾ ( k ) \underline p^{(k)} p(k)

  • intuitively: 选择下坡最陡的方向 p ‾ S D ( k ) \underline p^{(k)}_{SD} pSD(k)负梯度方向作为搜索方向的 (因此也称为梯度法)

  • 我们可以使用梯度计算搜索方向向量:
    p ‾ S D ( k ) = − ∇ J ( θ ‾ ) \underline p^{(k)}_{SD} = -\nabla J(\underline\theta) pSD(k)=J(θ)

    p ‾ S D ( k ) = − [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] \underline p^{(k)}_{SD} = -\left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right] pSD(k)=dθdJ(θ)θ(k)

  • 设目标函数 J ( θ ‾ ) J(\underline \theta) J(θ) θ ‾ ( k ) \underline\theta^{(k)} θ(k) 附近连续可微, p ‾ ( k ) \underline p^{(k)} p(k) 为搜索方向向量, 由泰勒级数在点 θ ‾ ( k ) \underline\theta^{(k)} θ(k) 一阶展开式得:
    J ( θ ‾ ( k ) + α ( k ) p ‾ ( k ) ) = J ( θ ‾ ( k ) ) + [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T α ( k ) p ‾ ( k ) + ⋯ J(\underline\theta^{(k)}+\alpha^{(k)}\underline p^{(k)}) = J(\underline\theta^{(k)}) +\left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\alpha^{(k)}\underline p^{(k)}+\cdots J(θ(k)+α(k)p(k))=J(θ(k))+dθdJ(θ)θ(k)Tα(k)p(k)+

    image-20200805224137079

  • 那么从这个角度,目标函数在 θ ‾ ( k ) \underline\theta^{(k)} θ(k) 处的下降的变化率为:
    lim ⁡ α → 0 J ( θ ‾ ( k ) + α ( k ) p ‾ ( k ) ) − J ( θ ‾ ( k ) ) α = [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T α ( k ) p ‾ ( k ) + ⋯ α = [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T p ‾ ( k ) + ⋯ \lim_{\alpha\rarr0}\frac{J(\underline\theta^{(k)}+\alpha^{(k)}\underline p^{(k)}) - J(\underline\theta^{(k)})}{\alpha} =\frac{\left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\alpha^{(k)}\underline p^{(k)}+\cdots}{\alpha}\\ =\left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\underline p^{(k)}+\cdots α0limαJ(θ(k)+α(k)p(k))J(θ(k))=αdθdJ(θ)θ(k)Tα(k)p(k)+=dθdJ(θ)θ(k)Tp(k)+

    其中 ¯𝜃𝑘 是 𝑔𝑘 与 𝑑𝑘 的夹角. 显然, 对于不同的方向 𝑑𝑘, 函数变化率取决于它与 𝑔𝑘 夹角的余弦值. 要使变化率最小, 只有 cos ¯𝜃𝑘 = −1, 即 ¯𝜃𝑘 = 𝜋 时才能达到, 亦即𝑑𝑘 应该取 (3.2) 中的负梯度方向, 这也是将负梯度方向叫作最速下降方向的由来.

⭕求线搜索步长的方法

image-20200805230722824

Line search 主要用于解决之前提到的步长的概念,即方向确定好之后,需要确定从当前点 $\underline \theta^{(k)} $ 沿着该方向走多远,以便走到下一个合适的点 θ ‾ ( k + 1 ) \underline \theta^{(k+1)} θ(k+1)。若用 p ‾ ( k ) \underline p^{(k)} p(k) 代表从第k个点走向第k+1点的方向, $\underline \theta^{(k)} $ 代表当前点, θ ‾ ( k + 1 ) \underline \theta^{(k+1)} θ(k+1) 代表下一个点, α ( k ) \alpha^{(k)} α(k) 代表步长,则存在如下的等式:
θ ‾ ( k + 1 ) = θ ‾ ( k ) + α ( k ) p ‾ ( k ) \underline \theta^{(k+1)} = \underline \theta^{(k)} +\alpha^{(k)}\underline p^{(k)} θ(k+1)=θ(k)+α(k)p(k)
这里简要介绍一下 p ‾ ( k ) \underline p^{(k)} p(k) ,大部分line search方法要求 p ‾ ( k ) \underline p^{(k)} p(k) 为下降方向,即从当前点沿着 p ‾ ( k ) \underline p^{(k)} p(k) 方向移动会导致函数值减少。由于目标是求取一个函数的最小值,因此最优的情况是求取沿 p ‾ ( k ) \underline p^{(k)} p(k) 方向满足 $J(\underline \theta^{(k+1)}) $ 为全局最小的步长 α ( k ) \alpha^{(k)} α(k)值,可用下式表示为:
min ⁡ α k { J ( θ ‾ ( k ) + α ( k ) p ‾ ( k ) ) } = min ⁡ α ( k ) { ϕ ( α ( k ) ) } \min_{\alpha^{k}}\{J(\underline\theta^{(k)}+\alpha^{(k)}\underline p^{(k)})\} = \min_{\alpha^{(k)}}\{\phi(\alpha^{(k)})\} αkmin{J(θ(k)+α(k)p(k))}=α(k)min{ϕ(α(k))}

  • 求出搜索方向 p ‾ \underline p p 后,尚未解决的问题是关于步长 α ( k ) \alpha^{(k)} α(k) 的一维最小搜索
  • 求步长 α ( k ) \alpha^{(k)} α(k)

Thus we can define a new one-dimensional objective function ϕ ( α ( k ) ) \phi(\alpha^{(k)}) ϕ(α(k)) for each iteration

方法1:直接法

求最小值我们的老朋友-> 求导为零
d ϕ ( α ( k ) ) d α ( k ) = ! 0 \frac{d\pmb{\phi(\alpha^{(k)})}}{d\alpha^{(k)}}\overset{!}=0 dα(k)dϕ(α(k))ϕ(α(k))ϕ(α(k))=!0

  • 尽管这是一个一维问题,但最小值往往不能精确计算出来。需要一个数值求解的程序。

设二次目标函数
J ( θ ‾ ) = g ‾ T θ ‾ + 1 2 θ ‾ T B ‾ θ ‾ + c J(\underline\theta) = \underline g^T\underline\theta + \frac12\underline\theta^T\underline B\underline\theta +c J(θ)=gTθ+21θTBθ+c

  • 设初始 θ ‾ ( 0 ) = 0 ‾ \underline\theta^{(0)} = \underline 0 θ(0)=0
    θ ‾ ( 1 ) = θ ‾ ( 0 ) + α ( 0 ) p ‾ = α p ‾ \underline\theta^{(1)} = \underline\theta^{(0)} + \alpha^{(0)}\underline p =\alpha \underline p θ(1)=θ(0)+α(0)p=αp

  • 目标函数为:
    J ( θ ‾ ) = g ‾ T θ ‾ + 1 2 θ ‾ T B ‾ θ ‾ + c = g ‾ T ( α p ‾ ) + 1 2 ( α p ‾ ) T B ‾ ( α p ‾ ) + c = g ‾ T ( α p ‾ ) + 1 2 α 2 p ‾ T B ‾ p ‾ + c J(\underline\theta ) =\underline g^T\underline\theta + \frac12\underline\theta^T\underline B\underline\theta +c\\ =\underline g^T (\alpha \underline p) + \frac12(\alpha \underline p)^T\underline B(\alpha \underline p) +c \\ =\underline g^T (\alpha \underline p) + \frac12\alpha^2 \underline p^T\underline B\underline p +c \\ J(θ)=gTθ+21θTBθ+c=gT(αp)+21(αp)TB(αp)+c=gT(αp)+21α2pTBp+c

  • 求导等于0
    d J d α = g ‾ T p ‾ + α p ‾ T B ‾ p ‾ = ! 0 \frac{dJ}{d\alpha}=\underline g^T\underline p + \alpha \underline p^T\underline B\underline p\overset{!}=0 dαdJ=gTp+αpTBp=!0

  • 得到最优解:
    α ∗ = − g ‾ T p ‾ p ‾ T B ‾ p ‾ \alpha^* = \frac{-\underline g^T\underline p}{\underline p^T\underline B\underline p} α=pTBpgTp


  • θ ‾ ( 1 ) = θ ‾ ( 0 ) + α ∗ p ‾ S D = − g ‾ T g ‾ g ‾ T B ‾ g ‾ g ‾ \underline\theta^{(1)} = \underline\theta^{(0)} +\alpha^*\underline p_{SD}\\ =\frac{-\underline g^T\underline g}{\underline g^T\underline B\underline g}\underline g θ(1)=θ(0)+αpSD=gTBggTgg

In practice, this is not solved exactly(neither analyrically nor numerically). Usually, we are only instrested in a suitable value of α ( k ) \alpha^{(k)} α(k) such thay there is a considerable decrease iof J J J along p ‾ ( k ) \underline p^{(k)} p(k) .

this is done e.g. by means of a Backtracking algorithm with the sufficient decrease condotion as a stopping criterion.

由于直接求取满足 ϕ ( α ( k ) ) \phi(\alpha^{(k)}) ϕ(α(k)) 为全局最小值的步长 α ( k ) \alpha^{(k)} α(k) 值涉及到大量 J ( θ ‾ ( k ) + α ( k ) p ‾ ( k ) ) J(\underline\theta^{(k)}+\alpha^{(k)}\underline p^{(k)}) J(θ(k)+α(k)p(k)) 的计算,若从求导角度计算最小值,还会涉及到▽f_k+1的计算,计算量较大。因此从计算量角度考虑,可以采用如下较为折中的策略。在大多数情况下,局部极小值的近似值 α ∗ ( k ) \alpha^{*(k)} α(k) of ϕ ( α ( k ) ) \phi(\alpha^{(k)}) ϕ(α(k)) is sufficient

方向确定好之后,每一步的line Search主要涉及两个问题:1)什么样的步长 α ( k ) \alpha^{(k)} α(k)值是合理的 2)如何选择步长 α ( k ) \alpha^{(k)} α(k)的长度。下面将沿这两个面展开讨论,首先讨论“什么样的步长 α ( k ) \alpha^{(k)} α(k)值是合理的”,确定了该问题之后,我们就可以在此基础上选择步长 α ( k ) \alpha^{(k)} α(k)值了。 – (利用 wolf条件)

方法二:近似法

Backtracking 是计算这种近似步长的最常用方法
image-20200806164152423
  1. 初始化:

    • 步长常数 α ‾ = 1 \overline\alpha = 1 α=1
    • 最小化步长范围 0 ≤ α ‾ min ⁡ < 1 0\le\overline\alpha_{\min}<1 0αmin<1
    • ς ∈ ] 0 , 1 [ \varsigma \in ]0,1[ ς]0,1[, 衰减因子
    • 初始化步长 α ‾ ( k ) = α ‾ \underline \alpha^{(k)} = \overline\alpha α(k)=α
  2. 计算(新)目标函数 ϕ ( α ( k ) ) \phi(\alpha^{(k)}) ϕ(α(k)) (由搜索方向,最速梯度下降)

  3. 判断: 1. 目标函数是否足够小 2. 步长是否小于设定的最小步,若满足条件则终止

  4. 否则,更新步长:
    α ( k ) : = ς ⋅ α ( k ) \alpha^{(k)} :=\varsigma\cdot\alpha^{(k)} α(k):=ςα(k)
    回到第一步

⭕Wolfe conditions

Armijo-Goldstein准则的核心思想有两个:①目标函数值应该有足够的下降;②一维搜索的步长α不应该太小。

这两个思想的意图非常明显。由于最优化问题的目的就是寻找极小值,因此,让目标函数函数值“下降”是我们努力的方向,所以①正是想要保证这一点。同理,②也类似:如果一维搜索的步长α太小了,那么我们的搜索类似于在原地打转,可能也是在浪费时间和精力。

Wolfe的贡献是,他证明对于一大类函数和 [公式] ,两个条件可以同时满足,也就是Wolfe步长必然存在。

无约束最优化问题 https://blog.csdn.net/nocml/article/details/8287466 https://www.52nlp.cn/unconstrained-optimization-one

为了不直接求解 α ‾ ( k ) \underline \alpha^{(k)} α(k)

所谓 Wolfe conditions 即 sufficient decrease condition 和 curvature condition 的综合,即 α ‾ ( k ) \underline \alpha^{(k)} α(k) 需要同时满足如下两个条件:

image-20200806232003362

如下将要讨论关于 α ‾ ( k ) \underline \alpha^{(k)} α(k) 需要满足的两个条件,当 α ‾ ( k ) \underline \alpha^{(k)} α(k) 满足这两个条件后,就可以认为从 θ ‾ ( k ) \underline \theta^{(k)} θ(k) 点移动到 θ ‾ ( k + 1 ) \underline \theta^{(k+1)} θ(k+1) 点的步长 α ‾ ( k ) \underline \alpha^{(k)} α(k) 已经确定下来了。

sufficient decrease condition

第一个条件为 sufficient decrease condition 该条件主要要用保证 每次的步长 α ‾ ( k ) \underline \alpha^{(k)} α(k) 都使得目标函数值充分的降低: 满足该条件后,才有全局收敛的可能性。

该条件可以用如下不等式描述:
J ( θ ‾ ( k ) + α ( k ) p ‾ ( k ) ) = ϕ ( α ( k ) ) ≤ J ( θ ‾ ( k ) ) + c 1 [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T α ( k ) p ‾ ( k ) ⏟ l ( α ( k ) ) J(\underline\theta^{(k)}+\alpha^{(k)}\underline p^{(k)})=\pmb{\phi(\alpha^{(k)})}\le \underbrace{J(\underline\theta^{(k)}) +c_1\left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\alpha^{(k)}\underline p^{(k)}}_{l(\alpha^{(k)})} J(θ(k)+α(k)p(k))=ϕ(α(k))ϕ(α(k))ϕ(α(k))l(α(k)) J(θ(k))+c1dθdJ(θ)θ(k)Tα(k)p(k)

下一点的函数值小于函数在此点的一阶泰勒展开值

. ϕ ( α ) \phi(\alpha) ϕ(α): one-dimensional funtion

image-20200824223257708

其中 c 1 c_1 c1 为常量,需满足 c 1 ∈ [ 0 , 1 ] c_1\in[0,1] c1[0,1],一般取 c 1 c_1 c1 为 1E-4,亦即f(x)的下降应该至少和α_k以及∇(f_k)^T*p_k成正比.

从图形角度看,函数位于第 k 点时,以上各参数中只有步长 α ‾ ( k ) \underline \alpha^{(k)} α(k)变量,其他均为常量,可以用以下不等式重新描述为:
ϕ ( α ( k ) ) ≤ l ( α ( k ) ) \pmb{\phi(\alpha^{(k)})}\le \pmb{l(\alpha^{(k)})} ϕ(α(k))ϕ(α(k))ϕ(α(k))l(α(k))l(α(k))l(α(k))
因此只要步长 α ‾ ( k ) \underline \alpha^{(k)} α(k) 的选择使得函数 ϕ ( α ( k ) ) \pmb{\phi(\alpha^{(k)})} ϕ(α(k))ϕ(α(k))ϕ(α(k)) 位于acceptable区间,就满足sufficient decrease condition。

特点:

  1. α = 0 \alpha = 0 α=0 时, ϕ ( 0 ) = l ( 0 ) \pmb{\phi(0)}= \pmb{l(0)} ϕ(0)ϕ(0)ϕ(0)=l(0)l(0)l(0)
  2. l ( α ) l(\alpha) l(α) 的系数不能为正,会导致 c>0
  3. c 1 c_1 c1 的取值范围是 [ 0 , 1 ] [0,1] [0,1] 不是 α \alpha α
curvature condition

单独只有充分下降条件是不够的, 因为如上图, 所有充分小的α都满足上述条件, 但是α太小会导致下降不充分, 为了排除这些小的α, 我们引入了第二个要求, 亦即曲率条件(curvature condition):

img
[ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) + α ( k ) p ‾ ( k ) ] T p ‾ ( k ) ≥ c 2 [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T p ‾ ( k ) , c 2 ∈ [ c 1 , 1 ] \left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}+\alpha^{(k)}\underline p^{(k)}} \right]^T\underline p^{(k)}\ge c_2\left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\underline p^{(k)} ,\quad c_2\in[c_1,1] dθdJ(θ)θ(k)+α(k)p(k)Tp(k)c2dθdJ(θ)θ(k)Tp(k),c2[c1,1]
上式的左边就是 ϕ ′ ( α ( k ) ) \phi'(\alpha^{(k)}) ϕ(α(k)) 右边则是 ϕ ′ ( 0 ) \phi'(0) ϕ(0) ,亦即上式要求 ϕ ′ ( α ( k ) ) \phi'(\alpha^{(k)}) ϕ(α(k)) 大于等于$ c_2$ 倍的 ϕ ′ ( 0 ) \phi'(0) ϕ(0) ,

这是因为如果 ϕ′(α) 是很小的负数, 则我们可以在这个方向上继续使得f(x)下降更多. 如下图所示

从图形 角度看,不等式 即要求函数在第 θ ‾ ( k + 1 ) \underline\theta^{(k+1)} θ(k+1) 点的变化速度率要低于 θ ‾ ( k ) \underline\theta^{(k)} θ(k) 点的变化速度,这一点可以从这两点处的梯度处看出,如下图所示。

image-20200806184937047 image-20200824224410683

d) c 2 c_2 c2 为常量,需满足 0 < c 1 < c 2 < 1 0<c_1<c_2<1 0<c1<c2<1,一般取 c 2 c_2 c2 为 0.9

image-20200824230102713

image-20200824230119763

⭕线搜索收敛性问题

  • 证明 steepest descent Method 是收敛的 convergent
  • 进行了一系列搜索步之后我们能得到至少一个局部最小值吗?

定义:全局收敛(Global convergence)和 局部收敛(local convergence)

image-20200818154924688

另外由必要条件(梯度为零)可以得到一个不那么严格的收敛定义:

image-20200818155108060

梯度的极限为零

p ‾ S D ( k ) \underline p_{SD}^{(k)} pSD(k) 是最速下降法的方向, α ( k ) \alpha^{(k)} α(k) 是满足 wolfe 条件的搜索步长, J J J is bounded below and J J J is cont.differentiable 再足够大的开集。

如果 J J J 的导数是 利普西茨连续的,则有:

image-20200818155626722

image-20200806233533032

收敛率

image-20200818155805944

2. 牛顿法 Newton method

无约束最优化四 https://www.52nlp.cn/unconstrained-optimization-four

在第上节中我们了解了步长的概念,以及从 θ ‾ ( k ) \underline\theta^{(k)} θ(k) 点的走到 θ ‾ ( k + 1 ) \underline\theta^{(k+1)} θ(k+1) 点使用 line search 方法计算 步长 的方法。本节分为 2 大部分,首先我们再次通过newton method引入方向的概念,在此基础上引入 quasi-newton method。然后引入 quasi-newton method中 的一种重要方法 BFGS method

最速梯度法求的搜索方向存在缺点

收敛的结果很有趣,但没有告诉我们需要计算多少次迭代,也没有说明收敛的速度。对于steepest descent methods来说,valleys是有问题的

image-20200807113929091

最速下降法用来确定了方向 p ‾ ( k ) \underline p^{(k)} p(k) 存在的的主要问题是: 如果目标函数中存在谷值,最速下降法就会失效;仅线性收敛性(缓慢收敛)(converge slowly)

现在为了改进:use a better direction than the steepest descent direction

引入牛顿法

我想我们还依稀记得,微积分中用于求一元函数根的Newton法。首先我们选择一个初始点x_0并计算获得其对应的f(x_0),然后该方法用曲线 y = f(x) 在 (x_0,f(x_0)) 的切线近似该曲线,把切线和x轴的交点记作 x_1,点x_1 比 x_0更接近所要求得根,同样方法用点 x_1 处的切线近似该曲线,并求取切线和x轴的交点x_2,一直迭代下去,直到找到满足我们所需的充分接近真实跟的解为止。该方法可用如下所示的图形来描述:

image-20200807143118209

因此Newton法由第k次近似值 x_k 求得第 k+1 次近似值 x_k+1 即为求 x_k 点处的切线和 x 轴的交点。切线方程为:
y – f ( x k ) = ∇ f ( x k ) ( x – x k ) y – f(x_k) = \nabla f (x_k)(x – x_k) yf(xk)=f(xk)(xxk)
y = 0 y = 0 y=0
= > 0 – f ( x k ) = ∇ f ( x k ) ( x – x k ) = > ▽ f ( x k ) ∗ x = ∇ f ( x k ) ∗ x k – f ( x k ) = > x = x k – f ( x k ) ∇ f ( x k ) => 0 – f(x_k) =\nabla f(x_k)(x – x_k)\\ => ▽f(x_k)*x = \nabla f(x_k)*x_k – f(x_k)\\ => x = x_k – \frac{f(x_k)}{\nabla f (x_k)} =>0f(xk)=f(xk)(xxk)=>f(xk)x=f(xk)xkf(xk)=>x=xkf(xk)f(xk)
因此
x k + 1 = x k – f ( x k ) ∇ f ( x k ) x_{k+1} = x_k – \frac{f(x_k)}{\nabla f (x_k)} xk+1=xkf(xk)f(xk)
从上面使用Newton Method求函数根的过程可以发现,首先需要选择一个初始点,并在点处构建一个模型来近似该函数。现在来考虑求取函数的最小值问题,方法类似。首先开始我们选择一个初始点 x_0,并构建函数在该点处的一个近似模型,上面求函数根时,我们构建的近似模型为切线模型。这里我们构建一个:

  • 切线模型(一次泰勒展开近似函数)
    m ( k ) ( p ‾ ) = J ( θ ‾ ( k ) ) + [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T p ‾ m^{(k)}(\underline p) =J(\underline\theta^{(k)}) + \left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\underline p m(k)(p)=J(θ(k))+dθdJ(θ)θ(k)Tp

  • 抛物线模型(二次泰勒展开近似函数)
    m ( k ) ( p ‾ ) = J ( θ ‾ ( k ) ) + [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T p ‾ + 1 2 p ‾ T [ d 2 J ( θ ‾ ) ( d θ ‾ ) 2 ∣ θ ‾ ( k ) ] T p ‾ m^{(k)}(\underline p) =J(\underline\theta^{(k)}) + \left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\underline p + \frac12\underline p^T \left[\frac{d^2J(\underline\theta)}{(d\underline\theta)^2}\Bigg|_{\underline\theta^{(k)}} \right]^T \underline p m(k)(p)=J(θ(k))+dθdJ(θ)θ(k)Tp+21pT(dθ)2d2J(θ)θ(k)Tp
    并求解该模型的梯度,同时令其为零,即:▽M_k(x+) = 0,在此基础上求得x+,该值即使得近似模型取得最小值的点。

我们可以利用函数曲率的信息(information of the curvature )来改进它。因此我们将目标函数进行二阶泰勒级数展开(处理非线性问题)( α ( k ) = 1 \alpha^{(k)} = 1 α(k)=1 )
J ( θ ‾ ( k ) + p ‾ ) = J ( θ ‾ ( k ) ) + [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T p ‾ + 1 2 p ‾ T [ d 2 J ( θ ‾ ) ( d θ ‾ ) 2 ∣ θ ‾ ( k ) ] T p ‾ + R = m ( k ) ( p ‾ ) + R J(\underline\theta^{(k)}+\underline p) = J(\underline\theta^{(k)}) + \left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\underline p + \frac12\underline p^T \left[\frac{d^2J(\underline\theta)}{(d\underline\theta)^2}\Bigg|_{\underline\theta^{(k)}} \right]^T \underline p +R=m^{(k)}(\underline p) +R J(θ(k)+p)=J(θ(k))+dθdJ(θ)θ(k)Tp+21pT(dθ)2d2J(θ)θ(k)Tp+R=m(k)(p)+R

  • R R R denotes the remainder of the tailor series

image-20200805224137079

在接近最小值 minimus θ ‾ ∗ \underline\theta^* θ 时,目标函数由一个二次函数近似:
m ( k ) ( p ‾ ) = J ( θ ‾ ( k ) ) + [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T p ‾ + 1 2 p ‾ T [ d 2 J ( θ ‾ ) ( d θ ‾ ) 2 ∣ θ ‾ ( k ) ] T p ‾ \pmb {m^{(k)}(\underline p)} =J(\underline\theta^{(k)}) + \left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\underline p + \frac12\underline p^T \left[\frac{d^2J(\underline\theta)}{(d\underline\theta)^2}\Bigg|_{\underline\theta^{(k)}} \right]^T \underline p m(k)(p)m(k)(p)m(k)(p)=J(θ(k))+dθdJ(θ)θ(k)Tp+21pT(dθ)2d2J(θ)θ(k)Tp

  • 并求解该模型的梯度,同时令其为零,在此基础上求得 θ ‾ ( k + 1 ) \underline \theta^{(k+1)} θ(k+1),该值即使得近似模型取得最小值的点。

  • 我们要求一个搜索方向使得函数为极小值 求函数导数令为零
    d m ( k ) ( p ‾ ) d p ‾ = [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T + [ d 2 J ( θ ‾ ) ( d θ ‾ ) 2 ∣ θ ‾ ( k ) ] T p ‾ = ! 0 ‾ (*) \frac{dm^{(k)}(\underline p)}{d\underline p} =\left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T + \left[\frac{d^2J(\underline\theta)}{(d\underline\theta)^2}\Bigg|_{\underline\theta^{(k)}} \right]^T \underline p\overset{!}=\underline 0 \tag{*} dpdm(k)(p)=dθdJ(θ)θ(k)T+(dθ)2d2J(θ)θ(k)Tp=!0(*)

  • 假设Hessian矩阵是正定的。我们得到了牛顿搜索方向 p ‾ N D ( k ) \underline p^{(k)}_{ND} pND(k) solving (*) w.r.t p ‾ \underline p p
    p ‾ N D ( k ) : = − [ d 2 J ( θ ‾ ) ( d θ ‾ ) 2 ∣ θ ‾ ( k ) ] − 1 [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] \underline p^{(k)}_{ND} := - \left[\frac{d^2J(\underline\theta)}{(d\underline\theta)^2}\Bigg|_{\underline\theta^{(k)}} \right]^{-1}\left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right] pND(k):=(dθ)2d2J(θ)θ(k)1dθdJ(θ)θ(k)
    image-20200807124742939

基于牛顿方向的线搜索算法
image-20200807124831340

从上式可见,使用Newton法时,每一步的方向为 p ‾ N D ( k ) \underline p^{(k)}_{ND} pND(k),而步长为1。从Newton法方向公式我们不难看出,若使用Newton法,则从每个最小值近似点 θ ‾ ( k ) \underline\theta^{(k)} θ(k) 点的走到 θ ‾ ( k + 1 ) \underline\theta^{(k+1)} θ(k+1) 的过程中将涉及函数 Hessian矩阵 (二阶导)计算,而该Hessian矩阵无法保证在每个点处都是正定的,

从上面的分析可见,Newton Method面临两个问题:

  1. Hessian矩阵计算量较大
  2. Hessian矩阵无法保证在迭代的过程中始终处于正定状态

为了解决这两个问题,我们将引入Quasi-Newton Method。

牛顿法得出的搜索方向错误的原因

若得出的牛顿搜索方向并不指向最小值点,原因是Hessian矩阵非正定

image-20200818164220539

这是:how to correct the Newton Direction

Modified Newton Direction: 将牛顿方向转最速的下降方向

image-20200818165314569

  • 选择 λ \lambda λ 的值使得矩阵 B ‾ ( 0 ) \underline B^{(0)} B(0) 为正定即可,
    • 例如取 λ = − min ⁡ ( λ i ) + ϵ \lambda=-\min(\lambda_i) + \epsilon λ=min(λi)+ϵ 比最小的特征值的相反数大 ϵ = 1 \epsilon =1 ϵ=1

image-20200818165621028

步长怎么计算呢

我们看到牛顿法在一次迭代后,无论起始点是什么,都能得到二次优化问题的最优解。如果到最小值的距离足够小,每个函数都可以局部用二次函数逼近,因此如果最小值足够接近起始点,牛顿法在一步后达到最小值。

牛顿法的收敛性及收敛率问题

顿法最大的特点就在于它的收敛速度很快。从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。

https://www.cnblogs.com/xinbaby829/p/7289431.html

缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。

修正牛顿法 modified Newton

牛顿法中我们求解牛顿搜索方向:

  • 一维搜索仍然是通过 backtracking 来完成的
  • 牛顿搜索方向 也是与 the unit step length α ( k ) = 1 \alpha^{(k)}=1 α(k)=1 组合
  • 这意味着,如果目标函数是二次函数或足够接近它的二次逼近函数,那么一步就能达到最小值。
  • 因此对于任何一维搜索算法,首先令 α ( k ) = 1 \alpha^{(k)}=1 α(k)=1 ,然后做一个回溯搜索( backtracking search)一个不错的选择
  • 目标函数二阶导数是必须的,逆也必须能计算
  • 此外,假设Hessian矩阵是正定的(positive definite Hessian)。根据泰勒定理,这在最小值附近确实成立。然而,如果我们离最小值很远,则不再适合。

image-20200807140444440

image-20200807140530907

Hessian矩阵必须是正定的才能保证所求的牛顿搜索方向时向下的。如果它是负定, p ‾ N D ( k ) \underline p^{(k)}_{ND} pND(k) 将表是一个上升的方向

Hessian矩阵不是正定的

如果黑森不是正定的,我们采用以下修改,我们设二次近似函数为:
M ‾ ( k ) = ( [ d J 2 ( θ ‾ ) ( d θ ‾ ) 2 ∣ θ ‾ ( k ) ] + E ‾ ( k ) ) \underline M^{(k)} = \left(\left[\frac{dJ^2(\underline\theta)}{(d\underline\theta)^2}\Bigg|_{\underline\theta^{(k)}}\right] + \underline E^{(k)}\right) M(k)=(dθ)2dJ2(θ)θ(k)+E(k)

  • 新的矩阵 E ‾ ( k ) \underline E^{(k)} E(k) 可以任意选择,只要能保证矩阵 M ‾ ( k ) \underline M^{(k)} M(k) 正定。如果 Hessian矩阵已经正定,则 E ‾ ( k ) \underline E^{(k)} E(k) 为 0

  • 常用的 E ‾ ( k ) \underline E^{(k)} E(k) 为使用足够大的 λ ( k ) > 0 \lambda^{(k)}>0 λ(k)>0
    E ‾ ( k ) = λ ( k ) I ‾ \underline E^{(k)} = \lambda^{(k)}\underline I E(k)=λ(k)I

  • 令人惊讶的是: 我们可以证明在某些有界条件下的二次收敛性

  • 修正后的牛顿方向是这样的: (将 M ‾ ( k ) \underline M^{(k)} M(k) 带入牛顿方向公式)
    p ‾ M N D ( k ) = − M ‾ − 1 [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] \underline p_{MND}^{(k)} = - \underline M^{-1} \left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right] pMND(k)=M1dθdJ(θ)θ(k)

  • This modified Newton algorithm works from any starting point!

    这种改进的牛顿算法可以从任何起点开始工作

即使我们利用修正牛顿法解决了Hessian矩阵的正定问题,一般来说我们仍然难以求得目标函数的二阶导数(do not have second order derivatives)

拟牛顿法 Quasi-Newton Method

前一章所介绍的牛顿法的优点是具有二阶收敛速度, 但当 Hesse 阵 𝐺(𝑥𝑘) = ∇2 𝑓(𝑥𝑘) 不正定时, 不能保证所产生的方向是目标函数在 𝑥𝑘 处的下降方向. 特别 地, 当 𝐺(𝑥𝑘) 奇异时, 算法就无法继续进行下去. 尽管修正牛顿法可以克服这一 缺陷, 但其中的修正参数 𝜇𝑘 的选取很难把握, 过大或过小都会影响到收敛速度. 此外, 牛顿法的每一迭代步都需要目标函数的二阶导数, 即 Hesee 阵, 对于大规模 问题其计算量是惊人的.

本章即将介绍的拟牛顿法克服了这些缺点, 它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。拟牛顿法和最速下降法一样只要求每一步迭代时知道目标函数的梯度。且收敛速度很快。

拟牛顿法:近似二阶导数,即近似曲率

image-20200807150629067

首先我们用一个新的函数近似目标函数:
J ( θ ‾ ( k ) + p ‾ ) ≈ J ( θ ‾ ( k ) ) + [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T p ‾ + 1 2 p ‾ T B ‾ ( k ) p ‾ ⏟ m ( k ) ( p ‾ ) J(\underline \theta^{(k)} + \underline p) \approx \underbrace{J(\underline\theta^{(k)}) +\left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\underline p + \frac12\underline p^T\underline B^{(k)}\underline p }_{m^{(k)}(\underline p)} J(θ(k)+p)m(k)(p) J(θ(k))+dθdJ(θ)θ(k)Tp+21pTB(k)p

  • 我们可以发现此函数与牛顿法的区别只在于 把真正的Hessian矩阵使用了任意的矩阵 B ‾ ( k ) \underline B^{(k)} B(k) 替换
    [ d J 2 ( θ ‾ ) ( d θ ‾ ) 2 ∣ θ ‾ ( k ) ] → B ‾ ( k ) \left[\frac{dJ^2(\underline\theta)}{(d\underline\theta)^2}\Bigg|_{\underline\theta^{(k)}}\right] \rarr\underline B^{(k)} (dθ)2dJ2(θ)θ(k)B(k)

则我们直接通过类比就可以得到拟牛顿法的搜索方向 指向极小值
p ‾ Q N D ( k ) = − [ B ‾ ( k ) ] − 1 [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] \underline p_{QND}^{(k)} = - [\underline B^{(k)}]^{-1} \left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right] pQND(k)=[B(k)]1dθdJ(θ)θ(k)

  • 矩阵 B ‾ ( k ) \underline B^{(k)} B(k) 是使用智能更新矩阵 U ‾ ( k ) \underline U^{(k)} U(k) 迭代计算的,它是目标函数曲率的近似值(即Hessian)
    B ‾ ( k + 1 ) = B ‾ ( k ) + U ‾ ( k ) \underline B^{(k+1)} = \underline B^{(k)} + \underline U^{(k)} B(k+1)=B(k)+U(k)
⭕构造矩阵 B ‾ ( k ) \underline B^{(k)} B(k)

新的目标函数的二次近似:
J ( θ ‾ ( k ) + p ‾ ) ≈ J ( θ ‾ ( k ) ) + [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T p ‾ + 1 2 p ‾ T B ‾ ( k ) p ‾ ⏟ m ( k ) ( p ‾ ) J(\underline \theta^{(k)} + \underline p) \approx \underbrace{J(\underline\theta^{(k)}) +\left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\underline p + \frac12\underline p^T\underline B^{(k)}\underline p }_{m^{(k)}(\underline p)} J(θ(k)+p)m(k)(p) J(θ(k))+dθdJ(θ)θ(k)Tp+21pTB(k)p
因此每一个选择作为Hessian矩阵的 近似 $\underline B^{(k+1)} $ 时,可以 模仿真实的Hessian矩阵的性质。得到下式:

我们尽可能利用上一步的信息来选取:
d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k + 1 ) − d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) = α ( k ) B ‾ ( k + 1 ) p ‾ ( k ) B ‾ ( k + 1 ) ( θ ‾ ( k + 1 ) − θ ‾ ( k ) ) = d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k + 1 ) − d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) B ‾ ( k + 1 ) ⋅ s ‾ ( k ) = y ‾ ( k ) \frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k+1)}} - \frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} =\alpha^{(k)}\underline B^{(k+1)} \underline p^{(k)}\\ \underline B^{(k+1)}(\underline\theta^{(k+1)}-\underline\theta^{(k)}) =\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k+1)}} - \frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}}\\ \underline B^{(k+1)}\cdot \underline s^{(k)} = \underline y^{(k)} dθdJ(θ)θ(k+1)dθdJ(θ)θ(k)=α(k)B(k+1)p(k)B(k+1)(θ(k+1)θ(k))=dθdJ(θ)θ(k+1)dθdJ(θ)θ(k)B(k+1)s(k)=y(k)
image-20200807152949119

这个被称作割线方程(secan equation)

  • 目的:确定一个正定且对称的矩阵 B ‾ ( k + 1 ) \underline B^{(k+1)} B(k+1) ,且维度为 l × l l\times l l×l
  • 对于任意维度为 l × l l\times l l×l 的矩阵有 l 2 l^2 l2 个自由度,不过由于对称条件, B ‾ ( k + 1 ) \underline B^{(k+1)} B(k+1) 自由度为 l ( l + 1 ) 2 \frac{l(l+1)}{2} 2l(l+1)
  • 可见,割线方程引入了对矩阵 B ‾ ( k + 1 ) \underline B^{(k+1)} B(k+1) 额外的 l l l - conditions
  • 因此有许多拟牛顿算法使用剩下的 l ( l − 1 ) 2 \frac{l(l-1)}{2} 2l(l1) 个自由度

使用这些自由度的一种可能性是Davidon Fletcher Powell(DFP)式。 它是通过施加以下条件得出的

  • B ‾ ( k + 1 ) \underline B^{(k+1)} B(k+1) 须满足割线方程

  • B ‾ ( k + 1 ) \underline B^{(k+1)} B(k+1) 须为对称矩阵,即 (从而使得算法所产生的方向是函数 𝑓 在 𝑥𝑘 处下降方向)
    B ‾ ( k + 1 ) = ( B ‾ ( k + 1 ) ) T \underline B^{(k+1)} = (\underline B^{(k+1)})^T B(k+1)=(B(k+1))T

  • B ‾ ( k + 1 ) \underline B^{(k+1)} B(k+1) 矩阵尽可能地接近 B ‾ ( k ) \underline B^{(k)} B(k) (以确保算法具有较快的收敛速度)
    min ⁡ B ‾ ( k + 1 ) ∣ ∣ B ‾ ( k + 1 ) − B ‾ ( k ) ∣ ∣ \min_{\underline B^{(k+1)}} ||\underline B^{(k+1)} - \underline B^{(k)}|| B(k+1)minB(k+1)B(k)

那么可以不加证明的计算出:

  1. 矩阵 B ‾ ( k + 1 ) \underline B^{(k+1)} B(k+1)

    image-20200807154312945

  2. the Broyden-Fletcher-Goldfarb-Shanno (BFGS) formula

    image-20200807154354558

有趣的事实(难以证明):

  • BFGS准牛顿方法收敛
  • 收敛的速度比一个最速下降方法的收敛速度要高

另外:存在避免计算 矩阵 B ‾ ( k + 1 ) \underline B^{(k+1)} B(k+1) 逆的算法

拟牛顿法算法
image-20200807154720048
补充

一:

image-20200807162558059 image-20200807162619135

Quasi-Newton Method每一步计算过程中仅涉及到函数值和函数梯度值计算,这样有效避免了Newton Method中涉及到的Hessian矩阵计算问题。于Newton Method不同的是Quasi-Newton Method在每点处构建一个如下的近似模型:
J ( θ ‾ ( k ) + p ‾ ) ≈ J ( θ ‾ ( k ) ) + [ d J ( θ ‾ ) d θ ‾ ∣ θ ‾ ( k ) ] T p ‾ + 1 2 p ‾ T B ‾ ( k ) p ‾ ⏟ m ( k ) ( p ‾ ) J(\underline \theta^{(k)} + \underline p) \approx \underbrace{J(\underline\theta^{(k)}) +\left[\frac{dJ(\underline\theta)}{d\underline\theta}\Bigg|_{\underline\theta^{(k)}} \right]^T\underline p + \frac12\underline p^T\underline B^{(k)}\underline p }_{m^{(k)}(\underline p)} J(θ(k)+p)m(k)(p) J(θ(k))+dθdJ(θ)θ(k)Tp+21pTB(k)p
从上面的近似模型我们可以看出,该模型用B_k代替了Newton Method中近似模型中涉及到的Hessian矩阵。这里有必要解释一下用于近似Hessian矩阵的B_k可行性,及一个指导性方案。根据Taylor(泰勒)级数可知如下公式:

image-20200807160052083

BFGS Method

从Quasi-Newton Method方向公式中,可以看到每一步计算方向的过程中均涉及到 B ‾ ( k + 1 ) \underline B^{(k+1)} B(k+1) 矩阵求逆的问题,为了避免该计算,通过分析割线公式可知,我们了构建一个近似H_k+1,该近似满足如下方程:
H k + 1 y k = s k H_{k+1} y_k = s_k Hk+1yk=sk
同时要求H_k+1为对称正定矩阵。因此BFGS Method中,每个点处的方向由如下公式计算:
p k = – H k ∗ ▽ f ( x k )       ( 29 ) p_k = –H_k*▽f(x_k)   (29) pk=Hkf(xk)   (29)
在此基础上,BFGS(不计算逆)方向迭代公式如下所示:

image-20200807163312875

B k + 1 B_{k+1} Bk+1 公式不同,注意位置

其中ρ_k为一个标量: opt5-7

有了上面的H_k迭代公式后,还有一个问题就是初始的H_0如何计算,目前常用的方法是初始的H_0直接设为单位矩阵I。因此BFGS Method用于解无约束(不求逆)最优化的过程可以表示为如下过程:

image-20200807163450184

https://www.52nlp.cn/unconstrained-optimization-five#comments

总结

image-20200807163609821

处理一个多维无约束优化问题

  1. 目标函数的梯度能否得到?
    • 不能:直接搜索法
  2. 目标函数的 Hessian 能否得到?
    • 不能:目标函数的 Hessian 能否近似
      • 不能:最速梯度法
      • 能: 拟牛顿法
  3. 目标函数的 Hessian 是否正定矩阵?
    • 不是:修正牛顿法
    • 是:牛顿方向法
补充

image-20200818160303330

求方向 - 求步长(另一个优化问题 反向算法) -

终止条件(stopping criteria)

image-20200818180324484

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值