1. 程式人生 > >真正理解拉格朗日乘子法和KKT條件

真正理解拉格朗日乘子法和KKT條件

 這篇博文中直觀上講解了拉格朗日乘子法和 KKT 條件,對偶問題等內容。 首先從無約束的優化問題講起,一般就是要使一個表示式取到最小值:

minf(x)
 如果問題是 maxf(x) 也可以通過取反轉化為求最小值minf(x),這個是一個習慣。對於這類問題在高中就學過怎麼做。只要對它的每一個變數求導,然後讓偏導為零,解方程組就行了。

二維線性可分示例圖

     所以在極值點處一定滿足 df(x)dx=0(只是必要條件,比如 f(x)=x3x=0 處就不是極值點),然後對它進行求解,再代入驗證是否真的是極值點就行了。對於有些問題可以直接通過這種方法求出解析解(如最小二乘法)。

     但是也有很多問題解不出來或者很難解,所以就需要梯度下降法、牛頓法、座標下降法之類的數值迭代演算法了(感知機 、logistic 迴歸中用到)。

     對於這些迭代演算法就像下面這張圖一樣,我們希望找到其中的最小值。一個比較直觀的想法是先找一個起點,然後不斷向最低點靠近。就先把一個小球放到一個碗裡一樣。

迭代演算法

     一開始要找一個起始點,然後確定走的方向和距離,最後還要知道什麼時候停止。這三步中最難的應該是確定走的方向。走的慢點還可以接受,要是方向錯了就找不到最小值了~。所以走的距離可以簡單的設為一個比較小的值。起始點可以隨機選一個 (x0,y0)。關鍵是方向,可以選擇

(x0,y0) 處的梯度的反方向,這是函式在這個點下降最快的方向(原因可以看知乎中憶臻的回答)。它是一個向量,然後它的大小就是走的距離,為了防止太大而走過頭,導致不斷在最小值附近震盪,需要乘上一個比較小的值(稱為學習率),最終的停止條件就是梯度的大小很接近於 0(在極值點處的梯度大小就是 0)就行了。這種方法依靠梯度確定下降方向的方法叫做梯度下降法。

 對 f(x) 求極小值的流程就是:

  1. 隨機選定x0
  2. 得到函式在 x0 的梯度,然後從 x0 向前走一步。計算式是:x0new=x0oldαf(x)
  3. 重複第 2 步,直到梯度接近於 o(小於一個事先設定的很小的數),或者到達指定的迭代上限。

梯度下降法

     除了這種方法之外,其中第 2 步還可以這樣做,固定 x, 把它作為常數。就變成只有一個變數的優化問題了,直接求導為 0 就可以得到最優點,向前走到 (x0,y1)處,然後固定 y1, 對 x 進行相同的操作。這種每次只優化一個變數的方法叫做座標下降法。

座標下降法

     然後就是進一步的,我們可能要在滿足一定約束條件的情況下最小化目標函式,比如有一個等式約束:

minf(x)s.t.h(x)=0
     解決這個的時候問題不能先用上面的方法求出 f(x) 的極值點,然後留下滿足方程 h(x)=0 的。因為這個問題的解可能根本不是 minf(x) 的解,它們是沒有關係的。那麼還是要從問題本身去找線索:

帶約束的極值

     如圖,其中的圓圈是指目標函式 f(xy) 投影在平面上的等值線,表示在同一個圓圈上,黑線是約束條件h(x)=0的函式影象。所以等值線與函式影象相交的點其實就是所有滿足約束的點。那麼極值點只有可能在等值線與函式影象相切的地方取到,因為如果在相交的地方取到,那麼沿著 h(x) 的影象往前走或者往後走,一定還有其它的等值線與它相交,也就是 f(x,y) 的值還能變大和變小,所以交點不是極值點,只有相切的時候才有可能是極值點(不可能同時變大和變小了)。在相切的地方 h(x) 的梯度和 f(x,y) 的梯度應該是在同一條直線上的。(這一點可以這麼想,在切點處兩個函式的梯度都與切平面垂直,所以在一條直線上) 

 所以滿足條件的極值點一定滿足: