你有哪些deep learning(rnn、cnn)调参的经验
總結一下在曠視實習兩年來的煉丹經驗,我主要做了一些 RL,圖像質量,圖像分類,GAN 相關的任務
『可復現性和一致性』
有的同學在打比賽的時候,從頭到尾只維護若干份代碼,每次載入前一次的訓練參數,改一下代碼再煉,俗稱老丹。這樣會有幾個問題:某次引入一個 bug,過了很久才發現,然后不知道影響范圍;得到一個好模型,但是不知道它是怎么來的;忘了自己的 baseline,不知道改動是正面還是負面。
要盡可能確保每一個模型有可復現性,實踐上建議代碼不應該在訓練后再改動,訓練新的模型時,把舊的代碼復制一遍。得到的實驗結果要開個文檔記下來以便日后總結,避免遺忘。我經常通過閱讀自己和別人的記錄來得到靈感。
實驗一致性上也要多做努力,理想狀態是有合理的基準來測模型的性能,同一個代碼不應該由于超參的微小改動而有顯著結果差異。出現這種情況可能是數據太少或基準設置不當。
『資源利用』
對于新入行的同學,不要試圖在玩具級別的數據集或任務上做靠譜的研究,比如 MNIST。
不是每一個實驗都要出一個好模型,實驗是為了驗證結論的。如果每個實驗都要 8 張卡跑兩個星期,人力物力都耗不起。盡力把實驗控制在單卡一天以內,理想狀態是半天得一次結論。理論上來說,水多加面面多加水(加數據加計算量)的做法無限漲點。建議先設一個目標,比如說就是在一天的訓練時間下做對比實驗。
我的實踐經驗是,首先用小圖小模型,比如 128 x 128 輸入的 ResNet18;用 cProfile 來找性能瓶頸,比如我的某個模型,訓練的時候有一大半時間耗費在等數據,數據處理中一大半時間在調用 numpy 的 round 函數,前期把精力集中在提高做實驗的效率上。
『模型不 work』
先把錦上添花的東西去掉,如數據增廣,玄學學習率和超參,魔幻損失函數,異形模型。如果世界上有一個非要加八個增廣和 1.96e-4 學習率 42 batchsize,配上四種混合損失函數的模型,改動一點都不行,它應該存在于靈能文明。可以先造一些盡量玩具的模型,驗證代碼正確性。
『需要進一步改進』
先確認影響模型性能的組件。感性認識就是,數據是否需要增加或增廣。模型是大了還是小了,再根據速度和精度期望開始尋找合適的模型。能用全卷積的任務,少用全連接層,參數量小。基本模型上 ResNet, Unet 結構還是主流。
當你的模型有 Batch Normalization,初始化通常不需要操心,激活函數默認 Relu 即可(某引用數萬的大佬說的)。一般順序是 Conv - BN - Relu。如果沒有 BN(很多任務上,BN降低訓練難度,但是可能影響最終性能 ),試著要做一些數據歸一化。
雖然有至少十種激活函數,但初期用 Relu 或者和某個 paper 統一即可。優化器只推薦 Momentum 和 Adam。在這些方面做嘗試意義不大,如果性能提升反倒可能說明模型不成熟。不推薦做人肉模型設計,比如把某層卷積改大一點,或者微調一下通道數。除非有特別 insight,不要自己亂設計玄學組件,以吸收別人經驗為主。
超參上,learning rate 最重要,推薦了解 cosine learning rate,其次是 batchsize 和 weight decay。當你的模型還不錯的時候,可以試著做數據增廣和改損失函數錦上添花了。
祝讀到這里的各位模型漲點!
參考文獻
Bag of Tricks for Image Classification with Convolutional Neural Networks,trick 合集 1。
Must Know Tips/Tricks in Deep Neural Networks,trick 合集 2。
33條神經網絡訓練秘技,trick 合集 3。
26秒單GPU訓練CIFAR10,工程實踐。
Batch Normalization,雖然玄學,但是養活了很多煉丹師。
Searching for Activation Functions,swish 激活函數。
煉丹是玄學還是科學?我覺得煉丹是工程學。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的你有哪些deep learning(rnn、cnn)调参的经验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: insightface和facenet效
- 下一篇: 这些deep learning(rnn、