梯度下降法及反向傳播小結

梯度下降法及反向傳播小結

7 人贊了文章

摘要

總結一些神經網路常用的基礎的知識,本文先從梯度下降法開始。會從淺入深,從純數學推導到神經網路中的梯度下降,供參考。

一、手動推導梯度下降法迭代公式:

我們先從純數學公式中,手動推導一下梯度下降法的迭代公式。

(一)梯度下降法:

每一次是沿著梯度方向(垂直方向)接近最優點——鋸齒現象

(由Delta y=▽x·Delta x得到 f(x)-f(x_{0})=▽f(x_{0})^{T}·(x-x_{0}) ,這裡 ▽f(x_{0}) 是函數f(x)在點x_{0}處的一階導數,由於高維涉及到矩陣運算,默認都是列向量,所以要加上轉置變成行向量方便矩陣相乘。)

1、這也就得到了 f(x) 在點 x_{0} 處的一階泰勒展開公式:f(x)=f(x_{0})+▽f(x_{0})^{T}·(x-x_{0})

2、那麼現在要做的就是從點x_{0}開始,通過對自變數x不斷的迭代,找到使得f(x)達到最小的x並且下降速度最快。現在f(x_{0})是初始條件給的已知值,已經固定,要減小f(x)則使得 ▽f(x_{0})^{T}·(x-x_{0}) 最小即可。

3、由兩個向量的內積 <a,b>=|a|·|b|·cos	heta 得,當 ab 夾角為180°時,兩個向量的內積最小值 min<a,b>=-|a|·|b| ,此時 a=-eta·b ( eta 是一個大於0的係數)。所以,當 x-x_{0}=-eta·▽f(x_{0}) 時, ▽f(x_{0})^{T}·(x-x_{0}) 最小,此時下降最快。

由此,我們得到了梯度下降法的迭代公式x=x_{0}-eta·▽f(x_{0}),也可以寫成 x_{k+1}=x_{k}-eta·▽f(x_{k}) ,(eta>0)

補充:

1、要區分梯度下降法和最速下降法的:

梯度下降法是沿著梯度方向,以一定的步長 eta 迭代下降,進而達到最小值;

而最速下降法是在梯度下降法的基礎上,根據已知的f(x)形式和點 x_{0},在進行求導,得到每一步的最優步長eta_{k},從而使得在梯度方向上下降的基礎上,下降的步長最優、下降的更快。這裡看一道最速下降法的例題(手寫了哈- -、):

2、迭代終止條件:

用過計算步長eta_{k}求出 x_{k+1} ,當一階導為零(駐點)且二階導正定(嚴格局部最小值),即 ▽f(x_{k+1})=0▽^{2}f(x_{k+1}) 正定,則嚴格的最小值。

(二)牛頓法:

直接從起始點指向最優點,下圖紅色為牛頓法;綠色為梯度下降法。

根據梯度下降法的推導過程,牛頓法的推導與上面的類似。

1、 f(x)x_{k} 點的二階泰勒展開式: f(x)=f(x_{k})+▽f(x_{k})^{T}·(x-x_{k})+frac{1}{2}(x-x_{k})^{T}·▽^{2}f(x_{k})·(x-x_{k})

其中,x_{k}是起始點,所以x_{k}f(x_{k})▽f(x_{k}) (一階導數)、▽^{2}f(x_{k}) (二階導數)都是常數。(並且,▽^{2}f(x_{k})是正定的,則f(x)x的正定二次函數。)

2、令f(x)x_{k} 點的二階泰勒展開式對 x 求導,並令導數為0:

▽f(x)=0+▽f(x_{k})·1+▽^{2}f(x_{k})·(x-x_{k})=0 ,這樣就解出了函數f(x)的極小點: x=x_{k}-[▽^{2}f(x_{k})]^{-1}·▽f(x_{k})

其中,記 x=x_{k+1} ,就得到了牛頓法的迭代公式: x_{k+1}=x_{k}-[▽^{2}f(x_{k})]^{-1}·▽f(x_{k})(牛頓法的步長為1)。那麼 x_{k+1} 就作為函數f(x)的極小點的新的近似點。

二、神經網路中的梯度下降法:

(一)權重w,偏置b的梯度下降法迭代公式:

如果將神經網路的輸出寫成 y=wx+b 、我們的期望值或者說標籤記做 a ,並且損失函數才用誤差平方和的均值形式。

那麼損失函數為: J(w,b)=frac{1}{2n}sum_{i}^{n}||y_{i}-a_{i}||^{2}

w和b的梯度下降法的迭代公式為: w_{k+1}=w_{k}-eta·frac{partial J}{partial w_{k}} b_{k+1}=b_{k}-eta·frac{partial J}{partial b_{k}} .

(二)梯度下降、隨機梯度下降、批量梯度下降:

這三種方法的w和b的迭代公式都是w_{k+1}=w_{k}-eta·frac{partial J}{partial w_{k}}b_{k+1}=b_{k}-eta·frac{partial J}{partial b_{k}} ,區別在於上面的 J(w,b) 不同。

1、梯度下降法:

(1)計算方法:

梯度下降法是計算整個數據集的損失函數J對於w和b的梯度,並去更新參數w、b。

J(w,b)=frac{1}{2n}sum_{1}^{n}||y_{i}-a_{i}||^{2}

(2)特點:

這種方法也就是最普通的梯度下降法。

①優點:利用全部的訓練樣本,將得到的是一個全局最優解,更精確。

②缺點:利用了所有的訓練數據來計算損失函數的梯度。由於我們每進行一次參數更新需要計算整體訓練數據的梯度,梯度下降會變得很慢並且十分佔內存。

2、隨機梯度下降法:

(1)計算方法:

隨機梯度下降每次只計算一個樣本損失函數J對w和b的梯度,並去更新參數w、b。

J(w_{i},b_{i})=frac{1}{2}||y-a||^{2}

(2)特點:

①優點:隨機梯度下降是通過每個樣本來迭代更新一次,收斂速度快很多。

舉個例子:

如果樣本量很大的情況(例如幾十萬),那麼可能只用其中幾萬條或者幾千條的樣本,就已經迭代到最優解了,對於這種情況隨機梯度下降法比較適合。

對比上面普通的梯度下降,迭代一次需要用到幾十萬訓練樣本,並且一次迭代不可能最優,如果迭代10次的話就需要遍歷訓練樣本10次。

②缺點:

·僅計算一個樣本的梯度,帶來的問題是會有較多的雜訊,使得每次迭代並不都向著整體梯度下降的方向前進,相比於真實梯度而言十分不準確,使得收斂過程曲折並容易陷入局部最優解。

·難以進行並行計算(就是常見到的batch_size)。

3、批量梯度下降法:

(1)計算方法:

一種折中的計算方法,批量梯度下降每次計算m個訓練樣本的損失函數J對w和b的梯度。我們將這些隨機的訓練輸入樣本稱為一個批量數據(batch_size)。期望m個樣本的損失函數總和的平均值大致相等於所有樣本損失函數總和的平均值 :▽J=frac{sum_{j=1}^{n}{▽J_{xj}}}{n}approxfrac{sum_{i=1}^{m}{▽J_{xi}}}{m}

那麼損失函數的計算方式為: J(w_{i:i+m},b_{i:i+m})=frac{1}{2m}sum_{1}^{m}{||y_{i}-a_{i}||^{2}}

(2)特點:相比較於隨機梯度下降計算的梯度更為準確,相比於普通梯度下降計算速度更快。

(三)batch_size、epoch、iteration、迭代終止條件以及常見的超參數

1、batch_size、epoch、iteration:

概念:

①batch_size(批大小):即每次訓練在訓練集中取batch_size個樣本訓練,並行計算;

②iteration(迭代):1個iteration等於使用batchsize個樣本訓練一次;

③epoch(周期):1個epoch等於使用訓練集中的全部樣本訓練一次;

舉個例子:

訓練集共有1000個樣本,batch_size=10。

那麼訓練一次1000個樣本需要:1次epoch,100次iteration。

(在訓練過程中,我們經常設置的是iteration迭代次數)

2、迭代終止條件:

(1)達到迭代次數

(2)early_stop:

①在訓練的過程中,記錄最佳的accuracy,當連續10次epoch(或者很多其它次,可依據實際情況取10、20、30….)沒達到最佳accuracy或不再提升時,就認為「不再提高」,此時使用early_stop停止訓練,可以防止過擬合。

(實際中可能經過某個epoch後,accuracy減少了,可是隨後的epoch又讓accuracy升上去了。所以並非accuracy一降下來,它就不再提高,不能依據accuracy一兩次的連續減少就推斷不再提高。)

②過擬合發生的時候:在模型訓練過程中動態的監測每次迭代(Epoch)後訓練集和驗證集的識別精度,一旦出現訓練集識別率繼續上升而驗證集識別率不再提高,就說明過擬合發生了。

(這種方法還會帶來一個額外的收穫:確定作為超參數之一的迭代數(Epoch Number)的量級。更進一步,甚至可以不設置固定的迭代次數,以過擬合為信號,一旦發生就提前停止(early_stop)訓練,避免後續無效的迭代。)

3、常見的超參數:

周期Epoch、批量數據大小batch_size、學習率(步長) eta

學習衰減率、神經網路層數、隱藏層神經元個數、Adam及Momentmn梯度下降法的優化演算法中的參數(後續會介紹)。

三、BP神經網路中梯度下降法的反向傳播推導:

公式略多了,敲起來費勁,也不容易寫備註,先附上圖片,在做步驟總結。

步驟總結:

1、計算輸出層的殘差: delta_{i}^{(n)}=[f(z_{i}^{(n)})-y_{i}]·f^{′}(z_{i}^{(n)})

2、利用上面推導得到的殘差迭代公式,計算隱藏層殘差:

(1)全連接層: delta_{i}^{(n-1)}=sum_{k=1}^{S_{n}}{[delta_{k}^{(n)}·w_{k_{i}}^{(n-1)}]}·f^{′}(z_{i}^{(n-1)})

(2)卷積層: delta_{i}^{(n-1)}=sum_{k=1}^{filter}{[delta_{k}^{(n)}·w_{k}^{(n-1)}]}·f^{′}(z_{i}^{(n-1)}),(其中,filter是指卷積核中的元素個數)

3、更新w和b:

(1)不考慮正則化:

w_{ij}^{(n)}leftarrow w_{ij}^{(n)}-eta·a_{j}^{(n)}·delta_{i}^{(n+1)}

b_{i}^{(n)}leftarrow b_{i}^{(n)}-eta·delta_{i}^{(n+1)}

(2)考慮正則化:

w_{ij}^{(n)}leftarrow (1-eta·lambda)w_{ij}^{(n)}-eta·a_{j}^{(n)}·delta_{i}^{(n+1)} ,(其中, lambda 是正則化係數)

b_{i}^{(n)}leftarrow b_{i}^{(n)}-eta·delta_{i}^{(n+1)}

最後總結一下反向傳播:

就是將函數分成不同的模塊,這樣計算局部梯度相對容易。

不需要把完整的求導公式推導出來,實際上並不用關於輸入量的梯度數學公式。只需要將表達式分成不同的可以求導的模塊(模塊化、鏈式法則),然後在反向傳播中一步步計算梯度即可。(前面的推導是為了找規律,就是用殘差δ和激活值a的迭代。)

參考:

1、《最優化方法》張薇 薛嘉慶 東北大學出版社

2、《Neural Networks and Deep Learning》

3、blog.csdn.net/sinat_300

4、cnblogs.com/yjbjingcha/

5、機器學習與深度學習講解


推薦閱讀:

TAG:深度學習DeepLearning | 梯度下降 |