【干貨】新手煉丹經(jīng)驗(yàn)總結(jié)
點(diǎn)擊上方“視學(xué)算法”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
導(dǎo)讀
本文總結(jié)了作者自身煉丹過(guò)程中的一些經(jīng)驗(yàn),包括了一些方法論以及技巧,幫助小白正確入坑。
煉丹入坑三年多,來(lái)總結(jié)一些經(jīng)驗(yàn),本文旨在幫助小白少走彎路,大佬輕噴:
本文源于一個(gè)舊回答:你有哪些deep learning(rnn、cnn)調(diào)參的經(jīng)驗(yàn)?(https://www.zhihu.com/question/41631631/answer/859040970)我的工作可以參見(jiàn) 我的 Github(https://github.com/hzwer),一股濃濃調(diào)參風(fēng),所以感覺(jué)能來(lái)說(shuō)點(diǎn)小經(jīng)驗(yàn)。另,曠視研究院目前在春招實(shí)習(xí)生,歡迎大家投遞。
1. 準(zhǔn)備工作
大部分情況下,我們的工作應(yīng)該站在巨人的肩膀上,切忌空中樓閣和徒手造輪子。在實(shí)踐中建議琢磨以下兩問(wèn):a. 目前的問(wèn)題是否可能用神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)?b. 是否有人做過(guò)類似的工作?
a. 即使有數(shù)據(jù),神經(jīng)網(wǎng)絡(luò)不是萬(wàn)能求解器。在視覺(jué)任務(wù)中的經(jīng)驗(yàn)規(guī)律是,神經(jīng)網(wǎng)絡(luò)的水平普遍高于普通人,弱于專家。理解“不能被神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)”的任務(wù)比較困難,通??梢园褑?wèn)題做分解和規(guī)約。舉例,因?yàn)樯窠?jīng)網(wǎng)絡(luò)可以做圖片一千類別分類,那么訓(xùn)練分類器分類一個(gè)人有沒(méi)有戴口罩很可行;因?yàn)樽屔窠?jīng)網(wǎng)絡(luò)生成一張高分辨率圖片比較難,所以讓神經(jīng)網(wǎng)絡(luò)端到端生成抖音短視頻會(huì)非常難。
b. 最令人心態(tài)崩潰的事情有:開(kāi)始寫(xiě)了一半論文才發(fā)現(xiàn)別人早就發(fā)表過(guò)了;搞了個(gè)把月的項(xiàng)目,不如人家 git clone 下來(lái)一鍵生成水平。通過(guò)文獻(xiàn)調(diào)研和 paperswithcode,可以避免這類問(wèn)題發(fā)生。有一個(gè)高的起點(diǎn)非常重要,做學(xué)校的課程項(xiàng)目時(shí),同學(xué)們往往喜歡用一個(gè)很差的基準(zhǔn),跑一些不強(qiáng)的對(duì)比實(shí)驗(yàn),但正經(jīng)的研究工作,往往要從一個(gè)很強(qiáng)的基準(zhǔn)開(kāi)始著手改進(jìn)。盡量不要在玩具級(jí)別的數(shù)據(jù)集或任務(wù)上做研究,比如 MNIST(有少數(shù)例外)。
2. 煉丹方法論
以下總結(jié)了這幾年對(duì)我影響較大的幾個(gè)方法論。a. 可復(fù)現(xiàn)性。b. 高效實(shí)驗(yàn)。c. 防呆實(shí)驗(yàn)。
a. 有的朋友在煉丹的時(shí)候從頭到尾只維護(hù)若干份代碼,每次載入前一次的訓(xùn)練參數(shù),改一下代碼再煉,俗稱 老丹 。這樣會(huì)有很多問(wèn)題:某次引入一個(gè) bug,過(guò)了很久才發(fā)現(xiàn),不知道影響范圍;得到一個(gè)好模型,但是沒(méi)人知道它是怎么來(lái)的;忘了自己的 baseline 長(zhǎng)什么樣,不知道改動(dòng)是正向還是負(fù)向。
我們要盡可能確保每一個(gè)模型有可復(fù)現(xiàn)性,實(shí)踐上建議固定隨機(jī)種子,且不在訓(xùn)練過(guò)程中再改動(dòng)訓(xùn)練代碼。訓(xùn)練新的模型時(shí),把舊的代碼復(fù)制一遍。得到的實(shí)驗(yàn)結(jié)果要開(kāi)個(gè)文檔記下來(lái)以便日后總結(jié),避免遺忘。后續(xù)總結(jié)回顧實(shí)驗(yàn)記錄,往往能獲得靈感。
b. 不是每一個(gè)實(shí)驗(yàn)都要出一個(gè)好模型, 實(shí)驗(yàn)是為了驗(yàn)證結(jié)論的 。如果每個(gè)實(shí)驗(yàn)都要 8 張卡跑兩個(gè)星期,人力物力都耗不起。盡力把實(shí)驗(yàn)控制在單卡一天以內(nèi),理想狀態(tài)是半天得一次結(jié)論。理論上來(lái)說(shuō),水多加面面多加水(加數(shù)據(jù)加計(jì)算量)的做法無(wú)限漲點(diǎn)。建議先設(shè)一個(gè)目標(biāo),比如說(shuō)就是在半天的訓(xùn)練時(shí)間下做對(duì)比實(shí)驗(yàn)。等到實(shí)驗(yàn)比較成熟以后再做大實(shí)驗(yàn)。
我的實(shí)踐經(jīng)驗(yàn)是,優(yōu)先選用小骨干網(wǎng)絡(luò) + 更小的輸入,直到消除了大部分 bugs;用 cProfile 來(lái)找找性能瓶頸(訓(xùn)練工程寫(xiě)的不夠好時(shí),常常有一大半時(shí)間耗費(fèi)數(shù)據(jù)傳輸,我曾經(jīng)發(fā)現(xiàn)某個(gè)工程數(shù)據(jù)處理中一大半時(shí)間在調(diào)用 numpy 的 round 函數(shù),還有某個(gè)工程大部分的時(shí)間開(kāi)銷在線程鎖上),解決這些問(wèn)題能讓之后工作事半功倍。
c. 介紹幾種經(jīng)典的防呆實(shí)驗(yàn)。首先可以只擬合一張圖片或者若干張圖片來(lái)觀察視覺(jué)效果,看看能不能正常過(guò)擬合。還可以把標(biāo)簽直接喂進(jìn)網(wǎng)絡(luò)中,看看網(wǎng)絡(luò)是否能夠快速學(xué)到 trivial 解。在訓(xùn)練過(guò)程中繪制訓(xùn)練集和驗(yàn)證集的損失函數(shù)曲線,看是否有合理的 gap。
3. 實(shí)戰(zhàn)小技巧
不迷信調(diào)參,如果發(fā)現(xiàn)一個(gè)模型對(duì)各種超參數(shù)都非常敏感,每天在各種組合上試的不亦樂(lè)乎,通常是有地方出了問(wèn)題,包括測(cè)試腳本寫(xiě)錯(cuò),任務(wù)定義不合理,數(shù)據(jù)太臟等。舉個(gè)例子,以前大家會(huì)非常注意一些細(xì)節(jié),比如模型初始化,輸入歸一化等,原因是當(dāng)時(shí)各種框架和算法實(shí)現(xiàn)不成熟。現(xiàn)在的框架通常在這些細(xì)節(jié)上都默認(rèn)是比較魯棒的設(shè)置,不建議特別關(guān)注。
我個(gè)人的經(jīng)驗(yàn)是,優(yōu)化器用 AdamW(少數(shù)地方用 SGD with Momentum),學(xué)習(xí)率推薦 cosine learning rate,初始值選 3e-4(SGD 可以選 0.1),激活函數(shù)選 PReLU。Batchsize 取 64,盡量用多卡,如果用 torch 的話記得用 DistributedDataParallel。用上這些基本不出錯(cuò),唯一比較玄學(xué)的是 BatchNormalization,有的任務(wù)上用了就是會(huì)變差(比如超分辨率,光流估計(jì)),有的任務(wù)不用 BatchNormalization 就是不好調(diào)。不要迷信公眾號(hào)的“即插即用”方法,各種魔改優(yōu)化器、激活函數(shù)、魔幻注意力不建議碰(除非研究這個(gè)),盡量用大量研究者驗(yàn)證過(guò)的方法。
如果感覺(jué)模型依然有 bugs,建議檢查以下幾條。a. 檢查模型是否正確開(kāi)關(guān)了 eval 和 train 模式。b. 檢查模型每個(gè)模塊的輸入輸出范圍是否符合預(yù)期。c. 可視化帶增廣的訓(xùn)練數(shù)據(jù),看看是否符合預(yù)期(順便提一下 imgaug,這個(gè)開(kāi)源庫(kù)用來(lái)做數(shù)據(jù)增廣性能很好,不容易踩坑)。
祝讀到這里的各位模型漲點(diǎn)!
參考文獻(xiàn)
如果覺(jué)得有用,就請(qǐng)分享到朋友圈吧!

點(diǎn)個(gè)在看 paper不斷!
