一文通透優化算法:從隨機梯度、隨機梯度降低法到牛頓法、共軛梯度
1 什麼是梯度降低法
常常在機器學習中的優化問題中看到一個算法,即梯度降低法,那到底什麼是梯度降低法呢?php
維基百科給出的定義是梯度降低法(Gradient descent)是一個一階最優化算法,一般也稱爲最速降低法。 要使用梯度降低法找到一個函數的局部極小值,必須向函數上當前點對應梯度(或者是近似梯度)的反方向的規定步長距離點進行迭代搜索。若是相反地向梯度正方向迭代進行搜索,則會接近函數的局部極大值點;這個過程則被稱爲梯度上升法。算法
額,問題又來了,什麼是梯度?爲了不各類複雜的說辭,我們能夠這樣簡單理解,在單變量的實值函數的狀況,梯度就是導數,或者,對於一個線性函數,也就是線的斜率。api
1.1 梯度降低法示例app
舉個形象的例子吧,好比當咱們要作一個房屋價值的評估系統,那都有哪些因素決定或影響房屋的價值呢?好比說面積、房子的大小(幾室幾廳)、地段、朝向等等,這些影響房屋價值的變量被稱爲特徵(feature)。在這裏,爲了簡單,咱們假定房屋只由一個變量影響,那就是房屋的面積。機器學習
假設有一個房屋銷售的數據以下:svg
面積(m^2) 銷售價錢(萬元)函數
123 250性能
150 320學習
87 160優化
102 220
… …
插句題外話,順便吐下槽,這套房屋價格數據在五年前可能還能買到帝都5環左右的房子,但如今只能買到二線城市的房屋了。
咱們能夠作出一個圖,x軸是房屋的面積。y軸是房屋的售價,以下:
若是來了一個新的房子/面積,假設在房屋銷售價格的記錄中沒有的,咱們怎麼辦呢?
咱們能夠用一條曲線去儘可能準的擬合這些數據,而後若是有新的輸入面積,咱們能夠在將曲線上這個點對應的值返回。若是用一條直線去擬合房屋價格數據,可能以下圖這個樣子:
而圖中綠色的點就是咱們想要預測的點。
爲了數學建模,首先給出一些概念和經常使用的符號。
- 房屋銷售記錄表 – 訓練集(training set)或者訓練數據(training data), 是咱們流程中的輸入數據,通常稱爲x
- 房屋銷售價錢 – 輸出數據,通常稱爲y
- 擬合的函數(或者稱爲假設或者模型),通常寫作 y = h(x)
- 訓練數據的條目數(#training set), 一條訓練數據是由一對輸入數據和輸出數據組成的
- 輸入數據的維度(特徵的個數,#features),n
而後便是一個典型的機器學習的過程,首先給出一個輸入數據,咱們的算法會經過一系列的過程獲得一個估計的函數,這個函數有能力對沒有見過的新數據給出一個新的估計,也被稱爲構建一個模型。
咱們用X1,X2..Xn 去描述feature裏面的份量,好比x1=房間的面積,x2=房間的朝向等等,咱們能夠作出一個估計函數:
θ在這兒稱爲參數,在這兒的意思是調整feature中每一個份量的影響力,就是究竟是房屋的面積更重要仍是房屋的地段更重要。
若是咱們令X0 = 1,就能夠用向量的方式來表示了:
咱們程序也須要一個機制去評估咱們θ是否比較好,因此說須要對咱們作出的h函數進行評估,通常這個進行評估的函數稱爲損失函數(loss function),描述h函數很差的程度,這裏咱們稱這個函數爲J函數。
換言之,咱們把對x(i)的估計值與真實值y(i)差的平方和做爲損失函數,前面乘上的係數1/2是爲了方便求導(且在求導的時候,這個係數會消掉)。
如何調整θ以使得J(θ)取得最小值有不少方法,其中有最小二乘法(min square),是一種徹底是數學描述的方法,另一種就是梯度降低法。
1.2 梯度降低算法流程
梯度降低法的算法流程以下:
1)首先對θ賦值,這個值能夠是隨機的,也可讓θ是一個全零的向量。
2)改變θ的值,使得J(θ)按梯度降低的方向進行減小。
爲了描述的更清楚,給出下面的圖:
這是一個表示參數θ與偏差函數J(θ)的關係圖,紅色的部分是表示J(θ)有着比較高的取值,咱們須要的是,可以讓J(θ)的值儘可能的低,也就是達到深藍色的部分(讓偏差/損失最小嘛)。θ0,θ1表示θ向量的兩個維度。
在上面提到梯度降低法的第一步是給θ給一個初值,假設隨機給的初值是在圖上的十字點。
而後咱們將θ按照梯度降低的方向進行調整,就會使得J(θ)往更低的方向進行變化,以下圖所示,算法的結束將是在θ降低到沒法繼續降低爲止。
固然,可能梯度降低的最終點並不是是全局最小點,即也多是一個局部最小點,以下圖所示:
上面這張圖就是描述的一個局部最小點,這是咱們從新選擇了一個初始點獲得的,看來咱們這個算法將會在很大的程度上被初始點的選擇影響而陷入局部最小點。
下面我將用一個例子描述一下梯度減小的過程,對於咱們的函數J(θ)求偏導J:
下面是更新的過程,也就是θi會向着梯度最小的方向進行減小。θi表示更新以前的值,-後面的部分表示按梯度方向減小的量,α表示步長,也就是每次按照梯度減小的方向變化多少。
一個很重要的地方值得注意的是,梯度是有方向的,對於一個向量θ,每一維份量θi均可以求出一個梯度的方向,咱們就能夠找到一個總體的方向,在變化的時候,咱們就朝着降低最多的方向進行變化就能夠達到一個最小點,無論它是局部的仍是全局的。
用更簡單的數學語言進行描述是這樣的:
1.3 梯度降低法是否必定降低最快
梯度降低法並不必定是降低最快的方向,它只是目標函數在當前的點的切平面(固然高維問題不能叫平面)上降低最快的方向。在practical implementation中,牛頓方向(考慮海森矩陣)才通常被認爲是降低最快的方向,能夠達到superlinear的收斂速度。梯度降低類的算法的收斂速度通常是linear甚至sublinear的(在某些帶複雜約束的問題)。
通常解釋梯度降低,會用下山來舉例。假設你如今在山頂處,必須抵達山腳下(也就是山谷最低處)的湖泊。但讓人頭疼的是,你的雙眼被蒙上了沒法辨別前進方向。換句話說,你再也不可以一眼看出哪條路徑是最快的下山路徑,以下圖:
最好的辦法就是走一步算一步,先用腳向四周各個方向都邁出一步,試探一下週圍的地勢,用腳感受下哪一個方向是降低最大的方向。換言之,每走到一個位置的時候,求解當前位置的梯度,沿着梯度的負方向(當前最陡峭的位置向下)走一步。就這樣,每要走一步都根據上一步所在的位置選擇當前最陡峭最快下山的方向走下一步,一步步走下去,一直走到咱們感受已經到了山腳。
固然這樣走下去,咱們走到的可能並不必定是真正的山腳,而只是走到了某一個局部的山峯低處。換句話說,梯度降低不必定可以找到全局的最優解,也有可能只是一個局部最優解。固然,若是損失函數是凸函數,梯度降低法獲得的解就必定是全局最優解。
總之,梯度降低法的優化思想是用當前位置負梯度方向做爲搜索方向,由於該方向爲當前位置的最快降低方向,因此也被稱爲是「最速降低法」。最速降低法越接近目標值,步長越小,前進越慢。梯度降低法的搜索迭代示意圖以下圖所示:
正由於梯度度降低法在接近最優解的區域收斂速度明顯變慢,因此利用梯度降低法求解須要不少次的迭代。在機器學習中,基於基本的梯度降低法發展了兩種梯度降低方法,分別爲隨機梯度降低法和批量梯度降低法。
2 隨機梯度降低
普通的梯度降低算法在更新迴歸係數時要遍歷整個數據集,是一種批處理方法,這樣訓練數據特別忙龐大時,可能出現以下問題:
- 收斂過程可能很是慢;
- 若是偏差曲面上有多個局極小值,那麼不能保證這個過程會找到全局最小值。
2.1 隨機梯度降低
爲了解決上面的問題,實際中咱們應用的是梯度降低的一種變體被稱爲隨機梯度降低。
上面公式中的偏差是針對於全部訓練樣本而獲得的,而隨機梯度降低的思想是根據每一個單獨的訓練樣原本更新權值,這樣咱們上面的梯度公式就變成了:
通過推導後,咱們就能夠獲得最終的權值更新的公式:
有了上面權重的更新公式後,咱們就能夠經過輸入大量的實例樣本,來根據咱們預期的結果不斷地調整權值,從而最終獲得一組權值使得咱們的算法可以對一個新的樣本輸入獲得正確的或無限接近的結果。
這裏作一個對比
設代價函數爲
參數更新爲:
i是樣本編號下標,j是樣本維數下標,m爲樣例數目,n爲特徵數目。因此更新一個θj只須要一個樣本就能夠。
下面兩幅圖能夠很形象的對比各類優化方法(圖來源:http://sebastianruder.com/optimizing-gradient-descent/):
SGD各優化方法在損失曲面上的表現
從上圖能夠看出, Adagrad、Adadelta與RMSprop在損失曲面上可以當即轉移到正確的移動方向上達到快速的收斂。而Momentum 與NAG會致使偏離(off-track)。同時NAG可以在偏離以後快速修正其路線,由於其根據梯度修正來提升響應性。
SGD各優化方法在損失曲面鞍點處上的表現
2.2 批量梯度降低
參數更新爲:
i是樣本編號下標,j是樣本維數下標,m爲樣例數目,n爲特徵數目。因此更新一個θj須要遍歷整個樣本集
此外,如何優化隨機梯度法呢?詳情請點擊:論文公開課第一期:詳解梯度降低等各種優化算法(含視頻和PPT下載)。
3 牛頓法
3.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矩陣的逆矩陣,計算比較複雜。
3.2 擬牛頓法
擬牛頓法(Quasi-Newton Methods)是求解非線性優化問題最有效的方法之一,於20世紀50年代由美國Argonne國家實驗室的物理學家W.C.Davidon所提出來。Davidon設計的這種算法在當時看來是非線性優化領域最具創造性的發明之一。不久R. Fletcher和M. J. D. Powell證明了這種新的算法遠比其餘方法快速和可靠,使得非線性優化這門學科在一晚上之間日新月異。
維基百科是這麼解釋擬牛頓法的
擬牛頓法是一種以牛頓法爲基礎設計的,求解非線性方程組或連續的最優化問題函數的零點或極大、極小值的算法。當牛頓法中所要求計算的Hessian矩陣難以甚至沒法計算時,擬牛頓法即可派上用場。
擬牛頓法的本質思想是改善牛頓法每次須要求解複雜的Hessian矩陣的逆矩陣的缺陷,它使用正定矩陣來近似Hessian矩陣的逆,從而簡化了運算的複雜度。
擬牛頓法和最速降低法同樣只要求每一步迭代時知道目標函數的梯度。經過測量梯度的變化,構造一個目標函數的模型使之足以產生超線性收斂性。這類方法大大優於最速降低法,尤爲對於困難的問題。另外,由於擬牛頓法不須要二階導數的信息,因此有時比牛頓法更爲有效。現在,優化軟件中包含了大量的擬牛頓算法用來解決無約束,約束,和大規模的優化問題。
擬牛頓法的基本思想以下。
與牛頓法相同, 擬牛頓法是用一個二次函數以近似目標函數. 的二階泰勒展開是
其中, 表示的梯度 ,表示Hessian矩陣的近似. 梯度可進一步近似爲下列形式
令上式等於,計算出Newton步長,
而後構造的近似知足
上式稱做割線方程組 .但當是定義在多維空間上的函數時, 從該式計算將成爲一個不定問題 (未知數個數比方程式個數多).此時,構造,根據Newton步長更新當前解的處理須要迴歸到求解割線方程.幾乎不一樣的擬牛頓法就有不一樣的選擇割線方程的方法.而大多數的方法都假定具備對稱性 (即知足). 另外, 下表所示的方法可用於求解; 在此, 於某些範數與儘可能接近.即對於某些正定矩陣, 以如下方式更新:
如下爲該算法的總結:
4 共軛梯度
共軛梯度法是介於梯度降低法(最速降低法)與牛頓法之間的一個方法,它僅需利用一階導數信息,但克服了梯度降低法收斂慢的缺點,又避免了牛頓法須要存儲和計算Hessian矩陣並求逆的缺點,共軛梯度法不只是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的算法之一。
在各類優化算法中,共軛梯度法是很是重要的一種。其優勢是所需存儲量小,具備逐步收斂性,穩定性高,並且不須要任何外來參數。
下圖爲共軛梯度法和梯度降低法搜索最優解的路徑對比示意圖: