做dl也有一段時間了,積累了一些經驗,也在網上看到一些別人的經驗。
為了面試,結合知乎上面的問答,我也總結了一下,歡迎大家補充。
一. 初始化
有人用normal初始化cnn的參數,最后acc只能到70%多,僅僅改成xavier,acc可以到98%。
二.從理解CNN網絡以產生直覺去調參數的角度考慮,應該使用可視化
可視化(知乎用戶 楊軍)
1.Visualize Layer Activations
原則上來說,比較理想的layer activation應該具備sparse和localized的特點。
如果訓練出的模型,用於預測某張圖片時,發現在卷積層里的某個feature map的activation matrix可視化以后,基本跟原始輸入長得一樣,基本就表明出現了一些問題,因為這意味着這個feature map沒有學到多少有用的東西。
2.Visualize Layer Weights
除了可視化隱藏層的activation以外,可視化隱藏層的模型weight矩陣也能幫助我們獲得一些insights。
3.Embedding the Hidden Layer Neurons with t-SNE
這個方法描述起來比較直觀,就是通過t-SNE[10]對隱藏層進行降維,然后以降維之后的兩維數據分別作為x、y坐標(也可以使用t-SNE將數據降維到三維,將這三維用作x、y、z坐標,進行3d clustering),對數據進行clustering,人工review同一類圖片在降維之后的低維空間里是否處於相鄰的區域。
三.調參技巧 [知乎用戶 Captain Jack]
- 剛開始, 先上小規模數據, 模型往大了放, 只要不爆顯存, 能用256個filter你就別用128個. 直接奔着過擬合去. 沒錯, 就是訓練過擬合網絡, 連測試集驗證集這些都可以不用.就是為了看整體訓練流程沒有錯誤,假如loss不收斂就要好好反思了。
- 觀察loss勝於觀察准確率
准確率雖然是評測指標, 但是訓練過程中還是要注意loss的. 你會發現有些情況下, 准確率是突變的, 原來一直是0, 可能保持上千迭代, 然后突然變1. - Learning Rate設置合理
- 太大: loss爆炸, 或者nan,或者loss根本不降而且維持較大值,因為有可能就是走過最優點了,每一步都走得太大
- 太小: 半天loss沒反映(但是, LR需要降低的情況也是這樣, 這里可視化網絡中間結果, 不是weights, 有效果, 倆者可視化結果是不一樣的, 太小的話中間結果有點水波紋或者噪點的樣子, 因為filter學習太慢的原因, 試過就會知道很明顯)
- 需要進一步降低了: loss在當前LR下一路降了下來, 但是半天不再降了.
- 如果有個復雜點的任務, 剛開始, 是需要人肉盯着調LR的. 后面熟悉這個任務網絡學習的特性后, 可以扔一邊跑去了.
- 如果上面的Loss設計那塊你沒法合理, 初始情況下容易爆, 先上一個小LR保證不爆, 等loss降下來了, 再慢慢升LR, 之后當然還會慢慢再降LR, 雖然這很蛋疼.
- LR在可以工作的最大值下往小收一收, 免得ReLU把神經元弄死了. 當然, 我是個心急的人, 總愛設個大點的.
4.簡短的注意事項:
預處理: -mean/std zero-center就夠了, PCA, 白化什么的都用不上. 我個人觀點, 反正CNN能學習encoder, PCA用不用其實關系不大, 大不了網絡里面自己學習出來一個.
shuffle, shuffle, shuffle.
網絡原理的理解最重要, CNN的conv這塊, 你得明白sobel算子的邊界檢測
Dropout, Dropout, Dropout(不僅僅可以防止過擬合, 其實這相當於做人力成本最低的Ensemble, 當然, 訓練起來會比沒有Dropout的要慢一點, 同時網絡參數你最好相應加一點, 對, 這會再慢一點)
.CNN更加適合訓練回答是否的問題, 如果任務比較復雜, 考慮先用分類任務訓練一個模型再finetune.無腦用ReLU(CV領域).
無腦用3x3.無腦用xavier.
LRN一類的, 其實可以不用. 不行可以再拿來試試看.現在一般就是用batch normalization了
filter數量2^n.
多尺度的圖片輸入(或者網絡內部利用多尺度下的結果)有很好的提升效果.
第一層的filter, 數量不要太少. 否則根本學不出來(底層特征很重要).
sgd adam 這些選擇上, 看你個人選擇. 一般對網絡不是決定性的. 反正我無腦用sgd + momentum.
batch normalization我一直沒用, 雖然我知道這個很好, 我不用僅僅是因為我懶. 所以要鼓勵使用batch normalization.
不要完全相信論文里面的東西. 結構什么的覺得可能有效果, 可以拿去試試.
你有95%概率不會使用超過40層的模型
.shortcut的聯接是有作用的.暴力調參最可取, 畢竟, 自己的生命最重要. 你調完這個模型說不定過兩天這模型就扔掉了.
機器, 機器, 機器.
Google的inception論文, 結構要好好看看.
一些傳統的方法, 要稍微了解了解. 我自己的程序就用過1x14的手寫filter, 寫過之后你看看inception里面的1x7, 7x1 就會會心一笑…因為這就是提取橫豎條紋的。
加data augmentation
知乎匿名用戶:
感覺除了層數和每層隱節點的個數,也沒啥好調的。其它參數,近兩年論文基本都用同樣的參數設定:迭代幾十到幾百epoch。sgd,mini batch size從幾十到幾百皆可。步長0.1,可手動收縮,weight decay取0.005,momentum取0.9。dropout加relu。weight用高斯分布初始化,bias全初始化為0。最后記得輸入特征和預測目標都做好歸一化。做完這些你的神經網絡就應該跑出基本靠譜的結果,否則反省一下自己的人品。