Intro

  • 把許多神經元合成一個layer
  • 藉由多個layer去把input映射到output
  • 對整個模型的權重 $W_{ij}$ 去做學習
  • 為深度學習之基礎

Activation function

  • 用來決定一個節點是否要激活
  • 同時用於normalize節點輸出
  • 共分為以下三類
    • Binary step
    • Linear step : 無法用於預測不同input對應的weight
    • Non-Linear step : 允許堆疊layer, backpropagation

常見的非線性激活函數 : Sigmoid, tanh, ReLU, Leaky ReLU

Sigmoid

  • 輸出介於0與1
  • 用於概率輸出
  • 由於輸出中心非0, 會造成梯度下降時方向偏移, 而影響收斂速度

Tanh

  • 輸出介於-1與1 (以0作為中心)
  • 相較Sigmoid有更大動態範圍
  • 輸入過大時, 也容易發生梯度消失

ReLU

  • 實作上非常簡單: $$ f(x) = max(0, x) $$

  • 可緩解梯度消失

  • 在負區為零可提升特徵表示之泛化能力

  • 不過若輸入包含大量負數, 會導致死亡ReLU

Leaky ReLU

  • 與ReLU非常雷同, 不過在負區時加入一個斜率
  • 額外的參數可能影響performance

Architecture of Deep Learning

img13

在每層layer要對下一層進行輸出時, 會在權重上再額外加上一個常數維度, 舉例:

在 3-5-1 的NNet中, 共有如下數目的weight:

$$ (3+1) \times 5 + (5+1) \times 1 = 26 $$

Error measure

使用誤差平方:

$$ e_n = (y_n - NNet(x_n))^2 = (y_n - \sum_{i=0}^{d^{L-1}} w_{i1}^{(L)} x_{i}^{L-1})^2 $$

接著計算誤差的偏微分, 可以幫助隨機梯度下降的進行

Partial derivatives on layers

  • Output layer

$$ \frac{\partial e_n}{\partial s_j^{(L)}} = -2 \bigl(y_n - s_j^{(L)}\bigr) \ \frac{\partial \bigl(\sum_i w_{ij}^{(L)} x_i^{(L-1)}\bigr)}{\partial w_{ij}^{(L)}} = x_i^{(L-1)} $$

Chain rule:

$$ \frac{\partial e_n}{\partial w_{ij}^{(L)}} = \frac{\partial e_n}{\partial s_j^{(L)}} \cdot \frac{\partial s_j^{(L)}}{\partial \bigl(\sum_i w_{ij}^{(L)} x_i^{(L-1)}\bigr)} \cdot \frac{\partial \bigl(\sum_i w_{ij}^{(L)} x_i^{(L-1)}\bigr)}{\partial w_{ij}^{(L)}} = -2 \bigl(y_n - s_j^{(L)}\bigr) x_i^{(L-1)} $$

  • Hidden layer

考慮當前layer的輸出:

$$ s_j^{(l)} = f \Bigl(\sum_i w_{ij}^{(l)} x_i^{(l-1)}\Bigr) $$

可以再分解成後面的誤差+激活函數的微分

$$ \frac{\partial e_n}{\partial w_{ij}^{(l)}} = = \frac{\partial e_n}{\partial s_j^{(l)}} \cdot f’ \Bigl(\sum_i w_{ij}^{(l)} x_i^{(l-1)}\Bigr) \cdot x_i^{(l-1)} $$

Compute delta

這邊假設激活函數用的是tanh

$$ \delta_j^{(l)} = \frac{\partial e_n}{\partial s_j^{(l)}} = \sum_k \Bigl(\delta_k^{(l+1)} \frac{\partial s_k^{(l+1)}}{\partial x_j^{(l)}}\Bigr) \cdot \frac{\partial x_j^{(l)}}{\partial s_j^{(l)}} $$

Backpropagation Algorithm

  1. 初始化權重(隨便設定)
  2. 先隨便挑一筆資料用來更新weight, SGD / Mini-batch
  3. 做forward pass, 取得網路對於 $x_n$ 的輸出:

$$ x_j^{(l)} = \tanh\Bigl(s_j^{(l)}\Bigr) = \tanh\Bigl(\sum_i w_{ji}^{(l)} x_i^{(l)}\Bigr) $$

  1. 對於每層中的每個神經元計算誤差信號, 其中delta會用到後面層數的輸出(根據上面chain rule推導)
  2. 更新權重:

$$ w_{ij}^{(l)} \leftarrow w_{ij}^{(l)} - \eta \delta_j^{(l)} x_i^{(l)} $$

其中eta用以控制更新幅度, 透過梯度下降去讓誤差函數收斂

Gradient Descent

前面的偏微分求出的結果就是梯度, 並且可以發現往梯度的反方向移動就可以讓loss function收斂:

$$ w_{t+1} = w_t - \eta \nabla E_{\text{in}}(w_t) $$

其中的v為梯度向量的反方向:

$$ v = - \frac{\nabla E_{\text{in}}(w_t)}{|\nabla E_{\text{in}}(w_t)|} $$

Neural Network Optimization

  • Non-convex : 很難找到對於global的最佳解
  • Local minimum : 由於backprop, 通常來說不同的初始權重會導致不同的收斂結果
  • 通常需要嘗試多種不同的初始權重
  • Difficult, but practically works

Shallow vs Deep NNet

  • 淺層的網路更容易訓練
  • 淺層網路架構更簡單
  • 但深度網路可以完成更複雜的任務, 例如電腦視覺