基于二阶矩阵的最优化问题(二)(附matlab代码)

非精确搜索确定步长

在之前的文章中,我们已经讨论了如何从 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} 104

曲率下降条件

曲率下降条件需要计算一个梯度,这里给出其公式:

∇ 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)Tpkc2fkTpk,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 c21;在CG法中 c 2 ≈ 0.1 c_2\approx0.1 c20.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)Tpkc2fkTpk,c2(c1,1)

强wolfe条件中参数的选取和wolfe公式中相同,我们取 c 1 ≈ 1 0 − 4 c_1\approx10^{-4} c1104,在牛顿法中,一般 c 2 ≈ 1 c_2\approx1 c21;在CG法中 c 2 ≈ 0.1 c_2\approx0.1 c20.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+(1c)αkfkTpkf(xk+αkpk)fk+cαkfkTpk
( 0 < c < 0.5 ) (0\lt c\lt0.5) (0<c<0.5)

在这里插入图片描述
下面有一张图来直观解释Goldstein条件:

这里的红线表示α可以取到的区间,我们发现,Goldstein条件抛弃了局部极值点,但是其计算方便,只需要常数阶计算就可以计算出α(和Armijo条件相似),且Goldstein条件可以保证充分下降。

回溯法(backtracking)

之前我们提到,Armijo条件的缺点在于α的值会取到充分小,那么先将α取较大的值,然后乘以一个系数p(小于1),使其慢慢下降就可以避免α的值取到充分小,在实际应用中基本没有问题。
回溯法就是基于这个思想创造的:

Created with Raphaël 2.3.0 取一个较大的α值 是否满足Armijo条件 αk=α α=p*α yes no

这里的 α ˉ > 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

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员毛师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值