機器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)2反向傳播算法

首先引入以下要使用的新的標(biāo)記符號:

假設(shè)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練樣本有m個,每個包含一組輸入 x 和一組輸出信號 y,L 表示神經(jīng)網(wǎng)絡(luò)層數(shù),S_{l} 表示每層的神經(jīng)元個數(shù),S_{L} 代表最后一層中處理單元的個數(shù)。k表示輸出層的單元數(shù)目(即表示這個問題分k類)

回顧邏輯回歸中的代價函數(shù)為:

在邏輯回歸中,只有一個輸出變量,又稱標(biāo)量,即只有一個因變量y,但是在神經(jīng)網(wǎng)絡(luò)中,我們可以有很多輸出變量,h_{\theta }(x) 是一個維度為 k 的向量,并且訓(xùn)練集中的因變量也是同樣維度的一個向量,因此神經(jīng)網(wǎng)絡(luò)的代價函數(shù)會比邏輯回歸更加復(fù)雜一些,為:?

這個看起來復(fù)雜很多的代價函數(shù)背后的思想還是一樣的,都是希望通過代價函數(shù)來觀察算法預(yù)測的結(jié)果與真實情況的誤差有多大,唯一不同的是,對于每一行特征,都會給出 k 個預(yù)測,基本上可以利用循環(huán),對每一行特征都預(yù)測 k 個不同結(jié)果,然后再利用循環(huán)在 k 個預(yù)測中選擇可能性最高的一個,將其與 y 中的實際數(shù)據(jù)進(jìn)行比較。

正則化的那一項只是每一層的矩陣\theta _{j} 的和(排除\theta _{0} )。最里層的循環(huán) j 循環(huán)所有的行(由S_{l} +1 層的激活單元數(shù)決定),循環(huán) i 則循環(huán)所有的列,由該層(S_{l} 層)的激活單元數(shù)所決定。

反向傳播算法:

之前在計算神經(jīng)網(wǎng)絡(luò)預(yù)測結(jié)果的時候我們采用了一種正向傳播方法,我們從第一層開始正向一層一層進(jìn)行計算,直到計算出最后一層的h_{\theta } (x)

現(xiàn)在,為了更簡便高效計算代價函數(shù)的偏導(dǎo)數(shù),需要采用一種反向傳播算法,也就是首先計算最后一層的誤差,然后再一層一層反向求出各層的誤差,直到倒數(shù)第二層。以一個例子來說明反向傳播算法。

假設(shè)我們的訓(xùn)練集只有一個樣本(x^1,y^1 ),假設(shè)構(gòu)建的神經(jīng)網(wǎng)絡(luò)是一個四層的神經(jīng)網(wǎng)絡(luò),其中? k=4,S_{L} =4,L=4;

前向傳播算法:

反向傳播:

反向傳播中的數(shù)學(xué)原理:(這里為了方便理解,設(shè)只有一個訓(xùn)練樣本)

定義新的標(biāo)記:\delta _{j}^l表示第l 層的第j個結(jié)點的誤差。

這里的誤差的計算實際上類似于前向傳播:(考慮簡單情況,先不考慮正則化項)

從最后一層的誤差開始計算,誤差表示的是激活單元的預(yù)測與實際值之間的誤差。(以下圖片顯示的向量化了)

注:

這里依次反向傳播計算到第二層的誤差,因為第一層是輸入變量,不存在誤差。

有了所有的誤差的表達(dá)式后,便可以計算代價函數(shù)的偏導(dǎo)數(shù)了,假設(shè),即我們不做任何正則化處理時有:

如果我們考慮正則化處理,并且我們的訓(xùn)練集是一個特征矩陣而非向量。在上面的特殊情況中,我們需要計算每一層的誤差單元來計算代價函數(shù)的偏導(dǎo)數(shù)。在更為一般的情況中,我們同樣需要計算每一層的誤差單元,但是我們需要為整個訓(xùn)練集計算誤差單元,此時的誤差單元也是一個矩陣,我們用\Delta _{ij}^l 來表示這個誤差矩陣。第 j 層的第 i 個激活單元受到第 j 個參數(shù)影響而導(dǎo)致的誤差。

首先用正向傳播方法計算出每一層的激活單元,利用訓(xùn)練集的結(jié)果與神經(jīng)網(wǎng)絡(luò)預(yù)測的結(jié)果求出最后一層的誤差,然后利用該誤差運用反向傳播法計算出直至第二層的所有誤差。然后計算出J(\theta )的偏導(dǎo)數(shù):

最后在利用梯度下降等優(yōu)化算法來最小化代價函數(shù)。

梯度檢測:--保證前向傳播和反向傳播基本保證百分百正確

當(dāng)對一個較為復(fù)雜的模型(例如神經(jīng)網(wǎng)絡(luò))使用梯度下降算法時,可能會存在一些不容易察覺的錯誤,意味著,雖然代價看上去在不斷減小,但最終的結(jié)果可能并不是最優(yōu)解。為了避免這樣的問題,可以采取一種叫做梯度的數(shù)值檢驗方法。這種方法的思想是通過估計梯度值來檢驗我們計算的導(dǎo)數(shù)值是否真的是我們要求的。

對梯度的估計采用的方法是在代價函數(shù)上沿著切線的方向選擇離兩個非常近的點然后采用數(shù)學(xué)計算導(dǎo)數(shù)的方法用以估計梯度。即對于某個特定的\theta ,我們計算出在\theta -\varepsilon 處和\theta +\varepsilon 的代價值(是一個非常小的值,通常選取 0.001),然后求兩個代價的平均,用以估計在\theta 處的代價值。

以上僅是當(dāng)\theta 為實數(shù)時,當(dāng)\theta 是一個向量時,代價函數(shù)的偏導(dǎo)數(shù)檢驗只針對一個參數(shù)的改變進(jìn)行檢驗,下面是一個只針對\theta _{1} 進(jìn)行檢驗的示例:(其余計算與之類似)

最后將得到的數(shù)值與反向傳播得到的偏導(dǎo)數(shù)進(jìn)行比較,看在數(shù)值上是否接近,如果非常接近,則認(rèn)為反向傳播的實現(xiàn)是正確的。一旦檢驗確定反向傳播是正確的,就應(yīng)該立刻關(guān)掉梯度檢測,因為梯度檢測的計算量很大,影響效率。

根據(jù)上面的算法,計算出的偏導(dǎo)數(shù)存儲在矩陣D_{ij}^l 中。檢驗時,我們要將該矩陣展開成為向量,同時我們也將\theta 矩陣展開為向量,我們針對每一個 \theta 都計算一個近似的梯度值,將這些值存儲于一個近似梯度矩陣中,最終將得出的這個矩陣同D_{ij}^l 進(jìn)行比較。

隨機初始化:

任何優(yōu)化算法都需要一些初始的參數(shù)。到目前為止都是初始所有參數(shù)為0,這樣的初始方法對于邏輯回歸來說是可行的,但是對于神經(jīng)網(wǎng)絡(luò)來說是不可行的。如果令所有的初始參數(shù)都為0,這將意味著第二層的所有激活單元都會有相同的值。同理,如果我們初始所有的參數(shù)都為一個非0的數(shù),結(jié)果也是一樣的,所以需要隨機初始化

訓(xùn)練神經(jīng)網(wǎng)絡(luò)過程總結(jié)

小結(jié)一下使用神經(jīng)網(wǎng)絡(luò)時的步驟:

網(wǎng)絡(luò)結(jié)構(gòu):第一件要做的事是選擇網(wǎng)絡(luò)結(jié)構(gòu),即決定選擇多少層以及決定每層分別有多少個單元。

輸入層-第一層的單元數(shù)即我們訓(xùn)練集的特征數(shù)量。輸出層-最后一層的單元數(shù)是我們訓(xùn)練集的結(jié)果的類的數(shù)量。隱藏層-如果隱藏層數(shù)大于1,確保每個隱藏層的單元個數(shù)相同,通常情況下隱藏層單元的個數(shù)越多越好。(但要考慮復(fù)雜性)

真正要決定的是隱藏層的層數(shù)和每個中間層的單元數(shù)。

訓(xùn)練神經(jīng)網(wǎng)絡(luò):

1. 隨機初始化參數(shù)(權(quán)重)

2. 利用正向傳播方法計算所有的h_{\theta } (x)

3. 編寫計算代價函數(shù)的代碼, 計算代價函數(shù)J(\theta )

4. 用反向傳播方法計算所有偏導(dǎo)數(shù)

5. 利用數(shù)值檢驗方法檢驗這些偏導(dǎo)數(shù)

6. 使用優(yōu)化算法(梯度下降法等)來最小化代價函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容