標籤:des 使用 strong 問題 cti 演算法
Numerical Optimization Line Search
線性搜尋簡介
數值最佳化是迭代式的最佳化方法,從一個初始點x0開始,然後產生一個迭代方向?d0,在這個方向上選擇一個步長α0,下一個點就是x0+α0??d0。按照這樣的方法不停的迭代下去,直到找到最優點。在這個過程中有兩步是非常重要的。第一步就是計算出迭代方向?dk,第二步是在這個方向上選擇合適的步長 αk,獲得下一個點xk+1。第一步產生迭代方向 ?dk 是各種最佳化方法產生差別的地方,不同的方法有不同的方法產生迭代方向。但是對於不同的迭代方法都有一個最基本的要求,那就是這個方向必須是一個下降方向:?f(xk)T??dk<0。其中?f(xk) 是 xk 的梯度方向。
第二步稱為線性搜尋。在這個步驟上不同的方法基本都是相同的。線上性搜尋方法中有兩個比較重要的部分,首先是停止條件,第二個是步長選擇演算法。之所以要求滿足停止條件而不是僅僅要求函數值有下降,是為了確保最佳化演算法能夠正常的收斂。線性搜尋問題可以如下形式化:
argminxf(xk+1)=f(xk+α??x)s.t.α≥0終止條件
首先假設當前點 xk 的梯度是 ?f(xk),當前的迭代方向是 ?dk,並且滿足 ?f(xk)T??dk<0,並且當前的選擇的步長為 α0。
Sufficient Descreasement Condition
這個條件也稱為Armijo Condition,描述如下:
f(xk+α0?dk)≤f(xk)+α0?ρg(xk)T?dk0<ρ<1/2其中 ρ 是使用者指定的參數,一般來說這個參數的數量級大概為1e?3 或者更低。但是僅僅使用這個條件並不能確保最佳化過程收斂。但是當這個條件配合backtracking搜尋方法的時候可以確保最佳化過程收斂。
Curvature Condition
?f(xk+α0?dk)T?dk≥δ?f(xk)T?dks.tρ<δ<1對於delta的取值一般比較大,比如0.8,0.9等等。這個值越大,對應的搜尋越不精確。
Wolfe Condition
Wolfe Condition就是把Sufficient Decreasement Condition和curvature condition合并在一起,表述如下:
f(xk+α0??dk)≤f(xk)+ρα0f(xk)T?dk?f(xk+α0?dk)T?dk≥δ?f(xk)T?dks.t0<ρ<δ<1一般來說Wolfe Condition是用於擬牛頓方法。
Strong Wolfe Condition
f(xk+α0??dk)≤f(xk)+ρα0f(xk)T?dk∣∣?f(xk+1)T?dk∣∣≤δ∣∣?f(xk)T?dk∣∣s.t0<ρ<δ<1Goldstein Condition
f(xk+α0?dk)≤f(xk)+α0?ρg(xk)T?dkf(xk+α0?dk)≥f(xk)+α0?(1?ρ)g(xk)T?dks.t.0<ρ<1/2步長選擇
這個一般可以使用多種不同的方法來選擇,對於我來說還是喜歡用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;
endretval = alpha;end總結
線性搜尋的效能對最佳化問題至關重要,簡單且可靠的線性搜尋方法可以解決很多的問題。一般來說,Goldstein條件適用於牛頓飯,Wolfe和strong Wolfe條件適用於擬牛頓法