稀疏自動編碼之反向傳播算法(BP)


假設給定m個訓練樣本的訓練集,用梯度下降法訓練一個神經網絡,對於單個訓練樣本(x,y),定義該樣本的損失函數:

那么整個訓練集的損失函數定義如下:

第一項是所有樣本的方差的均值。第二項是一個歸一化項(也叫權重衰減項),該項是為了減少權連接權重的更新速度,防止過擬合。

我們的目標是最小化關於 b 的函數J(W,b). 為了訓練神經網絡,把每個參數W^{(l)}_{ij} 和b^{(l)}_i初始化為很小的接近於0的隨機值(例如隨機值由正態分布Normal(0,ε2)采樣得到,把 ε 設為0.01), 然后運用批量梯度下降算法進行優化。由於 J(W,b) 是一個非凸函數,梯度下降很容易收斂到局部最優,但是在實踐中,梯度下降往往可以取得不錯的效果。最后,注意隨機初始化參數的重要性,而不是全部初始化為0. 如果所有參數的初始值相等,那么所有的隱層節點會輸出會全部相等,因為訓練集是一樣的,即輸入一樣,如果每個模型的參數還都一樣,輸出顯然會相同,這樣不論更新多少次參數,所有的參數還是會相等。隨機初始化各個參數就是為了防止這種情況發生。

梯度下降每一次迭代用下面的方式更新參數和 b:

 

其中 α 是學習率。上述迭代的關鍵是計算偏導數。我們將給出一種方向傳播算法,能夠高效地計算這些偏導數。

由上面的總體的損失函數公式, 很容易得到偏導數公式如下:

 

反向傳播算法的思想是:給定某個訓練樣本(x,y),首先進行“前向傳播”計算出整個網絡中所有節點的激活值,包括輸出節點的輸出值。那么對於 l 層的節點 i ,計算它的“殘差” \delta^{(l)}_i ,這個殘差用來衡量該節點對輸出的殘差產生了多大程度的影響。對於輸出節點,我們可以直接比較出網絡的激活值與真正的目標值之間的殘差,即\delta^{(n_l)}_i (nl  層就是輸出層) 。對於隱層節點,我們用 l+層殘差的加權平均值和 l 層的激活值來計算\delta^{(l)}_i .

下面詳細給出了反向傳播算法的步驟:

1. 進行前饋傳播,計算每一層的中所有節點的激活值

2. 對於輸出層(第nl )的節點 i 的殘差:

這里需要注意:z^{(l)}_i 表示第 l 層節點 i 的所有輸出之和,f 是激活函數,例如等,另外,最后一層(輸出層)的假設函數的輸出值就是該層節點的激活值。

3. 對於 l = n_l-1, n_l-2, n_l-3, \ldots, 2


                 \delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) f'(z^{(l)}_i)

4. 計算偏導數:

下面用矩陣-向量化的操作方式重寫這個算法。其中"\textstyle \bullet"表示matlab中的點乘。對於\textstyle f(\cdot)同樣向量化,\textstyle f'(\cdot) 也作同樣處理,即\textstyle f'([z_1, z_2, z_3]) =
[f'(z_1),
f'(z_2),
f'(z_3)].

BP算法重寫如下:

1. 進行前饋傳播,計算每一層的中所有節點的激活值

2. 對於輸出層(第n層)的節點 i 的殘差:

\begin{align}
\delta^{(n_l)}
= - (y - a^{(n_l)}) \bullet f'(z^{(n_l)})
\end{align}

3.  對於 l = n_l-1, n_l-2, n_l-3, \ldots, 2

\begin{align}
                 \delta^{(l)} = \left((W^{(l)})^T \delta^{(l+1)}\right) \bullet f'(z^{(l)})
                 \end{align}

4. 計算偏導數:

\begin{align}
\nabla_{W^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} (a^{(l)})^T, \\
\nabla_{b^{(l)}} J(W,b;x,y) &= \delta^{(l+1)}.
\end{align}

注意:在上面的第2步和第3步,,我們需要為每一個 節點 i 計算其 \textstyle f'(z^{(l)}_i) . 假設\textstyle f(z)是sigmoid激活函數,在前向傳播的過程中已經存儲了所有節點的激活值\textstyle a^{(l)}_i,因此利用我們在

稀疏自動編碼之神經網絡

中推導出的sigmoid激活函數的導數求法:對於sigmoid函數f(z) = 1 / (1 + exp( − z)),它的導函數為f'(z) = f(z)(1 − f(z)).可以提前算出\textstyle f'(z^{(l)}_i) = a^{(l)}_i (1- a^{(l)}_i),這里用到我們上面提到的.

最后,給出完整的梯度下降法.在下面的偽代碼中\textstyle \Delta W^{(l)}\textstyle W^{(l)}都是矩陣,\textstyle \Delta b^{(l)}\textstyle b^{(l)}是向量。

1.  對於每一層,即所有 l , \textstyle \Delta W^{(l)} := 0\textstyle \Delta b^{(l)} := 0 (設置為全零矩陣或者向量)

2. 從第一個訓練樣本開始,一直到最后一個(第 m 個訓練樣本):

  a. 用反向傳播計算\textstyle \nabla_{W^{(l)}} J(W,b;x,y) 和\textstyle \nabla_{b^{(l)}} J(W,b;x,y)

  b. \textstyle \Delta W^{(l)} := \Delta W^{(l)} + \nabla_{W^{(l)}} J(W,b;x,y).

  c. \textstyle \Delta b^{(l)} := \Delta b^{(l)} + \nabla_{b^{(l)}} J(W,b;x,y).

3. 更新參數:

現在,我們可以重復梯度下降法的迭代步驟來減小損失函數\textstyle J(W,b) 的值,進而訓練出我們的神經網絡。

 

學習來源:http://deeplearning.stanford.edu/wiki/index.php/Backpropagation_Algorithm

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM