當前位置: 華文問答 > 數位

深度學習調參有哪些技巧?

2016-10-22數位

破千贊了,來補兩個亞馬遜工程師的CNN調參經驗文章。

大概調了快一年CNN(2019年1月到今天),看到這個話題挺感興趣的,以下是我的總結

做工程

  • 3\times 3 摺積是CNN的主流元件。平時有設計一些解決分類,回歸任務的網路,裏面的摺積核基本都設定為3\times 3 ,要說原因的話應該去問問 VGG16 吧。兩個3\times 3 的摺積核堆疊能獲得5\times 5 摺積核的感受野並且參數比5\times 5 摺積核少,所以是大量推薦使用的。
  • 可以適當使用1\times N 摺積。為什麽要提這一點呢,這是因為1\times N 摺積可以減少計算量,並且1\times N 摺積可以在某個方向強調感受野,也就是說假如如果你要對一個長方形形狀的目標進行分類,你可以使用1\times N 的摺積核搭配3\times 3 的摺積核對長邊方向設定更大的感受野,或授權以獲得泛化效能的提升。
  • ACNet結構。這個研究來自於ICCV2019,可以在3\times 3 摺積的基礎上加上1\times 3 和3\times 1 的旁路摺積核,最後在推理階段把三個摺積核都 fusion 到3\times 3 摺積核上,在許多經典CV任務上都可以獲得大概1個點的提升。大家可以看看這篇文章解讀,來自公眾號AI科技評論。 a href="https:// mp.weixin.qq.com/s/uRwh 2-dSVyZeO1sbJzx6qg ">33摺積+13摺積+3*1摺積=白給的精度提升
  • 摺積核權重初始化方式。對於 weight 的初始化我一般都是使用 xavier 初始化。當然也可以可以嘗試何凱明大神的He初始化。對於bias的初始化全置於0。
  • Batch Normalization 。這是我一直在使用的技巧,可以很大程度的加快收斂速度。建議搭建自己網路的時候盡量加上 BN ,如果有 BN 了全連線層就沒必要加 Dropout 了。
  • 目標檢測不能盲目去掉 fpn 結構。在針對自己的數據調檢測任務如 yolov3 的時候不能盲目砍掉 fpn 結構,盡管你分析出某個分支的Anchor基本不可能會對你預測的目標起作用,但如果你直接去掉分支很可能會帶來漏檢。
  • 最佳化器的選擇。我基本都是帶動量的 SGD 。如果最佳化不動可以試試 Adam
  • 啟用函式。可以先用 ReLU 做一版,如果想再提升精度可以將 ReLU 改成 PReLU 試試。我更傾向於直接使用 ReLU
  • batch_size :在不同型別的任務中, batch_size 的影響也不同,大家可以看看這篇 batch_size 對模型效能影響的文章,來自公眾號AI開發者。Batch_size是怎麽影響模型效能的
  • 初始學習率。一般我是從 0.01 開始設定,我個人認為這個學習率和學習率衰減策略是相關的,但不宜設定的過大過小, 0.01 0.1 應該是比較常用的。學習率衰減策略我一般使用 multistep 方式, step_size 的設定要看視你的的 max_iter 而定。
  • 數據與處理之 zero-center 。第一次見到這個詞是在看cs231n的視訊上。主要有2個步驟,第一個是減均值,第二個是除以變異數。這樣做下來最後的輸入是滿足均值為0變異數為1的機率分布的,一般減均值是最常用的,後面的除以變異數用不用可能需要自己動手試驗一下看看效果。
  • 殘留誤差結構和密集連線。 resnet 的殘留誤差結構和 dense net 密集連線結構,做工程的時候考慮到速度近乎不可能說完全使用完整版本的 resnet densenet 的完整結構,但我們可以自己動手將我們網路的某些模組替換為殘留誤差結構和密集連線,替換的時候可以適當降低這倆結構的復雜度,類似於通道數減半,密集連線中只保留一半連線等等。這裏需要做一些消融實驗來驗證改進後的精度。
  • 關於loss。優秀的 loss 一般是對模型的泛化效能有所改善的,但在用 loss 的時候往往並不是直接替換 loss 那麽簡單,需要仔細思考 loss 背後的數學原理,要用對地方才可有提升。例如,如何將Focal Loss用到YOLOv3中提升 map ,大家可以看看這個貼文。https://www. zhihu.com/question/2933 69755 。
  • 找到模型調參時的可靠評價指標。在調整參數訓練模型時一定要找到正確的評價指標,沒調整一個參數就要記錄一下模型的評價指標如準確率, map 值, miou 值等。並且在調參時建議將調整的參數和在測試集上的精度組合成一個字串給模型重命令,方便之後快速 review
  • 使用了帶 backbone 的網路,如訓練 VGG16-SSD 建議選擇 finetune 的方式,從頭訓練不僅費時費力,甚至難以收斂。
  • 在做分割實驗的時候我發現用upsamling 加1*1摺積代替反摺積做上采樣得到的結果更平滑,並且miou差距不大,所以我認為這兩者都是都可以使用的。
  • 一些Anchor-based目標檢測演算法為了提高精度,都是瘋狂給框,ap值確實上去了,但也導致了fp會很多,並且這部份fp沒有回歸,在nms階段也濾不掉。相比於ap提升而言,工程上減少fp更加重要。Gaussian yolov3的fp相比於yolov3會減少40%,Anchor-free演算法暫時接觸得不多,就不太了解了。
  • 做比賽

  • 特征提取。VGG16,VGG19,ResNet50,Xception是非常好用的幾個特征提取模型。建議使用訓練好的經典模型對數據集提取特征向量儲存到本地,更方便使用,同時可以大振幅降低視訊記憶體消耗。
  • ensemble:
  • 將不同的經典網路提取出的特征向量,假設 VGG16 提取出的特征向量維度是 [N,c1] , ResNet50 提取的特征向量維度是 [N,c2] , Xception 提取的特征向量維度是 [N, c3] ,那麽我們可以使用三個系數 a、b、c 將其組合為形狀為 [N, a*c1+b*c2+c*c3] ,其中 a、b、c 三個參數的取值代表我們使用哪個模型的特征多一些,如果是分類回歸比賽,我們在後面接特征處理網路就可以了。可以取不同的 a、b、c 得到不同的特征,然後對結果做 voting soft-voting 等多種處理,一般結果不會太差啦。
  • 可以使用不同的初始化方式訓練出模型,然後做ensemble。
  • 可以使用用不同超參數(如學習率, batch_size ,最佳化器)訓練出不同模型,然後做ensemble。
  • 因為我就做了一點點入門級比賽,上面介紹的方法取得了還不錯的結果,所以我就在這裏獻醜啦,方法確實挺無腦的,大家笑一笑就好啦。 繼續想了下,我好像除了這些有接觸或者使用到,暫時沒有什麽其它的了,如果想起其他的了,之後補充下。

    -----------------------------------更新--------------------------------

    歡迎大家關註我的公眾號和我交流演算法哦。