线性搜索简介
数值优化是迭代式的优化方法,从一个初始点
按照这样的方法不停的迭代下去,直到找到最优点。在这个过程中有两步是非常重要的。第一步就是计算出迭代方向
第一步产生迭代方向
第二步称为线性搜索。在这个步骤上不同的方法基本都是相同的。在线性搜索方法中有两个比较重要的部分,首先是停止条件,第二个是步长选择算法。之所以要求满足停止条件而不是仅仅要求函数值有下降,是为了确保优化算法能够正常的收敛。
线性搜索问题可以如下形式化:
终止条件
首先假设当前点
Sufficient Descreasement Condition
这个条件也称为Armijo Condition,描述如下:
其中
但是当这个条件配合backtracking搜索方法的时候可以确保优化过程收敛。
Curvature Condition
对于
Wolfe Condition
Wolfe Condition就是把Sufficient Decreasement Condition和curvature condition合并在一起,表述如下:
一般来说Wolfe Condition是用于拟牛顿方法。
Strong Wolfe Condition
Goldstein Condition
步长选择
这个一般可以使用多种不同的方法来选择,对于我来说还是喜欢用backtracking方法,主要的原因是这个方法比较简单且容易实现。而且可以配合多种不同的终止条件。
backtracking
backtracking基本来说是从某个步长开始,然后不停的缩小步长。知道找到满足终止条件的步长。
function [retval] = backtrack(x0, d0, f, c1, c2)
%line search algorithm based on backtracking to find point satisfy strong wolfe condition
% x0 : current point
% d0 : search direction
% f : function will return value and gradient, [f, g] = f(x);
% 0 < c1 < c2 < 1
[f0, grad] = f(x0);
slope = grad' * d0;
if slope >= 0
error('must be a descent direction')
end
alpha0 = 0;
alphaMax = 1e2;
alpha = 1;
dec = 0.5;
inc = 2.1;
while 1
[current_val, current_grad] = f( x0 + alpha * d0);
factor = 1;
if current_val > ( f0 + alpha * c1 * slope)
factor = dec;
else
current_slope = current_grad' * d0;
if current_slope < c2 * slope
factor = inc;
else
if current_slope > -c2*slope
factor = dec;
else
break;
end
end
end
if alpha < 1e-15
warning('too small step size')
end
if alpha > alphaMax
warning('too large step size')
end
alpha = alpha * factor;
end
retval = alpha;
end
总结
线性搜索的性能对优化问题至关重要,简单且可靠的线性搜索方法可以解决很多的问题。一般来说,Goldstein条件适用于牛顿饭,Wolfe和strong Wolfe条件适用于拟牛顿法
没有评论:
发表评论