機器學習之——神經網絡學習

很久沒更新博客了,這一次我們繼續之前的機器學習的課程,這一節我們討論機器學習裏面重要的一個算法——神經網絡(Nerual Network)的學習部分。

神經網絡的代價函數

首先我們要引入一些標記,以便在後面討論中使用:


我們回想一下,在邏輯迴歸(Logistic Regression)問題中,我們的代價函數(Cost Function)如下:


在邏輯迴歸中,我們只有一個輸出變量,又稱作標量(Scalar),也只有一個因變量y,但是在神經網絡中,我們可以有很多輸出變量,我們的hø(x)是一個維度爲K的向量,並且我們訓練集中的因變量也是同樣維度的一個向量,因此我們的代價函數會比邏輯迴歸更加複雜一些,如下所示:


這個代價函數看起來複雜很多,但是背後的思想還是一樣的。我們希望能夠通過代價函數來觀察算法預測的結果與真實情況的誤差有多大,唯一不同的是,對於每一行特徵,我們都會給出K個預測,基本上我們可以利用循環,對每一行特徵都預測K個不同的結果,然後再利用循環在K個預測中選擇可能性最大的一個,將其與y中的實際數據進行對比。

歸一化的哪一項只是排除了每一層的ø0後,每一層的ø矩陣的和。最裏層的循環 j 循環所有的行(由si +1層的激活單元書決定),循環 i 則循環所有的列,由該層(si 層)的激活單元數所決定。


反向傳播算法(Backpropagation Algorithm)

之前我們在計算神經網絡預測結果的時候,我們採用了一種正向傳播方法,我們從第一層開始正向一層一層進行計算,直到最後一層的hø(x)。

現在,爲了計算代價函數的偏導數:


我們需要採用一種反向傳播算法,也就是首先計算最後一層的誤差,然後再一層一層反向求出各層的誤差,直到倒數第二層。

我們用一個例子來說明反向傳播算法。

假設,我們的訓練集只有一個實例(x(1), y(1)),我們的神經網絡是一個四層的神經網絡,其中:K=4,SL=4,L=4 


我們從最後一層的誤差開始計算,誤差是激活單元的預測()與實際值(yk)之間的誤差(k=1:K)。我們用來表示誤差,則:


我們利用這個誤差值來計算前一層的誤差:


其中g'(Z(3))是S形函數的導數,g'(Z(3))=a(3).*(1-a(3))。而則是權重導致的誤差的和。

下一步是繼續計算第二層的誤差:


因爲第一層是輸入變量,不存在誤差。我們有了所有的誤差的表達式之後,便可以計算代價函數的偏導數了,假設λ=0,即我們不做任何歸一化處理時有:


重要的是清楚地知道上面式子中上下標的含義:


如果我們考慮歸一化處理,並且我們的訓練集是一個特徵矩陣而非向量。在上面的特殊情況中,我們需要計算每一層的誤差單元來計算代價函數的偏導數。在更爲一般的情況中,我們同樣需要計算每一層的誤差單元,但是我們需要爲整個訓練集計算誤差單元,此時的誤差單元也是一個矩陣,我們用來表示這個誤差矩陣。第 l 層的第 i 個激活單元收到第 j 個參數影響而導致的誤差。

我們的算法表示爲:


即首先使用正向傳播方法計算出每一層的激活單元,利用訓練集的結果與神經網絡預測的結果求出最後一層的誤差,然後利用該誤差運用反向傳播法計算出直至第二層的所有誤差。

在求出了之後,我們便可以計算代價函數的偏導數了,計算方法如下:


在Octave或者Matlab中,如果我們使用 fminuc 這樣的優化算法求解求出權重矩陣,我們需要將矩陣首先展開爲向量,再利用算法求出最優解後再重新轉換回矩陣。

假設我們有三個權重矩陣,theta1,theta2和theta3,尺寸分別爲10*11,10*11和1*11,下面的代碼可以實現這樣的轉換:


這一次我們討論到這裏,下一回我們繼續學習神經網絡的梯度檢驗(Gradient Checking)隨機初始化(Random Initialization)

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