0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

模型調(diào)優(yōu)和復現(xiàn)算法遇到的一些坑

新機器視覺 ? 來源:CSDN ? 作者:新機器視覺 ? 2022-05-18 15:03 ? 次閱讀

作為一名算法工程師,主要是想把自己模型調(diào)優(yōu)和復現(xiàn)算法遇到的一些坑總結(jié)一下(里面的一行字可能是我當時花費了一周甚至更長時間得到的總結(jié)),希望能對讀者有所幫助。

一、熟悉數(shù)據(jù)

模型是數(shù)據(jù)的濃縮版----Andrew NG的二八定律,即80%的數(shù)據(jù)+20%的=更好的AI

對于新上手的一任務來說,需要熟悉你的數(shù)據(jù)。拿檢測任務來說,可以寫個可視化代碼查看標注是否合理,查看一下待檢測物體的大小分布情況(例如anchor的預設),查看一下圖片大小,查看類別分布情況(例如是否有極端的分布)等等。

二、算法選型

在接到一個新領(lǐng)域的新任務時,需要調(diào)研相關(guān)領(lǐng)域算法,對該領(lǐng)域的發(fā)展有個大概的了解,掌握一些關(guān)鍵算法(比如歷年的SOTA)的思路。雖然調(diào)研需要花費一些時間,但是這樣在算法選型上可以少做一些實驗,性價比是很高的。站在他們的肩膀上就好了。

不太可取的思路:

在指標上太鉆牛角尖。有些算法工程師遇到指標在自己數(shù)據(jù)集效果不太好的情況時,立馬換別的算法,或者立馬換個backbone,或者立馬換個loss去做實驗。(需要認真分析為什么效果不好,是自己訓練有問題,還是當前數(shù)據(jù)不太適合該算法,是評測指標不合理,還是評測指標實現(xiàn)有問題。)

不進行相關(guān)調(diào)研,直接上SOTA算法。這樣做會有一些不太理想的問題,比如SOTA可能沒有針對自己場景的數(shù)據(jù)做優(yōu)化,比如當前任務是小目標居多(通過分析數(shù)據(jù)得到),雖然SOTA的總的mAP很高,但是small mAP比之前算法還低,那就要慎用 。比如SOTA用的是很重的網(wǎng)絡,但是任務是速度快,或者速度與效果兼顧,那也應該慎用。

三、基于已有實現(xiàn)來優(yōu)化算法

對于某個任務在選擇好合適的算法以后,如果有相應的效果比較好的開源實現(xiàn),最好用開源項目進行算法的復現(xiàn)。

這樣做的目的:

更方便深入的理解算法的具體細節(jié),比如可能代碼在文章沒有提到的某些層上偷摸的加了一個shift操作,比如文章提到的一些trick代碼根本沒有實現(xiàn),比如代碼用了額外的數(shù)據(jù)訓練但文章沒有提到,比如文章描述的數(shù)據(jù)增強方式與代碼的實現(xiàn)不一樣等。(這些可能發(fā)生在開源復現(xiàn)者沒有“一比一”復現(xiàn)論文的情況,也可能發(fā)生在論文作者自己沒有實現(xiàn)的情況)

能快速掌握算法的基礎性能,比如復現(xiàn)算法大概的運行速度(特別是文章沒給出的時候)和達到的效果

不用自己做一些無用功。要知道重寫和調(diào)試一份新的模型不僅費時費力,可能還因為文章沒有寫清楚一些細節(jié),導致你幾乎無法復現(xiàn)到相應的結(jié)果。

利用開源項目已復現(xiàn)的算法(這里復現(xiàn)不是完全能與代碼作者或者文章作者結(jié)果一致,可能是數(shù)據(jù)增強,隨機種子導致結(jié)果有偏差,但已獲取到八九不離十的結(jié)果)來改進模型可以有下面幾點思路:

代碼是否實現(xiàn)了文章一些漲點的trick,如果沒有可以嘗試

文章一般會分析實驗結(jié)果,后面會有作者自己的一些觀點,他們可能會說明為什么有些情況文章的算法效果較差

有些文章會寫他們將來可能的工作,這也是一個改進思路

需要可視化查看實驗結(jié)果(特別是跑自己的數(shù)據(jù)集),結(jié)果可能與作者在公開數(shù)據(jù)集展示出的問題不一樣,分析效果差的原因

四、從0復現(xiàn)算法

復現(xiàn)算法是一個比較大的工程,這里的大工程不只是指代碼多或者工作量大,而是沒有一個基礎版,導致引入的不可控因素太多調(diào)試困難,比如數(shù)據(jù)接口是否有問題,模型是否搭建正確,訓練方式是否存在問題。

在復現(xiàn)算法或者優(yōu)化算法是比較頭疼的是一切訓練正常,loss曲線比你想象的還好看,訓練了一年后(just kidding, maybe longer),測試一下發(fā)現(xiàn)效果奇差無比,都不好意思說是自己寫的代碼。一年就過去了。

這里有下面一些建議:

盡量測試每一個細節(jié),從數(shù)據(jù)接口,模型,到loss輸出,到最終的評測代碼。保證每個部分都可控。

測試數(shù)據(jù)接口,從單進程,batch為1開始,方便打印數(shù)值進行對比。

不要隨意的去隨機,盡量保證問題可以復現(xiàn)比如先不要加入隨機數(shù)據(jù)增強,模型的隨機種子固定。

用少量的數(shù)據(jù),這樣可以快速的做實驗,也可以讓模型快速過擬合。模型能過擬合可以大概確定模型是可以學到點什么的。

盡量按照原文來復現(xiàn),在復現(xiàn)前,先不要過多的添加自己獨特的想法。比如訓練參數(shù),模型backbone,數(shù)據(jù)增強方式等等先按照文章來。不清楚的點可以嘗試email作者或者尋找相關(guān)圈子討論。

日志打印全,比如解loss為nan的情況,需要知道是forward的導致還是bp導致。

五、一些或許有用的訓練建議

保證數(shù)據(jù)是可靠的

有預訓練模型最好用上

通常學習率參數(shù)小于1e-5基本沒啥用了,比如cosine或者step操作,最后的學習率到1e-5就好了。當然特殊任務不一樣

bn在訓練時記得打開更新(特別是tf的小伙伴,容易漏),不然可能出現(xiàn)的問題是訓練時loss下降很快,測試感覺模型就沒收斂

sgd是很棒的,但是實驗用adam或許收斂速度更好

如果想要很好的壓榨出一個算法的性能,請先保證當前模型能到達相應的性能再去壓榨。而不是盲目的換模塊,瘋狂調(diào)參,那樣可能只是浪費時間

不要太相信自己的調(diào)參技術(shù),在沒有一個較好的baseline情況下,調(diào)參不會有質(zhì)的飛躍(除非是之前參數(shù)造成了某種bug)

數(shù)據(jù)小時,使用了預訓練模型記得固定前幾層的模型參數(shù),還可以用小點的學習率

loss balance有時候很有用

重復訓練可能可以提升點數(shù),將一個模型訓練好后,用訓練好的模型做預訓練模型載入,繼續(xù)用同一套參數(shù)訓練。有點像CyclicLR(https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.CyclicLR.html#torch.optim.lr_scheduler.CyclicLR)

DL沒有像機器學習有那么多公式支撐,很多都是make sense就做個實驗來驗證,所以盡量多閱讀論文,看看別人的實驗,這樣就可以減少不必要的實驗

這篇文章是為了分享自己的一些心得,希望讀者能用得上,如果有嚴重錯誤還請告知,不想誤導他人

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4624

    瀏覽量

    93110
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3279

    瀏覽量

    48972
  • 機器學習
    +關(guān)注

    關(guān)注

    66

    文章

    8428

    瀏覽量

    132837

原文標題:一個算法工程師復現(xiàn)算法的踩坑總結(jié)

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    FOC電路學習路上的一些硬件

    記錄下驅(qū)動直流無刷電機走過的。我是和是室友起在玩FOC,電路方面也是借鑒了他的。我倆共同的個心得就是,電路這個東西直接抄要么你就要原封不動的復刻下來,要么你就要搞懂電路中的每個
    的頭像 發(fā)表于 12-07 10:14 ?318次閱讀
    FOC電路學習路上的<b class='flag-5'>一些</b>硬件<b class='flag-5'>坑</b>

    MCF8316A調(diào)優(yōu)指南

    電子發(fā)燒友網(wǎng)站提供《MCF8316A調(diào)優(yōu)指南.pdf》資料免費下載
    發(fā)表于 11-20 17:21 ?0次下載
    MCF8316A<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>指南

    MCT8316A調(diào)優(yōu)指南

    電子發(fā)燒友網(wǎng)站提供《MCT8316A調(diào)優(yōu)指南.pdf》資料免費下載
    發(fā)表于 11-13 13:49 ?0次下載
    MCT8316A<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>指南

    MCT8315A調(diào)優(yōu)指南

    電子發(fā)燒友網(wǎng)站提供《MCT8315A調(diào)優(yōu)指南.pdf》資料免費下載
    發(fā)表于 11-12 14:14 ?0次下載
    MCT8315A<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>指南

    MMC DLL調(diào)優(yōu)

    電子發(fā)燒友網(wǎng)站提供《MMC DLL調(diào)優(yōu).pdf》資料免費下載
    發(fā)表于 10-11 11:48 ?0次下載
    MMC DLL<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>

    TDA3xx ISS調(diào)優(yōu)和調(diào)試基礎設施

    電子發(fā)燒友網(wǎng)站提供《TDA3xx ISS調(diào)優(yōu)和調(diào)試基礎設施.pdf》資料免費下載
    發(fā)表于 10-11 10:16 ?0次下載
    TDA3xx ISS<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>和調(diào)試基礎設施

    智能調(diào)優(yōu),使步進電機安靜而高效地運行

    電子發(fā)燒友網(wǎng)站提供《智能調(diào)優(yōu),使步進電機安靜而高效地運行.pdf》資料免費下載
    發(fā)表于 09-24 11:08 ?1次下載
    智能<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>,使步進電機安靜而高效地運行

    MMC SW調(diào)優(yōu)算法

    電子發(fā)燒友網(wǎng)站提供《MMC SW調(diào)優(yōu)算法.pdf》資料免費下載
    發(fā)表于 09-20 11:14 ?0次下載
    MMC SW<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b><b class='flag-5'>算法</b>

    TAS58xx系列通用調(diào)優(yōu)指南

    電子發(fā)燒友網(wǎng)站提供《TAS58xx系列通用調(diào)優(yōu)指南.pdf》資料免費下載
    發(fā)表于 09-14 10:49 ?0次下載
    TAS58xx系列通用<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>指南

    AM6xA ISP調(diào)優(yōu)指南

    電子發(fā)燒友網(wǎng)站提供《AM6xA ISP調(diào)優(yōu)指南.pdf》資料免費下載
    發(fā)表于 09-07 09:52 ?0次下載
    AM6xA ISP<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>指南

    OSPI控制器PHY調(diào)優(yōu)算法

    電子發(fā)燒友網(wǎng)站提供《OSPI控制器PHY調(diào)優(yōu)算法.pdf》資料免費下載
    發(fā)表于 08-30 11:12 ?0次下載
    OSPI控制器PHY<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b><b class='flag-5'>算法</b>

    ai大模型算法有什么區(qū)別

    AI大模型算法是人工智能領(lǐng)域的兩個重要概念,它們在很多方面有著密切的聯(lián)系,但同時也存在一些明顯的區(qū)別。 定義和概念 AI大模型通常是指具有大量參數(shù)和復雜結(jié)構(gòu)的人工智能
    的頭像 發(fā)表于 07-16 10:09 ?2023次閱讀

    深度學習模型訓練過程詳解

    詳細介紹深度學習模型訓練的全過程,包括數(shù)據(jù)預處理、模型構(gòu)建、損失函數(shù)定義、優(yōu)化算法選擇、訓練過程以及模型的評估與調(diào)
    的頭像 發(fā)表于 07-01 16:13 ?1399次閱讀

    深度解析JVM調(diào)優(yōu)實踐應用

    Tomcat自身的調(diào)優(yōu)是針對conf/server.xml中的幾個參數(shù)的調(diào)優(yōu)設置。首先是對這幾個參數(shù)的含義要有深刻而清楚的理解。
    的頭像 發(fā)表于 04-01 10:24 ?499次閱讀
    深度解析JVM<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>實踐應用

    鴻蒙開發(fā)實戰(zhàn):【性能調(diào)優(yōu)組件】

    性能調(diào)優(yōu)組件包含系統(tǒng)和應用調(diào)優(yōu)框架,旨在為開發(fā)者提供套性能調(diào)
    的頭像 發(fā)表于 03-13 15:12 ?474次閱讀
    鴻蒙開發(fā)實戰(zhàn):【性能<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>組件】