---
# System prepended metadata

title: HY機器學習#2：模型訓練要訣1
tags: [李宏毅, 機器學習]

---

# HY機器學習#2：模型訓練要訣1

https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/overfit-v6.pdf

# 類神經訓練不佳的可能原因

Training: xi yi
造出 f_theta(x) 包含未知參數
造出 L(theta) 由未知參數構成的Loss Function
評估 找出最小L(theta)的那個theta*

Testing:xi
用f_theta*(x) 來label testing data

![](https://i.imgur.com/CDRdWR0.png)


## 先看Traning Model 

如果誤差太大

### Model Bias太大

Function如果太簡單，可能永遠無法降低Bias
=>重新設計Model，例如增加feauture、增加層數、增加函數複雜度（例如sigmoid）

### Optimization Issue

Gradient Descent可能只能找到局部最小值，而非全域最小值
越多層越容易發生
=> 用其他的Optimization方法

### Model Bias or Optimization Issue?

https://arxiv.org/abs/1512.03385

越多層若bias還比較大，應該就是Optimization Issue
（少層可以做得到，多層也可以）
因此可以做一些比較淺層的方法或簡單的模型，若跟原先深的方法差不多，那可以推測是Optimization Issue

## 再Testiong Data

若Training Data誤差小，Testing Data誤差大

### Over Fitting

用彈性過大的函數描述（例如給共線三點，得到一個彈性更大的四次函數，但實際上就是共線）
=> 增加Training Data數、Data augmentation（根據經驗生出資料，例如將影像放大或局部）、降低模型彈性（根據對問題的理解，降低參數個數或神經元個數或共用參數（CNN））、降低feauture數、Early Stopping、Regularization、Dropout(以上三個在後面課程)
=> 降低彈性太多也可能會造成Model Bias

Cross Validation
將Training Set分成Train跟Validation
推薦用Validation結果而非Publc Testing的結果

N-Fold Validation
資料分成N份 其中一份Testing 其他Training，共有N種測試方法，將全部模型用在這N種測試方法，看平均來說哪個比較好

### Mismatching

Training/Testing Data分佈不一樣
例如某時期資料在另一時期資料不適用
=> 對資料的理解


# Optimization Issue

主因：Gradient=0 => Critical Point
可能是Local Minimum/Saddle Point(某一方向最大/另一方向最小)

## 判斷原因
Local Min:無法再往下走
Saddle point:可以往某個方向繼續

先對Loss Function做以下近似
![](https://i.imgur.com/3fkcbV1.png)

綠色部份因為gradient=0所以必為0，看紅色部份(Hessian)可判斷
![](https://i.imgur.com/iFzsHMA.png)

將Critical Point各自代入H矩陣
計算H矩陣的特徵值Eigen Value就可以得知
![](https://i.imgur.com/0r9cs6P.png)

## 若是Saddle Point

尋找其中一個Eigen Vector，以此為更新方向即可
（實做少用）
![](https://i.imgur.com/3ApamPW.png)

## Local Min?

以多維的角度來看，Local Min情況比較少


# 逃脫crtical point -1:Batch

將資料分成很多份(Batch)，每跑一次batch就更新一次參數
全部batch都跑一次稱為一個epoch
之後將資料shuffle打亂再繼續跑epoch

太大：更新參數慢，更新方向穩定（powerful）但需要時間多
太小：更新參數快，但更新方向不一定正確（noisy）
=>有平行運算，時間不一定倍數增加，不會增加這麼快
=>因此一個epoch需要的時間，小batch時間會比較多

看起來大batch劣勢消失，好像會比較好
但實際上大batch會有optimization issue，遇到local min就無法前進
小batch可能遇到有點差異的Loss Function，換一條路就可以繼續更新參數。在一樣的training準確率之下，test也會有比較好的準確率。

大的batch可能比較容易走到較陡的像是峽谷的Local Minimum（小的batch有noise，容易跳出峽谷），這樣會讓testing data一旦有些許改變就會影響準確率甚巨

## 各自的優勢：
大batch：一個epoch的時間短
小batch：Optimization Testing結果優

## 兼顧?

參考的paper

Large Batch Optimization for Deep Learning: Training BERT in 76 minutes
(https://arxiv.org/abs/1904.00962)

Extremely Large Minibatch SGD: Training ResNet-50 on
ImageNet in 15 Minutes (https://arxiv.org/abs/1711.04325)

Stochastic Weight Averaging in Parallel: Large-Batch Training That Generalizes Well (https://arxiv.org/abs/2001.02312)

Large Batch Training of Convolutional Networks
(https://arxiv.org/abs/1708.03888)

Accurate, large minibatch sgd: Training imagenet in 1 hour
(https://arxiv.org/abs/1706.02677)


# 逃脫crtical point -2:Momenten 動量

可以改善critical point的技術

原先的gradient descent:往gradient反向改變參數

令動量m(n)=λm(n-1)-ηg(n-1)
(g為gragient，m(0)=0)
更新參數參數θ(n)=θ(n-1)+m(n)
也就是不只加上gradient的方向，還要加上前次本來的方向

m(n)也就是之前所有g之加權和
也可以看成慣性，不要讓點卡住

# Training 卡住 -Learning Rate

https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/optimizer_v4.pdf

若Error surface崎嶇
可能在峽谷的兩端跑來跑去，無法跑到最低點（山谷）
有時候降低learning rate也沒有用，或是可能很耗時
=> Learning Rate應該可以隨時調整

坡度大（陡峭）：Rate小
坡度小（平緩）：Rate大

### RMS法（在Agagrad法裡面出現的方法）

除了原來的rate(η)，還會除以σ，這個變數在每個參數、每次更新都不一樣，算法是過去所有次數該參數的gradient的標準差（方均根）
θ(t)=θ(t-1) - [η/σ(t-1)]g(t-1)

這個方法可以讓坡度大的時候（標準差大）Rate變小

### RMS Prop法

標準差 Rate可能也會想要跟時間有關
原先RMS法：σ(t)^2 = Sum[g(t-1)^2]　＋　g(t) ^2
RMS Prop法：σ(t)^2 = aXSum[g(t-1)^2]　＋　(1-a)Xg(t) ^2

給予之前的、最新一次的方均根不同權重（a自行調整）
a比較大的話，表示最近的gradient的影響力比較大


### Adam法：RMS Pros + Momentum

Pytorch有Adam法，可以直接用（預設參數即可）

![](https://i.imgur.com/39Lv3ox.png)


https://arxiv.org/pdf/1412.6980.pdf


### Learning Rate Scheduling

Learning Rate也可以是時間的函數，通常有以下兩種，一種是decay，一種是先warm up再decay
decay是因為後半段通常趨於穩定，每一次的變化需要減少
warm up可能的原因是一開始計算標準差比較不準，需要一段時間探索再增加變化率
![](https://i.imgur.com/WNa178f.png)


![](https://i.imgur.com/R1m5lEV.png)


###### tags: `機器學習` `李宏毅`