直觀感受反向傳播的概念
上篇文章講述了神經(jīng)網(wǎng)絡(luò)的反向傳播算法的基本概念,現(xiàn)在來詳細(xì)的對此算法進(jìn)行一些講解。
回憶一下神經(jīng)網(wǎng)絡(luò)的代價函數(shù):
如果我們只考慮一個簡單的只有一個輸出單元的情況,即k=1,那么代價函數(shù)則變成:
直觀的說,項表示在第l層中第j個單元的誤差。更正式的說,
的值實際上是代價函數(shù)的導(dǎo)數(shù)。
由于函數(shù)的導(dǎo)數(shù)即是其切線的斜率,因此其切線越陡則說明計算的誤差越大。每一個神經(jīng)元的誤差都與后面連接的神經(jīng)元有關(guān),如下圖計算:
其中:
參數(shù)展開
使用神經(jīng)網(wǎng)絡(luò)時,我們處理的一組矩陣:,
,
...,為了使用最優(yōu)化函數(shù)比如"fminuc()",我們需要將所有的元素展開將其放入一個長向量中:
比如說如果Theta1的維度是1011,Theta2是1011,Theta3是1*11,那我們通過展開后的向量來得到原始的矩陣的話,需要如下的方法:
總結(jié)的話就直接看吳恩達(dá)老師的筆記:
梯度校驗
梯度校驗是用來確保我們做的反向傳播算法是否正確,這里假設(shè)代價函數(shù)的導(dǎo)數(shù)為:
那么在多個的矩陣,則可以得到下面近似于關(guān)于
的導(dǎo)數(shù):
一般取比較合適,太小了會導(dǎo)致一些計算問題。因此我們只是在
矩陣中加上或減去
,在octave中代碼如下所示:
我們已經(jīng)計算過deltaVector,因此計算出gradApprox后就可以判斷是否gradApprox ≈ deltaVector。一旦計算出反向傳播算法是準(zhǔn)確的,就不需要再繼續(xù)計算gradApprox了,因為計算gradApprox的過程是很緩慢的。
隨機(jī)初始化參數(shù)
將所有的權(quán)重初始化為0不適用于神經(jīng)網(wǎng)絡(luò),那樣反向傳播時,所有節(jié)點將重復(fù)更新為相同的值。因此,我們可以使用以下方法隨機(jī)初始化我們的Θ矩陣的權(quán)重:
因此,這里初始化每個為
之間的隨機(jī)值,使用上述公式保證我們得到所需的界限,相同的程序使用于所有的
。以下代碼可以用來進(jìn)行實驗:(Theta1,Theta2,Theta3的維度同上面一樣,這里的epsilon和上面梯度校驗的無關(guān)):
Theta1 = rand(10,11) * (2*INIT_EPSILON) - INIT_EPSILON;
Theta2 = rand(10,11) * (2*INIT_EPSILON) - INIT_EPSILON;
Theta3 = rand(1,11) * (2*INIT_EPSILON) - INIT_EPSILON;
總結(jié)
這里就直接使用原課程的筆記,懶得寫了,寫了也只是把這個翻譯一遍不如直接看原版筆記。這一周的內(nèi)容的確有點難度了,需要一定時間消化。
以上,為吳恩達(dá)機(jī)器學(xué)習(xí)第五周后半部分內(nèi)容。