咱們每一個人都會在咱們的生活或者工做中遇到各類各樣的最優化問題,好比每一個企業和我的都要考慮的一個問題「在必定成本下,如何使利潤最大化」等。最優化方法是一種數學方法,它是研究在給定約束之下如何尋求某些因素(的量),以使某一(或某些)指標達到最優的一些學科的總稱。隨着學習的深刻,博主愈來愈發現最優化方法的重要性,學習和工做中遇到的大多問題均可以建模成一種最優化模型進行求解,好比咱們如今學習的機器學習算法,大部分的機器學習算法的本質都是創建優化模型,經過最優化方法對目標函數(或損失函數)進行優化,從而訓練出最好的模型。常見的最優化方法有梯度降低法、牛頓法和擬牛頓法、共軛梯度法等等。html
梯度降低法是最先最簡單,也是最爲經常使用的最優化方法。梯度降低法實現簡單,當目標函數是凸函數時,梯度降低法的解是全局解。通常狀況下,其解不保證是全局最優解,梯度降低法的速度也未必是最快的。梯度降低法的優化思想是用當前位置負梯度方向做爲搜索方向,由於該方向爲當前位置的最快降低方向,因此也被稱爲是」最速降低法「。最速降低法越接近目標值,步長越小,前進越慢。梯度降低法的搜索迭代示意圖以下圖所示:算法
梯度降低法的缺點:機器學習
(1)靠近極小值時收斂速度減慢,以下圖所示;函數
(2)直線搜索時可能會產生一些問題;post
(3)可能會「之字形」地降低。性能
從上圖能夠看出,梯度降低法在接近最優解的區域收斂速度明顯變慢,利用梯度降低法求解須要不少次的迭代。學習
在機器學習中,基於基本的梯度降低法發展了兩種梯度降低方法,分別爲隨機梯度降低法和批量梯度降低法。優化
好比對一個線性迴歸(Linear Logistics)模型,假設下面的h(x)是要擬合的函數,J(theta)爲損失函數,theta是參數,要迭代求解的值,theta求解出來了那最終要擬合的函數h(theta)就出來了。其中m是訓練集的樣本個數,n是特徵的個數。url
1)批量梯度降低法(Batch Gradient Descent,BGD)spa
(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很大的時候,隨機梯度降低迭代一次的速度要遠高於批量梯度降低方法。二者的關係能夠這樣理解:隨機梯度降低方法以損失很小的一部分精確度和增長必定數量的迭代次數爲代價,換取了整體的優化效率的提高。增長的迭代次數遠遠小於樣本的數量。
對批量梯度降低法和隨機梯度降低法的總結:
批量梯度降低---最小化全部訓練樣本的損失函數,使得最終求解的是全局的最優解,即求解的參數是使得風險函數最小,可是對於大規模樣本問題效率低下。
隨機梯度降低---最小化每條樣本的損失函數,雖然不是每次迭代獲得的損失函數都向着全局最優方向, 可是大的總體的方向是向全局最優解的,最終的結果每每是在全局最優解附近,適用於大規模訓練樣本狀況。
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的二次模型:
function [x] = conjgrad(A,b,x) r=b-A*x; p=r; rsold=r'*r; for i=1:length(b) Ap=A*p; alpha=rsold/(p'*Ap); x=x+alpha*p; r=r-alpha*Ap; rsnew=r'*r; if sqrt(rsnew)<1e-10 break; end p=r+(rsnew/rsold)*p; rsold=rsnew; end end
啓發式方法指人在解決問題時所採起的一種根據經驗規則進行發現的方法。其特色是在解決問題時,利用過去的經驗,選擇已經行之有效的方法,而不是系統地、以肯定的步驟去尋求答案。啓發式優化方法種類繁多,包括經典的模擬退火方法、遺傳算法、蟻羣算法以及粒子羣算法等等。
還有一種特殊的優化算法被稱之多目標優化算法,它主要針對同時優化多個目標(兩個及兩個以上)的優化問題,這方面比較經典的算法有NSGAII算法、MOEA/D算法以及人工免疫算法等。
這部分的內容會在以後的博文中進行詳細總結,敬請期待。這部份內容的介紹已經在博客《[Evolutionary Algorithm] 進化算法簡介》進行了概要式的介紹,有興趣的博友能夠進行參考(2015.12.13)。