最優化算法
隨着大數據的到來,並行計算的流行,實際上機器學習領域的不少研究者會把重點放在最優化方法的研究上,如large scale computation。那麼爲何要研究最優化呢?咱們先從機器學習研究的目的提及。機器學習理論主要是設計和分析一些讓計算機能夠自動「學習」的算法,這些算法能夠從數據中自動分析得到規律,並利用規律對未知數據進行預測,並可用於發現數據之間隱藏的關係,解釋某些現象的發生。至於爲何要讓機器去作這些事情,緣由很簡單,數據量和維度過於龐大,沒法經過人腦簡單的處理或分析這些數據。好比,咱們沒法經過百萬級的DNA序列分析各序列和疾病發生的關係,也沒法在必定有限的時間內標定出1萬張圖像上人臉的位置。因此 研究者傾向於創建一些機器學習模型,經過輸入一個樣本(一我的的DNA序列或者是一副圖片),輸出樣本的標籤(是否患病、頭像的位置)。這些學習模型裏有大量能夠調整的參數,它們經過調整參數組合,擬合高維空間訓練樣本數據的分佈,識別出數據和標籤之間複雜的關係。目前已有的神經網絡、支持向量機、AdaBoost、卷積神經網絡等算法,它們的共同特色是經過調整參數讓模型的目標函數儘量大或者小(如logistic迴歸是使得分類錯誤率儘可能小)。爲了達到該目的,不一樣的機器學習算法首先會設定不一樣的目標函數,而後給參數賦上隨機初值,最後用各類降低法更快更好地尋找能讓分類錯誤率更小的參數組合。編程
因此,從廣義上講,機器學習算法的本質上是優化問題求解,例如,梯度降低、牛頓法、共軛梯度法都是常見的機器學習算法優化方法。那麼有人確定會有疑問,這不仍是調參數、選擇參數麼?這個參數優化與以前的調參的概念是不一樣的,以前說的調參是針對算法中的自由參數(即經過經驗指定的參數,用過weka或者R的人應該知道,如SVM中的gamma或者logistic迴歸中的懲罰因子lamda),這些參數主要是控制學習模型的泛化能力,防止過擬合。而這裏經過優化算法迭代出的參數則是目標函數中待求解的參數,例如,神經網絡中各隱含層節點的權值、logistic迴歸中各自變量的係數。對於不一樣目標函數和不一樣優化算法,產生的問題也各不相同,好比某些目標函數不是凸函數也不是無約束的優化問題,沒法直接利用梯度降低算法求解,又例如梯度降低法每每只能保證找到目標函數的局部最小值,找不到全局最小值,那麼該怎麼解決這些問題呢?答案是不一味的強行採用梯度降低,而是引入其餘變量(拉格朗日乘子)將有約束問題轉化爲無約束問題,也能夠適當爬登山,說不定能跳出小水溝(局部極小值)找到真正的深井(全局極小值),這種算法叫模擬退火。也能夠增大搜索範圍,讓一羣螞蟻(蟻羣算法)或者鳥兒(粒子羣算法)一齊搜索,或者讓參數巧妙地隨機改變(遺傳算法)。因此,如何更快的找到目標函數的全局最小值或者全局最大值,如何避免陷入局部最優解是優化算法研究的重點。數組
講了這麼多,主要是爲了說明機器學習與最優化問題的聯繫,也爲你們更好的理解後續機器學習算法提供基礎。接下來,咱們會把講解重點放在放在最優化及凸優化理論上。網絡
1. 最優化問題app
數值優化問題或者簡稱爲優化問題主要是求問題的解,優化問題具備如下通常形式:機器學習
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.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法、進退法、平分法等。
函數逼近法包括牛頓法、割線法、拋物線法、三次插值法、有理插值法等。
二、梯度降低法(最速降低法)
即利用一階的梯度信息找到函數局部最優解的一種方法。核心迭代公式爲
其中,pk是第k次迭代時選取的移動方向,在梯度降低法中,移動的方向設定爲梯度的負方向。
ak是第k次迭代是移動的步長,每次移動的步長能夠固定也能夠改變。在數學上,步長能夠經過line search令導數爲零找到該方向上的最小值,可是在實際編程時,這樣計算的代價太大,咱們通常能夠將它設定位一個常量。
所以,梯度降低法計算步驟能夠歸納爲
若是目標函數是一個凸優化問題,那麼梯度降低法得到的局部最優解就是全局最優解,理想的優化效果以下圖,值得注意一點的是,每一次迭代的移動方向都與出發點的等高線垂直:
實際上,梯度還能夠提供不在最快變化方向的其餘方向上坡度的變化速度,即在二維狀況下,按照梯度方向傾斜的圓在平面上投影成一個橢圓。橢球面的形狀受 Hesse 矩陣的條件數影響,橢球面越扁,那麼優化路徑須要走很大的彎路,計算效率很低。這就是常說的鋸齒現象( zig-zagging),將會致使收算法斂速度變慢。
三、牛頓法
前面提到的梯度降低法,主要利用的是目標函數的局部性質,具備必定的「盲目性」。
牛頓法則是利用局部的一階和二階偏導信息,去推測整個目標函數的形狀,進而能夠求得近似函數的全局最小值,而後將當前的最小值設定爲近似函數的最小值。也就是說,牛頓法在二階導數的做用下,從函數的凸性出發,直接搜索怎樣到達極值點,即在選擇方向時,不只考慮當前坡度是否夠大,還會考慮走了一步以後,坡度是否會變得更大。
相比最速降低法,牛頓法帶有必定對全局的預測性,收斂性質也更優良。固然因爲牛頓法是二階收斂的,比梯度降低法收斂的更快。
假設咱們要求f(x)的最小值,首先用泰勒級數求得其二階近似
顯然這裏x是自變量,x^(k)是常量,求解近似函數phi(x)的極值,即令其倒數爲0,很容易獲得
從而獲得牛頓法的迭代公式
顯然除了f(x)二次可微外,還要求f(x)的Hesse矩陣可逆。此外,因爲矩陣取逆的計算複雜爲 n 的立方,當問題規模比較大時,計算量很大,解決的辦法是採用擬牛頓法,如 BFGS, L-BFGS, DFP, Broyden’s Algorithm 進行近似。
此外,若是初始值離局部極小值太遠,泰勒展開並不能對原函數進行良好的近似,致使牛頓法可能不收斂。
咱們給出阻尼牛頓法的計算步驟,其實阻尼牛頓法相較原始牛頓法只是增長了沿牛頓方向的一維搜索:
四、共軛梯度法
共軛梯度法是介於最速降低法與牛頓法之間的一個方法,它僅需一階導數信息,但克服了最速降低法收斂慢的缺點,又避免了牛頓法須要存儲和計算Hesse矩陣並求逆的缺點。
共軛梯度法的基本思想是把共軛性與最速降低法相結合,利用已知點處的梯度構造一組共軛方向,並沿這組方向進行搜索,求出目標函數的極小點。根據共軛方向的基本性質,這種方法具備二次終止性。
共軛梯度法中的核心迭代過程能夠採起不一樣的方案,一種是直接延續,即老是用d^(k+1)=-g(k+1)+beta_k*d^(k)構造搜索方向;一種是把n步做爲一輪,每搜索一輪以後,取一次最速降低方向,開始下一輪,此種策略稱爲「重置」。
下面咱們介紹一種傳統的共軛梯度法
注意,上述算法中均假設採用的精確一維搜索,但實際計算中,精確一維搜索會帶來必定困難,代價較大,一般仍是採用不精確的一維搜索。但此時(4)中構造的搜索方向可能就不是降低方向了,解決這個問題有兩個方法。
其一,當d^(k+1)不是降低方向時,以最速降低方向從新開始。事實上,這也存在問題,但一維搜索比較粗糙時,這樣從新開始多是大量的,會下降計算效率。
其二,在計算過程當中增長附加的檢驗,具體細節能夠參考陳寶林老師的「最優化理論與方法」的P301。