假設給定m個訓練樣本的訓練集,用梯度下降法訓練一個神經網絡,對於單個訓練樣本(x,y),定義該樣本的損失函數:
那么整個訓練集的損失函數定義如下:
第一項是所有樣本的方差的均值。第二項是一個歸一化項(也叫權重衰減項),該項是為了減少權連接權重的更新速度,防止過擬合。
我們的目標是最小化關於 W 和 b 的函數J(W,b). 為了訓練神經網絡,把每個參數 和
初始化為很小的接近於0的隨機值(例如隨機值由正態分布Normal(0,ε2)采樣得到,把 ε 設為0.01), 然后運用批量梯度下降算法進行優化。由於 J(W,b) 是一個非凸函數,梯度下降很容易收斂到局部最優,但是在實踐中,梯度下降往往可以取得不錯的效果。最后,注意隨機初始化參數的重要性,而不是全部初始化為0. 如果所有參數的初始值相等,那么所有的隱層節點會輸出會全部相等,因為訓練集是一樣的,即輸入一樣,如果每個模型的參數還都一樣,輸出顯然會相同,這樣不論更新多少次參數,所有的參數還是會相等。隨機初始化各個參數就是為了防止這種情況發生。
梯度下降每一次迭代用下面的方式更新參數W 和 b:
其中 α 是學習率。上述迭代的關鍵是計算偏導數。我們將給出一種方向傳播算法,能夠高效地計算這些偏導數。
由上面的總體的損失函數公式, 很容易得到偏導數公式如下:
反向傳播算法的思想是:給定某個訓練樣本(x,y),首先進行“前向傳播”計算出整個網絡中所有節點的激活值,包括輸出節點的輸出值。那么對於 l 層的節點 i ,計算它的“殘差” ,這個殘差用來衡量該節點對輸出的殘差產生了多大程度的影響。對於輸出節點,我們可以直接比較出網絡的激活值與真正的目標值之間的殘差,即
(nl 層就是輸出層) 。對於隱層節點,我們用 l+1 層殘差的加權平均值和 l 層的激活值來計算
.
下面詳細給出了反向傳播算法的步驟:
1. 進行前饋傳播,計算每一層的中所有節點的激活值
2. 對於輸出層(第nl 層)的節點 i 的殘差:
這里需要注意: 表示第 l 層節點 i 的所有輸出之和,f 是激活函數,例如
,
等,另外,最后一層(輸出層)的假設函數
的輸出值就是該層節點的激活值。
3. 對於
4. 計算偏導數:
下面用矩陣-向量化的操作方式重寫這個算法。其中""表示matlab中的點乘。對於
同樣向量化,
也作同樣處理,即
.
BP算法重寫如下:
1. 進行前饋傳播,計算每一層的中所有節點的激活值
2. 對於輸出層(第nl 層)的節點 i 的殘差:
3. 對於
4. 計算偏導數:
注意:在上面的第2步和第3步,,我們需要為每一個 節點 i 計算其 . 假設
是sigmoid激活函數,在前向傳播的過程中已經存儲了所有節點的激活值
,因此利用我們在
稀疏自動編碼之神經網絡
中推導出的sigmoid激活函數的導數求法:對於sigmoid函數f(z) = 1 / (1 + exp( − z)),它的導函數為f'(z) = f(z)(1 − f(z)).可以提前算出,這里用到我們上面提到的
.
最后,給出完整的梯度下降法.在下面的偽代碼中,
都是矩陣,
,
是向量。
1. 對於每一層,即所有 l , ,
(設置為全零矩陣或者向量)
2. 從第一個訓練樣本開始,一直到最后一個(第 m 個訓練樣本):
a. 用反向傳播計算 和
b. .
c. .
3. 更新參數:
現在,我們可以重復梯度下降法的迭代步驟來減小損失函數 的值,進而訓練出我們的神經網絡。
學習來源:http://deeplearning.stanford.edu/wiki/index.php/Backpropagation_Algorithm