機器學習 101:一文帶你讀懂梯度下降
原標題 |Machine Learning 101: An Intuitive Introduction to Gradient Descent
作者 |Thalles Silva
譯者 | 汪鵬(重慶郵電大學)、通夜(中山大學)
梯度下降無疑是大多數機器學習(ML)演算法的核心和靈魂。我絕對認為你應該花時間去理解它。因為對於初學者來說,這樣做能夠讓你更好地理解大多數機器學習演算法是如何工作的。另外,想要培養對複雜項目的直覺,理解基本的概念也是十分關鍵的。
為了理解梯度下降的核心,讓我們來看一個運行的例子。這項任務是這個領域的一項老任務——使用一些歷史數據作為先驗知識來預測房價。
我們的目標是討論梯度下降。所以我們讓這個例子簡單一點,以便我們可以專註於重要的部分。
但是在我們開始之前,你可以在原文獲取代碼或:
https://github.com/sthalles/blog-resources
基本概念
假設你想爬一座很高的山,你的目標是最快到達山頂,可你環顧四周後,你意識到你有不止一條路可以走,既然你在山腳,但似乎所有選擇都能讓你離山頂更近。
如果你想以最快的方式到達頂峰,所以你要怎麼做呢?你怎樣才能只邁出一步,而能夠離山頂最近?
到目前為止,我們還不清楚如何邁出這一步!而這就是梯度的用武之地。
正如可汗學院的下面這段視頻所述,梯度獲取了一個多變數函數的所有偏導數。
https://www.khanacademy.org/math/multivariable-calculus/multivariable-derivatives/gradient-and-directional-derivatives/v/gradient?modal=1
讓我們一步步來看看它是如何工作的。
用更簡單的話來說,導數是一個函數在某一點的變化率或斜率。
以f(x)=x2函數為例。f(x)的導數就是另一個函數f"(x)在一個定點x的值,f"(x)就是f(x)的斜率函數。在這種情況下,當x=2時,f(x) = x2的斜率是2 x,也就是2*2=4。
簡單地說,導數指向上升最陡的方向。恰巧的是,梯度和導數基本上是一樣的。除了一點,即梯度是一個向量值函數,向量里包含著偏導數。換句話說,梯度是一個向量,它的每一個分量都是對一個特定變數的偏導數。
以函數f(x,y)=2x2 y2為另一個例子。
這裡的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的偏導數:
W0的偏導數
接下來,我們求W1的偏導數
W1的偏導數
由這兩個偏導數,我們可以得到梯度向量:
梯度向量
其中Err是MSE錯誤函數。
有了這個,我們的下一步是使用梯度更新權重向量W0和W1,以最小化誤差。
我們想要更新權重,以便它們可以在下一次迭代中將錯誤降低。我們需要使它們遵循每個相應梯度信號的相反方向。為此,我們將在這個方向上採取小尺寸η的小步驟。
步長η是學習率,它控制學習速度。根據經驗,一個好的起點是0.1。最後,更新步驟規則設置為:
在代碼中,完整的模型看起來像這樣。查看兩個梯度DW0和DW1前面的減號。這保證了我們將在與梯度相反的方向上採取步驟。
更新權重後,我們使用另一個隨機小批量重複該過程,就是這樣。
逐步地,每次重量更新導致線路中的小的移動朝向其最佳表示。最後,當誤差方差足夠小時,我們就可以停止學習。
隨時間變換的線性模型。第一次權重更新使線條快速達到理想的表示。
此版本的梯度下降稱為迷你批處理(Mini-Batch)隨機梯度下降。在這個版本中,我們使用一小部分訓練數據來計算梯度。每個小批量梯度提供最佳方向的近似值。即使梯度沒有指向確切的方向,實際上它也會收斂到非常好的解決方案。
請注意,在非常快地減小誤差信號之後,模型會減慢並收斂。
如果你仔細觀察錯誤圖表,你會注意到,在開始時學習速度會更快。
然而,在經過一些Epoch之後,它會放慢速度並保持平穩。這是因為,在開始時,指向最陡下降的梯度向量的幅度很長。結果,兩個權重變數W0和W1遭受更大的變化。
接著,隨著它們越來越靠近誤差表面的頂點,梯度逐漸變得越來越小,這導致了權重的非常小的變化。
最後,學習曲線穩定,並且過程完成。
本文編輯:王立魚
英語原文:https://towardsdatascience.com/machine-learning-101-an-intuitive-introduction-to-gradient-descent-366b77b52645
※visdat-數據初步探索性可視化工具
※CVPR 2019開幕與頒獎儀式:最佳論文完成不可能的任務,上萬參會者共建全球化盛會
TAG:AI研習社 |