梯度降低無疑是大多數機器學習(ML)算法的核心和靈魂。對於初學者來講,這樣作可以讓咱們更好地理解大多數機器學習算法是如何工做的。另外,想要培養對複雜項目的直覺,理解基本的概念也是十分關鍵的。python
爲了理解梯度降低的核心,讓咱們來看一個運行的例子。這項任務是這個領域的一項老任務——使用一些歷史數據做爲先驗知識來預測房價。算法
咱們的目標是討論梯度降低,因此咱們會盡量地舉簡單的例子。網絡
假設咱們想爬一座很高的山,咱們的目標是最快到達山頂,可咱們環顧四周後,意識到有不止一條路能夠走。既然咱們在山腳,那麼全部的路都能讓咱們離山頂更近。運維
若是咱們想以最快的方式到達頂峯,要怎麼作呢?怎樣才能只邁出一步,就可以離山頂最近?機器學習
到目前爲止,咱們還不清楚如何邁出這一步!而這就是梯度的用武之地。函數
正如可汗學院的這段視頻所述,梯度獲取了一個多變量函數的全部偏導數。post
讓咱們一步步來看看它是如何工做的。性能
用更簡單的話來講,導數是一個函數在某一點的變化率或斜率。學習
以f(x)=x²函數爲例。f(x)的導數就是另外一個函數f'(x)在一個定點x的值,f'(x)就是f(x)的斜率函數。在這種狀況下,當x=2時,f(x) = x²的斜率是2 x,也就是2*2=4。ui
f(x) = x²在不一樣點的斜率。
簡單來講,導數指向上升最陡的方向。恰巧的是,梯度和導數基本上是同樣的。除了一點,即梯度是一個向量值函數,向量裏包含着偏導數。換句話說,梯度是一個向量,它的每個份量都是對一個特定變量的偏導數。
以函數f(x,y)=2x²+y²爲另外一個例子。
這裏的f(x,y)是一個多變量函數。它的梯度是一個向量,其中包含了f(x,y)的偏導數,第一個是關於x的偏導數,第二個是關於y的偏導數。
若是咱們計算f(x,y)的偏導數。
獲得的梯度是如下這樣的向量:
請注意,其中每一個元素都指示了函數裏每一個變量的最陡上升方向。換句話說,梯度指向函數增加最多的方向。
回到登山的例子中,坡度指向的方向是最快到達山頂的方向。也就是說,梯度指向一個面更高的地方。
一樣的,若是咱們有一個有四個變量的函數,咱們會獲得一個有四個偏導數的梯度向量。一般,一個有n個變量的函數會產生一個n維梯度向量。
可是對於梯度降低,咱們不想讓f函數儘快地最大化,而是想讓它最小化。
因此咱們須要先定義咱們的任務,讓目標變得更清晰明確一點。
咱們的目標是基於歷史數據來預測房價。而想要創建一個機器學習模型,一般須要至少3個要素——問題T、性能度量P和經驗E。
爲了解決問題T,咱們將使用一個簡單的線性迴歸模型。該模型將從經驗E中學習,通過訓練,模型就能將其知識推廣到未知數據中。
線性模型是一個很好的學習模型。它是許多其餘ML算法的基礎,好比神經網絡和支持向量機。
在本例中,經驗E就是房屋數據集。房屋數據集包含了聖路易斯奧比斯波縣及其周邊地區最近的房地產清單。
數據集包含了781條數據記錄,能夠在原文下載CSV格式的數據文件。爲了簡便,在數據的8個特徵中,咱們只關注其中的兩個特徵 : 房屋大小和價格。在這781條記錄中,每一條記錄的房屋大小(以平方英尺爲單位)將是咱們的輸入特徵,而價格則是咱們的預測目標值。
此外,爲了檢查咱們的模型是否正確地從經驗E中學習到了模式知識,咱們須要一個機制來衡量它的性能。所以,咱們將平方偏差(MSE)的均值做爲性能度量P。
多年來,MSE一直是線性迴歸的標準。但從理論上講,任何其餘偏差測量方法,好比絕對偏差,都是可用的。而MSE的一些優勢是,它對偏差的衡量比絕對偏差更好。
如今咱們已經公式化了咱們的學習算法,接下來就深刻研究代碼。
首先,咱們使用pandas在python中加載數據,並分離房屋大小和價格特徵。以後,咱們對數據進行標準化,以防止某些特徵的大小範圍與其餘特徵不一樣。並且,標準化過的數據在進行梯度降低時,收斂速度比其餘方法快得多。
下面,你能夠看到以平方米爲單位的房價分佈。
按面積計算的房價分佈。數據被標準化到了[0,1]區間。
線性迴歸模型的工做原理是在數據上畫一條線。所以,咱們的模型由一個簡單的直線方程表示。
線性方程,m和b分別是斜率和y軸的截距,x變量是輸入值。
對於線性模型,斜率m和y軸的截距b是兩個自由的參數。咱們則要經過改變這兩個參數來找到最好的直線方程。
咱們將對它們迭代執行一些細小的改變,這樣它就能夠沿着偏差曲面上最陡的降低方向走。在每次迭代以後,這些權重變化將改善咱們的模型,使得它可以表示數據集的趨勢。
在繼續往下看以前,請記住咱們要取梯度的反方向來進行梯度降低。
你能夠把梯度降低想象成一個球滾下山谷。咱們想讓它落在最深的山谷裏,然而很明顯,咱們看到實際狀況可能會出錯。
打個比方,咱們能夠把梯度降低想象成一個球滾下山谷。最深的山谷是最優的全局最小值,這是咱們的目標。
根據球開始滾動的位置,它可能停在某一個山谷的底部。但不是最低的。這叫作局部極小值,在咱們的模型中,山谷就是偏差面。
注意,在類比中,並非全部的局部極小值都是糟糕的。實際上其中一些幾乎和最低的(全局)同樣低(好)。事實上,對於高維偏差曲面,最多見的方法是使用這些局部極小值中的一個(其實也不是很糟糕)。
相似地,咱們初始化模型權重的方法可能會致使它停留在局部極小值。爲了不這種狀況,咱們從均值爲零且方差較小的隨機正態分佈中初始化兩個權值向量。
在每次迭代中,咱們將取數據集的一個隨機子集,並將其與權重線性組合。這個子集稱爲迷你批處理(mini-batch)。在線性組合後,咱們把獲得的向量輸入MSE函數,計算新的偏差。
利用這個偏差,咱們能夠計算出偏差的偏導數,而後獲得梯度。
首先,咱們獲得關於W0的偏導數:
接下來,咱們求W1的偏導數
由這兩個偏導數,咱們能夠獲得梯度向量:
其中Err是MSE錯誤函數。
有了這個,咱們下一步是使用梯度更新權重向量W0和W1,以最小化偏差。
咱們想要更新權重,以便它們能夠在下一次迭代中將錯誤下降。咱們須要使它們遵循每一個相應梯度信號的相反方向。爲此,咱們將在這個方向上採起小尺寸η的小步驟。
步長η是學習率,它控制學習速度。根據經驗,一個好的起點是0.1。最後,更新步驟規則設置爲:
在代碼中,完整的模型看起來像這樣。查看兩個梯度DW0和DW1前面的減號。這保證了咱們將在與梯度相反的方向上採起步驟。
更新權重後,咱們使用另外一個隨機小批量重複該過程,就是這樣。
逐步地,每次重量更新致使線路中的小的移動朝向其最佳表示。最後,當偏差方差足夠小時,咱們就能夠中止學習。
隨時間變換的線性模型。第一次權重更新使線條快速達到理想的表示。
此版本的梯度降低稱爲迷你批處理(Mini-Batch)隨機梯度降低。在這個版本中,咱們使用一小部分訓練數據來計算梯度。每一個小批量梯度提供最佳方向的近似值。即便梯度沒有指向確切的方向,實際上它也會收斂到很是好的解決方案。
每個Epoch的錯誤信號。請注意,在很是快地減少偏差信號以後,模型會減慢並收斂。
若是仔細觀察錯誤圖表,就會注意到,在開始時學習速度會更快。 然而,在通過一些Epoch以後,它會放慢速度並保持平穩。這是由於,在開始時,指向最陡降低的梯度向量的幅度很長。結果,兩個權重變量W0和W1遭受更大的變化。
接着,隨着它們愈來愈靠近偏差表面的頂點,梯度逐漸變得愈來愈小,這致使了權重的很是小的變化。
最後,學習曲線穩定,而且過程完成。
原文標題:Machine Learning 101: An Intuitive Introduction to Gradient Descent
不要光顧着收藏,記得點贊、關注哦~~~