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
在每層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
- 初始化權重(隨便設定)
- 先隨便挑一筆資料用來更新weight, SGD / Mini-batch
- 做forward pass, 取得網路對於 $x_n$ 的輸出:
$$ x_j^{(l)} = \tanh\Bigl(s_j^{(l)}\Bigr) = \tanh\Bigl(\sum_i w_{ji}^{(l)} x_i^{(l)}\Bigr) $$
- 對於每層中的每個神經元計算誤差信號, 其中delta會用到後面層數的輸出(根據上面chain rule推導)
- 更新權重:
$$ 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
- 淺層的網路更容易訓練
- 淺層網路架構更簡單
- 但深度網路可以完成更複雜的任務, 例如電腦視覺