完整機器學習實現代碼GitHub
歡迎轉載,轉載請注明出處https://www.cnblogs.com/huangyc/p/10111234.html
歡迎溝通交流: 339408769@qq.com
1. 前言
我們在學習人工智能的時候,不管是機器學習還是深度學習都需要經歷一個調參的過程,參數的好壞直接影響這模型效果的好壞。今天我們介紹下在深度學習中,調參的技巧主要分為哪些。
2. 深度學習中的主要參數
- 學習率(learning rate):學習率的取值一般是1、0.1、0.01、0.001等,我的建議是學習率從大到小,因為大的學習率運算的快,驗證錯誤的速度快。並且我們的學習的過程一般通過Adam進行動態調整,基本問題不大。
- 網絡層數:先從1層開始。
- 每層結點數:16,32,128,超過1000的情況比較少見。
- batch size: 128左右開始。batch取太大會陷入局部最小值,batch取太小會抖動厲害,因此要選擇一個合適的batch size。
- 梯度裁剪: 限制最大梯度,如果梯度超過了閾值就進行截斷。
- dropout:在訓練的時候可以設置一定的dropout,提升網絡的健壯性,也能提升網絡的計算速度。
- 詞向量embedding大小:embedding的大小一般是128和256。
- 正負樣本比例: 這個是非常忽視,但是在很多分類問題上,又非常重要的參數。很多人往往習慣使用訓練數據中默認的正負類別比例,當訓練數據非常不平衡的時候,模型很有可能會偏向數目較大的類別,從而影響最終訓練結果。除了嘗試訓練數據默認的正負類別比例之外,建議對數目較小的樣本做過采樣,例如進行復制。提高他們的比例,看看效果如何,這個對多分類問題同樣適用。在使用mini-batch方法進行訓練的時候,盡量讓一個batch內,各類別的比例平衡,這個在圖像識別等多分類任務上非常重要。
- 每層做BN操作,提高結果准確率
- 盡量對數據做shuffle
3. 自動調參
人工一直盯着實驗,畢竟太累。自動調參當前也有不少研究。下面介紹幾種比較實用的辦法:
3.1 Gird Search
這個是最常見的。具體說,就是每種參數確定好幾個要嘗試的值,然后像一個網格一樣,把所有參數值的組合遍歷一下。優點是實現簡單暴力,如果能全部遍歷的話,結果比較可靠。缺點是太費時間了,特別像神經網絡,一般嘗試不了太多的參數組合。
3.2 Random Search
Bengio在Random Search for Hyper-Parameter Optimization中指出,Random Search比Gird Search更有效。實際操作的時候,一般也是先用Gird Search的方法,得到所有候選參數,然后每次從中隨機選擇進行訓練。
3.3 Bayesian Optimization
貝葉斯優化,考慮到了不同參數對應的實驗結果值,因此更節省時間。和網絡搜索相比簡直就是老牛和跑車的區別。具體原理可以參考這個論文: Practical Bayesian Optimization of Machine Learning Algorithms ,這里同時推薦兩個實現了貝葉斯調參的Python庫,可以上手即用:
- jaberg/hyperopt, 比較簡單。
- fmfn/BayesianOptimization, 比較復雜,支持並行調參。
4. 深度學習效果不好
- 選擇合適的損失函數:平方損失,交叉熵損失
- 選擇合適的Mini-batch size
- 選擇合適的激活函數
-
選擇合適的自適應學習率
4.1 過擬合處理辦法
- earyly stoping
- dropout
- 正則化
- BN
- bagging
-
數據增強
5. 畫圖
畫圖是一個很好的習慣,一般是訓練數據遍歷一輪以后,就輸出一下訓練集和驗證集准確率。同時畫到一張圖上。這樣訓練一段時間以后,如果模型一直沒有收斂,那么就可以停止訓練,嘗試其他參數了,以節省時間。
