Armijo-Goldstein准则及Wolfe-Powell准则
line search(一维搜索,或线搜索)是最优化(Optimization)算法中的一个基础步骤/算法。它可以分为精确的一维搜索以及不精确的一维搜索两大类。
本文主要介绍一下,不精确的一维搜索的两大准则:Armijo-Goldstein准则 & Wolfe-Powell准则。
1 为什么要遵循这些准则
由于采用了不精确的一维搜索,所以,为了能让算法收敛(即:求得极小值),人们逐渐发现、证明了一些规律,当你遵循这些规律的时候,算法就很有可能收敛。因此,为了达到让算法收敛的目的,我们就要遵循这些准则。
2 Armijo-Goldstein准则
此准则是在196X年的时候由Armijo和Goldstein提出的。
Armijo-Goldstein准则的核心思想有两个:①目标函数值应该有足够的下降;②一维搜索的步长 α α α不应该太小。
这两个思想的意图非常明显。由于最优化问题的目的就是寻找极小值,因此,让目标函数函数值“下降”是我们努力的方向,所以①正是想要保证这一点。同理,②也类似:如果一维搜索的步长 α α α太小了,那么我们的搜索类似于在原地打转,可能也是在浪费时间和精力。
有了这两个指导思想,我们来看看Armijo-Goldstein准则的数学表达式:
f
(
x
k
+
a
k
d
k
)
≤
f
(
x
k
)
+
a
k
ρ
g
k
T
d
k
⋯
(
1
)
f(x_k+a_kd_k) \leq f(x_k)+a_k \rho g_k^{T} d_k \cdots(1)
f(xk+akdk)≤f(xk)+akρgkTdk⋯(1)
f
(
x
k
+
a
k
d
k
)
≥
f
(
x
k
)
+
a
k
(
1
−
ρ
)
g
k
T
d
k
⋯
(
2
)
f(x_k+a_kd_k) \geq f(x_k)+a_k (1-\rho) g_k^{T} d_k \cdots(2)
f(xk+akdk)≥f(xk)+ak(1−ρ)gkTdk⋯(2)
其中,
0
<
ρ
<
1
/
2
0<\rho<1/2
0<ρ<1/2。袁亚湘写的《最优化理论与方法》一书证明,如果没有这个条件的话,将影响算法的超线性收敛性。
Armijo-Goldstein准则可能会把极小值点(可接受的区间)判断在区间bc内。显而易见,区间bc是有可能把极小值排除在外的(极小值在区间ed内)。所以,为了解决这个问题,Wolfe-Powell准则应运而生。
3 Wolfe-Powell准则
Wolfe-Powell准则也有两个数学表达式,其中,第一个表达式与Armijo-Goldstein准则的(1)式相同,第二个表达式为:
▽
f
(
x
k
+
a
k
d
k
)
T
d
k
≥
σ
g
k
T
d
k
,
σ
∈
(
ρ
,
1
)
⋯
(
3
)
\bigtriangledown f(x_k+a_kd_k)^{T}d_k \geq \sigma g_k^{T} d_k, \sigma\in\mathbb (\rho,1) \cdots(3)
▽f(xk+akdk)Tdk≥σgkTdk,σ∈(ρ,1)⋯(3)
这个式子已经不是关于函数值的了,而是关于梯度的。此式的几何解释为:可接受点处的切线斜率
≥
\geq
≥初始斜率的
σ
\sigma
σ 倍。
上面的图已经标出了 σ g k T d k \sigma g_k^{T} d_k σgkTdk那条线(即 e e e点处的切线),而初始点( α = 0 \alpha=0 α=0的点)处的切线是比 e点处的切线要“斜”的,由于 σ ∈ ( ρ , 1 ) \sigma\in\mathbb (\rho,1) σ∈(ρ,1),使得 e e e点处的切线变得“不那么斜”了。这样做的结果就是,我们将极小值包含在了可接受的区间内( e e e点右边的区间)。
Wolfe-Powell准则到这里还没有结束!在某些书中,你会看到用另一个所谓的**“更强的条件”**来代替(3)式,即:
∣
▽
f
(
x
k
+
a
k
d
k
)
T
d
k
∣
≤
−
σ
g
k
T
d
k
,
σ
∈
(
ρ
,
1
)
⋯
(
4
)
\vert \bigtriangledown f(x_k+a_kd_k)^{T}d_k \vert \leq -\sigma g_k^{T} d_k, \sigma\in\mathbb (\rho,1) \cdots(4)
∣▽f(xk+akdk)Tdk∣≤−σgkTdk,σ∈(ρ,1)⋯(4)
这个式子和(3)式相比,就是左边加了一个绝对值符号,右边换了一下正负号(因为
g
k
T
d
k
<
0
g_k^{T} d_k<0
gkTdk<0,
−
σ
g
k
T
d
k
>
0
-\sigma g_k^{T} d_k>0
−σgkTdk>0),这样做的结果就是:可接受的区间被限制在了
[
b
,
d
]
[b,d]
[b,d]内,即红线部分,如图:
参考: codelast.com