拉格朗日乘子(Lagrange Multipliers)又稱為待定乘數法(Undetermined Multipliers),通常用來尋找某一函數在一個或多個約束條件下的最值點。 
        
 
        
          其主要思想是引入一個新的變量λ(即拉格朗日乘子),把約束條件和原函數結合到一起,形成新的函數,這個新的函數的最值點與原函數相同。 
        
 
        
          本文內容主要來自《Pattern Recognition and Machine Learning》和和Andrew Ng的CS229講義。 
        
 
         
         第一個問題 
        
 
        
          假設我們有一個函數 
         f(x1,x2) ,現在我們要在約束條件 g(x1,x2)=0的約束下求函數f(x1,x2)的最大值。 
        
 
        
          最簡單的做法是,我們先對函數g進行變換,成為 x2 = h(x1) 的形式,然后把 h(x1) 作為x2 代入函數f,f(x1, x2)就變成了 f(x1,h(x1)) ,即僅與 x1 相關的函數,這時候我們就可以通過變換,求出 x1 的極致點,繼而獲得x2的極致點 x2 = h(x1)。 
        
 
         
         
        
           這種方法的的缺點是,某些函數中的變量如x2可能不那么容易找到其對應的x1變換,而且這種方法也把x1和x2按照不同的方式來處理,改變了他們的自然對稱。 
         
 
          
          更優雅的方式 
         
 
         
           現在,我們來看一種更優雅的,被成為拉格朗日乘子法的方法,我們需要引入一個 λ 變量,該變量即拉格朗日乘子。 
         
 
         
           我們最好從幾何學的角度來學習這種方法:假設我們有一個一個D維的變量x(每一維分別是x1,x2,x3 ... xD),那么約束條件 g(x) = 0 就代表了一個D-1 維度的超平面: 
         
 
         
 
         
           假設現在平面 g(x) = 0上有非常接近的兩個點 x + e和 x ,且 g(x)平面的梯度(gradient)為 ∇g(x) ,那么有: 
         
 
         
 
         
            由於x和x+e非常接近,那么我們可以認為 g(x+e) = g(x),繼而有: 
         
 
         
 
         
           由於 e 是平行於 g(x)=0 平面的,所以 ∇g(x) 總是垂直於約束平面 g(x) = 0 。 
         
 
          
          更進一步 
         
 
         
           有了上面的前提知識,下面我們可以先假設在約束平面上找到了一點x*使f(x*)獲得了最大值,由上面的內容得知, 該點的∇f(x*)也垂直於約束面。 
          
 
          
 
          
圖片來自: https://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E4%B9%98%E6%95%B0
 
         
 
          圖片來自: https://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E4%B9%98%E6%95%B0
           因此,最大值所在點的梯度 ∇f(x)與任一點所在的梯度 ∇g(x)必然是平行關系,所以有(其中λ != 0): 
         
 
         
 
         
           有上面的公式,我們可以引入拉格朗日公式為(對拉格朗日公式求偏導數倒推就是上面的式子): 
         
 
         
 
          {rock_cloud: 我的理解是,L取極值時,也就是L偏導為0,此時f偏導為0,也取到極值點,因此可以用L的極值點代表f的極值點。}
 
          一個等值約束的例子 
         
 
         
           假設我們需要找到以下函數的極值: 
         
 
         
 
         
           約束條件為(等值約束): 
         
 
         
 
         
           把他們寫為拉格朗日公式為: 
         
 
         
 
         
           由於拉格朗日的極值點必然在所有位置參數的一階導數都為0的情況下,即: 
         
 
         
 
         
 
        
 
        
           對上面三個公式求解,可以很容易得到(x1,x2) = (1/2,1/2)為極值點,並且λ = 1。 
         
 
          
          不等值約束 
         
 
         
           拉格朗日乘子法經過推廣,可以一般化寫為: 
         
 
         
 
         
           其中,目標函數,約束條件分別為: 
         
 
         
 
         
           也就是說,約束條件有多少個,就需要多少個拉格朗日乘子,即上面的  
          
和 
          
。 
         
 
         
和 
          
。 
         
           我們只討論凸函數,即二次函數問題,非凸函數問題更加復雜,所以一般會把優化問題修改成凸函數優化問題。 
         
 
         
           現在再來看之前那個函數,求下面函數的最大值: 
         
 
         
 
         
           我們把約束條件改為: 
         
 
         
 
         
           現在,約束條件可以分為兩部分,第一部分是 g(x1,x2) > 0,第二部分為 g(x1,x2) = 0。 
         
 
         
           對於第一部分來說,由於我們的目標函數是凹函數(可以轉換為凸函數),所以在g(x1,x2)大於0的空間范圍內,f(x1,x2)的極值只可能取在f(x1,x2)的導函數為0的時候,即 ∇f(x) = 0,也就是轉換成拉格朗日函數之后把 λ = 0 。 
         
 
         
           對於第二部分 g(x1,x2) = 0 來說,只有當f(x1,x2)的梯度往g(x1,x2) > 0區域外移動的時候才可能取到最大值,在該最大值點有 ∇f(x) = −λ∇g(x) 。 
         
 
         
           對於這兩種情況來說,最終都會導致 λg(x1,x2) = 0 (前者λ=0后者g(x1,x2))=0),所以原問題中在求f函數的最大值問題就轉變成了在以下條件下求拉格朗日公式的最優值: 
         
 
         - g(x1,x2) >= 0
 - λ >= 0
 - λg(x1,x2) = 0
 
            即,假如我們要求 f(x1,x2) 的最大值,只需在上面約束的情況下求拉格朗日函數的最大值即可(即對拉格朗日函數分別求x1,x2和λ求偏導數,讓偏導數等於0)即可。 
          
 
         
          上面所述的三個條件,就是KKT條件,可以看做拉格朗日的推廣。  
        
 
       