總結(jié) | 深度學(xué)習(xí)實(shí)踐雜談
點(diǎn)擊左上方藍(lán)字關(guān)注我們

熟悉數(shù)據(jù)
算法選型
在指標(biāo)上太鉆牛角尖。有些算法工程師遇到指標(biāo)在自己數(shù)據(jù)集效果不太好的情況時(shí),立馬換別的算法,或者立馬換個(gè)backbone,或者立馬換個(gè)loss去做實(shí)驗(yàn)。(需要認(rèn)真分析為什么效果不好,是自己訓(xùn)練有問(wèn)題,還是當(dāng)前數(shù)據(jù)不太適合該算法,是評(píng)測(cè)指標(biāo)不合理,還是評(píng)測(cè)指標(biāo)實(shí)現(xiàn)有問(wèn)題。) 不進(jìn)行相關(guān)調(diào)研,直接上SOTA算法。這樣做會(huì)有一些不太理想的問(wèn)題,比如SOTA可能沒(méi)有針對(duì)自己場(chǎng)景的數(shù)據(jù)做優(yōu)化,比如當(dāng)前任務(wù)是小目標(biāo)居多(通過(guò)分析數(shù)據(jù)得到),雖然SOTA的mAP很高,但是small mAP比之前算法還低,那就要慎用 。比如SOTA用的是很重的網(wǎng)絡(luò),但是任務(wù)是速度快,或者速度與效果兼顧,那要慎用。
基于已有實(shí)現(xiàn)來(lái)優(yōu)化算法
更方便深入的理解算法的具體細(xì)節(jié),比如可能代碼在文章沒(méi)有提到的某些層上偷摸的加了一個(gè)shift操作,比如文章提到的一些trick代碼根本沒(méi)有實(shí)現(xiàn),比如代碼用了額外的數(shù)據(jù)訓(xùn)練但文章沒(méi)有提到,比如文章描述的數(shù)據(jù)增強(qiáng)方式與代碼的實(shí)現(xiàn)不一樣等。(這些可能發(fā)生在開(kāi)源復(fù)現(xiàn)者沒(méi)有“一比一”復(fù)現(xiàn)論文的情況,也可能發(fā)生在論文作者自己沒(méi)有實(shí)現(xiàn)的情況) 能快速掌握算法的基礎(chǔ)性能,比如復(fù)現(xiàn)算法大概的運(yùn)行速度(特別是文章沒(méi)給出的時(shí)候)和達(dá)到的效果 不用自己做一些無(wú)用功。要知道重寫(xiě)和調(diào)試一份新的模型不僅費(fèi)時(shí)費(fèi)力,可能還因?yàn)槲恼聸](méi)有寫(xiě)清楚一些細(xì)節(jié),導(dǎo)致你幾乎無(wú)法復(fù)現(xiàn)到相應(yīng)的結(jié)果。
代碼是否實(shí)現(xiàn)了文章一些漲點(diǎn)的trick,如果沒(méi)有可以嘗試 文章一般會(huì)分析實(shí)驗(yàn)結(jié)果,后面會(huì)有作者自己的一些觀點(diǎn),他們可能會(huì)說(shuō)明為什么有些文章的算法效果較差 有些文章會(huì)寫(xiě)他們將來(lái)可能的工作,這也是一個(gè)改進(jìn)思路。 需要可視化查看實(shí)驗(yàn)結(jié)果(特別是跑自己的數(shù)據(jù)集),結(jié)果可能與作者在公開(kāi)數(shù)據(jù)集展示出的問(wèn)題不一樣,分析效果差的原因
從0復(fù)現(xiàn)算法
盡量測(cè)試每一個(gè)細(xì)節(jié),從數(shù)據(jù)接口,模型,到loss輸出,到最終的評(píng)測(cè)代碼。保證每個(gè)部分都可控。 測(cè)試數(shù)據(jù)接口,從單進(jìn)程,batch為1開(kāi)始,方便打印數(shù)值進(jìn)行對(duì)比。 不要隨意的去隨機(jī),盡量保證問(wèn)題可以復(fù)現(xiàn)比如先不要加入隨機(jī)數(shù)據(jù)增強(qiáng),模型的隨機(jī)種子固定。 用少量的數(shù)據(jù),這樣可以快速的做實(shí)驗(yàn),也可以讓模型快速過(guò)擬合。模型能過(guò)擬合可以大概確定模型是可以學(xué)到點(diǎn)什么的。 盡量按照原文來(lái)復(fù)現(xiàn),能復(fù)現(xiàn)前,先不要過(guò)多的添加自己獨(dú)特的想法。比如訓(xùn)練參數(shù),模型backbone,數(shù)據(jù)增強(qiáng)方式等等先按照文章來(lái)。不清楚的可以嘗試email作者或者尋找相關(guān)圈子討論。 日志打印全,比如解loss為nan的情況,需要知道是forward的導(dǎo)致還是bp導(dǎo)致。
一些或許有用的訓(xùn)練建議
保證數(shù)據(jù)是可靠的 有預(yù)訓(xùn)練模型最好用上 通常學(xué)習(xí)率參數(shù)小于1e-5基本沒(méi)啥用了,比如cosine或者step操作,最后的學(xué)習(xí)率到1e-5就好了。當(dāng)然特殊任務(wù)不一樣 bn在訓(xùn)練時(shí)記得打開(kāi)更新(特別是tf的小伙伴,容易漏),不然可能出現(xiàn)的問(wèn)題是訓(xùn)練時(shí)loss下降很快,測(cè)試感覺(jué)模型就沒(méi)收斂 sgd是很棒的,但是實(shí)驗(yàn)用adam或許收斂速度更好 如果想要很好的壓榨出一個(gè)算法的性能,請(qǐng)先保證當(dāng)前模型能到達(dá)相應(yīng)的性能再去壓榨。而不是盲目的換模塊,瘋狂調(diào)參,那樣可能只是浪費(fèi)時(shí)間。 不要太相信自己的調(diào)參技術(shù),在沒(méi)有一個(gè)較好的baseline情況下,調(diào)參不會(huì)有質(zhì)的飛躍(除非是之前參數(shù)造成了某種bug) 數(shù)據(jù)小時(shí),使用了預(yù)訓(xùn)練模型記得固定前幾層的模型參數(shù),還可以用小點(diǎn)的學(xué)習(xí)率 loss balance有時(shí)候很有用 重復(fù)訓(xùn)練可能可以提升點(diǎn)數(shù),將一個(gè)模型訓(xùn)練好后,用訓(xùn)練好的模型做預(yù)訓(xùn)練模型載入,繼續(xù)用同一套參數(shù)訓(xùn)練。有點(diǎn)像CyclicLR。 DL沒(méi)有像機(jī)器學(xué)習(xí)有那么多公式支撐,很多都是make sense就做個(gè)實(shí)驗(yàn)來(lái)驗(yàn)證,所以盡量多閱讀論文,看看別人的實(shí)驗(yàn),這樣就可以減少不必要的實(shí)驗(yàn) 這篇文章是為了分享自己的一些心得,希望讀者能用得上,如果有嚴(yán)重錯(cuò)誤還請(qǐng)告知,不想誤導(dǎo)他人

END
評(píng)論
圖片
表情
