Neural Networks: Learning
内容較多,故分成上下兩篇文章。
一、内容概要
- Cost Function and Backpropagation
- Cost Function
- Backpropagation Algorithm
- Backpropagation Intuition
- Backpropagation in Practice
- Implementation Note:Unroll Parameters
- Gradient Checking
- Random Initialization
- Putting it Together
- Application of Neural Networks
- Autonomous Driving
二、重點&難點
1.Cost Function and Backpropagation
1) Cost Function
首先定義一下後面會提到的變量
L: 神經網絡總層數
Sl:l層單元個數(不包括bias unit)
k:輸出層個數
回顧正則化邏輯回歸中的損失函數:
\[J(\theta) = - \frac{1}{m} \sum_{i=1}^m [ y^{(i)}\ \log (h_\theta (x^{(i)})) + (1 - y^{(i)})\ \log (1 - h_\theta(x^{(i)}))] + \frac{\lambda}{2m}\sum_{j=1}^n \theta_j^2
\]
在神經網絡中損失函數略微複雜了些,但是也比較好了解,就是把所有層都算進去了。
\[\begin{gather*} J(\Theta) = - \frac{1}{m} \sum_{i=1}^m \sum_{k=1}^K \left[y^{(i)}_k \log ((h_\Theta (x^{(i)}))_k) + (1 - y^{(i)}_k)\log (1 - (h_\Theta(x^{(i)}))_k)\right] + \frac{\lambda}{2m}\sum_{l=1}^{L-1} \sum_{i=1}^{s_l} \sum_{j=1}^{s_{l+1}} ( \Theta_{j,i}^{(l)})^2\end{gather*}
2)BackPropagation反向傳播
更詳細的公式推導可以參考http://ufldl.stanford.edu--反向傳導算法
下面給出我自己對BP算法的了解以及ufldl上的推導:
假設神經網絡結構如下
- 1. FP
-
利用前向傳導公式(FP)計算\(2,3……\) 直到 \({n_l}\)層(輸出層)的激活值。
計算過程如下:
- 2. BP
- 權值更新
首先需要知道的是BP算法是幹嘛的?它是用來讓神經網絡自動更新權重\(W\)的。
這裡權重\(W\)與之前線性回歸權值更新形式上是一樣:
那現在要做的工作就是求出後面的偏導,在求之前進一步變形:
注意\(J(W,b;x^{(i)},y^{(i)})\)表示的是單個樣例的代價函數,而\(J(W,b)\)表示的是整體的代價函數。
是以接下來的工作就是求出\(\frac{∂J(W,b;x,y)}{∂W_{ij^{(l)}}}\),求解這個需要用到微積分中的鍊式法則,即
\[\begin{align*}
\frac{∂J(W,b;x,y)}{∂W_{ij^{(l)}}} = \frac{∂J(W,b;x,y)}{∂a_{i^{(l)}}} \frac{∂a_{i^{(l)}}}{∂z_{i^{(l)}}} \frac{∂z_{i^{(l)}}}{∂w_{ij^{(l)}}} = a_j^{(l)}δ_i^{(l+1)}
\end{align*}
更加詳細運算過程可以參考一文弄懂神經網絡中的反向傳播法——BackPropagation,這篇文章詳細的介紹了BP算法的每一步驟。
上面的公式中出現了\(δ\)(誤差error),是以後續的目的就是求出每層每個node的\(δ\),具體過程如下:
- 計算δ
對于第 \(n_l\)層(輸出層)的每個輸出單元\(i\),我們根據以下公式計算殘差:
對 \(l = n_l-1, n_l-2, ……,3,2\)的各個層,第 \(l\) 層的第 \(i\) 個節點的殘差計算方法如下:
将上面的結果帶入權值更新的表達式中便可順利的執行BackPropagation啦~~~
但是!!!需要注意的是上面式子中反複出現的 \(f '(z_i^{(l)})\) ,表示激活函數的導數。這個在剛開始的确困惑到我了,因為視訊裡老師在示範計算\(δ\)的時候根本就乘以這一項,難道老師錯了?其實不是的,解釋如下:
常用的激活函數有好幾種,但使用是分情況的:
- 線上性情況下:f(z) = z
- 在非線性情況下:(隻舉一些我知道的例子)
- sigmoid
- tanh
- relu
是以這就是為什麼老師在視訊中沒有乘以 \(f '(z_i^{(l)})\) 的原因了,就是因為是線性的,求導後為1,直接省略了。
另外sigmoid函數表達式為\(f(z)=\frac{1}{1+e^{-z}}\),很容易知道\(f'(z)=\frac{-e^{-z}}{ (1+e^{-z}) ^2 } = f(z)·(1-f(z))\)這也就解釋了Coursera網站上講義的公式是這樣的了:
是以現在總結一下BP算法步驟:
- 進行前饋傳導計算,利用前向傳導公式,得到\(L_2, L_3, \ldots\)直到輸出層 \(\textstyle L_{n_l}\)的激活值。
對輸出層(第 \(\textstyle n_l\)層),計算:
\(\delta^{(n_l)}= - (y - a^{(n_l)}) \bullet f'(z^{(n_l)})\)
對于 \(\textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2\) 的各層,計算:
\(\delta^{(l)} = \left((W^{(l)})^T \delta^{(l+1)}\right) \bullet f'(z^{(l)})\)
- 計算最終需要的偏導數值:
\[ \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}
使用批量梯度下降一次疊代過程:
- 對于所有\(\textstyle l\),令 \(\textstyle \Delta W^{(l)} := 0 , \textstyle \Delta b^{(l)} := 0\) (設定為全零矩陣或全零向量)
對于\(\textstyle i = 1\) 到\(\textstyle m\) ,
使用反向傳播算法計算\(\textstyle \nabla_{W^{(l)}} J(W,b;x,y)\) 和\(\textstyle \nabla_{b^{(l)}} J(W,b;x,y)\) 。
計算\(\textstyle \Delta W^{(l)} := \Delta W^{(l)} + \nabla_{W^{(l)}} J(W,b;x,y)\) 。
計算\(\textstyle \Delta b^{(l)} := \Delta b^{(l)} + \nabla_{b^{(l)}} J(W,b;x,y)\) 。
- 更新權重參數:
W^{(l)} &= W^{(l)} - \alpha \left[ \left(\frac{1}{m} \Delta W^{(l)} \right) + \lambda W^{(l)}\right] \\
b^{(l)} &= b^{(l)} - \alpha \left[\frac{1}{m} \Delta b^{(l)}\right]
3) Backpropagation Intuition
本小節示範了具體如何操作BP,不再贅述。
具體可參考Coursera講義。