2017年9月24日 星期日

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

沒有留言:

張貼留言