使用梯度下降方法求解凸優化問題的時候,會遇到一個問題,選擇什么樣的梯度下降步長才合適。
假設優化函數為,若每次梯度下降的步長都固定,則可能出現左圖所示的情況,無法收斂。若每次步長都很小,則下降速度非常慢,需要很多輪的迭代,如右圖所示。所以步長的選擇和收斂速度是一個取舍關系。
於是,有了一種可調節步長的解法,稱為backtracking line search。
假設我們當前的位置為Xc 並且要在d方向上尋找更優的解,那么問題就變為了估計Φ(t)的最小值,t是步長。
關於P的新的解是。那么怎么來估計這個步長呢?(直接把課件的幻燈片貼上來了)
也就是說,設f(x)在Xc的導數,再設兩個變量r和c∈(0, 1).
因為r∈(0, 1),所以rv隨着v的增大而趨向於0,也就是步長t逐漸減小,直到找到滿足條件的rv。之前已經設定了
,所以必定有
課件里給出了一段Matlab的偽代碼,翻譯過來差不多就是這樣
function t = BLS(f,d,x,r,c) % Backtracking line search % Input : % f: MATLAB file that returns function value % d: The search direction % x: current x % r : backtrack step between (0,1) usually 1/2 % c: (0,1) usually 10^{-4} % Output : % t: adaptive step length [fc, gc] = feval(f,x); xc = x; x = xc + t*d; fk1 = feval(f,x);
t = 1;
while fk1 > fk + c*t*(gk'*d)
t= t*r;
x = xc + t*d;
fk1 = feval(f,x);
end
最后,課件里給出了尋找方向d的幾種方法
參考資料:
http://www.stat.cmu.edu/~ryantibs/convexopt/lectures/05-grad-descent.pdf
https://www.math.washington.edu/~burke/crs/408/lectures/L7-line-search.pdf