【機器學習】——學習率,梯度下降法,批梯度下降,歸一化

爲什麼需要梯度下降法

上一篇內容中我們講到了對於一個損失函數 L(θ)L(\theta) ,其中 θ\theta 是自變量,我們希望 L(θ)L(\theta) 最小,那麼就相當於要尋找一個 θθ{\theta}^* \in \theta ,使得個 L(θ)L({\theta}^*) 爲所有 L(θ)L(\theta) 中的最小值。
那麼如何得到這個 θ{\theta}^* 呢?
當時我的第一反應是:咱高數課不是學過嗎?極值點要麼就是不可導的點,要麼就是導數爲0的點(大概就這麼個意思,具體條件有點記不清了)。那麼我直接求導使得 L(θ)=0L^{'}(\theta) =0,解方程然後把每個解代入 L(θ)L(\theta) 其中值最小的一個不就是 θ{\theta}^* 了嗎?和我想法一樣的同學請舉手哈哈哈。
理論上當然是可以的,然而實際上 L(θ)L(\theta) 通常非常非常非常複雜,所以一般解不出來~~囧放棄這個思路。在講梯度下降法之前我們先回顧一下導數。

導數的物理含義

我們在高等數學中學習過導數,對於一個函數 y=f(x)y = f(x),在 x0x_0 點的導數爲 f(x0)=limΔx0f(x0+Δx))f(x0)Δxf^{'}(x_0) = {\lim_{\Delta x \to 0}\frac{f(x_0 + \Delta x)) - f(x_0)}{\Delta x} },直觀一點理解就是**f(x)f(x)的自變量xxx0x_0處產生一個微小的變化後,函數f(x)f(x)的變化趨勢**。舉個例子,假設f(x)=x2f(x) = x^2
y=x^2
那麼 f(x)=2xf^{'}(x) = 2x
我們知道最低點爲 x=0x=0
x=1x=1 時,f(1)=2f^{'}(1) = 2,當 x=1x=-1 時,f(1)=2f^{'}(1) = -2
導數取值的方向是當前點使得 f(x)f(x) 增大的方向,與當前點與最低點的方向相反。顯然,如果我們希望自變量 xx 朝最低點移動,那麼 xx 的變化方向就應當和導數方向相反。
x=1x=1 時,f(1)=2f^{'}(1) = 2,當 x=2x=2 時,f(1)=4f^{'}(1) = 4
導數的大小代表了當前點的斜率大小。顯然,我們希望在x=2x=2移動地更快,加快接近的速度,而在x=1x=1處移動慢一些避免越過最低點。因此 xx 變化的大小應該和導數的大小成正比。
換言之,想要使得函數變小,自變量應該往與導數相反的方向移動,移動的長度應該和導數值的大小成正比。

梯度下降法

理解了導數的物理意義,我們理解梯度下降法就很簡單了。如果 θ\theta 是一個多維向量 θ=(θ1,θ2,......,θn)\theta =(\theta _1, \theta _2,......,\theta _n ) ,
它的損失函數爲 L(θ1,θ2,......,θn)L(\theta _1, \theta _2,......,\theta _n) ,
那麼它的梯度就是 (L(θ)=L(θ)θ2,L(θ)θ2,....,L(θ)θn)(\nabla L(\theta)=\frac{\partial {L(\theta)}}{\theta_2},\frac{\partial {L(\theta)}}{\theta_2},....,\frac{\partial {L(\theta)}}{\theta_n}) ,
說白了就是對各個變量的導數組成的向量。那麼我們可以把上一部分的結論改爲:想要使得函數變小,自變量應該往與梯度相反的方向移動,移動的長度應該和梯度值的大小成正比 ,寫成公式就是:
θ1=θ0βL(θ0)\theta^1 = \theta^0 - \beta* \nabla L(\theta^0),其中 θ0\theta^0 是更新前的自變量值,θ1\theta^1 是更新後的自變量值。β\beta 是移動的步長,它是一個超參數,需要自己設定,它的選擇在實踐中非常重要

沿着梯度的方向損失函數一定是變小的嗎?

真…不一定。我們來看一個例子。
一個有意思的例子
在數值爲30的點,它在x,y方向顯然應該是向上和向右,但是疊加之後的梯度卻是增大的,所以其實沿着梯度的方向損失函數未必是減小的。怎麼辦?好像也沒啥更好的辦法。。。。

學習率

我們知道了想要使得函數變小,自變量應該往與梯度相反的方向移動,移動的長度應該和梯度值的大小成正比。但是每次移動的多少是一個很重要的問題,爲什麼很重要呢?我們來看下圖:圖片出自李宏毅老師的課件
顯然,我們使用紅,綠、藍、黃三種方式都滿足
沿着與梯度相反的方向移動
這個條件,但步子太大容易扯着蛋,比如黃線直接跳過了最低點。藍色步子太小等到天荒地老,而綠色就更有意思了,來回震盪徘徊無法收斂,而紅色則恰到好處。但是顯然我們無法在實踐中畫出loss的真正曲線(幾萬個神經元的神經網絡,隨時函數複雜的可怕),那麼我們怎麼判斷呢?我們可以看損失函數在每個參數取值時的大小,也就是每更新一次,我算一下損失值,然後看損失的變化。那麼對應四種顏色的直線大概是如下圖所示:
圖片出自李宏毅老師的課件
所以,如果你在訓練一個網絡,發現損失函數飆升,那麼顯然步子太大扯着蛋了(學習率過大),如果一直在減小但是減小速度極慢,那麼你可能可以考慮把學習率調大一些。那麼如果損失函數一直不變了(此時導數接近0)是否就說明我們找到了最優的函數參數了呢?答案是否定的,如下圖圖片出自李宏毅老師的課件
顯然右邊的紅色箭頭指向的是最低點,但是左邊紅色箭頭的終點導數也爲0,也是個極小值點。還有一種極其容易被忽略的情況,大家可以看上圖的四個邊附近都是平行的平面區域,這些點也是導數爲0的點哦。
鞍點
上圖中的鞍點也是導數爲0的點。那麼怎麼辦?怎麼辦?怎麼辦?

隨機梯度下降和批梯度下降

解決的辦法有很多,這裏只介紹其中一種,隨機梯度下降和批梯度下降。
我們假設損失函數爲L=n(y^n(b+wixi))2L = \sum_n(\hat y^n-(b+\sum{w_ix_i}) )^2,損失函數與所有的樣本都有關係,那麼就意味着我們每更新一次參數,都需要對於所有的樣本進行一次計算,顯然這樣做每更新一次參數的計算量是非常大的,我們假設一個epoch爲對於所有的樣本進行一次計算,那麼我們計算n個epoch就只能更新n次參數。那如果我們每次更新參數只用一個樣本呢?假設有m個樣本,我們同樣計算n個epoch,那麼那麼我們計算n個epoch就可以更新n*m次參數,可以大大加快參數更新的速度!這種每次更新參數只用一個樣本的方法就叫隨機梯度下降法
但是我們將了半天只能說明隨機梯度下降更新參數的效率比梯度下降高,和解決梯度爲0的點不是最優解有啥關係呢?我們知道梯度下降法每次參數更新的方向與梯度相反的方向移動,所以對於一個給定的樣本,它的更新方向是固定的,但是隨機梯度下降則不是,它使得參數更新的方向有了隨機性,因爲你隨機取了一個樣本,但是,梯度爲0的點使用隨機梯度下降法很可能梯度不爲0,那麼就可以避免我們的參數更新停在某個梯度爲0但是不是最優解的點。說白了就是隨機梯度下降引入了隨機性。真是法如其名啊哈哈。而且需要注意的是,雖然隨機梯度下降引入了隨機性,但是並不影響隨機梯度的期望,可以理解爲它的平均梯度方向還是之前計算的所有樣本的梯度方向,但是方差很大
但是!我們看隨機梯度下降似乎還是在瞎走?對啊,因爲方差很大,一個樣本的梯度和整個損失函數的梯度不是一碼事,咋辦?批梯度下降應運而生,一個樣本的方向不夠準確,方差大,我多用幾個不就行了?批梯度下降每次更新參數只用多個樣本,事實上,由於gpu可以並行計算多個樣本,現在的深度學習基本都是使用這種方法。那麼問題又來了:多個是多少個?個數(batch size)的大小又對結果有什麼影響呢?結合我們之前講的內容我們可以得到以下結論:

  • 批梯度下降的batch size越大,方差越小,下降的方向就越接近梯度的反方向,就是走的方向越準
  • 批梯度下降的batch size越大,參數更新的效率越低,我們計算n個epoch就可以更新參數的次數爲m*n / batch size,但是多個訓練數據loss function求和後,只做一次梯度下降,加速計算。
  • 批梯度下降的batch size越大,隨機性就越小,參數的更新方向就越固定,可能導致損失函數停留在梯度爲0但是不是最優解的點**
  • 由於batch size越小,隨機性就越大,因此在使用較小的batch size時,儘量不要選擇太大的學習率,可能導致不收斂
  • 一個常見的方法是線性縮放規則 :當批量大小放大m倍時, 學習率也放大m倍,線性縮放規則往往在batch size比較小時適用, 當批量大小非常大時, 線性縮放會使得訓練不穩定

梯度下降與特徵歸一化

我們在機器學習任務中,常常需要對特徵做歸一化,也就是把所有的特徵映射到同一個取值區間。這麼做是爲什麼呢?我們首先假設損失函數爲L=n(y^n(b+wixi))2L = \sum_n(\hat y^n-(b+\sum{w_ix_i}) )^2,對於w1,w2w_1,w_2,它們的導數爲L(w)w1=δx1,L(w)w2=δx2\frac{\partial {L(w)}}{w_1} = -\delta*x_1,\frac{\partial {L(w)}}{w_2} = -\delta*x_2,其中δ=y^n(b+wixi)\delta = \hat y^n-(b+\sum{w_ix_i})是一個固定值,那麼x1x_1x2x_2的值的大小顯然對於參數更新是有影響的,如果學習率是一個固定值,x1x_1x2x_2的值相差數萬倍(完全有可能),那麼w1w_1w2w_2的更新也就相差數萬倍,這樣學習的難度就會增加,因此特徵歸一化對於使用梯度下降法的算法來說是很重要的。上述過程可以用下圖表示:
左圖未做歸一化,右圖做了歸一化

回顧一下, 這篇博客主要講了什麼是梯度下降法,主要內容有:

  • 1.不能通過求解導數爲0的方程來最小化損失函數的原始是通常損失函數都比較複雜,難以求解該方程。

  • 2.導數的物理含義::想要使得函數變小,自變量應該往與導數相反的方向移動,移動的長度應該和導數值的大小成正比。

  • 3.梯度就是對各個變量的導數組成的向量,因此,根據結論2,我們可以知道:想要使得函數變小,自變量應該往與梯度相反的方向移動,移動的長度應該和梯度值的大小成正比。,梯度下降法就是基於這種思想。

  • 4.學習率是很重要的超參數,反映了參數更新的步長。

  • 5.我們瞭解了隨機梯度下降和批梯度下降,它們使得參數更新的方向有了隨機性,可以避免陷入梯度爲0但是不是最優解的點

  • 6.爲什麼要使用特徵歸一化?特徵歸一化對於使用梯度下降法的算法來說爲什麼是很重要的?
    希望這篇博客能對大家有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章