最優化方法是一種數學方法,它是研究在給定約束之下如何尋求某些因素(的量),以使某一(或某些)指標達到最優的一些學科的總稱。在學習機器學習的過程中我們發現,大部分的機器學習算法的本質都是建立優化模型,通過最優化方法對目標函數(或損失函數)進行優化,從而訓練出最好的模型。常見的最優化方法有梯度下降法、牛頓法和擬牛頓法、共軛梯度法、拉格朗日數乘法等等。
1. 梯度下降法(Gradient Descent)
梯度下降法是最早最簡單,也是最為常用的最優化方法。梯度下降法實現簡單,當目標函數是凸函數時,梯度下降法的解是全局解。一般情況下,其解不保證是全局最優解,梯度下降法的速度也未必是最快的。梯度下降法的優化思想是用當前位置負梯度方向作為搜索方向,因為該方向為當前位置的最快下降方向,所以也被稱為是”最速下降法“。最速下降法越接近目標值,步長越小,前進越慢。梯度下降法的搜索迭代示意圖如下圖所示:
梯度下降法的缺點:
(1)靠近極小值時收斂速度減慢,如下圖所示;
(2)直線搜索時可能會產生一些問題;
(3)可能會“之字形”地下降。
從上圖可以看出,梯度下降法在接近最優解的區域收斂速度明顯變慢,利用梯度下降法求解需要很多次的迭代。
在機器學習中,基於基本的梯度下降法發展了兩種梯度下降方法,分別為隨機梯度下降法和批量梯度下降法。
比如對一個線性回歸(Linear Logistics)模型,假設下面的h(x)是要擬合的函數,J(theta)為損失函數,theta是參數,要迭代求解的值,theta求解出來了那最終要擬合的函數h(theta)就出來了。其中m是訓練集的樣本個數,n是特征的個數。
1)批量梯度下降法(Batch Gradient Descent,BGD)
(1)將J(theta)對theta求偏導,得到每個theta對應的的梯度:
(2)由於是要最小化風險函數,所以按每個參數theta的梯度負方向,來更新每個theta:
(3)從上面公式可以注意到,它得到的是一個全局最優解,但是每迭代一步,都要用到訓練集所有的數據,如果m很大,那么可想而知這種方法的迭代速度會相當的慢。所以,這就引入了另外一種方法——隨機梯度下降。
對於批量梯度下降法,樣本個數m,x為n維向量,一次迭代需要把m個樣本全部帶入計算,迭代一次計算量為m*n2。
2)隨機梯度下降(Stochastic Gradient Descent,SGD)
(1)上面的風險函數可以寫成如下這種形式,損失函數對應的是訓練集中每個樣本的粒度,而上面批量梯度下降對應的是所有的訓練樣本:
(2)每個樣本的損失函數,對theta求偏導得到對應梯度,來更新theta:
(3)隨機梯度下降是通過每個樣本來迭代更新一次,如果樣本量很大的情況(例如幾十萬),那么可能只用其中幾萬條或者幾千條的樣本,就已經將theta迭代到最優解了,對比上面的批量梯度下降,迭代一次需要用到十幾萬訓練樣本,一次迭代不可能最優,如果迭代10次的話就需要遍歷訓練樣本10次。但是,SGD伴隨的一個問題是噪音較BGD要多,使得SGD並不是每次迭代都向着整體最優化方向。
隨機梯度下降每次迭代只使用一個樣本,迭代一次計算量為n2,當樣本個數m很大的時候,隨機梯度下降迭代一次的速度要遠高於批量梯度下降方法。兩者的關系可以這樣理解:隨機梯度下降方法以損失很小的一部分精確度和增加一定數量的迭代次數為代價,換取了總體的優化效率的提升。增加的迭代次數遠遠小於樣本的數量。
對批量梯度下降法和隨機梯度下降法的總結:
批量梯度下降---最小化所有訓練樣本的損失函數,使得最終求解的是全局的最優解,即求解的參數是使得風險函數最小,但是對於大規模樣本問題效率低下。
隨機梯度下降---最小化每條樣本的損失函數,雖然不是每次迭代得到的損失函數都向着全局最優方向, 但是大的整體的方向是向全局最優解的,最終的結果往往是在全局最優解附近,適用於大規模訓練樣本情況。
2. 牛頓法和擬牛頓法(Newton's method & Quasi-Newton Methods)
1)牛頓法(Newton's method)
牛頓法是一種在實數域和復數域上近似求解方程的方法。方法使用函數f (x)的泰勒級數的前面幾項來尋找方程f (x) = 0的根。牛頓法最大的特點就在於它的收斂速度很快。
具體步驟:
首先,選擇一個接近函數 f (x)零點的 x0,計算相應的 f (x0) 和切線斜率f ' (x0)(這里f ' 表示函數 f 的導數)。然后我們計算穿過點(x0, f (x0)) 並且斜率為f '(x0)的直線和 x 軸的交點的x坐標,也就是求如下方程的解:
我們將新求得的點的 x 坐標命名為x1,通常x1會比x0更接近方程f (x) = 0的解。因此我們現在可以利用x1開始下一輪迭代。迭代公式可化簡為如下所示:
已經證明,如果f ' 是連續的,並且待求的零點x是孤立的,那么在零點x周圍存在一個區域,只要初始值x0位於這個鄰近區域內,那么牛頓法必定收斂。 並且,如果f ' (x)不為0, 那么牛頓法將具有平方收斂的性能. 粗略的說,這意味着每迭代一次,牛頓法結果的有效數字將增加一倍。下圖為一個牛頓法執行過程的例子。
由於牛頓法是基於當前位置的切線來確定下一次的位置,所以牛頓法又被很形象地稱為是"切線法"。牛頓法的搜索路徑(二維情況)如下圖所示:
牛頓法搜索動態示例圖:
關於牛頓法和梯度下降法的效率對比:
從本質上去看,牛頓法是二階收斂,梯度下降是一階收斂,所以牛頓法就更快。如果更通俗地說的話,比如你想找一條最短的路徑走到一個盆地的最底部,梯度下降法每次只從你當前所處位置選一個坡度最大的方向走一步,牛頓法在選擇方向時,不僅會考慮坡度是否夠大,還會考慮你走了一步之后,坡度是否會變得更大。所以,可以說牛頓法比梯度下降法看得更遠一點,能更快地走到最底部。(牛頓法目光更加長遠,所以少走彎路;相對而言,梯度下降法只考慮了局部的最優,沒有全局思想。)
根據wiki上的解釋,從幾何上說,牛頓法就是用一個二次曲面去擬合你當前所處位置的局部曲面,而梯度下降法是用一個平面去擬合當前的局部曲面,通常情況下,二次曲面的擬合會比平面更好,所以牛頓法選擇的下降路徑會更符合真實的最優下降路徑。
注:紅色的牛頓法的迭代路徑,綠色的是梯度下降法的迭代路徑。
牛頓法的優缺點總結:
優點:二階收斂,收斂速度快;
缺點:牛頓法是一種迭代算法,每一步都需要求解目標函數的Hessian矩陣的逆矩陣,計算比較復雜。
2)擬牛頓法(Quasi-Newton Methods)
擬牛頓法是求解非線性優化問題最有效的方法之一,於20世紀50年代由美國Argonne國家實驗室的物理學家W.C.Davidon所提出來。Davidon設計的這種算法在當時看來是非線性優化領域最具創造性的發明之一。不久R. Fletcher和M. J. D. Powell證實了這種新的算法遠比其他方法快速和可靠,使得非線性優化這門學科在一夜之間突飛猛進。
擬牛頓法的本質思想是改善牛頓法每次需要求解復雜的Hessian矩陣的逆矩陣的缺陷,它使用正定矩陣來近似Hessian矩陣的逆,從而簡化了運算的復雜度。擬牛頓法和最速下降法一樣只要求每一步迭代時知道目標函數的梯度。通過測量梯度的變化,構造一個目標函數的模型使之足以產生超線性收斂性。這類方法大大優於最速下降法,尤其對於困難的問題。另外,因為擬牛頓法不需要二階導數的信息,所以有時比牛頓法更為有效。如今,優化軟件中包含了大量的擬牛頓算法用來解決無約束,約束,和大規模的優化問題。
具體步驟:
擬牛頓法的基本思想如下。首先構造目標函數在當前迭代xk的二次模型:





3. 共軛梯度法(Conjugate Gradient)

4. 啟發式優化方法
啟發式方法指人在解決問題時所采取的一種根據經驗規則進行發現的方法。其特點是在解決問題時,利用過去的經驗,選擇已經行之有效的方法,而不是系統地、以確定的步驟去尋求答案。啟發式優化方法種類繁多,包括經典的模擬退火方法、遺傳算法、蟻群算法以及粒子群算法等等。
還有一種特殊的優化算法被稱之多目標優化算法,它主要針對同時優化多個目標(兩個及兩個以上)的優化問題,這方面比較經典的算法有NSGAII算法、MOEA/D算法以及人工免疫算法等。
5. 解決約束優化問題——拉格朗日乘數法
5.1 拉格朗日乘數法的基本思想
作為一種優化算法,拉格朗日乘子法主要用於解決約束優化問題,它的基本思想就是通過引入拉格朗日乘子來將含有n個變量和k個約束條件的約束優化問題轉化為含有(n+k)個變量的無約束優化問題。拉格朗日乘子背后的數學意義是其為約束方程梯度線性組合中每個向量的系數。
如何將一個含有n個變量和k個約束條件的約束優化問題轉化為含有(n+k)個變量的無約束優化問題?拉格朗日乘數法從數學意義入手,通過引入拉格朗日乘子建立極值條件,對n個變量分別求偏導對應了n個方程,然后加上k個約束條件(對應k個拉格朗日乘子)一起構成包含了(n+k)變量的(n+k)個方程的方程組問題,這樣就能根據求方程組的方法對其進行求解。
解決的問題模型為約束優化問題:
min/max a function f(x,y,z), where x,y,z are not independent and g(x,y,z)=0.
即:min/max f(x,y,z)
s.t. g(x,y,z)=0
5.2 數學實例
首先,我們先以麻省理工學院數學課程的一個實例來作為介紹拉格朗日乘數法的引子。
【麻省理工學院數學課程實例】求雙曲線xy=3上離遠點最近的點。
解:
首先,我們根據問題的描述來提煉出問題對應的數學模型,即:
min f(x,y)=x2+y2(兩點之間的歐氏距離應該還要進行開方,但是這並不影響最終的結果,所以進行了簡化,去掉了平方)
s.t. xy=3.
根據上式我們可以知道這是一個典型的約束優化問題,其實我們在解這個問題時最簡單的解法就是通過約束條件將其中的一個變量用另外一個變量進行替換,然后代入優化的函數就可以求出極值。我們在這里為了引出拉格朗日乘數法,所以我們采用拉格朗日乘數法的思想進行求解。
我們將x2+y2=c的曲線族畫出來,如下圖所示,當曲線族中的圓與xy=3曲線進行相切時,切點到原點的距離最短。也就是說,當f(x,y)=c的等高線和雙曲線g(x,y)相切時,我們可以得到上述優化問題的一個極值(注意:如果不進一步計算,在這里我們並不知道是極大值還是極小值)。
現在原問題可以轉化為求當f(x,y)和g(x,y)相切時,x,y的值是多少?
如果兩個曲線相切,那么它們的切線相同,即法向量是相互平行的,▽f//▽g.
由▽f//▽g可以得到,▽f=λ*▽g。
這時,我們將原有的約束優化問題轉化為了一種對偶的無約束的優化問題,如下所示:
原問題:min f(x,y)=x2+y2 對偶問題:由▽f=λ*▽g得,
s.t. xy=3 fx=λ*gx,
fy=λ*gy,
xy=3.
約束優化問題 無約束方程組問題
通過求解右邊的方程組我們可以獲取原問題的解,即
2x=λ*y
2y=λ*x
xy=3
通過求解上式可得,λ=2或者是-2;當λ=2時,(x,y)=(sqrt(3), sqrt(3))或者(-sqrt(3), -sqrt(3)),而當λ=-2時,無解。所以原問題的解為(x,y)=(sqrt(3), sqrt(3))或者(-sqrt(3), -sqrt(3))。
通過舉上述這個簡單的例子就是為了體會拉格朗日乘數法的思想,即通過引入拉格朗日乘子(λ)將原來的約束優化問題轉化為無約束的方程組問題。
5.3 拉格朗日乘數法的基本形態
求函數在滿足
下的條件極值,可以轉化為函數
的無條件極值問題。
我們可以畫圖來輔助思考。
綠線標出的是約束g(x,y)=c的點的軌跡。藍線是f(x,y)的等高線。箭頭表示斜率,和等高線的法線平行。
從圖上可以直觀地看到在最優解處,f和g的斜率平行。
▽[f(x,y)+λ(g(x,y)−1)]=0, λ≠0
一旦求出λ的值,將其套入下式,易求在無約束極值和極值所對應的點。
F(x,y)=f(x,y)+λ(g(x,y)−c)
新方程F(x,y)在達到極值時與f(x,y)相等,因為F(x,y)達到極值時g(x,y)−c總等於零。
上述式子取得極小值時其導數為0,即▽f(x)+▽∑λigi(x)=0,也就是說f(x)和g(x)的梯度共線。
題目1:
給定橢球
求這個橢球的內接長方體的最大體積。這個問題實際上就是條件極值問題,即在條件
下,求的最大值。
當然這個問題實際可以先根據條件消去,然后帶入轉化為無條件極值問題來處理。但是有時候這樣做很困難,甚至是做不到的,這時候就需要用拉格朗日乘數法了。通過拉格朗日乘數法將問題轉化為
對求偏導得到
聯立前面三個方程得到和
,帶入第四個方程解之
帶入解得最大體積為
拉格朗日乘數法對一般多元函數在多個附加條件下的條件極值問題也適用。
題目2:
題目:求離散分布的最大熵。
分析:因為離散分布的熵表示如下
而約束條件為
要求函數的最大值,根據拉格朗日乘數法,設
對所有的求偏導數,得到
計算出這個等式的微分,得到
這說明所有的都相等,最終解得
因此,使用均勻分布可得到最大熵的值。
5.4 拉格朗日乘數法與KKT條件
我們上述討論的問題均為等式約束優化問題,但等式約束並不足以描述人們面臨的問題,不等式約束比等式約束更為常見,大部分實際問題的約束都是不超過多少時間,不超過多少人力,不超過多少成本等等。所以有幾個科學家拓展了拉格朗日乘數法,增加了KKT條件之后便可以用拉格朗日乘數法來求解不等式約束的優化問題了。
首先,我們先介紹一下什么是KKT條件。
KKT條件是指在滿足一些有規則的條件下, 一個非線性規划(Nonlinear Programming)問題能有最優化解法的一個必要和充分條件. 這是一個廣義化拉格朗日乘數的成果. 一般地, 一個最優化數學模型的列標准形式參考開頭的式子, 所謂 Karush-Kuhn-Tucker 最優化條件,就是指上式的最優點x∗必須滿足下面的條件:
1). 約束條件滿足gi(x∗)≤0,i=1,2,…,p, 以及,hj(x∗)=0,j=1,2,…,q
2). ∇f(x∗)+∑i=1μi∇gi(x∗)+∑j=1λj∇hj(x∗)=0, 其中∇為梯度算子;
3). λj≠0且不等式約束條件滿足μi≥0,μigi(x∗)=0,i=1,2,…,p。
KKT條件第一項是說最優點x∗必須滿足所有等式及不等式限制條件, 也就是說最優點必須是一個可行解, 這一點自然是毋庸置疑的. 第二項表明在最優點x∗, ∇f必須是∇gi和∇hj的線性組合, μi和λj都叫作拉格朗日乘子. 所不同的是不等式限制條件有方向性, 所以每一個μi都必須大於或等於零, 而等式限制條件沒有方向性,所以λj沒有符號的限制, 其符號要視等式限制條件的寫法而定.
為了更容易理解,我們先舉一個例子來說明一下KKT條件的由來。
let L(x,μ)=f(x)+∑k=1μkgk(x),其中μk≥0,gk(x)≤0
∵μk≥0 gk(x)≤0 => μg(x)≤0
∴maxμL(x,μ)=f(x) (2)
∴minxf(x)=minxmaxμL(x,μ) (3)
maxμminxL(x,μ)=maxμ[minxf(x)+minxμg(x)]=maxμminxf(x)+maxμminxμg(x)=minxf(x)+maxμminxμg(x)
又∵μk≥0, gk(x)≤0
∴maxμminxμg(x)=0, 此時μ=0 or g(x)=0.
minxmaxμL(x,μ)=maxμminxL(x,μ)=minxf(x)
我們把maxμminxL(x,μ)稱為原問題minxmaxμL(x,μ)的對偶問題,上式表明當滿足一定條件時原問題、對偶的解、以及minxf(x)是相同的,且在最優解x∗處μ=0 or g(x∗)=0。把x∗代入(2)得maxμL(x∗,μ)=f(x∗),由(4)得maxμminxL(x,μ)=f(x∗),所以L(x∗,μ)=minxL(x,μ),這說明x∗也是L(x,μ)的極值點,即
最后總結一下:
KKT條件是拉格朗日乘子法的泛化,如果我們把等式約束和不等式約束一並納入進來則表現為:
注:x,λ,μ都是向量。
表明f(x)在極值點x∗處的梯度是各個hi(x∗)和gk(x∗)梯度的線性組合。