反向傳播演算法(UFLDL版)
1. UFLDL中的一些術語
- 表示輸出層的層數(數量),用表示第二層,表示第三層,表示輸出層。無論是Nielsen版還是,coursera版都是用“L”表示神經網路的層數(總層數)
小寫的經常來表示層數,大寫的加角標經常表示第幾層, - 表示第l層神經元的個數。
- 表示第層的第個神經元上的偏置
2 證明步驟
2.1 代價函式
假設我們有一個固定樣本集,它包含 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…
以上關於定義中的第一項是一個均方差項。第二項是一個規則化項(也叫權重衰減項),其目的是減小權重的幅度,防止過度擬合。
怎麼理解正則化項,這項這麼多個求和符號堆在一起,看上去實在很嚇人,它其實表示了整個神經網路上的所有弧上的權重,你不要看這個項有很多,其實多層的求和公式放在一起相當於多層迴圈,$ \sum_{l=1}^{n_l-1} ; \sum_{i=1}^{s_l} ; \sum_{j=1}^{s_{l+1}} \left( W{(l)}_{ji}\right)2$相當於一個三層巢狀的迴圈:
: 1 ->
: 1 ->
: 1 ->
用語言來描述就是,先從第一層開始,一層一層往後直到倒數第二層,對於每一層執行下面的操作:
從第一個神經元開始到這層最後一個神經元(從上往下數),對於每個神經元執行下面的操作:
每個神經元與下一層所有相連線的的神經元之間連線上的權重,把這個上面的權重羅列出來進行累加。
其實這個累加的部分,不僅表示出這張圖所有的權重,而且也指明瞭找出這個權重的方法。
2.2 梯度下降法
我們的目標是利用梯度下降法來求得引數W和b以使得函式最小。
梯度下降法中每一次迭代都按照如下公式對引數 和 進行更新:
KaTeX parse error: No such environment: align at position 8:
\begin{̲a̲l̲i̲g̲n̲}̲
W_{ij}^{(l)} &…
其中 $\textstyle \alpha $是學習速率。
和代價函式一樣,我們也是先求出單個樣例代價函式 的偏導數 和 ,之後再推匯出整體代價函式 $\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得到最後一層的殘差,但是對於隱藏層的殘差如何計算呢?我們主要採用了這樣幾個技術來計算隱藏層的殘差:
- 重新定義殘差
定義殘差為: $ {\delta^{(l)}_i} = \frac{\partial J(W,b;x,y)}{\partial z^{(l)}_i} $ - 隱藏層的殘差都用相鄰層的殘差來表示
- 充分利用相鄰兩層神經元輸入的關係(和之間的數量關係)建立偏導和殘差之間的關係以及相鄰兩層殘差之間的關係。
2.2.1.1 具體步驟
-
進行前饋傳導計算,利用前向傳導公式,得到 $\textstyle L_2, L_3, \ldots $ 直到輸出層 的啟用值。
-
利用重新定義的殘差計算公式來計算輸出層每個單元的殘差
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 $ ,而對於最後一層來說又可以寫成,於是$\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=ij \neq i- (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)$) -
利用相鄰兩層殘差的關係來計算隱藏層的各節點的殘差
我們依然從重新定義的殘差公式開始推導,$ {\delta^{(l)}_i} = \frac{\partial J(W,b;x,y)}{\partial z^{(l)}i} ll+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…
注:原文是利用最後一層和倒數第二層之間的關係來證明的,但是我覺得利用任何中間任何兩個相鄰層來證明才更有一般性,這有點像數學歸納法。 -
利用殘差計算代價函式對權重的偏導
我們依然利用相鄰兩層輸入之間的關係:
$ \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)}} $ ,而,用這個公式提現的關係求導得$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} -
利用殘差計算代價函式對偏置的偏導
和上一步的過程一模一樣,只是最後一步對偏置進行求導。於是結果為:
\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)則表示為:
- 輸出層殘差計算公式:
\begin{align}
\delta^{(n_l)}= - (y - a^{(n_l)}) \bullet f’(z^{(n_l)}) \tag{12}\
\end{align} - 相鄰兩層殘差的關係:
\begin{align}