Pytorch_第七篇_深度學習 (DeepLearning) 基礎 [3]---梯度降低

深度學習 (DeepLearning) 基礎 [3]---梯度降低法


Introduce

在上一篇「深度學習 (DeepLearning) 基礎 [2]---神經網絡經常使用的損失函數」中咱們介紹了神經網絡經常使用的損失函數。本文將繼續學習深度學習的基礎知識,主要涉及基於梯度降低的一類優化算法。首先介紹梯度降低法的主要思想,其次介紹批量梯度降低、隨機梯度降低以及小批量梯度降低(mini-batch)的主要區別。html

如下均爲我的學習筆記,如有錯誤望指出。git


梯度降低法

主要思想:沿着梯度反方向更新相關參數,使得代價函數逐步逼近最小值。github

思路歷程算法

假設給咱們一個損失函數,咱們怎麼利用梯度降低法找到函數的最小值呢(換一種說法,即如何找到使得函數最小的參數x)?首先,咱們應該先清楚函數的最小值通常位於哪裏。按個人理解應該是在導數爲0的極值點,然而極值點又不必定都是最小值點,多是局部極小值點。那麼,既然知道了最小值點在某個極值點(梯度爲0),那麼咱們使得損失函數怎麼逼近這個極值點呢?網絡

如今咱們反過來思考上述梯度降低法的主要思想。首先,要理解這個主要思想,咱們須要理解梯度方向是什麼。梯度方向指的是曲面當前點方向導數最大值的方向(指向函數值增大的方向)。假設咱們如今處在函數上x=xt這個點(梯度不爲0,不是極值點),所以如今咱們須要肯定增長x仍是減小x能幫忙咱們逼近函數的最小值。前面說過梯度方向指向函數值增大的方向,所以咱們只要往梯度的反方向更新x,就能找到極小值點。(可能仍是有點迷,下面結合例子具體看梯度降低的執行過程來理解其主要思想函數

note: 因爲凸函沒有局部極小值,所以梯度降低法能夠有效找到全局最小值,對於非凸函數,梯度降低法可能陷入局部極小值。)學習

舉個梨子
假設有一個損失函數以下(當x=0的時候取得最小值,咱們稱x=0爲最優解):大數據

\[y = x^2 \]

咱們須要利用梯度降低法更新參數x的值使得損失函數y達到最小值。首先咱們隨機初始化參數x,假設咱們初始化參數x的值爲xt,以下圖所示:
優化

如今問題轉化爲咱們怎麼更新參數x的值(當前爲xt)使得其愈來愈靠近使得函數達到最小值的最優參數x。直觀上看咱們須要減少x的值,才能使得其愈來愈靠近最優參數。htm

如今咱們求取y對參數x的導(當有多個參數時,爲偏導),以下:

\[y' = 2x \]

因爲xt>0,所以當咱們代入xt到y',咱們能夠發如今點xt處導數(梯度)爲正值,所指方向爲圖中所示的梯度方向。很明顯,咱們不能隨着梯度指示的方向更新參數x,而應該往梯度方向的負方向更新。如上圖所示,很明顯,應該減少x的值才能慢慢靠近最優解。所以,不難給出參數x的更新公式(即梯度降低的參數通常更新公式)以下(α爲學習率):

\[x_{t+1} = x_t - α * y'(x_t) \]

咱們來驗證上述更新公式

  • 當x=xt(xt>0)(位於y軸右邊),則在x處的導數也大於0,由更新公式,下一時刻的x會減小(如上圖所示x=xt減小會愈來愈靠近最優解x=0)。
  • 當x=-xt(xt>0)(位於y軸左邊),則在x處的導數也小於0,代入更新公式,咱們發現下一時刻x會增長(如上圖所示x=-xt增長會愈來愈靠近最優解x=0)。所以推導出的梯度降低參數更新公式符合咱們的目標。
  • 所以不斷對參數x對上述更新,最終x的值會慢慢靠近最優解x=0.

上述即是梯度降低法的原理了,只不過舉的例子比較簡單,多參數(如神經網絡中的參數w和b)的能夠相似推理。

一個注意點:假設咱們如今處在x=xt這個點,若學習率α設置過大,雖然收斂速度可能會加快(每次跨步大),可是xt也可能會過分更新,即(一次性減得太多)可能會越過最優解(跑到最優解的左邊),再一次更新的話也可能會再次越過最優解(一次性加得太多,跑到最優解的右邊),emmm,就這樣反覆橫跳,始終達不到最優解。另外,學習率設置過小的話,x雖然更可能達到最優解,可是算法收斂太慢(x的每個跨步過短)。對於學習率的選擇,能夠按0.00一、0.0一、0.一、1.0這樣子來篩選。


如今依次介紹三種類型的梯度降低法,批量梯度降低、隨機梯度降低以及小批量梯度降低 如下介紹均以Logistic迴歸模型的損失函數(凸函數)爲例,以下

\[z = w1x1+w2x2+b \]

\[y_p = sigmoid(z) \]

\[Loss(y_p,y_t) = -{1\over n}\sum_{i=1}^n (y_tlog(y_p)+(1-y_t)log(1-y_p)) \]

其中input = (x1,x2)爲輸入的訓練樣本。咱們的目標是在訓練樣本集(假設有N個訓練樣本)上尋找最優參數w一、w2以及b使得損失函數在訓練樣本上達到最小的損失。(神經網絡的訓練過程過程就是輸入訓練樣本,計算損失,損失函數反向對待更新參數求梯度,其次按照梯度降低法的參數更新公式朝着梯度反方向更新全部參數,如此往復,直到找到使得損失最小的最優參數或者達到最大迭代次數)(注意到損失函數上還有一個常量n咱們沒有解釋,其實我以爲如下三個基於梯度降低的優化算法主要區別就是在n的取值上)


批量梯度降低(n=N的狀況)

對於上述問題,批量梯度降低的作法是什麼樣的呢?其每次將整個訓練樣本集都輸入神經網絡模型,而後對每一個訓練樣本都求得一個損失,對N個損失加權求和取平均,而後對待更新參數求導數,其次按照梯度降低法的參數更新公式朝着梯度反方向更新全部參數。通俗來說就是每次更新參數都用到了全部訓練樣本(等價於上述損失公式中的n=N)。每一輪參數更新中,每一個訓練樣本對參數更新都有貢獻(每個樣本都給了參數更新必定的指導信息),所以理論上每一輪參數更新提供的信息是很豐富的,參數更新的幅度也是比較大的,使得參數更新能在少數幾輪迭代中就達到收斂(對於凸優化問題能達到全局最優)。然而,對於大數據時代,訓練樣本可能有不少不少,每輪都是用那麼多的樣本進行參數更新的指導的話,更新一次(一次epoch)會很是很是久,這是這種方法的主要缺點


隨機梯度降低(n=1的狀況)

對於上述優化問題,隨機梯度降低(SGD)與批量梯度降低法的主要區別就是, SGD每一輪參數更新都只用一個訓練樣原本指導參數更新(n=1)。也就是說每次只計算出了某訓練樣本的損失,並進行反向傳播指導參數更新。其優勢是每一輪迭代的時間開銷很是低(由於只用到了一個訓練樣本)。然而一個訓練樣本提供的信息可能比較侷限,即其可能使得某次參數更新方向並非朝着全局最優的方向(如噪聲樣本提供的信息可能就是錯誤的,致使其往偏離全局最優的方向更新),可是總體上是朝着全局最優的方向的。雖然隨機梯度降低可能最終只能達到全局最優附近的某個值,可是相對於批量梯度降低來講最好的地方就是速度很快,所以基於精度和效率權衡,更經常使用的仍是SGD。


小批量(mini-batch)梯度降低(n=num_batch)

小批量梯度降低是上述兩種方法的一個折中,即既考慮精度也考慮了收斂速度。那麼折中方法是怎麼作的呢?首先小批量梯度須要設置一個批量的大小(假設是num_batch),而後每次選取一個批量的訓練樣本,計算獲得num_batch個損失,求和取平均後反向傳播來指導參數更新(n=num_batch)。通俗來講就是每一輪的參數更新咱們既不是用上整個訓練樣本集(時間開銷大),也不是隻用一個訓練樣本(可能提供錯誤信息),咱們是使用一個小批量的樣本(1<n<N)來指導參數更新。雖然可能效果沒有批量梯度降低法好,速度沒有隨機梯度降低法快,可是這種方法在精度和收斂速度上是一個很好的折中。所以,在深度學習中,用得比較多的通常仍是小批量(mini-batch)梯度降低。


本文參考-1

本文參考-2

相關文章
相關標籤/搜索