跳至主要内容

Hyperparameter, Batch Normalization, Softmax

本文探討了訓練深度學習模型時最常用的兩個觀念,包括調整超參數 (hyperparameter tuning) 以及使用批次正規化 (batch normalization)。文中比較了不同的調整超參數的方法,並列出了調整的區間以及最適當的範圍。文章接著介紹了批次正規化,並說明了在深度學習模型中如何使用批次正規化來加快訓練速度。文中更進一步介紹了 Softmax Regression 以及其 Cost Function 和 Gradient Descent 的用法,並且提及了常見的深度學習框架,以及如何選擇合適的框架以及框架的重要性。

Hyperparameter Tuning

  • 下面來 ranking 一下目前所出現過的 hyperparameters 重要度
  • 最重要
    • Learning rate α\alpha
  • 第二重要
    • Momentum parameter β0.9\beta \approx 0.9
    • Number of hidden units nln^{l}
    • Mini-Batch size
  • 第三重要
    • Number of layers LL
    • Learning rate decay Decay-rate\text{Decay-rate}
  • 不怎麼需要調整
    • Adam parameters β1,β2,ϵ\beta_1, \beta_2, \epsilon

Tunning Process

  • 我們可以一次測試多種 hyperparameters 的組合
  • 但不要使用 grid 當作測試方法
    • 假設你的 (x, y) 選用最重要跟最不重要的 (α,ϵ)(\alpha, \epsilon)
    • 那麼你用 grid 方式等於只是在測試五種 α\alpha 而已
Hyperparameter Tuning Grid
Hyperparameter Tuning Grid
  • 隨機選擇測試組合
    • 這是相對不錯的測試方法
Hyperparameter Tuning Random
Hyperparameter Tuning Random
  • Coarse to fine
    • 基於隨機選擇,在測試時順便聚焦到測試結果不錯的區域,繼續測試該區域
Hyperparameter Tuning Coarse to Fine
Hyperparameter Tuning Coarse to Fine

Appropriate Scale for Picking Hyperparameters

  • 在隨機選取 hyperparameters 時要注意數值的區間 scale
  • 例如隨機選取 layers 或 units,線性區間是非常合理的事
    • n = [50, 100], L = [2, 4]
  • 但在選取 α,β\alpha, \beta 時,不同區間代表的意義不同
    • 例如 β\beta 從 0.9 增加至 0.9005 幾乎沒影響
      • 依然是在取大約前 10 個值的平均
    • 但是 β\beta 從 0.999 增加至 0.9995
      • 代表原本取前 1000 個值的平均
      • 變成取前 2000 個值的平均
  • 所以對這些 hyperparameters 必須先依區間拆分,然後再從每個區間隨機取值
  • α\alpha 拆成 0.0001, 0.001, 0.01, 0.1
  • β\beta1β1-\beta 然後像 α\alpha 一樣拆成 0.1, 0.01, 0.001

Practices

  • 考慮數據、伺服器等環境變化,最好每隔幾個月就要更新你的 hyperparameters,來獲得當前最好的模型
  • Deep learning 中,hyperparameters 可能可以跨領域設定,所以時常關注不同領域的應用可以獲得靈感
  • 在訓練模型時,有兩種方法
    • Panda (babysitting one model)
      • 硬體有限、模型困難,所以無法一次測試大量模型時採用
      • 快速建置、開始測試、不斷調整參數
      • 就像熊貓一樣專心的照顧自己小孩
    • Caviar (training many model parallelly)
      • 有足夠硬體、自己足以應付多個模型
      • 一次平行測試多種 hyperparameters 的結果,並挑選最好的
      • 就像魚一次產下上億個魚卵,看看能不能有很棒的小孩出現

Batch Normalization (BN)

  • Batch Normalization (BN) 有許多好處
    • 訓練速度提升
    • 快速尋找 hyperparameters,所以尋找範圍更加旁大
    • 能夠使 NN 不會受 hyperparameters 影響,更加穩定
  • 在先前我們學過 Normalize input
  • 那我們能不能把這個方法,也運用在每個 hidden layers 的 activation units (A[l]A^{[l]}) 呢 ?
    • 答案是可以的,而且能夠加速 W[l+1],b[l+1]W^{[l+1]}, b^{[l+1]} 的訓練
    • 實作時通常會 normalize Z[l]Z^{[l]},實作如下
μ=1miz(i)σ2=1mi(ziμ)2znorm(i)=z(i)μσ2+ϵ\begin{aligned} \mu &= \frac{1}{m}\sum_i z^{(i)}\\ \sigma^2 &= \frac{1}{m}\sum_i (z_i - \mu)^2\\ z_\text{norm}^{(i)} &= \frac{z^{(i)}-\mu}{\sqrt{\sigma^2+\epsilon}} \end{aligned}
  • 此時所有新的 z(i)z^{(i)} 的 mean = 0, variance = 1
  • 但我們不想讓每個 z(i)z^{(i)} 都一樣是 mean = 0, variance = 1
    • 以 sigmoid 為假設,這樣 normalize 後,每一個 z(i)z^{(i)} 都會在 sigmoid 的 linear 區間
    • 將會不利於訓練 non-linear neural network,進而得到不好的模型
  • 所以我們再次計算
z~(i)=γ×znorm(i)+β\tilde{z}^{(i)} = \gamma \times z_\text{norm}^{(i)} + \beta
  • 這個 γ,β\gamma, \betaw,bw, b 一樣都是 parameters,可以隨著 gradient descent 更新
  • 最終這個 z~(i)\tilde{z}^{(i)} 就可以取代 z(i)z^{(i)}

Adding BN to a NN

Adding BN to a NN
Adding BN to a NN
  • 所以現在利用 w,bw, b 計算完 zz 之後
  • 再用 γ,β\gamma, \beta 計算 z~\tilde{z},以此類推下去
  • Backpropogation 一樣就會計算出 dγ,dβd\gamma, d\beta 來更新 γ,β\gamma, \beta
  • 另外由於 BN 包含減去 mean μ\mu 的動作,使得 bb 參數變得沒有作用
    • 會變成由 β\beta 來取代 bb 的工作
    • 所以在 BN 中,可以把 bb 省略或設為 0

Why BN works ?

  1. 因為對每個 neuron 的 input 都做了 normalization,所以提高整體訓練速度
  2. 因為 normalization 的關係,所有前面層的 weights 對後面層影響減少,更加精確
    • 每一層之間的 weights 耦合度減少,所以更加獨立,並提升自我學習的強度
    • 減緩了 "Covariate Shift" 的影響
  3. BN 也起到了些微的 regularization 效果
    • 因為是在每個 mini-batch 重新計算 mean, variance
    • 這樣計算的結果會產生一些 noise,這些 noise 產生了類似 dropout 的效果
      • 若 mini-batch size 越大,這個效果會越小
    • 不要把 regularization 當作使用 BN 的主要原因

BN at test time

  • BN 能在 mini-batch 時運作良好
  • 但在運行 test set 時,資料是一筆一筆出現,無法得到 μ,σ2\mu, \sigma^2
  • 解決方法 : 當訓練每一個 mini-batch 時,會得到每一個 μ{i}[l],σ2{i}[l]\mu^{\{i\}[l]}, \sigma^{2\{i\}[l]}
    • 將這些參數當成 θi\theta_i 進行 exponentailly weighted averages
    • 預測出最終給 test 時使用的 μ,σ2\mu, \sigma^2 即可

Softmax Regression

  • 要得到多個種類的 classification,我們可以使用 Softmax 作為最後一層的 activation function
  • 我們使用 CC 作為 classification 的種類數目
  • 最後一層計算出 Z : Z[L]=W[L]a[L1]+b[L]Z^{[L]} = W^{[L]}a^{[L-1]} + b^{[L]}
  • ZZ 向量的每一個 ziz_i 使用 softmax activation function
ai[L]=eZi[L]i=1CeZi[L]a_i^{[L]} = \frac{e^{Z_i^{[L]}}}{\sum_{i=1}^C e^{Z_i^{[L]}}}
  • 所有的 ai[L]a_i^{[L]} 加起來要等於 1 i=1Cai[L]=1\sum_{i=1}^C a_i^{[L]} = 1
  • 用實際例子舉例
Softmax example
Softmax example

Softmax Cost Function

  • Loss function : L(y^,y)=j=1Cyjlogyj^\mathcal{L}(\hat{y}, y) = -\sum_{j=1}^C y_j\log \hat{y_j}
  • yy vector 中因為只有第 i 個 entry 為 1
    • 所以其他都等於 0 yj=0 if jiy_j = 0 \text{ if } j \neq i
  • 所以 Loss function 可以簡化成 L(y^,y)=logyj^\mathcal{L}(\hat{y}, y) = -\log\hat{y_j}
    • 也就是要讓 yj^\hat{y_j} 越大,cost 才會越接近 0
  • 於是 Cost Function 等於
    J=1mi=1mL(y^,y)J = \frac{1}{m}\sum_{i=1}^m \mathcal{L}(\hat{y}, y)

Softmax Gradient Descent

  • Softmax regression 在回推 backpropogation 時的算法跟 logistic 時一模一樣
  • 只是以向量模式取代實數
  • dZ[L]=y^yR(C,1)dZ^{[L]} = \hat{y} - y \in \mathbb{R}^{(C, 1)}

Deep Learning Frameworks

  • 現在有非常多種框架能夠簡單應用 deep learning
    • Caffe / Caffe 2
    • CNTK
    • DL4J
    • Keras
    • Lasagne
    • mxnet
    • PaddlePaddle
    • TensorFlow
    • Theano
    • Torch
  • 但選擇時最好基於以下幾個重點
    1. 方便編寫程式
    2. 運行速度要快 (特別是大型數據)
    3. 是否真正開放 (不但是開源、而且需要良好管理、能夠持續更新)