很久沒更新部落格了,這一次我們繼續之前的機器學習的課程,這一節我們讨論機器學習裡面重要的一個算法——神經網絡(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)。