选择最优步长的精确搜索方法往往计算量大,特别是当迭代点远离最优解时,效率很低,而且很多最优化算法的收敛速度并不依赖于精确的一维搜索过程。这促使一些研究者放宽了一维搜索的精确要求,而去保证目标函数在每次迭代有满意的下降量,这类方法称为非精确的一维搜索方法或可接受的一维搜索方法,它可以大大节省计算量。
不精确的一维搜索方法核心问题是选取可接受的步长使得得到一个满意的水平,即足够的下降且大范围收敛。因此,研究者提出了一些准则,以满足不精确搜索能也能收敛的条件。Armijo-Goldstein和Wolf-Powell准则为非精确一维搜索的两大准则。
Armijo-Goldstein准则
Armijo-Goldstein准则核心思想就两点:
1、目标函数值应该有足够的下降
2、一维搜索的步长不应该太小
这两点意图是非常明显,由于最优化问题就是寻找极小值,所以使得目标函数值下降,是我们努力的方向,此外如果搜索步长太小,可能原地打转,影响收敛速度。具体方法如下:
假设是一个下降方向,记,有:
则的一个合理的下界(保证下降):
再给其一个上界限制(不能太小):
那么Armijo-Goldstein准则可描述为:
可接受的应该满足:
注:如果不在这个范围内,将影响其超线性收敛性。
图1 Armijo-Goldstein准则示例令,即固定和方向,求解满足条件的步长,则Armijo-Goldstein可写为:
从上图和公式中,可以看出在的下方,在的下方,所以区间都是在满足条件的步长。然而,Armijo-Goldstein准则可能会把极值点判断在可接受的范围之外,所以为了解决这一问题,Wolf-Powell准则应用而生。
图 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准则是一样的,即:
为了保证足够的步长以及可接受的区间包含极小值点,上界被定义:
也就是:
其说明在点处的斜率应该大于起始点斜率的倍。是负值,所以上界的含义就是可接受的范围中斜率应该是接近零的负值或者正值。
此外,还有一种更为严苛的准则,称为强Wolf调节,即:
强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)
图4 Wolf-Powell条件示意图
后退法(简单准则)
后退法仅采用了Armijo-Goldstein准则的下界限制,即保证函数的下降,此外要求不要太小即可。其基本思想是:
给定
Step1 令
Step2 如果,则令停止迭代,输出 ;否则转Step3
Step3 ,转Step2
关于这些准则的有效性,比如步长的存在性,大范围收敛性质可参阅刘红英版本的数值规划基础或者Numerical Optimization。后来学者们又发展了Curry-Altman步长律、Danilin-Pshenichuyi步长律、De Leone-Grippo步长律等,这些步长律或者准则会在后文的具体优化算法中有所涉及,使用的过程中可能会大大加速优化方法的收敛。
参考文献:
[1] Numerical Optimization. Jorge Nocedal
网友评论