非精确搜索确定步长
在之前的文章中,我们已经讨论了如何从 X k X_k Xk更新到 X k + 1 X_{k+1} Xk+1,这篇文章我们主要不精确搜索中确定步长的方法
沃尔夫(wolfe)条件
wolfe条件分为Armijo条件和曲率下降条件,只要函数f有下界,所求的α就满足wolfe和强wolfe条件。
Armijo条件
Armijo条件的优点在于其计算的代价很小,只需要常数阶的计算就可以得到有效的α,下面是Armijo条件的公式:
f ( x k + α p k ) ≤ f ( x k ) + c 1 α ∇ f k T p k , c 1 ∈ ( 0 , 1 ) f(x_k+αp_k)\le f(x_k)+c_1α\nabla f_k^Tp_k,c_1\in (0,1) f(xk+αpk)≤f(xk)+c1α∇fkTpk,c1∈(0,1)
我们用一张图来直观解释这个条件:
这里的红线表示α可以取到的区间,我们发现,Armijo条件的α会取到充分小的值,这对于迭代来说是非常不利的,Armijo条件无法保证充分下降,这会导致函数无法收敛。这里的
c
1
c_1
c1(学习率)一般取
1
0
−
4
10^{-4}
10−4。
曲率下降条件
曲率下降条件需要计算一个梯度,这里给出其公式:
∇ f ( x k + α p k ) T p k ≥ c 2 ∇ f k T p k , c 2 ∈ ( c 1 , 1 ) \nabla f(x_k+αp_k)^Tp_k\geq c_2\nabla {f_k}^Tp_k,c_2\in (c_1,1) ∇f(xk+αpk)Tpk≥c2∇fkTpk,c2∈(c1,1)
在不精确计算中,这个计算的代价是很大的,但曲率下降条件为α提供了一个范围,其保证了α不会取到充分小的值,保证了充分下降,这里我们也用一张图来解释曲率下降条件:
这边的红线表示α取不到的区间,在开始时
∇
f
k
T
p
k
\nabla {f_k}^Tp_k
∇fkTpk是小于0的,移动到中间点后,其梯度会比出发时大一点,我们可以看到,
c
2
c_2
c2这个参数约束了α取到充分小的值,至少在每一步都会有一个微小的下降,我们联立Armijo条件和曲率下降条件就可以得到充分下降的α,在牛顿法中,一般
c
2
≈
1
c_2\approx1
c2≈1;在CG法中
c
2
≈
0.1
c_2\approx0.1
c2≈0.1。
强沃尔夫(wolfe)条件
强wolfe条件相对于wolfe条件来说就是做了一个左右对称,即:
∣ ∇ f ( x k + α p k ) T p k ∣ ≥ c 2 ∣ ∇ f k T p k ∣ , c 2 ∈ ( c 1 , 1 ) \vert\nabla f(x_k+αp_k)^Tp_k\vert\geq c_2\vert\nabla {f_k}^Tp_k\vert,c_2\in (c_1,1) ∣∇f(xk+αpk)Tpk∣≥c2∣∇fkTpk∣,c2∈(c1,1)
强wolfe条件中参数的选取和wolfe公式中相同,我们取 c 1 ≈ 1 0 − 4 c_1\approx10^{-4} c1≈10−4,在牛顿法中,一般 c 2 ≈ 1 c_2\approx1 c2≈1;在CG法中 c 2 ≈ 0.1 c_2\approx0.1 c2≈0.1。
Goldstein条件
之前的wolfe条件(尤其是强wolfe条件)需要计算梯度,这个代价非常的大,但不计算梯度有可能导致算法不收敛,那么Goldstein条件可以解决这个问题,下面给出Goldstein条件的公式:
f k + ( 1 − c ) α k ∇ f k T p k ≤ f ( x k + α k p k ) ≤ f k + c α k ∇ f k T p k f_k+(1-c)α_k\nabla f_k^Tp_k\le f(x_k+α_kp_k)\le f_k+cα_k\nabla f_k^Tp_k fk+(1−c)αk∇fkTpk≤f(xk+αkpk)≤fk+cαk∇fkTpk
( 0 < c < 0.5 ) (0\lt c\lt0.5) (0<c<0.5)
下面有一张图来直观解释Goldstein条件:
这里的红线表示α可以取到的区间,我们发现,Goldstein条件抛弃了局部极值点,但是其计算方便,只需要常数阶计算就可以计算出α(和Armijo条件相似),且Goldstein条件可以保证充分下降。
回溯法(backtracking)
之前我们提到,Armijo条件的缺点在于α的值会取到充分小,那么先将α取较大的值,然后乘以一个系数p(小于1),使其慢慢下降就可以避免α的值取到充分小,在实际应用中基本没有问题。
回溯法就是基于这个思想创造的:
这里的
α
ˉ
>
0
,
p
∈
(
0
,
1
)
,
c
∈
(
0
,
1
)
\bar α>0,p\in(0,1),c\in(0,1)
αˉ>0,p∈(0,1),c∈(0,1),除非有非常强烈的条件提示我们需要用wolfe条件(如多尺度问题),我们一般使用回溯法来编写程序。
在p->1时,找到的α比较长,但找的比较慢;在p->0时,找到的α比较短,但找的比较快,所以需要结合不同实际问题进行调参。
下面是我在github的wolfe和回溯法的MATLAB实现代码:代码点击此处
while(num_iter)// wolfe方向(Matlab)
if~(feval(func,x0+alpha*dk)<=func(x0)+rho*alpha*feval(gfunc,x0)'*dk)
b=alpha;
alpha=(alpha+a)/2;
continue;
end
if~(feval(gfunc,x0+alpha*dk)'*dk>=sigma*feval(gfunc,x0)'*dk)
a=alpha;
alpha=min([2*alpha,(b+alpha)/2]);
continue;
end
break;
end
//回溯法(Matlab)
alpha_k=10;//该参数可调(初始alpha_k应该较大)
p=0.5;
epa=10-6;
while(alpha>epa)
if~(feval(func,x0+alpha*dk)>func(x0)+rho*alpha*feval(gfunc,x0)'*dk)
alpha=alpha*p;
end
end