<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 7207字,需瀏覽 15分鐘

           ·

          2024-04-18 10:05

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

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

          調(diào)參前的準備

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

          階段1:learning rate和num steps

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

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


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

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

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

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

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


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

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

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

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

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

          當然,如果在當前任務中發(fā)現(xiàn)這個懶辦法也沒帶來多少收益,那這個任務可能真是地形相對平坦,對學習率衰減不太敏感,這時小夕一般不會考慮精調(diào)衰減策略。反之,如果發(fā)現(xiàn)這種懶辦法都帶來了明顯的收益,那么仔細對比一下衰減策略下的開發(fā)集曲線和無衰減策略的開發(fā)集曲線,如果發(fā)現(xiàn)波峰后移的厲害,那可能衰減的太快了,嘗試推后衰減時機。不過,既然有明顯收益,那這時按照經(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擴展模塊中文版教程
          在「小白學視覺」公眾號后臺回復:擴展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

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

          下載3:OpenCV實戰(zhàn)項目20講
          小白學視覺公眾號后臺回復:OpenCV實戰(zhàn)項目20講即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學習進階。

          交流群


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


          瀏覽 158
          10點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          10點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  最新在线看黄 | 国产激情在线内射 | 爱色99| 中日韩精品一区二区三区四区 | 天天干夜夜爽 |