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設計要合理
多任務情況下, 各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用不用其實關系不大, 大不了網絡里面自己學習出來一個.
(5)不知選什么就用:激活函數用ReLU(CV領域).;參數初始化用xavier;
(8)多尺度的圖片輸入(或者網絡內部利用多尺度下的結果)有很好的提升效果。
(10)shortcut的聯接是有作用的。
(11)batch normalization我一直沒用, 雖然我知道這個很好, 我不用僅僅是因為我懶. 所以要鼓勵使用batch normalization。好壞另說,試了才知道。
(12)不要完全相信論文里面的東西. 結構什么的覺得可能有效果, 可以拿去試試.
(13)暴力調參最可取, 畢竟, 自己的生命最重要. 你調完這個模型說不定過兩天這模型就扔掉了.
鏈接(知乎):https://www.zhihu.com/question/25097993/answer/127472322