線搜索(line search)方法

轉自http://www.cnblogs.com/kemaswill/p/3416231.html

 在機器學習中, 通常需要求某個函數的最值(比如最大似然中需要求的似然的最大值). 線搜索(line search)是求得一個函數\(f(x)\)的最值的兩種常用迭代方法之一(另外一個是trust region). 其思想是首先求得一個下降方向,在這個方向上\(f(x)\)會下降, 然後是求得\(f(x)\)在這個方向上下降的步長. 求下降方向的方法有很多, 比如梯度下降, 牛頓方法和Quasi-Newton方法, 而步長可以是固定值, 也可以通過諸如Armijo算法來求得.

  1. 線搜索(line search)

  線搜索是一種迭代的求得某個函數的最值的方法. 對於每次迭代, 線搜索會計算得到搜索的方向\(p_k\)以及沿這個方向移動的步長\(\alpha_k\).

  大多數的線搜索方法都會要求\(p_k\)是下降方向(descent direction), 亦即需要滿足以下條件: \({p_k}^T{\nabla}f_k <0\), 這樣就能夠保證函數\(f\)(x)沿着這個方向是下降的. 一般來說, 搜索方向是\(p_k=-B_k^{-1}\nabla f_k\)

  其中\(B_k\)是一個對稱非奇異矩陣. 在最深下降(steepest descent)方法中, \(B_k\)是單位矩陣\(I\), 在牛頓方法(Newton)中\(B_k\)則是海森(Hessian)矩陣\({\nabla}^2f(x_k)\), 在Quasi-Newton方法中通過迭代求得Hessian矩陣的近似矩陣.

  當\(p_k\)由上式定義, 且\(B_k\)是正定矩陣時: $$p_k^T\nabla f_k = -\nabla f_k^T B_k^{-1}\nabla f_k <0$$所以\(p_k\)是下降方向(descent direction).

  2. 步長

  步長\(\alpha\)應該最小化下面的函數:$$\phi (\alpha)=f(x_k+\alpha p_k)$$

  但是求得使上式最小的\(\alpha\)比較困難, 且計算量比較大, 實際常用的方法是在可接受的計算量的情況下儘可能的求得較大的步長, 以使得\(\phi(\alpha)\)儘可能的降低. 經典的線搜索方法通過迭代來求得\(\alpha\), 直至達到某個停止條件. 一般的線搜索方法都包含以下兩個步驟:

  1. bracketing: 求得一個包含理想的步長的區間
  2. 二分法或者插值法: 在這個區間內使用二分法或者插值法來求得步長

  2.1 對於凸函數的二分搜索算法

  如果\(f(x)\)是一個可微分的凸函數, 則我們的目標是求得\(\alpha\), 使得$$\alpha=arg \min_{\lambda>0}f(x+\lambda p)$$

  令\(\phi (\alpha)=f(x_k+\alpha p_k)\), 其中\(\phi(\alpha)\)是\(\alpha\)的凸函數, 所以問題轉化爲求:$$\bar{\alpha}=arg \min_{\alpha>0} \phi(\alpha)$$

  因爲\(\phi(\alpha)\)是凸函數, 所以\(\phi'(\bar{\alpha})=0\). 可以得到\(\phi'(\alpha)=\nabla f(x+\alpha p)^T p\), 因爲p是梯度下降方向, 所以\(\phi'(0)<0\).

  假設我們知道一個\(\hat{\alpha}\)使得\(\phi'(\hat{\alpha})>0\), 那麼使得\(\phi'(\bar{\alpha})=0\)的\(\alpha\)肯定位於(0,\(\hat{\alpha}\))區間內. 然後我們可以使用以下二分查找算法來求解\(\phi'(\alpha) \approx 0\) 

  1. 令k=0, \(\alpha_l :=0\), \(\alpha_u :=\hat{\alpha}\)令\(\tilde{\alpha}=\frac{\alpha_u + \alpha_l}{2}\), 然後計算\(\phi'(\tilde{\alpha})\):
    • 如果\(\phi'(\tilde{\alpha})>0\), 則令\(\alpha_u :=\tilde{\alpha}\), 令\(k\gets k+1\)
    • 如果\(\phi'(\tilde{\alpha})<0\), 則令\(\alpha_l :=\tilde{\alpha}\), 令\(k\gets k+1\)
    • 如果\(\phi'(\tilde{\alpha})=0\), 停止迭代

  2.2 Armijo算法

  使用二分查找法來求步長的計算複雜度很高, 因爲在最小化\(f(x)\)的每次迭代中我們都需要執行一次線搜索, 而每次線搜索都要用上述的二分查找算法. 我們可以在犧牲一定的精度的條件下來加快計算速度, Armijo算法是一種近似線搜索算法.

  首先, 我們要求每次的步長\(\alpha_k\)都使得\(f(x)\)充分的降低:$$f(x_k +\alpha p_k)\leq f(x_k)+c_1 \alpha \nabla f_k^T p_k$$

  上述條件稱作 充分下降條件 , 其中\(c_1 \in (0,1)\), 一般來說\(c_1=10^{-4}\). 亦即\(f(x)\)的下降應該至少和\(\alpha_k\)以及\(\nabla f_k^T p_k\)成正比. 如下圖所示, 上式的右邊\(f(x_k)+c_1 \alpha \nabla f_k^T p_k\)是一個線性函數, 可以表示爲\(l(\alpha)\).

  充分下降條件規定只有使得\(\phi(\alpha)\leq l(\alpha)\)的\(\alpha\)才滿足條件. 其區間如上圖所示.

  單獨只有充分下降條件是不夠的, 因爲如上圖, 所有充分小的\(\alpha\)都滿足上述條件, 但是\(\alpha\)太小會導致下降不充分, 爲了排除這些小的\(\alpha\), 我們引入了第二個要求, 亦即 曲率條件(curvature condition) :$$\nabla f(x_k + \alpha_k p_k)^T p_k \geq c_2 \nabla f_k^T p_k$$其中\(c_2 \in (c_1,1)\). 上式的左邊就是\(\phi'(\alpha_k)\), 右邊則是\(\phi'(0)\), 亦即上式要求\(\phi'(\alpha_k)\)大於等於\(c_2\)倍的\(\phi'(0)\), 這是因爲如果\(\phi'(\alpha)\)是很小的負數, 則我們可以在這個方向上繼續使得\(f(x)\)下降更多. 如下圖所示

  上述兩個條件合起來稱作 Wolfe條件 :

  $$f(x_k +\alpha p_k)\leq f(x_k)+c_1 \alpha \nabla f_k^T p_k$$

  $$\nabla f(x_k + \alpha_k p_k)^T p_k \geq c_2 \nabla f_k^T p_k$$

  其中\(0<c_1 < c_2 <1\)

  我們可以使用以下算法來求得滿足Wolfe條件的步長\(\alpha\), 其主要思想是從一個初始的步長之後逐步減少\(\alpha\), 直至其滿足充分下降條件, 同時可以防止\(\alpha\)變得太小:

  1. 選擇一個\(\bar(\alpha)>0, \rho, c\in (0,1);\)令\(\alpha \gets \bar{\alpha}\)
  2. 重複以下步驟直到\(f(x_k +\alpha p_k)\leq f(x_k)+c_1 \alpha \nabla f_k^T p_k\):
  • \(\alpha \gets \rho \alpha\)

     3.  返回\(\alpha_k=\alpha\)

  [1]. Numerical Optimization, Chapter 3, p35-p42. J. Nocedal, S.Wright.

  [2].  Continuous Optimization Methods: Line search methods: one-dimensional optimization .

  [3]. Wikipedia: Line Search .

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章