一维搜索方法c语言,优化方法基础系列-非精确的一维搜索技术

选择最优步长的精确搜索方法往往计算量大,特别是当迭代点远离最优解时,效率很低,而且很多最优化算法的收敛速度并不依赖于精确的一维搜索过程。这促使一些研究者放宽了一维搜索的精确要求,而去保证目标函数在每次迭代有满意的下降量,这类方法称为非精确的一维搜索方法或可接受的一维搜索方法,它可以大大节省计算量。

不精确的一维搜索方法核心问题是选取可接受的步长

math?formula=%5Clambda_k使得

math?formula=f(%5Cboldsymbol%20x_k)-f(%5Cboldsymbol%20x_k%2B%5Clambda_k%5Cboldsymbol%20d_k)得到一个满意的水平,即足够的下降且大范围收敛。因此,研究者提出了一些准则,以满足不精确搜索能也能收敛的条件。Armijo-Goldstein和Wolf-Powell准则为非精确一维搜索的两大准则。

Armijo-Goldstein准则

Armijo-Goldstein准则核心思想就两点:

1、目标函数值应该有足够的下降

2、一维搜索的步长

math?formula=%5Clambda不应该太小

这两点意图是非常明显,由于最优化问题就是寻找极小值,所以使得目标函数值下降,是我们努力的方向,此外如果搜索步长太小,可能原地打转,影响收敛速度。具体方法如下:

假设

math?formula=%5Cboldsymbol%20d_k是一个下降方向,记

math?formula=%5Cboldsymbol%7Bg%7D_k%3D%5Cnabla%20f(%5Cboldsymbol%7Bx%7D_k),有:

math?formula=f(%5Cboldsymbol%7Bx%7D_k%2B%5Clambda%5Cboldsymbol%7Bd%7D_k)%3Df(%5Cboldsymbol%7Bx%7D_k)%2B%5Clambda%5Cnabla%20f(%5Cboldsymbol%7Bx%7D_k)%5ET%5Cboldsymbol%7Bd%7D_k%2BO(%7C%7C%5Clambda%5Cboldsymbol%7Bd%7D_k%7C%7C)

math?formula=%5Cboldsymbol%7Bg%7D_k%5ET%5Cboldsymbol%7Bd%7D_k%3C0%2Cf(%5Cboldsymbol%7Bx%7D_k)-f(%5Cboldsymbol%7Bx%7D_k%2B%5Clambda%5Cboldsymbol%7Bd%7D_k)的一个合理的下界(保证下降):

math?formula=f(%5Cboldsymbol%7Bx%7D_k)-f(%5Cboldsymbol%7Bx%7D_k%2B%5Clambda%5Cboldsymbol%7Bd%7D_k)%5Cgeq%20-%5Crho%20%5Clambda%5Cboldsymbol%7Bg%7D_k%5ET%5Cboldsymbol%7Bd%7D_k%2C%5Crho%20%5Cin%20(0%2C0.5)

再给其一个上界限制(

math?formula=%5Clambda不能太小):

math?formula=f(%5Cboldsymbol%7Bx%7D_k)-f(%5Cboldsymbol%7Bx%7D_k%2B%5Clambda%5Cboldsymbol%7Bd%7D_k)%5Cleq%20-(1-%5Crho)%20%5Clambda%5Cboldsymbol%7Bg%7D_k%5ET%5Cboldsymbol%7Bd%7D_k%2C%5Crho%20%5Cin%20(0%2C0.5)

那么Armijo-Goldstein准则可描述为:

可接受的

math?formula=%5Clambda应该满足:

math?formula=f(%5Cboldsymbol%7Bx%7D_k)%2B(1-%5Crho)%20%5Clambda%5Cboldsymbol%7Bg%7D_k%5ET%5Cboldsymbol%7Bd%7D_k%5Cleq%20f(%5Cboldsymbol%7Bx%7D_k%2B%5Clambda%5Cboldsymbol%7Bd%7D_k)%5Cleq%20f(%5Cboldsymbol%7Bx%7D_k)%2B%5Crho%5Clambda%5Cboldsymbol%7Bg%7D_k%5ET%5Cboldsymbol%7Bd%7D_k%2C%5Crho%20%5Cin%20(0%2C0.5)

注:如果

math?formula=%5Crho不在这个范围内,将影响其超线性收敛性。

5e130ce61adb

图1 Armijo-Goldstein准则示例

math?formula=%5Cvarphi%20(%5Clambda)%20%3D%20f(%5Cboldsymbol%7Bx%7D_k%2B%5Clambda%5Cboldsymbol%7Bd%7D_k),即固定

math?formula=%5Cboldsymbol%7Bx%7D_k和方向

math?formula=%5Cboldsymbol%7Bd%7D_k,求解满足条件的步长,则Armijo-Goldstein可写为:

math?formula=%5Cvarphi%20(0)%2B(1-%5Crho)%5Clambda%5Cvarphi%20%5E%5Cprime(0)%5Cleq%20%5Cvarphi(%5Clambda)%5Cleq%20%5Cvarphi(0)%2B%5Crho%5Clambda%5Cvarphi%5E%5Cprime(0)

从上图和公式中,可以看出

math?formula=%5Cvarphi(0)%2B%5Crho%5Clambda%5Cvarphi%5E%5Cprime(0)

math?formula=%5Cvarphi(0)的下方,

math?formula=%5Cvarphi(0)%2B(1-%5Crho)%5Clambda%5Cvarphi%5E%5Cprime(0)

math?formula=%5Cvarphi(0)%2B%5Crho%5Clambda%5Cvarphi%5E%5Cprime(0)的下方,所以

math?formula=%5Bb%2Cc%5D区间都是在满足条件的步长。然而,Armijo-Goldstein准则可能会把极值点判断在可接受的范围之外,所以为了解决这一问题,Wolf-Powell准则应用而生。

5e130ce61adb

图 2 Armijo-Goldstein 准则流程图

Algorithm 9 Armijo-Goldstein准则

function lamda = ArmijoGoldstein(func,gfunc,lamda0,ro,apha,iterNum,plotFlag)

if nargin<7

plotFlag = 1;

end

if nargin<6

iterNum = 100;

end

if nargin<5

apha = 2;

end

if nargin<4

ro = 0.1;

end

if nargin<3

lamda0 = 1;

end

a = 0;

b = inf;

lamda =lamda0;

f0 = func(0);

g0 = gfunc(0);

if plotFlag == 1

figH = figure();

end

while iterNum

flamda = func(lamda);

if plotFlag == 1

pause(1)

plot(0:0.01:4,func(0:0.01:4),'-b');

hold on;

plot([0,4],[f0,f0],'-y');

plot([0,4],[f0,f0+ro*4*g0],'-or');

plot([0,4],[f0,f0+(1-ro)*4*g0],'-og');

plot([0,lamda],[f0,flamda],'-*k');

plot(a,func(a),'-*g');

if ~isinf(b)

plot(b,func(b),'-*r');

end

hold off;

end

if flamda<=f0+ro*lamda*g0 %满足Armijo准则,足够的下降

if flamda>=f0+(1-ro)*lamda*g0 %满足Goldstein,步长不会太小

break;

else %不满足Goldstein,步长太小,左端的a设置为lamda

a = lamda;

if isinf(b)%右端的b为空的时候,说明Armijo准则一直是满足的,步长太小了,扩大步长

lamda = apha*lamda;

else

lamda = (a+b)/2; %步长设定为区间的中值

end

end

else%下降不足,缩小b和步长

b = lamda;

lamda = (a+b)/2;

end

iterNum = iterNum - 1;

end

%示例

%lamda = ArmijoGoldstein(@(x)(sin(-4+x)-1),@(x)(cos(-4+x)),1,0.4,2,100,1)

Wolf-Powell 准则

Wolf-Powell准则下界和Armijo-Goldstein准则是一样的,即:

math?formula=f(%5Cboldsymbol%7Bx%7D_k%2B%5Clambda%5Cboldsymbol%7Bd%7D_k)%5Cleq%20f(%5Cboldsymbol%7Bx%7D_k)%2B%5Crho%5Clambda%5Cboldsymbol%7Bg%7D_k%5ET%5Cboldsymbol%7Bd%7D_k%2C%5Crho%20%5Cin%20(0%2C0.5)

为了保证足够的步长以及可接受的区间包含极小值点,上界被定义:

math?formula=%5Cboldsymbol%7Bg%7D_%7Bk%2B1%7D%5ET%5Cboldsymbol%7Bd%7D_k%5Cgeq%5Csigma%20%5Cboldsymbol%7Bg%7D_k%5ET%5Cboldsymbol%7Bd%7D_k%2C%5Csigma%20%5Cin%20(%5Crho%2C1)

也就是:

math?formula=%5Cvarphi%20%5E%5Cprime(%5Clambda)%5Cgeq%20%5Csigma%20%5Cvarphi%5E%5Cprime(0)

其说明在点

math?formula=%5Clambda处的斜率应该大于起始点斜率的

math?formula=%5Csigma倍。

math?formula=%5Cvarphi%5E%5Cprime(0)是负值,所以上界的含义就是可接受的范围中斜率应该是接近零的负值或者正值。

此外,还有一种更为严苛的准则,称为强Wolf调节,即:

math?formula=%5Cvert%20%5Cvarphi%5E%5Cprime(%5Clambda)%20%5Cvert%20%5Cleq%20-%5Csigma%20%5Cvarphi%5E%5Cprime(0)

强Wolf条件使得可接受的范围的斜率的正值不至于过大,可以将远离极小值点的步长排除在外。一般

math?formula=%5Csigma越小,线性搜索越精确,不过

math?formula=%5Csigma越小,工作量越大,一般取

math?formula=%5Crho%20%3D%200.1%2C%20%5Csigma%5Cin%20%5B0.6%2C0.8%5D

5e130ce61adb

图 3 强Wolf条件示意图

Algorithm 10 Wolf-Powell 准则

function lamda = WolfPowell(func,gfunc,lamda0,ro,sigma,apha,iterNum,plotFlag)

if nargin<8

plotFlag = 1;

end

if nargin<7

iterNum = 100;

end

if nargin<6

apha = 2;

end

if nargin<5

ro = 0.1;

end

if nargin<4

sigma = 0.7;

end

if nargin<3

lamda0 = 1;

end

a = 0;

b = inf;

lamda =lamda0;

f0 = func(0);

g0 = gfunc(0);

if plotFlag == 1

figH = figure();

for i=0:0.01:4

if gfunc(i)>=sigma*g0;

gs_i = i;

break;

end

end

end

while iterNum

flamda = func(lamda);

if plotFlag == 1

pause(1)

plot(0:0.01:4,func(0:0.01:4),'-b');

hold on;

plot([0,4],[f0,f0],'-y');

plot([0,4],[f0,f0+ro*4*g0],'-or');

plot([gs_i-0.5,gs_i+0.5],[func(gs_i)+(-0.5)*sigma*g0,func(gs_i)+(0.5)*sigma*g0],'-og');

plot([0,lamda],[f0,flamda],'-*k');

plot(a,func(a),'-*g');

if ~isinf(b)

plot(b,func(b),'-*r');

end

hold off;

end

if flamda<=f0+ro*lamda*g0 %满足Armijo准则,足够的下降

if gfunc(lamda)>=sigma*g0 %满足wolf-powell,步长不会太小

break;

else %不满足wolf-powell,步长太小,左端的a设置为lamda

a = lamda;

if isinf(b)%右端的b为空的时候,说明Armijo准则一直是满足的,步长太小了,扩大步长

lamda = apha*lamda;

else

lamda = (a+b)/2; %步长设定为区间的中值

end

end

else%下降不足,缩小b和步长

b = lamda;

lamda = (a+b)/2;

end

iterNum = iterNum - 1;

end

%example

%lamda = WolfPowell(@(x)(sin(-4+x)-1),@(x)(cos(-4+x)),1,0.4,0.45,2,100,1)

5e130ce61adb

图4 Wolf-Powell条件示意图

后退法(简单准则)

后退法仅采用了Armijo-Goldstein准则的下界限制,即保证函数的下降,此外要求

math?formula=%5Clambda不要太小即可。其基本思想是:

给定

math?formula=%5Crho%20%5Cin%20(0%2C0.5)%2C0%3Cl%3Cu%3C1

Step1 令

math?formula=%5Clambda%3D1

Step2 如果

math?formula=f(%5Cboldsymbol%7Bx%7D_k%2B%5Clambda%5Cboldsymbol%7Bd%7D_k)%5Cleq%20f(%5Cboldsymbol%7Bx%7D_k)%2B%5Crho%5Clambda%5Cboldsymbol%7Bg%7D_k%5ET%5Cboldsymbol%7Bd%7D_k,则令

math?formula=%5Clambda_k%3D%5Clambda停止迭代,输出

math?formula=%5Clambda_k ;否则转Step3

Step3

math?formula=%5Clambda%3A%3D%5Comega%20%5Clambda%2C%5Comega%5Cin%5Bl%2Cu%5D,转Step2

关于这些准则的有效性,比如步长的存在性,大范围收敛性质可参阅刘红英版本的数值规划基础或者Numerical Optimization。后来学者们又发展了Curry-Altman步长律、Danilin-Pshenichuyi步长律、De Leone-Grippo步长律等,这些步长律或者准则会在后文的具体优化算法中有所涉及,使用的过程中可能会大大加速优化方法的收敛。

参考文献:

[1] Numerical Optimization. Jorge Nocedal

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值