# 神經網路優化技巧
<!-- Put the link to this slide here so people can follow -->
https://hackmd.io/@joshhu/SJ2UG4UdS
---
* 針對資料
* 針對神經元
* 針對整個神經網路
* 針對損失函數
* 針對啟動函數
* 針對層
* 針對參數
---
## 使用這些技術的目的
---
1. 提高模型的準確度
2. 加快達到訓練效果的時間
3. 防止overfitting
5. Inference的速度
6. 對抗雜訊的能力
---
## 提高模型準確率
---
1. Confusion Matrix
2. F1 Score其它資訊
---
## 模型準確率
---
1. 訓練集上有沒有好的結果
1. 訓練集結果不好,不是過度擬合(overfitting),需做調整(如dropout)
1. 測試集上有沒有好的結果
1. 測試集上沒有好結果,就是過度擬合
1. 測試集上結果也好,表示模型訓練成功
---
## 優化流程

---
## 網路優化調整的對象
---
1. 變更整個網路架構(換一組新的H)
1. 針對訓練資料集的變更
1. 針對訓練參數的調整
1. 網路參數的調整
1. 損失函數
1. 最佳化方法
1. 使用一個或多個GPU,或分散式系統(k8s)
---
## 變更整個網路架構
---
1. 變換一種大架構
2. 變更神經元的種類(啟動函數, RELU)
3. 變換不同的模型,如把resnet換成densnet
4. Dropout(大多只用在fully connected layers)
5. batch norm
6. 模型的參數量會影響很多地方:訓練時間、記憶體的使用、硬體的使用、佈署、參考的時間
---
### 變換一種大架構
---
1. 把線性換成非線性
2. 變更神經元的類型
3. 把非線性換成NN
4. 把NN換成DNN
5. 把DNN換成CNN
6. 把CNN換成更複雜的架構,如inception
7. 增加複雜度,即增加函數的分佈空間
8. 如$y=w_1x^2+w_2x+b$這個非線性,一定包含$w_2x+b(w_1=0)$這個線性解
---
### 模型參數量的影響
---
1. 這個model是否train的起來
2. 準確度
3. 訓練時間
4. 記憶體的使用
5. 硬體的使用佈署
6. Inference的時間
---
### 變更Activation Function

---
### Gradient Vanishing

---
### Gradient Vanishing
---
靠近輸入層Gradient值非常小,靠近輸出層的Gradient很大,相同學習率靠近輸入層參數updata會很慢,靠近輸出層的參數updata會很快。當前幾層都還沒有更動參數的時候(隨機),之後幾層的參數就已經收斂了。
---
## 針對訓練資料集的變更
---
1. 獲得更多分佈更平均的訓練資料
1. Feature Scaling
1. Data augmentation
1. 資料集train, val, test比例的改變
1. 使用CV調整資料集的圖型特值
1. 變換資料集的顏色空間
1. Data balancing
1. Generative model(autoencoders, GAN)
1. Weighted Random Sampler
---
## 訓練時參數的調整
---
1. 批次大小(batch size)
1. 輪數(epoch)
1. 提早結束(Early stopping)
---
## 網路參數的調整
---
1. Batch norm
1. Weights, biases的初始化
1. Activation Function(變更神經元)
1. 防止梯度消失或梯度膨脹
1. Softmax
---
## 損失函數的調整
---
1. 更換損失函數MSE、BCE、CCE
1. L1, L2 Regularization
1. L1, L2 Lamda值
1. 讓損失函數更平滑(更好微分)
2. Focal Loss
---
## 最佳化方法的調整
---
1. 更換最佳化方法
1. 學習率的調整
1. Hessian, LBFG
1. Momentum-based
1. Adagrad, RMSProp, ADAM, momentum
1. Adaptive learning rates
---
## 最佳化方法的調整
---
1. 更換最佳化方法
1. 學習率的調整
1. Hessian, LBFG
1. Momentum-based
1. Adagrad, RMSProp, ADAM, momentum
1. Adaptive learning rates
---
{"metaMigratedAt":"2023-06-15T00:33:27.738Z","metaMigratedFrom":"YAML","title":"神經網路優化技巧","breaks":true,"description":"nn optimization .","contributors":"[{\"id\":\"33d47e04-0bab-4c19-9d2f-fbbbae0b7706\",\"add\":3377,\"del\":1091}]"}