介紹一下關於機器學習梯度下降自己的理解:
上圖來自 Neural Networks and Deep Learning(美)Michael Nielsen 著
如上圖所示,假設我們需要找到二元函數 C(v1,v2) 的最小值,根據微積分:
(1) |
很明顯,要找到 C(v1,v2) 的最小值,我們需要一個操作使得 C 不斷減少,則我們可以在 v 做每次 ”移動“ 時, C 都能減小那麼一點點,即需要: ∆C < 0
將 (1) 式寫成向量形式:
C 的梯度向量 ∇C: | |
∆v : |
|
則 (1) ∆C 可寫爲: ∆C ≈ ∇C · ∆v
這裏,如果我們用 ∆v = -η∇C , 則代入上式: |
∆C < 0;所以要維持 C 不斷減少,我們只需要滿足 ∆v = −η∇C 即可。
則梯度下降的更新規則可以爲: |
注意,∇C 是梯度向量,它有兩個分量:爲 v 的兩個分量 v1 和 v2 對於 C 在各自方向上的梯度方向。所以我們在v1, v2兩個分量上沿着它們的負梯度方向移動一段距離就行了,η 我們叫做步長,它能決定我們二元函數中自變量v1, v2變化的大小。
好了,咱們理解了上面的東西,接下來,我們來看看怎麼將梯度下降運用在機器學習中!
假設我們利用 MSE 即均方誤差作爲誤差函數,即:
(2) |
上式中,n爲訓練樣本的個數,x代表訓練數據,y(x)爲訓練數據 x 輸入訓練模型之後的實際輸出,a爲標籤,即理想輸出。直觀上來說,上式表示對於n個訓練樣本,訓練模型實際輸出 y(x) 與理想輸出 a 的 "差距" 的平均大小。
我們的目標是最小化 C(w, b)。對於 (2),看起來C中含有的自變量有 w, b ,x 。而很顯然 , x作爲訓練數據,我們是不能運用梯度下降算法來改變它使得我們的 C 變小的,我們只能通過改變 w, b 的值來使得誤差函數不斷減小。這個時候,想想,參考之前講的知識,我們應該怎麼做呢?
我們可以這樣做(參考上面的v):
其中的 C 爲代價函數(在這裏是誤差函數)。
通過重複應用這種更新規則我們就能“讓球體滾下山”,並且有望能找到代價函數的最小值。換句話說,這是一個能讓神經網絡學習的規則。
關於隨機梯度下降
其實也很容易理解:隨機挑選一批訓練數據,訓練,做一次梯度下降(更新一次權重)
{
關於梯度下降我們會有兩種思路:
一種思路是對於輸入的單個訓練數據 x,我們就做一次梯度下降 。這種方法更新速度很快,但是單個訓練樣本不足以代表整個訓練集,而且訓練結果也會波動的比較厲害:
比如我有三個訓練數據 x1、x2, 對應的標籤爲 a1、a2
對於 x1 , 放入訓練模型,得出 y(x1) - a1 = b1 ,b1很大,即 y(x1) 和 a1 “差距”比較大。好,我們做梯度下降,模型中參數改變了,現在做完梯度下降之後 如果我們還將 x1 輸入訓練模型,y1(x1) - a1 = c1 < b1。"差距變小了", 這是毋庸置疑的,畢竟這是在做梯度下降嘛。(因爲參數變了,我將改變參數後的模型記爲y1)
但是對於x2呢,在未輸入訓練數據 x1 來改變模型中參數時,y(x2) - a2 = b2。 在輸入訓練數據x1改變模型中參數後,y1(x2) - a2 = c2。但是很有可能,c2 > b2,也就是說對於x1的那次梯度下降的確降低了 y(x1) 離標籤的“差距”,但是卻增加了 y(x2) 離標籤的“差距”。而我們有對於單個的 x2 做梯度下降時,有可能雖然降低了 y(x2) 離標籤的“差距”,卻又增加了y(x1)離標籤的“差距”。
還有另外一種思路 批量梯度下降:對於每訓練數據,我們將訓練數據中的每一個 x, 我們都求出 對於參數 w, b 的偏導數,然後對其求和再求平均值作爲參數 w, b 的梯度方向。 這種方法更新比較穩定,在結果最終收斂時,基本不會出現波動,但是其更新速度太慢,我們每進行一次參數的更新都需要將所有訓練樣本都放進訓練模型中訓練一遍以得到 (j ∈ [0, n])。
其更新規則如下:
其中 η 爲學習速率,n 爲訓練數據的數量。其中的參數
Wk 和 bl,它倆只是 weights 和 bias 衆多參數中的一個。
}
折中兩種辦法:隨機梯度下降
我們的最小化目標 C 是整個訓練集對於每一個(共n個)訓練數據的模型輸出 y(x) 離標籤 a 的偏差 的和的平均值即: (共n個訓練數據)。
現在我們將最小化目標 C 變爲一批(m個)訓練數據的模型輸出 y(x) 離標籤 a 的偏差 的和的平均值來近似代替上式 , 即:
隨機梯度下降就是一次選取一批:m個訓練數據進行一次梯度下降(參數更新),更新規則如下:
完!