在講解偏差反向傳播算法以前,咱們來回顧一下信號在神經網絡中的流動過程。請細細體會,當輸入向量\(X\)輸入感知器時,第一次初始化權重向量\(W\)是隨機組成的,也能夠理解成咱們任意設置了初始值,並和輸入作點積運算,而後模型經過權重更新公式來計算新的權重值,更新後的權重值又接着和輸入相互做用,如此迭代屢次,獲得最終的權重。html
信號向前傳播,權重的更新反向傳播,是這樣嗎?
是的,你的直覺沒錯,確實是反向傳播。算法
反向傳播這個術語常常被誤解爲用於多層神經網絡的整個學習算法。實際上,反向傳播僅指用於計算梯度的方法,而另外一種算法,例如隨機梯度降低,使用該梯度來進行學習。此外,反向傳播常常被誤解爲僅適用於多層神經網絡,可是原則上它能夠計算任何函數的導數(對於一些函數,正確的響應是報告函數的導數是未定義的)。編程
不如咱們仍是使用上一節矩陣乘法的列子來可視化的講解,這樣有助於咱們去理解反向傳播。假設有以下三層網絡,輸入層、隱藏層、輸出層,現有一組信號\(X\)輸入網絡,輸入層和隱藏層的連接權重\(W_{input-hidden}\)和隱藏層與輸出層之間的權重\(W_{hidden-ouput}\)咱們隨機初始化。爲了清晰效果,咱們僅標註了幾個權重,第一個輸入節點和中間隱藏層第一個節點之間的權重爲\(w_{1,1}\) = 0.9,正如上圖中的神經網絡所示。一樣,你能夠看到輸入的第二節點和隱藏層的第二節點之間的連接的權重爲\(w_{2,2}\) = 0.8,隱藏層第三個節點和輸出層第二個節點之間連接的權重爲\(w_{3,2}\) = 0.2......此命名方式前面解釋過,標註以後在分析反向傳播時可幫助咱們理解。
網絡
圖5.2.1函數
輸入矩陣:
\[X=\begin{bmatrix} 0.9\\ 0.1\\ 0.8\end{bmatrix}\]
輸入層和隱藏層之間的鏈接權重:
\[W_{input-hidden}=\begin{bmatrix} 0.9 & 0.3&0.4 \\ 0.2& 0.8&0.2 \\ 0.8& 0.1&0.9 \end{bmatrix}\]
隱藏層和輸出層之間的鏈接權重:
\[W_{hidden-output}=\begin{bmatrix} 0.3 & 0.7&0.5 \\ 0.6& 0.5&0.2 \\ \end{bmatrix}\]學習
初始值定義好之後,開始計算輸入到隱藏層的組合調節輸入值\(X_{hidden}\)。
\[X_{hidden} = W_{input_hidden} \cdot X\]
此處的矩陣乘法仍是交由計算機來執行,計算出的答案以下:
\[X_{hidden} =\begin{bmatrix} 0.9 & 0.3&0.4 \\ 0.2& 0.8&0.2 \\ 0.8& 0.1&0.9 \end{bmatrix} \cdot \begin{bmatrix} 0.9\\ 0.1\\ 0.8\end{bmatrix}\]
\[X_{hidden} =\begin{bmatrix} 1.16\\ 0.42\\ 0.62\end{bmatrix}\]
彆着急往下走,讓咱們來整理一下網絡的信號流動狀況,\(X_{hidden}\)做爲第一層的輸出,第二層的輸入已經正確求解,如今它準備進入隱藏層。
spa
圖5.2.23d
\(X_{hidden}\)一進入隱藏層,咱們就對\(X_{hidden}\)的這些節點使用S激活函數,使其變得更加天然,而且咱們把通過S函數處理後的這組輸出信號命名爲\(O_{hidden}\)。
\[O_{hidden}=Sigmoid(X_{hidden})=Sigmoid(\begin{bmatrix} 1.16\\ 0.42\\ 0.62\end{bmatrix})=\begin{bmatrix} 0.761\\ 0.603\\ 0.650\end{bmatrix}\]htm
讓咱們再次可視化這些輸入到第二層隱藏層的組合調節輸入。如今信號已經向前流動到了第二層,下一步固然是計算第三層的輸出信號\(X_{output}\)(還未通過S函數的輸出信號),計算的方法和前面同樣,沒有什麼區別,無論咱們的網絡是幾層,這種方法都適用。
blog
圖5.2.3
因而,咱們有:
\[X_{output}=W_{hidden-output} \cdot O_{hidden}=\begin{bmatrix} 0.3 & 0.7&0.5 \\ 0.6& 0.5&0.2 \\ \end{bmatrix} \cdot \begin{bmatrix} 0.761\\ 0.603\\ 0.650\end{bmatrix}= \begin{bmatrix} 0.975\\ 0.888\\ \end{bmatrix}\]
如今,更新示意圖展現咱們的進展,從初始輸入信號開始,一層層往前流動的前饋信號,最後獲得了最終層的組合輸入信號。
圖5.2.4
最後一步固然是使用S函數獲得最後一層的輸出,用\(O_{ouput}\)表示:
\[O_{ouput}=Sigmoid(X_{output})=Sigmoid( \begin{bmatrix} 0.975\\ 0.888\\ \end{bmatrix} )= \begin{bmatrix} 0.726\\ 0.708\\ \end{bmatrix} \]
前饋信號的流動到此爲止,任務完成!經過可視化的圖形,前饋神經網絡中信號流入方向,變化等狀況咱們用網絡圖最後形展現出來。
圖5.2.5
毫無疑問,整個過程就是前饋的意思,信號一直向前流動,最後輸出,中間任意層沒有信號反回上一級網絡。
下一步咱們會將神經網絡的輸出值與訓練樣本中的輸出值進行比較,計算出偏差,並使用這個偏差值來反向調節權重值。
上一步咱們獲得了前向傳播的輸出值爲[0.726, 0.708],這個值與真實值[0.01,0.99]還存在必定差距,不過不要緊,反向傳播偏差會幫助咱們更新權值,縮小這些偏差,讓咱們來實驗一下。
由於總偏差爲:\(E=\sum(target-O_{output})^2=E_{1}+E_{2}=(target1-O_{output1})^2+(target2-O_{output2})^2\)
因爲咱們的實驗網絡有兩個輸出,所以總偏差爲兩個輸出偏差之和。
第一個偏差:
\[E_{1}=(target_{1}-O_{output1})^2=(0.726-0.01)^2=0.512656\]
第二個偏差:
\[E_{2}=(target_{2}-O_{output2})^2=(0.706-0.99)^2=0.079524\]
總偏差:
\[E=E_{1}+E_{2}=0.512656+0.079524=0.59218\]
對於隱藏層和輸出層之間的權重\(w_{1,1}\)來講,若是咱們想知道\(w_{1,1}\)對總體偏差產生了多少影響,能夠用總偏差對\(w_{1,1}\)求偏導,該偏導可使用鏈式法則表示。
\[\frac{\partial E}{\partial w_{1,1}}=\frac{\partial E}{\partial O_{ouput1}} \cdot \frac{\partial O_{ouput1}}{\partial X_{ouput1}} \cdot \frac{\partial X_{ouput1}}{\partial w_{1,1}}\]
如圖所示的反向傳播示意圖,並結合求導表達式,能夠幫助咱們更清楚的瞭解偏差是怎麼反向傳播的。
圖5.2.6
下面咱們對以上求導式子中的每一個小式子分別求值
一、首先是計算$\frac{\partial E}{\partial O_{ouput1}} $
\[E=(target_{1}-O_{output1})^2+(target2-O_{output2})^2\]
\[\frac{\partial E}{\partial O_{ouput1}}=-2(target_{1}-O_{output1})+0=-2(0.01-0.726)=1.432\]
二、再來計算\(\frac{\partial O_{ouput1}}{\partial X_{ouput1}}\)
\[O_{ouput1}=\frac{1}{1+e^{-X_{ouput1}}}\]
\[\frac{\partial O_{ouput1}}{\partial X_{ouput1}}=O_{ouput1}(1-O_{ouput1})=0.726(1-0.726)=0.198924\]
三、最後計算\(\frac{\partial X_{ouput1}}{\partial w_{1,1}}\)
\[X_{ouput1}=w_{1,1} \cdot O_{hidden1}+w_{2,1} \cdot O_{hidden2}+w_{3,1} \cdot O_{hidden3}\]
\[\frac{\partial X_{ouput1}}{\partial w_{1,1}}=O_{hidden1}=0.761\]
因此:
\[\frac{\partial E}{\partial w_{1,1}}=\frac{\partial E}{\partial O_{ouput1}} \cdot \frac{\partial O_{ouput1}}{\partial X_{ouput1}} \cdot \frac{\partial X_{ouput1}}{\partial w_{1,1}}=1.432 \times 0.198924 \times 0.761=0.216777826848\]
咱們取學習率\(\eta=0.5\),利用公式\[{w_{1,1}}_{new}=w_{1,1}-\eta \frac{\partial E}{\partial w_{1,1}}\]
獲得更新後的\({w_{1,1}}_{new}\)爲:\[{w_{1,1}}_{new}=0.3-0.5 \times 0.216777826848=0.191611086576\]
綜上所述,也能夠這樣去計算\(\frac{\partial E}{\partial w_{1,1}}\):
\[\frac{\partial E}{\partial w_{1,1}}=-2(target_{1}-O_{output1}) \cdot O_{ouput1}(1-O_{ouput1}) \cdot O_{hidden1}\]
所以,改變上述式子的變量能夠更新\(w_{2,1}\),\(w_{2,1}\),\(w_{1,2}\),\(w_{2,2}\),\(w_{3,2}\)等權重值。
計算輸入層和隱藏層之間的權重和上面的方法同樣,但使用偏差對權重進行求導時,該偏差應使用兩個輸出口的總偏差,而不是一個輸入口的偏差。咱們仍然用圖形化的方式來展現:
圖5.2.7
如上圖所示,對於隱藏層和輸出層之間的權重\(w_{1,1}\)來講,若是咱們想知道\(w_{1,1}\)對總體偏差產生了多少影響,能夠用總偏差對\(w_{1,1}\)求偏導,該偏導可使用鏈式法則表示。
\[\frac{\partial E}{\partial w_{1,1}}=\frac{\partial E}{\partial O_{hidden1}} \cdot \frac{\partial O_{hidden1}}{\partial X_{hidden1}} \cdot \frac{\partial X_{hidden1}}{\partial w_{1,1}}\]
咱們仍是一個一個的計算上面的式子。
一、首先計算\(\frac{\partial E}{\partial O_{hidden1}}\)
對於隱藏層的輸出,它會接受來自兩個輸出傳來的偏差,因此:
\[\frac{\partial E}{\partial O_{hidden1}}=\frac{\partial E_{1}}{\partial O_{hidden1}}+\frac{\partial E_{2}}{\partial O_{hidden1}}\]
\[\because \frac{\partial E_{1}}{\partial O_{hidden1}}=\frac{\partial E_{1}}{\partial X_{output1}} \cdot \frac{\partial X_{output1}}{\partial O_{hidden1}}\]
\[\because \frac{\partial E_{1}}{\partial X_{output1}}=\frac{\partial E_{1}}{\partial O_{output1}} \cdot \frac{\partial O_{output1}}{\partial X_{output1}}=1.437 \times 0.198924=0.285853788\]
下面的\(w'_{j,k}\)爲隱藏層和輸出層的連接權重
\[X_{output1}=w'_{1,1} \cdot O_{hidden1}+w'_{2,1} \cdot O_{hidden2}+w'_{3,1} \cdot O_{hidden3}\]
\[\therefore \frac{\partial X_{output1}}{\partial O_{hidden1}}=w'_{1,1}=0.3\]
\[\therefore \frac{\partial E_{1}}{\partial O_{hidden1}}=\frac{\partial E_{1}}{\partial X_{output1}} \cdot \frac{\partial X_{output1}}{\partial O_{hidden1}}=0.285853788 \times 0.3=0.0857561364\]
再來計算\(\frac {\partial E_{2}}{\partial O_{hidden1}}\)
\[\because \frac{\partial E_{2}}{\partial O_{hidden1}}=\frac{\partial E_{2}}{\partial X_{output2}} \cdot \frac{\partial X_{output2}}{\partial O_{hidden1}}\]
\[\because \frac{\partial E_{2}}{\partial X_{output2}}=\frac{\partial E_{2}}{\partial O_{output2}} \cdot \frac{\partial O_{output2}}{\partial X_{output2}}\]
\[\because X_{output2}=w'_{1,2} \cdot O_{hidden1}+w'_{2,2} \cdot O_{hidden2}+w'_{3,2} \cdot O_{hidden3}\]
\[\therefore \frac{\partial X_{output2}}{\partial O_{hidden1}}=w'_{1,2}\]
\[\therefore \frac{\partial E_{2}}{\partial O_{hidden1}}=\frac{\partial E_{2}}{\partial X_{output2}} \cdot \frac{\partial X_{output2}}{\partial O_{hidden1}}=-0.116599104 \times 0.2=-0.0233198208\]
最後獲得
\[\frac{\partial E}{\partial O_{hidden1}}=\frac{\partial E_{1}}{\partial O_{hidden1}}+\frac{\partial E_{2}}{\partial O_{hidden1}}=0.0857561364-0.0233198208=0.0624363156\]
二、再計算\(\frac{\partial O_{hidden1}}{\partial X_{hidden1}}\)
\[\because O_{hidden1}=\frac{1}{1+e^{-X_{hidden1}}}\]
\[\frac{\partial O_{hidden1}}{\partial X_{hidden1}}=O_{hidden1}(1-O_{hidden1})=0.761(1-0.761)=0.181879\]
三、最後計算\(\frac{\partial X_{hidden1}}{\partial w_{1,1}}\)
\[\because X_{hidden1}=w_{1,1} \cdot X_{1}+w_{2,1} \cdot X_{2}+w_{3,1} \cdot X_{3}\]
\[\therefore \frac{\partial X_{hidden1}}{\partial w_{1,1}}=X1=0.9\]
\[\frac{\partial E}{\partial w_{1,1}}=\frac{\partial E}{\partial O_{hidden1}} \cdot \frac{\partial O_{hidden1}}{\partial X_{hidden1}} \cdot \frac{\partial X_{hidden1}}{\partial w_{1,1}}=0.0624363156 \times 0.181879 \times 0.9=0.01022026918051116\]
咱們取學習率\(\eta=0.5\),利用公式\[{w_{1,1}}_{new}=w_{1,1}-\eta \frac{\partial E}{\partial w_{1,1}}\]
獲得更新後的\({w_{1,1}}_{new}\)爲:\[{w_{1,1}}_{new}=0.9-0.5 \times 0.01022026918051116=0.191611086576=0.89488986540974442\]
一樣的方法能夠更新其餘權重的值。這樣咱們就完成了偏差反向傳播算法的介紹,在實際訓練中咱們經過這種方法不停的迭代,直到總偏差接近0爲止,獲得的最優權重保留下來,訓練完成。
參考文獻:
一、《Python神經網絡編程》
二、http://www.javashuo.com/article/p-bfnqjnsq-bp.html