最優化
隨着大數據的到來,並行計算的流行,實際上機器學習領域的很多研究者會把重點放在最優化方法的研究上,如large scale computation。那么為什么要研究最優化呢?我們先從機器學習研究的目的說起。機器學習理論主要是設計和分析一些讓計算機可以自動“學習”的算法,這些算法可以從數據中自動分析獲得規律,並利用規律對未知數據進行預測,並可用於發現數據之間隱藏的關系,解釋某些現象的發生。至於為什么要讓機器去做這些事情,原因很簡單,數據量和維度過於龐大,無法通過人腦簡單的處理或分析這些數據。比如,我們無法通過百萬級的DNA序列分析各序列和疾病發生的關系,也無法在一定有限的時間內標定出1萬張圖像上人臉的位置。所以 研究者傾向於建立一些機器學習模型,通過輸入一個樣本(一個人的DNA序列或者是一副圖片),輸出樣本的標簽(是否患病、頭像的位置)。這些學習模型里有大量可以調整的參數,它們通過調整參數組合,擬合高維空間訓練樣本數據的分布,識別出數據和標簽之間復雜的關系。目前已有的神經網絡、支持向量機、AdaBoost、卷積神經網絡等算法,它們的共同特點是通過調整參數讓模型的目標函數盡可能大或者小(如logistic回歸是使得分類錯誤率盡量小)。為了達到該目的,不同的機器學習算法首先會設定不同的目標函數,然后給參數賦上隨機初值,最后用各種下降法更快更好地尋找能讓分類錯誤率更小的參數組合。
所以,從廣義上講,機器學習算法的本質上是優化問題求解,例如,梯度下降、牛頓法、共軛梯度法都是常見的機器學習算法優化方法。那么有人肯定會有疑問,這不還是調參數、選擇參數么?這個參數優化與之前的調參的概念是不同的,之前說的調參是針對算法中的自由參數(即通過經驗指定的參數,用過weka或者R的人應該知道,如SVM中的gamma或者logistic回歸中的懲罰因子lamda),這些參數主要是控制學習模型的泛化能力,防止過擬合。而這里通過優化算法迭代出的參數則是目標函數中待求解的參數,例如,神經網絡中各隱含層節點的權值、logistic回歸中各自變量的系數。對於不同目標函數和不同優化算法,產生的問題也各不相同,比如某些目標函數不是凸函數也不是無約束的優化問題,無法直接利用梯度下降算法求解,又例如梯度下降法往往只能保證找到目標函數的局部最小值,找不到全局最小值,那么該怎么解決這些問題呢?答案是不一味的強行采用梯度下降,而是引入其他變量(拉格朗日乘子)將有約束問題轉化為無約束問題,也可以適當爬爬山,說不定能跳出小水溝(局部極小值)找到真正的深井(全局極小值),這種算法叫模擬退火。也可以增大搜索范圍,讓一群螞蟻(蟻群算法)或者鳥兒(粒子群算法)一齊搜索,或者讓參數巧妙地隨機改變(遺傳算法)。所以,如何更快的找到目標函數的全局最小值或者全局最大值,如何避免陷入局部最優解是優化算法研究的重點。
講了這么多,主要是為了說明機器學習與最優化問題的聯系,也為大家更好的理解后續機器學習算法提供基礎。接下來,我們會把講解重點放在放在最優化及凸優化理論上。
1. 最優化問題
數值優化問題或者簡稱為優化問題主要是求問題的解,優化問題具有以下一般形式:
minimize f0(x)subject to fi(x)<bi, i=1,…,m(1.1)minimize f0(x)subject to fi(x)<bi, i=1,…,m(1.1)
其中,函數f0f0為目標函數,函數fi:Rn→Rfi:Rn→R為不等式,或約束函數。x=(x1,…,xn)x=(x1,…,xn)為向量,是目標函數的待優化參數(optimization variables),也稱為優化問題的可行解,常量b1,…,bmb1,…,bm稱為邊界或約束。當存在向量x∗x∗,使得滿足上式約束的任意向量zz,存在f0(x∗)<f0(z)f0(x∗)<f0(z),則向量x∗x∗稱為上式(1.1)的最優解。當不存在約束時,優化問題稱為無約束的優化問題,反之,稱為有約束的優化問題。對於有約束的優化問題,當目標函數以及約束函數fi(x), i=0,…,mfi(x), i=0,…,m滿為線性函數,則稱該優化問題為線性規划(linear programming)。例如,fi(x)fi(x)滿足fi(αx+βy)=αfi(x)+βfi(y)fi(αx+βy)=αfi(x)+βfi(y);如果目標函數或者約束函數不滿足線性關系,則稱優化問題為非線性規划(nonlinear programming)。如果目標函數和約束函數都滿足凸函數不等式的性質,即:fi(αx+βy)≦αfi(x)+βfi(y)fi(αx+βy)≦αfi(x)+βfi(y),其中α+β=1, α≧0,β≧0α+β=1, α≧0,β≧0則該優化問題可稱為凸優化問題。很明顯, 線性規划問題也服從凸優化問題的條件,只有αα和ββ具有一定的特殊取值時,不等式才能變成等式成立,因此,凸優化問題是線性規划問題的一般形式。
對於機器學習而言,其一般表現為從一系列潛在的模型集合中尋找一個模型能最好的滿足先驗知識以及擬合觀測數據。模型訓練的目的在於找到分類錯誤或者預測誤差最小的模型參數值。相對於優化問題,這里所說的先驗知識可以對應成優化問題的約束函數,而目標函數則是一個評價觀測值和估計值差別的函數(均方誤差函數),或者是評價觀測數據服從某模型下某組參數值的可能性的函數(似然函數)。因此,還是像之前所說過的,機器學習其實就是一個優化問題,優化問題的相關研究進展會極大影響機器學習領域的發展。
最優化算法即用於求解優化問題的方法,啊,簡直是廢話。。。最優化算法的計算效率(時間復雜度和空間復雜度)會嚴重限制算法的應用,例如,對於非光滑函數,傳統的優化算法一般不會有較好的效果;優化參數維度較高時,有些優化算法也不適用。優化問題中,最常見的是最小二乘問題和線性規划,接下來會對這兩個基本的優化問題做簡要介紹。
a. 最小二乘問題
最小二乘問題(Least-Square problems)是無約束優化問題,同時,目標函數是具有aTix−biaiTx−bi形式的線性表達式的平方和,其一般形式可記為:
minimize f0(x)=∥Ax−b∥2=k∑i=1(aTix−bi)2(1.2)minimize f0(x)=∥Ax−b∥2=∑i=1k(aiTx−bi)2(1.2)
其中,A∋Rk×n, k≧nA∋Rk×n, k≧n為觀測樣本集合,向量xx為待優化參數。
最小二乘問題是回歸分析的根本,最小二乘問題很容易辨認,當目標函數為二次函數時,即可認為該優化問題為最小二乘問題。我們學過的解決該問題的最簡單的方法是最小二乘法,我們可以將式(1.2)簡化為求解線性等式,(ATA)x=ATb(ATA)x=ATb。因此,我們可以獲得求解該問題的解析式x=(ATA)−1ATbx=(ATA)−1ATb。該方法的時間復雜度為n2kn2k,當樣本數量以及特征維度較低時(百維、千維),一般計算機會在幾秒內求的最優解,當使用更好的計算資源時,對於同樣的樣本量計算時間會呈指數衰減(摩爾定律)。但是,對於需要滿足實時計算要求時,如果樣本特征維度高於百萬級別,采用最小二乘法求解就會變的不可行。所以,我們一般會采用梯度下降等迭代優化方法求解上述目標函數的可行解,當然為了防止過擬合,可選擇懲罰(regularization)或者偏最小二乘(weighted least-squares)解決該問題。
b. 線性規划
線性規划是優化問題的另一個重要分支,其一般形式為:
miniminze cTxsubject to aTix≦bi, i=1,…,m(1.3)miniminze cTxsubject to aiTx≦bi, i=1,…,m(1.3)
對於線性規划問題,不存在類似最小二乘問題的一步求解方法,即最小二乘法,但是可用於解決線性規划問題的方法很多,如simplex方法,內插點法。雖然無法直接一步求解,但是我們可以通過控制迭代次數或設置停止迭代條件來減少運算的時間復雜度,例如,內插點法的時間復雜度為n2mn2m,其中m≧nm≧n。另外,采用迭代法求解優化問題不一定能像最小二乘法一樣求得全局最優解,但目前的迭代算法大多場合下可以達到最小二乘法一樣的准確度,而且,可滿足實時計算的需求。
同時,很多優化問題都可以轉換成線性規划問題,如Chebyshev approximation problem:
minimize maxi=1,…,k∣aTix−bi∣(1.4)minimize maxi=1,…,k∣aiTx−bi∣(1.4)
其中,x為待優化參數。Chebyshev優化問題與最小二乘問題類似,但最小二乘問題可微(矩陣半正定),而Chebyshev目標函數不可微,所以無法采用最小二乘法求解。我們需要將目標函數進行轉化,即可轉化成線性規划:
minimize tsubject to aTix−t≦bi, −aTix−t≦−bi, wherei=1,…,k(1.5)minimize tsubject to aiTx−t≦bi, −aiTx−t≦−bi, wherei=1,…,k(1.5)
這樣,我們就可采用simplex等方法求解該對偶線性規划問題。
c. 凸優化
凸函數的定義在上面已經介紹過了,即:
minimize f0(x)subject to fi(x)<bi, i=1,…,m(1.6)minimize f0(x)subject to fi(x)<bi, i=1,…,m(1.6)
其中,函數f0,…,fm:Rn→Rf0,…,fm:Rn→R為凸函數。
凸函數定義為:
fi(tx+(1−t)y)≦tfi(x)+(1−t)fi(y)fi(tx+(1−t)y)≦tfi(x)+(1−t)fi(y),其中t≧0(1.7)t≧0(1.7)
也就是說,凸函數其函數圖像上方的點集是凸集,函數圖像上的任意兩點確定的弦在其圖像上方,這里需要點明的是國內某些教材上關於凸函數和凹函數的定義與這里寫的正好相反,這里的凸函數是直觀視覺上的凹函數,即碗形函數。凸函數的定義在定義域C上的凸函數可表現為
凸函數的判定方法一般是求解其二階導數(如果存在),如果其二階導數在區間上非負,則該函數為凸函數。當且僅當,二階導數在區間上恆大於0,則函數稱為嚴格凸函數。凸函數具有如下性質:
(1) 凸函數的一階導數在區間內單調不減;
(2) 凸函數具有仿射不變性,即f(x)f(x)是凸函數,則g(y)=f(Ax+b)g(y)=f(Ax+b)也是凸函數;
(3) 凸函數的任何 極小值都是最小值,嚴格凸函數最多有一個最小值;
(4) 凸函數在區間內(凸集內部)是正定的。最小二乘問題和線性規划問題都屬於凸優化問題。
因為凸函數具有局部最優解就是全局最優解的優良性質,我們可以在求解過程不用過多考慮局部最優解和全局最優解的問題,因此,現有優化問題研究更多放在將一般形式的目標函數轉化為凸函數后求解。而對於凸優化問題,我們可以采用熟知的內插法、梯度下降法、牛頓拉斐遜算法以及BFGS算法等。這些算法以及如何將優化目標函數轉換為凸函數是本系列博客的主要闡述的問題。
數學優化入門:梯度下降法、牛頓法、共軛梯度法
2016-10-15
數學優化入門:梯度下降法、牛頓法、共軛梯度法。前面講的都是從n維空間到一維空間的映射函數,對於從n維歐式空間變換到m維歐式空間的函數f,也可以表示成由m個實函數組成y=f(x)=[y1(x1,…xn),…ym(x1,…,xn)]T。
1、基本概念
1.1 方向導數
1.2 梯度的概念
如果考慮z=f(x,y)描繪的是一座在點(x,y)的高度為f(x,y)的山。那么,某一點的梯度方向是在該點坡度最陡的方向,而梯度的大小告訴我們坡度到底有多陡。
對於含有n個變量的標量函數,其梯度表示為
1.3 梯度與方向導數
函數在某點的梯度是這樣一個向量,它的方向與取得最大方向導數的方向一致,而它的模為方向導數的最大值。
1.4 梯度與等高線
函數z=f(x)在點P(x,y)的梯度的方向與過點的等高線f(x,y)=c在這點的法線的一個方向相同,且從數值較低的等高線指向數值較高的等高線,而梯度的模等於函數在這個法線方向的方向導數。這個法線方向就是方向導數取得最大值的方向。
即負梯度方向為最速下降方向。
1.5 等高面
對於二次函數
其中A為n*n的對稱正定矩陣,x-為一定點,則函數f(x)的等值面f(x,y)=c是一個以x-為中心的橢球面。
此橢球面的形狀受 Hesse 矩陣的條件數影響,長軸與短軸對應矩陣的最小特征值和最大特征值的方向,其大小與特征值的平方根成反比,最大特征值與最小特征值相差越大,橢球面越扁。
矩陣的條件數:矩陣A的條件數等於A的范數與A的逆的范數的乘積,即cond(A)=‖A‖·‖A^(-1)‖,是用來判斷矩陣病態與否的一種度量,條件數越大矩陣越病態。
1.6 Hesse 矩陣
在牛頓法中應用廣泛,定義為
1.7 Jacobi矩陣
前面講的都是從n維空間到一維空間的映射函數,對於從n維歐式空間變換到m維歐式空間的函數f,也可以表示成由m個實函數組成y=f(x)=[y1(x1,…xn),…ym(x1,…,xn)]T。對於函數f,如果其偏導數都存在,可以組成一個m行n列的矩陣,即所謂的Jacobi矩陣:
顯然, 當f(x) 是一個標量函數時,Jacobi矩陣是一個向量,即f(x)的梯度,此時Hesse 矩陣是一個二維矩陣;當f(x)是一個向量值函數時,Jacobi 矩陣是一個二維矩陣,Hesse 矩陣是一個三維矩陣。
1.8 共軛方向
先給出共軛方向的定義:
當A為單位陣時,這兩個方向關於A共軛將等價於兩個方向正交,可見共軛是正交概念的推廣。
我們在來看共軛方向的幾何意義。
前面提到過二次函數
的等值面f(x,y)=c是一個以x-為中心的橢球面。設x^(1)為此橢球面邊緣的一點,則x^(1)處的法向量為
將其中后面一項記作
即由x(1)指向橢圓面中心x-的向量。
下面,設d^(1)為此橢球面在x(1)處的切向量,由於切向量d^(1)與法向量delta f(x(1))正交,即
可見,等值面上一點處的切向量與由此點指向極小點的向量是關於A共軛的。
因此,極小化上述二次函數,若依次沿着d^(1)和d^(2)進行一維搜索,則經過兩次迭代必達到極小點。
1.9 一維搜索
在許多迭代下降算法中,具有一個共同點,就是得到x(k)后,按某種規則確定一個方向d(k),再從x(k)除法,沿方向d(k)在直線上求目標函數f(x(k)+lambda*d(k))的的極小點,從而得到x(k)的后繼點x(k+1),這里求目標函數在直線上的極小點,稱為一維搜索,或者線搜索,可以歸結為單變量lambda的極小化問題。確定的lambda可以成為步長。
一維搜索方法很多,大致可以分為試探法和函數逼近法(插值法)。當然,這兩種方法都是求得即小的的近似值。
試探法包括0.618法、Fibonacci法、進退法、平分法等。
函數逼近法包括牛頓法、割線法、拋物線法、三次插值法、有理插值法等。
2、梯度下降法(最速下降法)
即利用一階的梯度信息找到函數局部最優解的一種方法。核心迭代公式為
其中,pk是第k次迭代時選取的移動方向,在梯度下降法中,移動的方向設定為梯度的負方向。
ak是第k次迭代是移動的步長,每次移動的步長可以固定也可以改變。在數學上,步長可以通過line search令導數為零找到該方向上的最小值,但是在實際編程時,這樣計算的代價太大,我們一般可以將它設定位一個常量。
因此,梯度下降法計算步驟可以概括為
如果目標函數是一個凸優化問題,那么梯度下降法獲得的局部最優解就是全局最優解,理想的優化效果如下圖,值得注意一點的是,每一次迭代的移動方向都與出發點的等高線垂直:
實際上,梯度還可以提供不在最快變化方向的其他方向上坡度的變化速度,即在二維情況下,按照梯度方向傾斜的圓在平面上投影成一個橢圓。橢球面的形狀受 Hesse 矩陣的條件數影響,橢球面越扁,那么優化路徑需要走很大的彎路,計算效率很低。這就是常說的鋸齒現象( zig-zagging),將會導致收算法斂速度變慢。
3、牛頓法
前面提到的梯度下降法,主要利用的是目標函數的局部性質,具有一定的“盲目性”。
牛頓法則是利用局部的一階和二階偏導信息,去推測整個目標函數的形狀,進而可以求得近似函數的全局最小值,然后將當前的最小值設定為近似函數的最小值。也就是說,牛頓法在二階導數的作用下,從函數的凸性出發,直接搜索怎樣到達極值點,即在選擇方向時,不僅考慮當前坡度是否夠大,還會考慮走了一步之后,坡度是否會變得更大。
相比最速下降法,牛頓法帶有一定對全局的預測性,收斂性質也更優良。當然由於牛頓法是二階收斂的,比梯度下降法收斂的更快。
假設我們要求f(x)的最小值,首先用泰勒級數求得其二階近似
顯然這里x是自變量,x^(k)是常量,求解近似函數phi(x)的極值,即令其倒數為0,很容易得到
從而得到牛頓法的迭代公式
顯然除了f(x)二次可微外,還要求f(x)的Hesse矩陣可逆。此外,由於矩陣取逆的計算復雜為 n 的立方,當問題規模比較大時,計算量很大,解決的辦法是采用擬牛頓法,如 BFGS, L-BFGS, DFP, Broyden’s Algorithm 進行近似。
此外,如果初始值離局部極小值太遠,泰勒展開並不能對原函數進行良好的近似,導致牛頓法可能不收斂。
我們給出阻尼牛頓法的計算步驟,其實阻尼牛頓法相較原始牛頓法只是增加了沿牛頓方向的一維搜索:
4、共軛梯度法
共軛梯度法是介於最速下降法與牛頓法之間的一個方法,它僅需一階導數信息,但克服了最速下降法收斂慢的缺點,又避免了牛頓法需要存儲和計算Hesse矩陣並求逆的缺點。
共軛梯度法的基本思想是把共軛性與最速下降法相結合,利用已知點處的梯度構造一組共軛方向,並沿這組方向進行搜索,求出目標函數的極小點。根據共軛方向的基本性質,這種方法具有二次終止性。
共軛梯度法中的核心迭代過程可以采取不同的方案,一種是直接延續,即總是用d^(k+1)=-g(k+1)+beta_k*d^(k)構造搜索方向;一種是把n步作為一輪,每搜索一輪之后,取一次最速下降方向,開始下一輪,此種策略稱為“重置”。
下面我們介紹一種傳統的共軛梯度法
注意,上述算法中均假設采用的精確一維搜索,但實際計算中,精確一維搜索會帶來一定困難,代價較大,通常還是采用不精確的一維搜索。但此時(4)中構造的搜索方向可能就不是下降方向了,解決這個問題有兩個方法。
其一,當d^(k+1)不是下降方向時,以最速下降方向重新開始。事實上,這也存在問題,但一維搜索比較粗糙時,這樣重新開始可能是大量的,會降低計算效率。
其二,在計算過程中增加附加的檢驗,具體細節可以參考陳寶林老師的“最優化理論與方法”的P301。