784 words
4 minutes

Machine Learning : Neural Network

Intro#

  • 把許多神經元合成一個layer
  • 藉由多個layer去把input映射到output
  • 對整個模型的權重 WijW_{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)f(x) = max(0, x)
  • 可緩解梯度消失
  • 在負區為零可提升特徵表示之泛化能力
  • 不過若輸入包含大量負數, 會導致死亡ReLU

Leaky ReLU#

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

Architecture of Deep Learning#

img13

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

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

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

Error measure#

使用誤差平方:

en=(ynNNet(xn))2=(yni=0dL1wi1(L)xiL1)2e_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
ensj(L)=2(ynsj(L))(iwij(L)xi(L1))wij(L)=xi(L1)\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:

enwij(L)=ensj(L)sj(L)(iwij(L)xi(L1))(iwij(L)xi(L1))wij(L)=2(ynsj(L))xi(L1)\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的輸出:

sj(l)=f(iwij(l)xi(l1))s_j^{(l)} = f \Bigl(\sum_i w_{ij}^{(l)} x_i^{(l-1)}\Bigr)

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

enwij(l)==ensj(l)f(iwij(l)xi(l1))xi(l1)\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

δj(l)=ensj(l)=k(δk(l+1)sk(l+1)xj(l))xj(l)sj(l)\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, 取得網路對於 xnx_n 的輸出:
xj(l)=tanh(sj(l))=tanh(iwji(l)xi(l))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. 更新權重:
wij(l)wij(l)ηδj(l)xi(l)w_{ij}^{(l)} \leftarrow w_{ij}^{(l)} - \eta \delta_j^{(l)} x_i^{(l)}

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

Gradient Descent#

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

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

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

v=Ein(wt)Ein(wt)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#

  • 淺層的網路更容易訓練
  • 淺層網路架構更簡單
  • 但深度網路可以完成更複雜的任務, 例如電腦視覺
Machine Learning : Neural Network
https://blog.cyberangel.work/posts/ml-nn/
Author
Ethan
Published at
2025-03-22
License
CC BY-NC-SA 4.0
Last updated on 2025-03-22,257 days ago

Some content may be outdated

Table of Contents