作者:Parul Pandey
機器之心編譯
參與:Panda
梯度下降是最常用的機器學習優化算法之一,Towards Data Science 近日發布了一篇文章,淺顯易懂地解釋了梯度下降的原理和工作過程。
「過早優化是罪惡之源。」
——計算機科學家和數學家 Donald Ervin Knuth
敏捷(agile)是軟件開發過程中的一個廣為人知的術語。其背后的基本思想很簡單:快速構建出來→發布它→獲得反饋→基于反饋進行修改→重復這一過程。這種做法的目標是讓產品親近用戶,并讓用戶通過反饋引導你,以實現錯誤最少的可能最優的產品。另外,改進的步驟也需要很小,并且也應該讓用戶能持續地參與進來。在某種程度上講,敏捷軟件開發過程涉及到快速迭代。而梯度下降的基本過程也差不多就是如此——盡快從一個解開始,盡可能頻繁地測量和迭代。
目標
梯度下降算法是一個迭代過程,能讓我們得到一個函數的最小值(這里先不提一些額外的注意事項)。下面的公式將整個梯度下降算法匯總成為了一行:
但我們是怎么得到這個公式的?實際上很簡單,而且僅包含一些高中數學知識(小編:海外高中數學?捂臉)。我們希望能通過這篇文章在線性回歸模型的背景中理解和再現這一公式。
一個機器學習模型
設有一些在一個 2D 空間中的數據點。假設這些數據與一組學生的身高和體重有關。我們希望預測這些量之間的某種關系,以使我們可以預測未來某個新學生的體重。這本質上是監督式機器學習技術的一個簡單案例。
現在,讓我們在空間中畫一條任意的線,并使其穿過某些數據點。那么這條線的方程即為 Y = mX + b,其中 m 是斜率,b 是這條線在 Y 軸上的截距。
預測
給定一組已知的輸入和它們對應的輸出。機器學習模型會嘗試基于這些數據預測新輸入的輸出結果。
機器學習過程
誤差(Error)即為兩個預測結果之間的差異。
與其相關的概念是成本函數或損失函數。
成本函數
成本函數/損失函數評估的是我們的機器學習算法的性能表現。損失函數計算的是單個訓練樣本的誤差,成本函數則是損失函數在整個訓練集上的平均。因此,我會交替地使用這兩個術語。
基本上而言,成本函數能告訴我們在給定了 m 和 b 的值時模型在預測方面的表現「有多好」。
比如說,如果數據集中共有 N 個點,而對于所有這 N 個數據點,我們希望最小化其誤差。因此成本函數就將是總平方誤差,即:
N 個數據點的成本函數
為什么我們要用平方差而不直接使用絕對差呢?因為平方差能讓我們更輕松地推導出一條回歸線。實際上,為了找到那條線,我們需要計算成本函數的一階導數,而計算絕對值的倒數比計算平方值的導數要難得多。
最小化成本函數
任何機器學習算法的目標都是最小化成本函數。
這是因為實際值和預測值之間的誤差越低,就說明算法在學習上的表現就越好。因為我們希望得到最低的誤差值,所以我們希望這些m 和 b 值所得到的誤差盡可能最小。
我們究竟如何最小化任意函數?
仔細觀察,我們的成本函數是 Y=X2 的形式。在笛卡爾坐標系中,這是一個拋物線方程,可以畫成下圖形式:
拋物線
要最小化上述函數,我們需要找到能得到最低 Y值的 X 值,即紅點位置。因為這是一張2D 圖,所以定位其最小值很容易,但在更高維度上情況卻非如此。在這些情況下,我們需要設計一個能定位最小值的算法,這個算法就是梯度下降。
梯度下降
梯度下降是最常用的優化算法之一,也是目前最常用的優化神經網絡的方式。這是一種用于尋找函數最小值的迭代式優化算法。
直觀理解
假設你正沿著下面的圖行走,而且目前正位于綠點位置。你的目標是到達最小值,即紅點位置;但在你的位置處,你無法看到最小值在哪里。
可能的動作會是這樣:
你可能向上或向下
如果你決定了要走的方向,為了到達目的地,你可能跨一大步,也可能走一小步。
本質上講,為了到達最小值,你應該知道兩件事:走哪條路和步子邁多大。
梯度下降算法可使用導數幫助我們有效且高效地做這些決定。導數是源自微積分的一個術語,可作為圖在特定點的斜率而進行計算。所以,如果我們有能力計算這條切線,我們可能就能夠算出為到達最小值所應選擇的方向。我們將在后文更詳細地介紹這一點。
最小值
在上圖中,我們可以在綠點畫一條切線,我們知道,如果我們向上移動,我們就將遠離最小值或者反過來。另外,這條切線也能讓我們了解斜率的陡峭程度。
藍點處的斜率沒有綠點處陡,這意味著從藍點到達最小值所需的步幅比在綠點處要小得多。
成本函數的數學解釋
現在,讓我們將上面介紹的一切寫成數學公式。在等式 y = mX+b 中,m 和 b 是其參數。在訓練過程中,它們的值會進行較小的變化。我們將這個小變化表示成δ。參數的值將分別以m=m-δm和 b=b-δb 的方式更新。這里我們的目標是找到y=mx+b 中能使誤差最小的 m 和 b 值,即最小化成本函數的值。
重寫成本函數:
其思想是,通過計算函數的導數和斜率,我們可以找到該函數的導數/斜率。
學習率
到達最小值或底部的步幅大小被稱為學習率。更大的步幅/更高的學習率可以覆蓋更大區域,但卻有越過最小值的風險。另一方面,更小的步幅/更低的學習率到達最低點需要消耗大量時間。
下面的圖片展示了學習率的概念。在第三張圖中,我們用最少的步驟到達了最小值。這是這一問題的最佳學習率。
可以看到,當學習率過低時,需要很多步驟才能收斂。而當學習率過高時,梯度下降將無法到達最小值,如下圖所示。
不同學習率的實驗結果可參考:https://developers.google.com/machine-learning/crash-course/fitter/graph。
導數
機器學習在優化問題中使用導數。梯度下降等優化算法使用導數來實際決定是增大還是減小權重,以增大或減小目標函數。
如果我們可以計算出一個函數的導數,我們就會知道要繼續的方向就是最小化該函數的方向。我們主要是處理兩個來自微積分的概念:
冪規則
冪規則計算的是提升成冪的變量的導數。
鏈式法則
鏈式法則用于計算復合函數的導數。鏈式法則可以使用萊布尼茲符號表示如下:
如果變量 z 依賴于變量 y,而變量 y 又依賴于變量 x,則 y 和 z 是因變量,而且 z 也通過中間變量依賴于 x。這被稱為鏈式法則,用數學式可寫成:
讓我們通過一個例子來理解:
將冪規則和鏈式法則用于導數,我們可以計算成本函數相對于 m 和 b 的變化方式。這涉及到偏導數的概念,即如果一個函數有兩個變量,則尋找該函數相對于一個變量的偏導數的方法是將另一個變量視為常量。用例子解釋會更清楚:
計算梯度下降
現在我們將這些微積分規則應用于我們原來的等式,并找到成本函數相對于 m 和 b 的導數。重訪成本函數:
為了簡單,讓我們擺脫其中的求和符號。這個求和部分很重要,尤其是涉及到隨機梯度下降(SGD)與批梯度下降的概念時。在批梯度下降的過程中,我們一次性檢查所有訓練樣本的誤差;而在 SGD 過程中,我們每次檢查每個誤差。但是,為了簡單起見,我們假設我們每次檢查每個誤差。
現在,我們來計算與 m 和 b 相關的誤差的梯度:
將這些值放回成本函數,并將其與學習率相乘:
現在,這個等式中的 2 并不是那么重要,因為它只是表示我們的學習率有兩倍或一半那么大。所以我們直接丟掉它。因此,最終這整篇文章都濃縮成了兩個表示梯度下降的簡單等式。
m1,b1 = 下個位置參數;m?,b? = 當前位置參數。
因此,為了求解梯度,我們使用新的 m 和 b 值迭代我們的數據點并計算偏導數。這個新梯度能指出成本函數在當前位置的斜率以及我們應該移動的方向,以便更新我們的參數。我們的更新的大小受學習率控制。
總結
這篇文章的目的是展示梯度下降的概念。我們使用了梯度下降作為線性回歸的優化策略。通過繪制最佳擬合線來測量學生身高和體重之間的關系。但是,需要重點指出,這個線性回歸示例是為了演示簡單而選擇的,梯度下降也可用于其它機器學習技術。
原文鏈接:
https://towardsdatascience.com/understanding-the-mathematics-behind-gradient-descent-dde5dc9be06e
文章來源:機器之心
IEEE Spectrum
《科技縱覽》
官方微信公眾平臺
往期推薦