天天看點

在曠視兩年的北大學子分享關于deep learning的調參經驗

重磅幹貨,第一時間送達

在曠視兩年的北大學子分享關于deep learning的調參經驗
在曠視兩年的北大學子分享關于deep learning的調參經驗

推薦文章【點選下面可直接跳轉】:

​​2020 年校招,最值得加入的網際網路公司有哪些?​​

編輯:AI算法與圖像處理

已授權轉載,如需轉載請聯系作者

總結一下在曠視實習兩年來的煉丹經驗,我主要做了一些 RL,圖像品質,圖像分類,GAN 相關的任務,日常大概占用 5 - 10 張卡。

『可複現性和一緻性』

有的同學在打比賽的時候,從頭到尾隻維護若幹份丹方(代碼),每次載入前一次的訓練參數,調一下代碼繼續訓,俗稱老丹。這樣會有幾個問題:某次引入一個 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降低訓練難度,但是影響最終性能 ),可能要做一些資料歸一化。資料量比較小時才考慮 dropout。雖然有至少十種激活函數,但在 Relu 外隻推薦試一下 Swish。煉丹術隻推薦 Momentum 和 Adam。在這些方面做嘗試意義不大,如果性能提升反倒可能說明模型不成熟。不推薦做人肉模型設計,比如把某層卷積改大一點,或者微調一下通道數。除非有特别 insight,不要自己亂設計新元件。超參上,learning rate 最重要,推薦了解 cosine learning rate 和 cyclic 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 激活函數。

在曠視兩年的北大學子分享關于deep learning的調參經驗