深度學習—常見問題總結(調優方法)


1、為什么要用神經網絡?

  對於非線性分類問題,如果用多元線性回歸進行分類,需要構造許多高次項,導致特征特多,學習參數過多,從而復雜度太高 。

  在神經網絡中引入激活函數一個重要的原因就是為了引入非線性。

2、CNN基本問題

   層級結構:輸入層->卷積層->激活層->池化層->卷積層->激活層->池化層->全連接層····

   (1)輸入層數據預處理:去均值;歸一化;PCA/白化;

  去均值:即0均值化,CNN常用,訓練集所有像素值減去均值,把輸入數據各個維度中心化到0,測試集也減相同的均值;

      目的:(1)數據有過大的均值可能導致參數的梯度過大,在梯度回傳時會有一些影響;(2)如果有后續的處理,可能要求數據0均值,比如PCA。

  歸一化:幅度歸一化到同樣的范圍;

      目的:為了讓不同維度的數據具有相同的分布規模,方便操作,圖像一般不需要。

  PCA/白化:降維,白化是對PCA降維后的數據每個特征軸上的幅度歸一化;

      目的:相當於在零均值化和歸一化操作之間插入一個旋轉操作,將數據投影在主軸上。圖像一般不需要,因為圖像的信息本來就是依靠像素之間的相對差異來體現的。

   (2)池化層作用:

  本質上,是在精簡feature map數據量的同時,最大化保留空間信息和特征信息,的處理技巧;

  目的是,(a)對feature map及參數進行壓縮,起到降維作用;

      (b)減小過擬合的作用。包括Max pooling 和average pooling;

      (c)引入不變性,包括平移、旋轉、尺度不變性。但CNN的invariance的能力,本質是由convolution創造的;

  簡而言之,如果輸入是圖像的話,那么池化層的最主要作用就是壓縮圖像

  為什么不用卷積步長的壓縮:因為pooling layer的工作原理,在壓縮上比convolution更專注和易用。

  為什么不用BP神經網絡去做呢?

  (1)全連接,權值太多,需要很多樣本去訓練,計算困難。應對之道:減少權值的嘗試,局部連接,權值共享。

  卷積神經網絡有兩種神器可以降低參數數目。
  第一種神器叫做局部感知野,一般認為人對外界的認知是從局部到全局的,而圖像的空間聯系也是局部的像素聯系較為緊密,而距離較遠的像素相關性則較弱。因而,每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然后在更高層將局部的信息綜合起來就得到了全局的信息。  

  第二級神器,即權值共享

  (2)邊緣過渡不平滑。應對之道:采樣窗口彼此重疊。

3、調參優化方法:基本原則—快速試錯

  (1)由小數據到大數據:剛開始, 先上小規模數據, 模型往大了放, 只要不爆顯存, 能用256個filter你就別用128個. 直接奔着過擬合去。

    目的:驗證自己的訓練腳本的流程對不對。如果小數據量下, 你這么粗暴的大網絡奔着過擬合去都沒效果. 那么, 你要開始反思自己了, 模型的輸入輸出是不是有問題? 要不要檢查自己的代碼(永遠不要懷疑工具庫, 除非你動過代碼)? 模型解決的問題定義是不是有問題? 你對應用場景的理解是不是有錯?

  (2)loss設計要合理

  一般來說分類就是Softmax, 回歸就是L2的loss. 但是要注意loss的錯誤范圍(主要是回歸), 你預測一個label是10000的值, 模型輸出0, 你算算這loss多大, 這還是單變量的情況下. 一般結果都是nan. 所以不僅僅 輸入要做normalization, 輸出也要這么弄.

  多任務情況下, 各loss想法限制在一個量級上, 或者最終限制在一個量級上, 初期可以着重一個任務的loss。

  (3)觀察loss勝於觀察准確率

  LOSS下降時穩定的,而准確率有時是突變的,不能反映真實情況。給NN一點時間, 要根據任務留給NN的學習一定空間. 不能說前面一段時間沒起色就不管了. 有些情況下就是前面一段時間看不出起色, 然后開始穩定學習.

   (4)確認分類網絡學習充分

  分類網絡就是學習類別之間的界限. 你會發現, 網絡就是慢慢的從類別模糊到類別清晰的. 怎么發現? 看Softmax輸出的概率的分布. 如果是二分類, 你會發現, 剛開始的網絡預測都是在0.5上下, 很模糊. 隨着學習過程, 網絡預測會慢慢的移動到0,1這種極值附近. 所以, 如果你的網絡預測分布靠中間, 再學習學習。

  (5)學習率設置合理

  太大: loss爆炸, 或者nan;太小: 半天loss沒反映。當loss在當前LR下一路降了下來, 但是半天不再降了,就需要進一步降低了LR了。

  (6)對比訓練集和驗證集的loss

  判斷過擬合, 訓練是否足夠, 是否需要early stop的依據, 這都是中規中矩的原則, 不多說了.

  (7)清楚receptive field的大小

   CV的任務, context window是很重要的. 所以你對自己模型的receptive field的大小要心中有數. 這個對效果的影響還是很顯著的. 特別是用FCN, 大目標需要很大的receptive field. 不像有fully connection的網絡, 好歹有個fc兜底, 全局信息都有。

  (8)最后一層激活函數:分類softmax,回歸的話一般不用,直接輸出wx+b。

  (9)訓練數據增強:旋轉、裁剪、亮度、色度、飽和度等變化等增加魯棒性。

簡短的注意事項:

  (1)預處理: -mean/std zero-center就夠了, PCA, 白化什么的都用不上. 我個人觀點, 反正CNN能學習encoder, PCA用不用其實關系不大, 大不了網絡里面自己學習出來一個.

  (2)訓練數據要shuffle, shuffle, shuffle。
  (3) Dropout, Dropout, Dropout(不僅僅可以防止過擬合, 其實這相當於做人力成本最低的 Ensemble, 當然, 訓練起來會比沒有Dropout的要慢一點, 同時網絡參數你最好相應加一點, 對, 這會再慢一點)。注意,一般取值0.5,在測試時關掉。
  (4)CNN更加適合訓練回答 是否的問題, 如果任務比較復雜, 考慮先用分類任務訓練一個模型再finetune.
  (5)不知選什么就用:激活函數用ReLU(CV領域).;參數初始化用xavier;
  (6)LRN一類的, 其實 可以不用. 不行可以再拿來試試看.
  (7)filter數量2^n。 第一層的filter, 數量不要太少. 否則根本學不出來(底層特征很重要).
  (8)多尺度的圖片輸入(或者網絡內部利用多尺度下的結果)有很好的提升效果。
  (9)sgd adam 這些選擇上, 看你個人選擇. 一般對網絡不是決定性的. 反正我無腦用sgd + momentum。

  (10)shortcut的聯接是有作用的。

  (11)batch normalization我一直沒用, 雖然我知道這個很好, 我不用僅僅是因為我懶. 所以要鼓勵使用batch normalization。好壞另說,試了才知道。

  (12)不要完全相信論文里面的東西. 結構什么的覺得可能有效果, 可以拿去試試.

  (13)暴力調參最可取, 畢竟, 自己的生命最重要. 你調完這個模型說不定過兩天這模型就扔掉了.

 

 鏈接(知乎):https://www.zhihu.com/question/25097993/answer/127472322

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM