1. 程式人生 > >反向傳播演算法(UFLDL版)

反向傳播演算法(UFLDL版)

1. UFLDL中的一些術語

  1. nln_l表示輸出層的層數(數量),用L2L_2表示第二層,L3L_3表示第三層,LnlL_{n_l}表示輸出層。無論是Nielsen版還是,coursera版都是用“L”表示神經網路的層數(總層數)
    小寫的ll經常來表示層數,大寫的LL加角標經常表示第幾層,
  2. SlS_l表示第l層神經元的個數。
  3. bi(l)b^{(l)}_i表示第l+1l+1層的第ii個神經元上的偏置

2 證明步驟

2.1 代價函式

假設我們有一個固定樣本集(x(1),y(1)),...,(x(m),y(m)){(x^{(1)},y^{(1)}),...,(x^{(m)},y^{(m)})}

,它包含 m 個樣例。我們利用批量梯度下降法來求解神經網路。

2.1.2 單個樣例的代價函式

對於單個的樣例,其代價函式為:
\begin{align}
J(W,b; x,y) = \frac{1}{2} \left| h_{W,b}(x) - y \right|^2 \tag1\
\end{align}

2.1.2 整體代價函式

而整體代價函式為:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ J(W,b) &= \lef…


以上關於J(W,b)J(W,b)定義中的第一項是一個均方差項。第二項是一個規則化項(也叫權重衰減項),其目的是減小權重的幅度,防止過度擬合。
怎麼理解正則化項,這項這麼多個求和符號堆在一起,看上去實在很嚇人,它其實表示了整個神經網路上的所有弧上的權重,你不要看這個項有很多,其實多層的求和公式放在一起相當於多層迴圈,$ \sum_{l=1}^{n_l-1} ; \sum_{i=1}^{s_l} ; \sum_{j=1}^{s_{l+1}} \left( W{(l)}_{ji}\right)2$相當於一個三層巢狀的迴圈:
ll : 1 -> nl1n_l -1
  i
i
: 1 -> sls_l
    jj: 1 -> sl+1s_{l+1}
用語言來描述就是,先從第一層開始,一層一層往後直到倒數第二層,對於每一層執行下面的操作:
從第一個神經元開始到這層最後一個神經元(從上往下數),對於每個神經元執行下面的操作:
每個神經元與下一層所有相連線的的神經元之間連線上的權重,把這個上面的權重羅列出來進行累加。
其實這個累加的部分,不僅表示出這張圖所有的權重,而且也指明瞭找出這個權重的方法。

2.2 梯度下降法

我們的目標是利用梯度下降法來求得引數W和b以使得函式J(W,b)J(W,b)最小。
梯度下降法中每一次迭代都按照如下公式對引數 W\textstyle Wb\textstyle b 進行更新:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ W_{ij}^{(l)} &…
其中 $\textstyle \alpha $是學習速率。
和代價函式一樣,我們也是先求出單個樣例代價函式 J(W,b;x,y)\textstyle J(W,b;x,y) 的偏導數Wij(l)J(W,b;x,y)\textstyle \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y)bi(l)J(W,b;x,y)\textstyle \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y),之後再推匯出整體代價函式 $\textstyle J(W,b) $的偏導數:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \frac{\partial…
而求單個樣例偏導採用的是反向傳播演算法

2.2.1 針對單個樣例的反向傳播演算法

在深入到具體的推導之前,先說一下大體的思路,先說目標吧:我們是利用整個神經網路的“殘差”來計算偏導的,或者說代價函式對引數(權重或者偏置)的偏導可以由當前引數所處層次的臨近層的殘差來表示。對於最後一層我們可以用神經元的輸出減去樣本中的y得到最後一層的殘差,但是對於隱藏層的殘差如何計算呢?我們主要採用了這樣幾個技術來計算隱藏層的殘差:

  1. 重新定義殘差
    定義殘差為: $ {\delta^{(l)}_i} = \frac{\partial J(W,b;x,y)}{\partial z^{(l)}_i} $
  2. 隱藏層的殘差都用相鄰層的殘差來表示
  3. 充分利用相鄰兩層神經元輸入的關係(zi(l)z^{(l)}_izj(l+1)z^{(l+1)}_j之間的數量關係)建立偏導和殘差之間的關係以及相鄰兩層殘差之間的關係。

2.2.1.1 具體步驟

  1. 進行前饋傳導計算,利用前向傳導公式,得到 $\textstyle L_2, L_3, \ldots $ 直到輸出層 Lnl\textstyle L_{n_l} 的啟用值。

  2. 利用重新定義的殘差計算公式來計算輸出層每個單元的殘差
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \delta^{(n_l)}…
    證明過程:
    $ \delta^{(n_l)}_i = \frac{\partial}{\partial z^{n_l}i}J(W,b;x,y)= \frac{\partial}{\partial z^{n_l}i}\frac{1}{2} \left|y - h{W,b}(x)\right|^2 $ ,而對於最後一層來說hW,b(x)h_{W,b}(x)又可以寫成aj(nl)a_j^{(n_l)},於是$\frac{\partial}{\partial z^{n_l}i}\frac{1}{2} \left|y - h{W,b}(x)\right|^2 = \frac{\partial}{\partial z^{n_l}i}\frac{1}{2} \sum{j=1}^{S{n_l}} (y_j-a_j{(n_l)})2 ,又由於a_j^{(n_l)} = f(z_j^{(n_l)}),於是\frac{\partial}{\partial z^{n_l}i}J(W,b;x,y) =\frac{\partial}{\partial z^{n_l}i}\frac{1}{2} \sum{j=1}^{S{n_l}} (y_j-f(z_j{(n_l)}))2 。到這一步由於J(W,b;x,y)轉化成了z_j^{(n_l)}的函式,於是可以求偏導了,求偏導的時候注意,由於這是累和求導的問題,其實只有當j=i的時候導數才存在,j \neq i0時導數都為0, 所以最後的結果是- (y_i - f(z_i^{(n_l)})) \cdot f’(z^{(n_l)}_i) (或者寫成- (y_i - a^{(n_l)}_i) \cdot f’(z^{(n_l)}_i)$)

  3. 利用相鄰兩層殘差的關係來計算隱藏層的各節點的殘差
    我們依然從重新定義的殘差公式開始推導,$ {\delta^{(l)}_i} = \frac{\partial J(W,b;x,y)}{\partial z^{(l)}i} ,為了讓l層和l+1層發生關係,我們利用一些鏈式求導法則的技巧改寫這個公式,變為\frac{\partial J(W,b;x,y)}{\partial z^{(l)}i} = \sum{j=1}^{s{l+1}} \frac{\partial J}{\partial z^{(l+1)}_j} \frac{\partial z^{(l+1)}_j}{\partial z^{(l)}i}。而其中\frac{\partial J}{\partial z{(l+1)}_j}$根據我們之前的定義就是${\delta{(l+1)}j}啊,所以 原式等於 \sum{j=1}^{s{l+1}} \delta^{(l+1)}_j \frac{\partial z^{(l+1)}j}{\partial z{(l)}_i}$,又因為$z{(l+1)}j = \sum{k=1}{s_l}W{(l)}{jk}a^{(l)}_k + b{(l+1)}_j=\sum_{k=1}{s_l}W{(l)}_{jk}f(z{(l)}_k) + b^{(l+1)}j,於是\frac{\partial z^{(l+1)}j}{\partial z^{(l)}i} = W^{(l)}{ji}f’( z{(l)}_i)$,(這裡涉及到累和求導的問題,求導後只留下一項),於是最後的結果是${\delta{(l)}i} = \sum{j=1}^{s{l+1}} W^{(l)}{ji} \delta^{(l+1)}_j f’(z^{(l)}_i)$,整理一下為
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \delta^{(l)}_i…
    注:原文是利用最後一層和倒數第二層之間的關係來證明的,但是我覺得利用任何中間任何兩個相鄰層來證明才更有一般性,這有點像數學歸納法。

  4. 利用殘差計算代價函式對權重的偏導
    我們依然利用相鄰兩層輸入之間的關係:zj(l+1)=k=1slWjk(l)ak(l)+bj(l+1)z^{(l+1)}_j =\sum_{k=1}^{s_l}W^{(l)}_{jk}a^{(l)}_k + b^{(l+1)}_j
    $ \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) = \frac{\partial J}{\partial z^{(l+1)}_j} \frac{\partial z^{(l+1)}j}{\partial W{ij}^{(l)}} $ ,而Jzj(l+1)=δj(l+1)\frac{\partial J}{\partial z^{(l+1)}_j} = \delta^{(l+1)}_j,用zj(l+1)=k=1slWjk(l)ak(l)+bj(l+1)z^{(l+1)}_j =\sum_{k=1}^{s_l}W^{(l)}_{jk}a^{(l)}_k + b^{(l+1)}_j這個公式提現的關係求導得$a^{(l)}j $,於是
    \begin{align}
    \frac{\partial}{\partial W
    {ij}^{(l)}} J(W,b; x, y) = a^{(l)}_j \delta_i^{(l+1)} \tag{10}\
    \end{align}

  5. 利用殘差計算代價函式對偏置的偏導
    和上一步的過程一模一樣,只是最後一步對偏置bi(l)b_{i}^{(l)}進行求導。於是結果為:

\begin{align}
\frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y) &= \delta_i^{(l+1)}. \tag{11}\
\end{align}

2.2.1.2 矩陣形式

上面是的推導結果是分量形式的,如果利用矩陣形式的,則公式(8)、(9)、(10)、(11)則表示為:

  1. 輸出層殘差計算公式:
    \begin{align}
    \delta^{(n_l)}= - (y - a^{(n_l)}) \bullet f’(z^{(n_l)}) \tag{12}\
    \end{align}
  2. 相鄰兩層殘差的關係:
    \begin{align}