1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        神經(jīng)網(wǎng)絡(luò)調(diào)參指南

        共 7207字,需瀏覽 15分鐘

         ·

        2024-04-18 10:05

        點(diǎn)擊上方小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂
        重磅干貨,第一時(shí)間送達(dá)
        Author:夕小瑤
        From:夕小瑤的賣(mài)萌屋
        序言
        雖然現(xiàn)在僅僅靠調(diào)參已經(jīng)在深度學(xué)習(xí)領(lǐng)域不是香餑餑了,但是如果連參數(shù)都不會(huì)調(diào),那可能連肉湯都喝不到的。畢竟你有再好的idea,也需要有一個(gè)漂亮的實(shí)驗(yàn)結(jié)果去支撐的對(duì)不對(duì),參數(shù)調(diào)不好,千里馬也容易被當(dāng)成騾子。
         
        說(shuō)到調(diào)參,也不得不吐槽現(xiàn)在行業(yè)里論文復(fù)現(xiàn)難的問(wèn)題。小夕曾經(jīng)非常好奇AAAI2018某送審文章的性能,于是完全按照論文里的設(shè)定去做了復(fù)現(xiàn),發(fā)現(xiàn)跟與論文中的結(jié)果足足差了4個(gè)百分點(diǎn)!更神奇的是我發(fā)現(xiàn)按照該論文的設(shè)定,模型遠(yuǎn)不足以擬合數(shù)據(jù)集 ╮( ̄▽?zhuān)?")╭ 最后實(shí)在get不到論文里的trick了,小夕就放開(kāi)了自己調(diào)!結(jié)果最后調(diào)的比該論文里的結(jié)果還高了0.5個(gè)點(diǎn),著實(shí)比較尷尬。

        我們不能說(shuō)某些頂會(huì)論文數(shù)據(jù)有問(wèn)題,但是可以確信的是顯式或隱式的超參數(shù)很可能大大的影響實(shí)驗(yàn)結(jié)果,這個(gè)超參數(shù)或許來(lái)自數(shù)據(jù)預(yù)處理,或許來(lái)自?xún)?yōu)化算法,或許來(lái)自模型本身,甚至有時(shí)候是來(lái)自輸出層的推理階段。

        調(diào)參前的準(zhǔn)備

        好啦,回到正題上。在調(diào)參之前,小夕強(qiáng)烈建議在代碼里完成下面幾件事:
        1. 可視化訓(xùn)練過(guò)程中每個(gè)step(batch)的loss。如果是分類(lèi)任務(wù),可以順便可視化出每個(gè)batch的準(zhǔn)確率(不均衡數(shù)據(jù)可視化F1-score)。
        2. 將訓(xùn)練日志在打印到屏幕上的同時(shí)也寫(xiě)入到本地磁盤(pán)。如果能實(shí)時(shí)同步寫(xiě)入那更好了(在python中可以用logging模塊可以輕松實(shí)現(xiàn)。一個(gè)handler輸出到屏幕,再設(shè)置一個(gè)handler輸出到磁盤(pán)即可)。
        3. 借助tensorflow里的FLAGS模塊或者python-fire工具將你的訓(xùn)練腳本封裝成命令行工具。
        4. 代碼中完成tensorboard等訓(xùn)練過(guò)程可視化環(huán)境的配置,最少要可視化出訓(xùn)練loss曲線(xiàn)。
        5. 如果使用tensorflow,記得設(shè)置GPU內(nèi)存動(dòng)態(tài)增長(zhǎng)(除非你只有一個(gè)GPU并且你確信一個(gè)訓(xùn)練任務(wù)會(huì)消耗GPU的一大半顯存)
         
        另外,初始調(diào)參階段記得關(guān)閉L2、Dropout等用來(lái)調(diào)高模型泛化能力的超參數(shù)吶,它們很可能極大的影響loss曲線(xiàn),干擾你的重要超參數(shù)的選取。然后根據(jù)自己的任務(wù)的量級(jí),預(yù)估一個(gè)合理的batch size(一般來(lái)說(shuō)64是個(gè)不錯(cuò)的初始點(diǎn)。數(shù)據(jù)集不均衡的話(huà)建議使用更大一點(diǎn)的值,數(shù)據(jù)集不大模型又不是太小的情況下建議使用更小一些的值)。如果對(duì)網(wǎng)絡(luò)參數(shù)的隨機(jī)初始化策略缺乏經(jīng)驗(yàn)知識(shí)(知識(shí)來(lái)源于相關(guān)任務(wù)的論文實(shí)驗(yàn)細(xì)節(jié)或開(kāi)源項(xiàng)目等),可以使用He方法[1](使用ReLU激活時(shí))或Xavier方法[2]來(lái)進(jìn)行網(wǎng)絡(luò)參數(shù)初始化。

        階段1:learning rate和num steps

        這個(gè)階段是最容易的,打開(kāi)tensorboard,按照指數(shù)規(guī)律設(shè)置幾組可能的學(xué)習(xí)率,小夕一般設(shè)置如下六組[1, 0.1, 0.01, 0.001, 0.0001, 0.00001]。
         
        如果你的GPU比較多,你還可以在幾個(gè)大概率學(xué)習(xí)率附近多插幾個(gè)值,比如小夕一般喜歡再插上[0.03, 0.05, 0.003, 0.005, 0.007, 0.0005]這幾個(gè)值(最起碼在做文本分類(lèi)任務(wù)時(shí)經(jīng)常撞到不錯(cuò)的結(jié)果哦)。
         
        當(dāng)這些任務(wù)跑完時(shí),就可以去tensorboard里挑選最優(yōu)學(xué)習(xí)率啦。選擇原則也很簡(jiǎn)單,選擇那條下降的又快又深的曲線(xiàn)所對(duì)應(yīng)的學(xué)習(xí)率即可,如下圖,選擇粉色那條曲線(xiàn):

         
        選擇好學(xué)習(xí)率后,順便再觀察一下這條曲線(xiàn),選擇一個(gè)差不多已經(jīng)收斂的step作為我們的訓(xùn)練總steps(如果數(shù)據(jù)集規(guī)模小的話(huà)也可以換算成epoch次數(shù))。如圖


        可以看到,我們的模型在迭代到4K步的時(shí)候就基本收斂了,保險(xiǎn)起見(jiàn)我們可以選擇6K來(lái)作為我們訓(xùn)練的總num_steps(畢竟后面改動(dòng)的超參數(shù)可能使收斂延后嘛)。
         
        細(xì)節(jié):
        如果GPU有限并且任務(wù)對(duì)顯存的消耗沒(méi)有太大,那么可以同時(shí)在一個(gè)GPU里掛上多組訓(xùn)練任務(wù)(這時(shí)每組任務(wù)的計(jì)算速度會(huì)有損耗,但是完成全部任務(wù)所消耗的總時(shí)間大大減少了)。小夕一般先隨便設(shè)個(gè)學(xué)習(xí)率跑一下,確定一下每個(gè)任務(wù)大體消耗的顯存,然后在shell腳本里將這若干個(gè)任務(wù)塞進(jìn)GPU里并行跑(shell腳本里直接用&扔進(jìn)后臺(tái)即可)。當(dāng)然,如果代碼里用到了時(shí)間戳,可以給時(shí)間戳加個(gè)隨機(jī)噪聲或者在shell腳本里為任務(wù)之間加上一定的時(shí)間間隔,免得訓(xùn)練任務(wù)的時(shí)間戳發(fā)生碰撞。
         
        買(mǎi)不起GPU版:
        曾經(jīng)有一段時(shí)間小夕只有一個(gè)可以用的GPU,然而任務(wù)規(guī)模又大到每次實(shí)驗(yàn)要占用一大半的GPU顯存且要跑一天半,然而時(shí)間又特別緊,來(lái)不及像上面一樣跑十幾次實(shí)驗(yàn)去選個(gè)學(xué)習(xí)率。那怎么辦呢?
         
        小夕get到一個(gè)trick,就是在代碼里計(jì)算出來(lái)每次更新時(shí)的梯度更新向量的模當(dāng)前參數(shù)向量的模的比值。如果這個(gè)比值在 量級(jí)附近的話(huà)說(shuō)明學(xué)習(xí)率還可以,如果數(shù)量級(jí)太小,則網(wǎng)絡(luò)更新不動(dòng),需要增大學(xué)習(xí)率。數(shù)量級(jí)太大則每次更新對(duì)網(wǎng)絡(luò)的修改太大,網(wǎng)絡(luò)很容易發(fā)生不穩(wěn)定,需要降低學(xué)習(xí)率。這樣基本跑幾個(gè)batch就能估算一次學(xué)習(xí)率,很快就能get到一個(gè)湊合使用的學(xué)習(xí)率。
         
        階段2:batch size和momentum

        帶著第一階段得到的超參數(shù),我們來(lái)到了第二階段。
         
        如果我們使用的是Adam這種“考慮周全”的優(yōu)化器的話(huà),動(dòng)量項(xiàng)momentum這類(lèi)優(yōu)化器的超參數(shù)就基本省了。然而,不僅是小夕的經(jīng)驗(yàn),業(yè)界廣泛的經(jīng)驗(yàn)就是Adam找到的最優(yōu)點(diǎn)往往不如精調(diào)超參的SGD找到的超參數(shù)質(zhì)量高。因此如果你想要追求更加極限的性能的話(huà),momentum還是要會(huì)調(diào)的哦。
         
        momentum一方面可以加速模型的收斂(減少迭代步數(shù)),另一方面還可以帶領(lǐng)模型逃離差勁的局部最優(yōu)點(diǎn)(沒(méi)理解的快回去看看momentum SGD的公式)。而batch size參數(shù)似乎也能帶來(lái)類(lèi)似的作用——batch size越小,噪聲越大,越容易逃離局部最優(yōu)點(diǎn),同時(shí)這時(shí)對(duì)梯度的估計(jì)不準(zhǔn)確,導(dǎo)致需要更多的迭代步數(shù)。因此小夕一般將這兩個(gè)參數(shù)一起調(diào)。
         
        兩個(gè)參數(shù)同時(shí)調(diào)的時(shí)候可以使用傳統(tǒng)的網(wǎng)格搜索,也可以使用大牛們提倡的隨機(jī)搜索[3]。小夕覺(jué)得嘛,GPU多又時(shí)間充裕的話(huà)就網(wǎng)格搜索,否則就隨機(jī)搜索啦。反正兩個(gè)超參數(shù)時(shí)使用網(wǎng)格搜索也不是讓人那么無(wú)法接受。還不熟悉這兩種策略的同學(xué)可以去Ng在coursera開(kāi)的深度學(xué)習(xí)課上補(bǔ)補(bǔ)哦,“超參數(shù)調(diào)節(jié)”這幾節(jié)課講的很清晰而且貌似是公開(kāi)的。
         
        另外,如果使用網(wǎng)格搜索并且搜索范圍小的話(huà)小夕一般直接在shell腳本里偷懶解決:

         
        另外,由于這兩個(gè)超參數(shù)可能涉及到模型的泛化能力,因此記得在監(jiān)控loss曲線(xiàn)的同時(shí)也要監(jiān)控開(kāi)發(fā)集準(zhǔn)確率哦。如果兩組實(shí)驗(yàn)的loss曲線(xiàn)的形狀都很好,這時(shí)就可以根據(jù)開(kāi)發(fā)集準(zhǔn)確率來(lái)做取舍了(一般不會(huì)出現(xiàn)loss曲線(xiàn)形狀很差但是開(kāi)發(fā)集準(zhǔn)確率超好的情況)。
         
        另外,還要記得!這一階段結(jié)束后,可能最優(yōu)的loss曲線(xiàn)會(huì)發(fā)生很大的變化,可能第一階段我們確定的num_steps在這一階段已經(jīng)變得過(guò)分冗余了,那么我們?cè)谶@一階段結(jié)束后要記得把尾巴剪短一些哦(即減少num_steps,減少的依據(jù)跟以前一樣)。當(dāng)然如果batch size低了很多,有可能之前的num_steps不足以充分訓(xùn)練了,那么要記得增加步數(shù)啦。

        階段3:學(xué)習(xí)率衰減策略
         
        相比較前面幾個(gè)超參數(shù),學(xué)習(xí)率衰減策略就比較神奇了。有時(shí)你會(huì)發(fā)現(xiàn)這個(gè)超參數(shù)好像沒(méi)有什么用,有時(shí)卻會(huì)發(fā)現(xiàn)它像開(kāi)了掛一樣讓你看似已經(jīng)收斂的網(wǎng)絡(luò)更進(jìn)一層,帶來(lái)更低的訓(xùn)練loss和更高的開(kāi)發(fā)集準(zhǔn)確率。

        這個(gè)其實(shí)也很容易理解啦,如果你的模型在收斂時(shí)走到了“高原地帶”,這時(shí)其實(shí)你衰減學(xué)習(xí)率不會(huì)帶來(lái)太大改觀。而如果收斂時(shí)在“峽谷邊緣”來(lái)回跳躍,這時(shí)你衰減學(xué)習(xí)率就可能一步跨下峽谷,發(fā)現(xiàn)新大陸!當(dāng)然啦,這也只能是我們的YY,在手頭任務(wù)中誰(shuí)也不清楚這幾百萬(wàn)幾千萬(wàn)維度的空間里的地形。所以不妨使用一個(gè)簡(jiǎn)單有效的學(xué)習(xí)率衰減策略簡(jiǎn)單一調(diào),有用就繼續(xù)精調(diào),沒(méi)用就算啦。
         
        經(jīng)典的學(xué)習(xí)率衰減策略要同時(shí)考慮4個(gè)東西:衰減開(kāi)始的時(shí)機(jī)、衰減量級(jí)(線(xiàn)性衰減or指數(shù)衰減)、衰減速率以及衰減的周期。
         
        還記得我們上個(gè)階段得到的開(kāi)發(fā)集準(zhǔn)確率曲線(xiàn)嗎?沒(méi)錯(cuò)!這條曲線(xiàn)的低谷附近就是開(kāi)始衰減的好時(shí)機(jī)!


        衰減時(shí)機(jī)很好確定,例如上面這種狀態(tài),最高開(kāi)發(fā)集準(zhǔn)確率在3000左右,那么我們不妨從2700左右開(kāi)始衰減學(xué)習(xí)率。

        衰減量級(jí)來(lái)說(shuō),貌似大家用指數(shù)衰減更多一點(diǎn)。不過(guò)呢,對(duì)于指數(shù)衰減來(lái)說(shuō),衰減因子調(diào)節(jié)起來(lái)較為敏感,一旦衰減因子太小,則model往往還沒(méi)有訓(xùn)練夠呢就衰減沒(méi)了。因子設(shè)置太大的話(huà)迭代好久學(xué)習(xí)率還是下不去,導(dǎo)致開(kāi)發(fā)集的性能提升不大??紤]這些的同時(shí)還要把握好衰減的間隔(也就是每多少個(gè)steps衰減一次),如果間隔過(guò)小,則開(kāi)發(fā)集準(zhǔn)確率的波峰附近相比無(wú)衰減時(shí)更平緩,如果間隔過(guò)大,容易發(fā)現(xiàn)除了第一次衰減,后面的衰減都不會(huì)帶來(lái)什么收益。不過(guò),最最起碼的一個(gè)設(shè)計(jì)原則是,在到達(dá)原先的最高開(kāi)發(fā)集準(zhǔn)確率點(diǎn)的那個(gè)step時(shí),最少衰減為初始學(xué)習(xí)率的一半才行(除非你的衰減間隔真的很短)。
         
        是不是感覺(jué)超級(jí)麻煩哇,為了一個(gè)學(xué)習(xí)率衰減要去考慮和計(jì)算這么多東西,感覺(jué)好麻煩哦,所以小夕個(gè)人更喜歡用下面這種懶辦法。
         
        這種方法是從fasttext源碼里學(xué)到的,實(shí)驗(yàn)了一下發(fā)現(xiàn)還蠻好用的就一直用了下來(lái)。首先,開(kāi)始衰減的點(diǎn)不用算,直接從第一步起就開(kāi)始線(xiàn)性衰減。然后假如總迭代步數(shù)為5K,學(xué)習(xí)率為0.01,那么我們就可以算一下每一步學(xué)習(xí)率的衰減量為

         
        粗略算一下發(fā)現(xiàn)這時(shí)到達(dá)第3000步時(shí)的學(xué)習(xí)率為0.006,好像還蠻合理的誒。這樣在最后一步時(shí),學(xué)習(xí)率也恰好衰減到0。

        在這個(gè)方案里,我們可以每個(gè)step都重新計(jì)算學(xué)習(xí)率,但是為了防止某些情況浮點(diǎn)下溢以及額外的計(jì)算開(kāi)銷(xiāo)(雖然可以忽略),往往還是設(shè)置一個(gè)衰減間隔,比如每100steps衰減一次。相比經(jīng)典策略,這時(shí)的衰減間隔就不那么敏感啦,放心大膽的去設(shè)置。

        使用這種懶辦法基本沒(méi)有引入任何難調(diào)的超參數(shù),只要你在第二階段的num_steps設(shè)置的合理,這一階段的懶版學(xué)習(xí)率衰減就能往往取得不錯(cuò)的效果。

        當(dāng)然,如果在當(dāng)前任務(wù)中發(fā)現(xiàn)這個(gè)懶辦法也沒(méi)帶來(lái)多少收益,那這個(gè)任務(wù)可能真是地形相對(duì)平坦,對(duì)學(xué)習(xí)率衰減不太敏感,這時(shí)小夕一般不會(huì)考慮精調(diào)衰減策略。反之,如果發(fā)現(xiàn)這種懶辦法都帶來(lái)了明顯的收益,那么仔細(xì)對(duì)比一下衰減策略下的開(kāi)發(fā)集曲線(xiàn)和無(wú)衰減策略的開(kāi)發(fā)集曲線(xiàn),如果發(fā)現(xiàn)波峰后移的厲害,那可能衰減的太快了,嘗試推后衰減時(shí)機(jī)。不過(guò),既然有明顯收益,那這時(shí)按照經(jīng)典衰減策略再精調(diào)往往也不虧啦。

        剩下的超參數(shù)要怎么調(diào)呢?坐等小夕的下一篇文章咯( ̄? ̄)



        [1] Xavier Glorot and Yoshua Bengio. 2010. Understanding the difficulty of training deep feedforward neural networks. In Proceedings of the Thirteenth International Conference on Artificial Intelligence and Statistics, volume 9 of Proceedings of Machine Learning Research, pages 249–256, Chia Laguna Resort, Sardinia, Italy. PMLR.
        [2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. 2015. Delving deep into rectifiers: Surpassing human-level performance on imagenet classification. CoRR, abs/1502.01852.
        [3] Bergstra J, Bengio Y. Random search for hyper-parameter optimization[J]. Journal of Machine Learning Research, 2012, 13(Feb): 281-305.

           
        下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
        在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。

        下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講
        小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車(chē)道線(xiàn)檢測(cè)、車(chē)輛計(jì)數(shù)、添加眼線(xiàn)、車(chē)牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。

        下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
        小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

        交流群


        歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱(chēng)+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


        瀏覽 158
        10點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        10點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            特黄特色大片免费播放叫疼 | 丁香五月综合网 | 精品久久久久久久久久久国产字幕 | 大学生被内谢粉嫩无套 | 亚洲最新中文字幕在线 | 91丨九色丨高潮丰满 | 免费在线a视频 | 青娱乐视视频 | 在线观看www | 国产人妖TS重口系列网站观看 |