天天看點

Andrew Ng機器學習課程筆記--week5(上)

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上的推導:

Andrew Ng機器學習課程筆記--week5(上)

假設神經網絡結構如下

Andrew Ng機器學習課程筆記--week5(上)

- 1. FP

  1. 利用前向傳導公式(FP)計算\(2,3……\) 直到 \({n_l}\)層(輸出層)的激活值。

    計算過程如下:

Andrew Ng機器學習課程筆記--week5(上)

- 2. BP

  • 權值更新

首先需要知道的是BP算法是幹嘛的?它是用來讓神經網絡自動更新權重\(W\)的。

這裡權重\(W\)與之前線性回歸權值更新形式上是一樣:

Andrew Ng機器學習課程筆記--week5(上)

那現在要做的工作就是求出後面的偏導,在求之前進一步變形:

Andrew Ng機器學習課程筆記--week5(上)
注意\(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*}

Andrew Ng機器學習課程筆記--week5(上)
Andrew Ng機器學習課程筆記--week5(上)
Andrew Ng機器學習課程筆記--week5(上)
更加詳細運算過程可以參考一文弄懂神經網絡中的反向傳播法——BackPropagation,這篇文章詳細的介紹了BP算法的每一步驟。

上面的公式中出現了\(δ\)(誤差error),是以後續的目的就是求出每層每個node的\(δ\),具體過程如下:

  • 計算δ

對于第 \(n_l\)層(輸出層)的每個輸出單元\(i\),我們根據以下公式計算殘差:

Andrew Ng機器學習課程筆記--week5(上)

對 \(l = n_l-1, n_l-2, ……,3,2\)的各個層,第 \(l\) 層的第 \(i\) 個節點的殘差計算方法如下:

Andrew Ng機器學習課程筆記--week5(上)

将上面的結果帶入權值更新的表達式中便可順利的執行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網站上講義的公式是這樣的了:

Andrew Ng機器學習課程筆記--week5(上)

是以現在總結一下BP算法步驟:

  1. 進行前饋傳導計算,利用前向傳導公式,得到\(L_2, L_3, \ldots\)直到輸出層 \(\textstyle L_{n_l}\)的激活值。
  2. 對輸出層(第 \(\textstyle n_l\)層),計算:

    \(\delta^{(n_l)}= - (y - a^{(n_l)}) \bullet f'(z^{(n_l)})\)

  3. 對于 \(\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)})\)

  4. 計算最終需要的偏導數值:

\[ \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}

使用批量梯度下降一次疊代過程:

  1. 對于所有\(\textstyle l\),令 \(\textstyle \Delta W^{(l)} := 0 , \textstyle \Delta b^{(l)} := 0\) (設定為全零矩陣或全零向量)
  2. 對于\(\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)\) 。

  3. 更新權重參數:

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講義。
Andrew Ng機器學習課程筆記--week5(上)

MARSGGBO ♥原創 2017-8-3

繼續閱讀