- 針對資料
- 針對神經元
- 針對整個神經網路
- 針對損失函數
- 針對啟動函數
- 針對層
- 針對參數
使用這些技術的目的
- 提高模型的準確度
- 加快達到訓練效果的時間
- 防止overfitting
- Inference的速度
- 對抗雜訊的能力
提高模型準確率
- Confusion Matrix
- F1 Score其它資訊
模型準確率
- 訓練集上有沒有好的結果
- 訓練集結果不好,不是過度擬合(overfitting),需做調整(如dropout)
- 測試集上有沒有好的結果
- 測試集上沒有好結果,就是過度擬合
- 測試集上結果也好,表示模型訓練成功
優化流程

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

Gradient Vanishing

Gradient Vanishing
靠近輸入層Gradient值非常小,靠近輸出層的Gradient很大,相同學習率靠近輸入層參數updata會很慢,靠近輸出層的參數updata會很快。當前幾層都還沒有更動參數的時候(隨機),之後幾層的參數就已經收斂了。
針對訓練資料集的變更
- 獲得更多分佈更平均的訓練資料
- Feature Scaling
- Data augmentation
- 資料集train, val, test比例的改變
- 使用CV調整資料集的圖型特值
- 變換資料集的顏色空間
- Data balancing
- Generative model(autoencoders, GAN)
- Weighted Random Sampler
訓練時參數的調整
- 批次大小(batch size)
- 輪數(epoch)
- 提早結束(Early stopping)
網路參數的調整
- Batch norm
- Weights, biases的初始化
- Activation Function(變更神經元)
- 防止梯度消失或梯度膨脹
- Softmax
損失函數的調整
- 更換損失函數MSE、BCE、CCE
- L1, L2 Regularization
- L1, L2 Lamda值
- 讓損失函數更平滑(更好微分)
- Focal Loss
最佳化方法的調整
- 更換最佳化方法
- 學習率的調整
- Hessian, LBFG
- Momentum-based
- Adagrad, RMSProp, ADAM, momentum
- Adaptive learning rates
最佳化方法的調整
- 更換最佳化方法
- 學習率的調整
- Hessian, LBFG
- Momentum-based
- Adagrad, RMSProp, ADAM, momentum
- Adaptive learning rates
神經網路優化技巧 https://hackmd.io/@joshhu/SJ2UG4UdS
{"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}]"}