Week5
Cost Function
- 首先定義一些在neural network會用到的變數
- L:在這個network中有幾層layer
- $s_l$:在這個layer中有幾個unit (不含bias unit)
- K:總共有幾個output unit,即結果分成幾類
- $h_\Theta(x)_k$:產生第k個output的hypothesis
- Neural network的cost function定義如下:
\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*}
Backpropagation Algorithm
- Backpropagation是neural network中用來表示最小化cost function的術語,就如同在logistic及linear regression中所用的gradient descent
- 目標是計算:$\min_\Theta J(\Theta)$
- 在這一節中我們來看看如何計算J(Θ)的偏微分
- $\dfrac{\partial}{\partial \Theta_{i,j}^{(l)}}J(\Theta)$
- 演算法:
- 給定一組training set $\lbrace (x^{(1)}, y^{(1)}) \cdots (x^{(m)}, y^{(m)})\rbrace$
- 設定$\Delta^{(l)}_{i,j}$ for all (l,i,j)
- $\Delta$代表的是error
- For training example t =1 to m:
- 設定$a^{(1)} := x^{(t)}$
- 使用forward propogation計算$a^{(l)}$ for l=2,3,…,L
- 利用$y^{(t)}$計算$\delta^{(L)} = a^{(L)} - y^{(t)}$
- 這是最後一個layer的error
- $\delta$是$\Delta$的小寫
- 將最後一層得到的結果跟正確值y相減
- 計算最後一層layer之前的$\delta^{(L-1)}, \delta^{(L-2)},\dots,\delta^{(2)}$
- 使用$\delta^{(l)} = ((\Theta^{(l)})^T \delta^{(l+1)})\ .*\ a^{(l)}\ .*\ (1 - a^{(l)})$
- 後面兩項代表的是$g'(z^{(l)}) = a^{(l)}\ .*\ (1 - a^{(l)})$,也就是對$g(z^{(l)})$的微分(g-prime derivative)
- $\Delta^{(l)}_{i,j} := \Delta^{(l)}_{i,j} + a_j^{(l)} \delta_i^{(l+1)}$
- 或是用vector計算:$\Delta^{(l)} := \Delta^{(l)} + \delta^{(l+1)}(a^{(l)})^T$
- 最後可以得到新的$\Delta$ matrix
- 若j≠0
- $D^{(l)}_{i,j} := \dfrac{1}{m}\left(\Delta^{(l)}_{i,j} + \lambda\Theta^{(l)}_{i,j}\right)$
- 若j=0
- $D^{(l)}_{i,j} := \dfrac{1}{m}\Delta^{(l)}_{i,j}$
- D是作為accumulator用來將所有的值加起來以求出最後的偏微分
- $\frac \partial {\partial \Theta_{ij}^{(l)}} J(\Theta)$ = $D_{ij}^{(l)}$
Backpropagation Intuition
- $\delta_j^{(l)}$代表的是在$a^{(l)}_j$的error,實際上也可以看成cost function的微分
- $\delta_j^{(l)} = \dfrac{\partial}{\partial z_j^{(l)}} cost(t)$
- 以下面這張圖為例:
- 第二層的$\delta_2^{(2)}$可透過第三層的$\delta_1^{(3)}$及$\delta_2^{(3)}$來得到
- $\delta_2^{(2)}$ == $\Theta_{12}^{(2)}$*$\delta_1^{(3)}$+$\Theta_{22}^{(2)}$*$\delta_2^{(3)}$
Gradient Checking
- Gradient checking可以用來確保我們的back propagation是正確的
- Cost function的微分結果可以用下列式子來做近似:
- $\dfrac{\partial}{\partial\Theta}J(\Theta) \approx \dfrac{J(\Theta + \epsilon) - J(\Theta - \epsilon)}{2\epsilon}$
- 而對於有多個theta的矩陣,對於$Θ_j$微分的近似值則如下:
- $\dfrac{\partial}{\partial\Theta_j}J(\Theta) \approx \dfrac{J(\Theta_1, \dots, \Theta_j + \epsilon, \dots, \Theta_n) - J(\Theta_1, \dots, \Theta_j - \epsilon, \dots, \Theta_n)}{2\epsilon}$
- 將epsilon設小(${\epsilon = 10^{-4}}$)可確保數學式子是正確的
- 淡epsilon若設的過小會遇到數值上的問題
- 將近似的結果跟用back propagation得到的delta做比較,若結果正確的話數值不會差太多
- 由於實作上近似值的計算很慢,所以在檢查完back propagation演算法後就不要再多做了!
Random Initialization
- 在neural network中若將weight的初始值都設為0的話,在做back propagate時所有的node都會被update成相同的數值,這樣會大大降低準確度
- 所以我們應該將$\Theta^{(l)}_{ij}$設成介於$[-\epsilon,\epsilon]$間的隨機值
- 這裡的epsilon跟gradient checking的沒有關聯
- epsilon比較好的選擇如下圖,Lin/Lout為該Layer input/output的unit數量
- 首先要選擇network architecture,hidden unit有幾個,要分成幾個layer
- hidden unit:越多越好,但要衡量計算成本
- hidden layer:預設為1層,若超過1層,則建議每一層的hidden unit數目一樣\
- Training a Neural Network
- 隨機初始化weights
- 實作forward propagation以求得$h_\Theta(x^{(i)})$
- 實作cost function
- 實作back propagation以算出cost function的偏微分
- 跑一次gradient checking確認back propagation是對的
- 使用gradient descent或內建的最佳化方式求出讓cost function最小的weights
沒有留言:
張貼留言