BP算法是一種最有效的多層神經網絡學習方法,其主要特點是信號前向傳遞,而誤差后向傳播,通過不斷調節網絡權重值,使得網絡的最終輸出與期望輸出盡可能接近,以達到訓練的目的。
一、多層神經網絡結構及其描述
下圖為一典型的多層神經網絡。
通常一個多層神經網絡由L層神經元組成,其中:第1層稱為輸入層,最后一層(第L層)被稱為輸出層,其它各層均被稱為隱含層(第2層~第L-1層)。
令輸入向量為:
\[ \vec x = [x_1 \quad x_2 \quad \ldots \quad x_i \quad \ldots \quad x_m], i=1,2,\ldots, m \]
輸出向量為:
\[ \vec y = [y_1 \quad y_2 \quad \ldots \quad y_k \quad \ldots \quad y_n], k = 1,2, \ldots,n \]
第l隱含層各神經元的輸出為:
\[ h^{(l)}= [h_1^{(l)} \quad h_2^{(l)} \quad \ldots \quad h_j^{(l)} \quad \ldots \quad h_{s_l}^{(l)}],j=1,2,\ldots,s_l \]
其中,$s_l$為第l層神經元的個數。
設$W_{ij}^{(l)}$為從l-1層第j個神經元與l層第i個神經元之間的連接權重;$b_i^{(l)}$為第l層第i個神經元的偏置,那么:
\[ h_i^{(l)} = f(net_i^{(l)})\]
\[ net_i^{(l)} = \sum_{j=1}^{s_{l-1}} W_{ij}^{(l)} h_j^{(l-1)} + b_i^{(l)}\]
其中,$net_i^{(l)}$為l層第i個神經元的輸入,$f(\cdot)$為神經元的激活函數。通常在多層神經網絡中采用非線性激活函數,而不是用線性激活函數,因為采用基於線性激活函數的多層神經網絡本質上還是多個線性函數的疊加,其結果仍然為一個線性函數。
二、激活函數
BP神經網絡通常使用下面兩種非線性激活函數:
\[ f(x) = \frac 1 {1 + e^{-x}}\]
\[ f(x) = \frac {1 - e^{-x}} {1 + e^{-x}}\]
第一種稱為sigmod函數或者logistics函數,第二種為雙曲正切函數。
Sigmod函數的圖像如下圖所示,它的變化范圍為(0, 1),其導數為$f^{'} = f(1-f)$。
雙曲正切函數的圖像如下圖所示,它的變化范圍為(-1, 1),其導數為$f^{'} = 1-f^2$。
三、BP算法推導過程
假定我們有m個訓練樣本$\{ (x(1), y(1)), (x(2), y(2)), \ldots, (x(m), y(m))\}$,其中$d(i)$為對應輸入$x(i)$的期望輸出。BP算法通過最優化各層神經元的輸入權值以及偏置,使得神經網絡的輸出盡可能地接近期望輸出,以達到訓練(或者學習)的目的。
采用批量更新方法,對於給定的m個訓練樣本,定義誤差函數為:
\[ E = \frac 1 m \sum_{i=1}^m E(i) \]
其中,E(i)為單個樣本的訓練誤差:
\[ E(i) = \frac 1 2 \sum_{k=1}^n (d_k(i) - y_k(i))^2 \]
因此,
\[ E = \frac 1 {2m} \sum_{i=1}^m \sum_{k=1}^n (d_k(i) - y_k(i))^2\]
BP算法每一次迭代按照以下方式對權值以及偏置進行更新:
\[ W_{ij}^{(l)} = W_{ij}^{(l)} -\alpha \frac {\partial E} {\partial W_{ij}^{(l)}} \]
\[ b_i^{(l)} = b_i^{(l)} -\alpha \frac {\partial E} {\partial b_i^{(l)}}\]
其中,$\alpha$為學習速率,它的取值范圍為(0, 1)。BP算法的關鍵在於如何求解$W_{ij}^{(l)}$和$b_i^{(l)}$的偏導數。
對於單個訓練樣本,輸出層的權值偏導數計算過程:
\begin{equation*}
\begin{split}
\frac {\partial E(i)} {\partial W_{kj}^{(L)}}&=\frac {\partial} {\partial W_{kj}^{(L)}} (\frac 1 2 \sum_{k=1}^n (d_k(i)-y_k(i))^2) \\
&=\frac {\partial} {\partial W_{kj}^{(L)}} (\frac 1 2 (d_k(i)-y_k(i))^2)\\
&=-(d_k(i)-y_k(i))\frac {\partial y_k(i)} {\partial W_{kj}^{(L)}}\\
&=-(d_k(i)-y_k(i))\frac {\partial y_k(i)} {\partial net_k^{(L)}} \frac {\partial net_k^{(L)}} {\partial W_{kj}^{(L)}}\\
&=-(d_k(i)-y_k(i))f(x)^{'}|_{x=net_k^{(L)}} \frac {\partial net_k^{(L)}} {\partial W_{kj}^{(L)}}\\
&=-(d_k(i)-y_k(i))f(x)^{'}|_{x=net_k^{(L)}} h_j^{(L-1)}
\end{split}
\end{equation*}
即:
\[
\frac {\partial E(i)} {\partial W_{kj}^{(L)}} = -(d_k(i) - y_k(i))f(x)^{'}|_{x=net_k^{(L)}}h_j^{(L-1)}
\]
同理可得,
\[
\frac {\partial E(i)} {\partial b_{k}^{(L)}} = -(d_k(i) - y_k(i))f(x)^{'}|_{x=net_k^{(L)}}
\]
令:
\[
\delta_k^{(L)} = -(d_k(i) - y_k(i))f(x)^{'}|_{x=net_k^{(L)}}
\]
則:
\[
\frac {\partial E(i)} {\partial W_{kj}^{(L)}} = \delta_k^{(L)} h_j^{(L)}
\]
\[
\frac {\partial E(i)} {\partial b_{k}^{(L)}} = \delta_k^{(L)}
\]
對隱含層L-1層:
\begin{equation*}
\begin{split}
\frac {\partial E(i)} {\partial W_{ji}^{(L-1)}}&=\frac {\partial} {\partial W_{ji}^{(L-1)}} (\frac 1 2 \sum_{k=1}^n (d_k(i)-y_k(i))^2) \\
&=\frac {\partial} {\partial W_{ji}^{(L-1)}} (\frac 1 2 \sum_{k=1}^n (d_k(i)-f(\sum_{j=1}^{s_{L-1}} W_{kj}^{(L)} h_j^{(L-1)} + b_k^{(L)}))^2) \\
&=\frac {\partial} {\partial W_{ji}^{(L-1)}} (\frac 1 2 \sum_{k=1}^n (d_k(i)-f(\sum_{j=1}^{s_{L-1}} W_{kj}^{(L)} f(\sum_{i=1}^{s_{L-2}} W_{ji}^{(L-2)}h_i^{(L-2)} + b_j^{(L-1)}) + b_k^{(L)}))^2) \\
&=-\sum_{k=1}^n (d_k(i) - y_k(i)) f(x)^{'}|_{x=net_k^{(L)}} \frac {\partial net_k^{(L)}} {\partial W_{ji}^{(L-1)}}
\end{split}
\end{equation*}
因為,
\begin{equation*}
\begin{split}
net_k^{(L)} &=\sum_{j=1}^{s_{L-1}} W_{kj}^{(L)} h_j^{(L-1)} + b_k^{(L)} \\
&=\sum_{j=1}^{s_{L-1}} W_{kj}^{(L)} f(\sum_{i=1}^{s_{L-2}} W_{ji}^{(L-2)}h_i^{(L-2)} + b_j^{(L-1)}) + b_k^{(L)} \\
&=\sum_{j=1}^{s_{L-1}} W_{kj}^{(L)} f(net_j^{(L-1)})
\end{split}
\end{equation*}
所以,
\begin{equation*}
\begin{split}
\frac {\partial E(i)} {\partial W_{ji}^{(L-1)}}&= \sum_{k=1}^n (d_k(i) - y_k(i)) f(x)^{'}|_{x=net_k^{(L)}} \frac {\partial net_k^{(L)}} {\partial W_{ji}^{(L-1)}} \\
&= \sum_{k=1}^n (d_k(i) - y_k(i)) f(x)^{'}|_{x=net_k^{(L)}} \frac { \partial net_k^{(L)}} {\partial f(net_j^{(L-1)})} \frac {\partial f(net_j^{(L-1)})} {\partial net_j^{(L-1)}} \frac {\partial net_j^{(L-1)}} {\partial W_{ji}^{(L-1)}} \\
&= \sum_{k=1}^n (d_k(i) - y_k(i)) f(x)^{'}|_{x=net_k^{(L)}} W_{kj}^{(L)} f(x)^{'}|_{x = net_j^{(L-1)}} h_i^{(L-2)}
\end{split}
\end{equation*}
同理,
\[
\frac {\partial E(i)} {\partial b_j^{(L-1)}} = \sum_{k=1}^n (d_k(i) - y_k(i)) f(x)^{'}|_{x=net_k^{(L)}} W_{kj}^{(L)} f(x)^{'}|_{x = net_j^{(L-1)}}
\]
令:
\begin{equation*}
\begin{split}
\delta_j^{(L-1)} &= \sum_{k=1}^n (d_k(i) - y_k(i)) f(x)^{'}|_{x=net_k^{(L)}} W_{kj}^{(L)} f(x)^{'}|_{x = net_j^{(L-1)}} \\
&=\sum_{k=1}^n W_{kj}^{(L)} \delta_k^{(L)} f(x)^{'}|_{x = net_j^{(L-1)}}
\end{split}
\end{equation*}
\[
\frac {\partial E(i)} {\partial W_{ji}^{(L-1)}} = \delta_j^{(L-1)} h_i^{(L-2)}
\]
\[
\frac {\partial E(i)} {\partial b_j^{(L-1)}} = \delta_j^{(L-1)}
\]
由上可推,第l層($2 \leq l \leq L-1 $)的權值和偏置的偏導可以表示為:
\[
\frac {\partial E(i)} {\partial W_{ji}^{(l)}} = \delta_j^{(l)} h_i^{(l-1)}
\]
\[
\frac {\partial E(i)} {\partial b_j^{(l)}} = \delta_j^{(l)}
\]
其中,
\[
\delta_j^{(l)} = \sum_{k=1}^{s_{l+1}} W_{kj}^{(l+1)} \delta_k^{(l+1)} f(x)^{'}|_{x=net_{j}^{(l)}}
\]
四、BP算法過程描述
采用批量更新方法對神經網絡的權值和偏置進行更新:
- 對所有的層$2 \leq l \leq L$,設$\Delta W^{(l)} = 0, \Delta b^{(l)} = 0 $,這里$\Delta W^{(l)} $和$\Delta b^{(l)} $分別為全零矩陣和全零向量;
-
For i = 1:m ,
- 使用反向傳播算法,計算各層神經元權值和偏置的梯度矩陣$\nabla W^{(l)} (i)$和向量和$\nabla b^{(l)}(i) $;
- 計算$\Delta W^{(l)} = \nabla W^{(l)}(i) $;
- 計算$\Delta b^{(l)} = \nabla b^{(l)}(i)$。
-
更新權值和偏置:
- 計算$W^{(l)} = W^{(l)} + \frac 1 m \Delta W^{(l)} $;
- 計算$b^{(l)} = b^{(l)} + \frac 1 m \Delta b^{(l)} $。