總結知乎深度學習調參技巧。

1.Deep Learning 之 最優化方法

2.深度學習調參有哪些技巧? - Captain Jack的回答 - 知乎 https://www.zhihu.com/question/25097993/answer/127472322 

調參就是trial-and-error. 沒有其他捷徑可以走. 唯一的區別是有些人盲目的嘗試, 有些人思考後再嘗試. 快速嘗試, 快速糾錯這是調參的關鍵.

這是一個很好的鏈接, 說明了如何從零開始不斷的trial-and-error(其實這裏面沒遇到什麼error):
Using convolutional neural nets to detect facial keypoints tutorial

========================================================

基本原則:
快速試錯

一些大的注意事項:
1. 剛開始, 先上小規模數據, 模型往大了放, 只要不爆顯存, 能用256個filter你就別用128個. 直接奔着過擬合去. 沒錯, 就是訓練過擬合網絡, 連測試集驗證集這些都可以不用.

爲什麼?
+ 你要驗證自己的訓練腳本的流程對不對. 這一步小數據量, 生成速度快, 但是所有的腳本都是和未來大規模訓練一致的(除了少跑點循環)
+ 如果小數據量下, 你這麼粗暴的大網絡奔着過擬合去都沒效果. 那麼, 你要開始反思自己了, 模型的輸入輸出是不是有問題? 要不要檢查自己的代碼(永遠不要懷疑工具庫, 除非你動過代碼)? 模型解決的問題定義是不是有問題? 你對應用場景的理解是不是有錯? 不要懷疑NN的能力, 不要懷疑NN的能力, 不要懷疑NN的能力. 就我們調參狗能遇到的問題, NN沒法擬合的, 這概率是有多小?
+ 你可以不這麼做, 但是等你數據準備了兩天, 結果發現有問題要重新生成的時候, 你這周時間就醬油了.

2. Loss設計要合理.

+ 一般來說分類就是Softmax, 迴歸就是L2的loss. 但是要注意loss的錯誤範圍(主要是迴歸), 你預測一個label是10000的值, 模型輸出0, 你算算這loss多大, 這還是單變量的情況下. 一般結果都是nan. 所以不僅僅輸入要做normalization, 輸出也要這麼弄.
+ 多任務情況下, 各loss想法限制在一個量級上, 或者最終限制在一個量級上, 初期可以着重一個任務的loss。

3. 觀察loss勝於觀察準確率

準確率雖然是評測指標, 但是訓練過程中還是要注意loss的. 你會發現有些情況下, 準確率是突變的, 原來一直是0, 可能保持上千迭代, 然後突然變1. 要是因爲這個你提前中斷訓練了, 只有老天替你惋惜了. 而loss是不會有這麼詭異的情況發生的, 畢竟優化目標是loss.
給NN一點時間, 要根據任務留給NN的學習一定空間. 不能說前面一段時間沒起色就不管了. 有些情況下就是前面一段時間看不出起色, 然後開始穩定學習.

4. 確認分類網絡學習充分

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

5. Learning Rate設置合理
+ 太大: loss爆炸, 或者nan
+ 太小: 半天loss沒反映(但是, LR需要降低的情況也是這樣, 這裏可視化網絡中間結果, 不是weights, 有效果, 倆者可視化結果是不一樣的, 太小的話中間結果有點水波紋或者噪點的樣子, 因爲filter學習太慢的原因, 試過就會知道很明顯)
+ 需要進一步降低了: loss在當前LR下一路降了下來, 但是半天不再降了.
+ 如果有個複雜點的任務, 剛開始, 是需要人肉盯着調LR的. 後面熟悉這個任務網絡學習的特性後, 可以扔一邊跑去了.
+ 如果上面的Loss設計那塊你沒法合理, 初始情況下容易爆, 先上一個小LR保證不爆, 等loss降下來了, 再慢慢升LR, 之後當然還會慢慢再降LR, 雖然這很蛋疼.
+ LR在可以工作的最大值下往小收一收, 免得ReLU把神經元弄死了. 當然, 我是個心急的人, 總愛設個大點的.

6 對比訓練集和驗證集的loss
判斷過擬合, 訓練是否足夠, 是否需要early stop的依據, 這都是中規中矩的原則, 不多說了.

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

(人是大目標,關節點是嗎???)

簡短的注意事項:

  1. 預處理: -mean/std zero-center就夠了, PCA, 白化什麼的都用不上. 我個人觀點, 反正CNN能學習encoder, PCA用不用其實關係不大, 大不了網絡裏面自己學習出來一個.
  2. shuffle, shuffle, shuffle.
  3. 網絡原理的理解最重要, CNN的conv這塊, 你得明白sobel算子的邊界檢測.
  4. Dropout, Dropout, Dropout(不僅僅可以防止過擬合, 其實這相當於做人力成本最低的Ensemble, 當然, 訓練起來會比沒有Dropout的要慢一點, 同時網絡參數你最好相應加一點, 對, 這會再慢一點).
  5. CNN更加適合訓練回答是否的問題, 如果任務比較複雜, 考慮先用分類任務訓練一個模型再finetune.
  6. 無腦用ReLU(CV領域).
  7. 無腦用3x3.
  8. 無腦用xavier.
  9. LRN一類的, 其實可以不用. 不行可以再拿來試試看.
  10. filter數量2^n.
  11. 多尺度的圖片輸入(或者網絡內部利用多尺度下的結果)有很好的提升效果.
  12. 第一層的filter, 數量不要太少. 否則根本學不出來(底層特徵很重要).
  13. sgd adam 這些選擇上, 看你個人選擇. 一般對網絡不是決定性的. 反正我無腦用sgd + momentum.
  14. batch normalization我一直沒用, 雖然我知道這個很好, 我不用僅僅是因爲我懶. 所以要鼓勵使用batch normalization.
  15. 不要完全相信論文裏面的東西. 結構什麼的覺得可能有效果, 可以拿去試試.
  16. 你有95%概率不會使用超過40層的模型.
  17. shortcut的聯接是有作用的.
  18. 暴力調參最可取, 畢竟, 自己的生命最重要. 你調完這個模型說不定過兩天這模型就扔掉了.
  19. 機器, 機器, 機器.
  20. Google的inception論文, 結構要好好看看.
  21. 一些傳統的方法, 要稍微瞭解瞭解. 我自己的程序就用過1x14的手寫filter, 寫過之後你看看inception裏面的1x7, 7x1 就會會心一笑...

 

3.深度學習調參有哪些技巧? - 陳旭展的回答 - 知乎 https://www.zhihu.com/question/25097993/answer/161393876

因爲優化問題到底是什麼取決於模型+數據。對於不同的優化問題可能不同的求解器的結果都不一樣。adam 的主要作用是自適應梯度值。如果數據集巨大,每個類裏都有很大的in-class diversity的話可能會對同一個label 得到較大的loss,這時候adam會有優勢。如果模型和數據都不是特別大,SGD+moment會有更好的效果。哈哈,調參沒有萬金油。

我只對卷積網絡有一點點了解,所以接下來談的都是和卷積網絡相關的內容。

調參請在驗證集上!調參請在驗證集上!調參請在驗證集上!(水論文會得高分)

首先我們假設我們手上有一個正確的,沒有bug,可以訓練的模型,以及預先設立的誤差目標。那麼分三種情況:

1、模型表現非常好,在訓練集和驗證集上都滿足我們的目標。那不用調了。

2、模型在訓練集上的誤差很小,且各種(softmax 等等) loss 能減小到一個很小的值(對於我自己而言小於0.01),但是驗證集的 loss 相對較大(對我的問題而言,一般會在0.3~0.6)。那就是過擬合了。

3、在訓練集和驗證集上的loss都比較大,都大於0.3,那可能就是欠擬合了。

——————————————————————————————————————————

模型的訓練是在擬合訓練集的規律,模型的使用卻是將規律作用於測試集。那麼我們假設訓練集和測試集所包含的規律是大方向相同的,小細節存在差異的。

如果一個模型在訓練集上一直一直訓練下去,那麼它會很好的擬合訓練集所有的大方向規律和小細節規律,過擬合就是必然的了。因爲訓練的目標是將訓練集 loss 降到 0。理想的訓練過程如圖:

我們假設模型在驗證集的表現由兩部分組成:1、對訓練集規律的掌握(主要指標 trainset loss),2、學習結果對訓練集的適應程度(主要指標 validation set loss)。如上圖所示,調參的本質就是要找到那個best model 平衡點。

——————————————————————————————————————————

出現上述情況該調什麼?調試hyperparameters 的先後順序是什麼?

1、優先調 learning rate!優先調 learning rate!優先調 learning rate!

學習速率會很大程度上影響模型的表現。同樣的模型採用不同的learning rate 可能會表現迥異。所以憑感覺建好一個模型後如果對錶現不滿意應該優先調學習速率。我前段時間在知乎上看一個哥們說學習速率可以有解析解,希望他早日成功拯救我脫離調學習速率的苦海。模型具有理論容量和有效容量兩種能力指標,理論容量是由卷積核數量,模型深度等決定的。但是有效容量會受學習速率影響。

2、加 Dropout, 加 BN, 加Data augmentation

一般而言,在設計模型之初我們都信奉大力出奇跡。模型儘量深,卷積核儘量多,強行讓模型擬合訓練集。這時容易遇到的問題就是過擬合。解決過擬合的第一要素是模型的正則化,最有效方法是加大訓練數據集。如果有錢任性,那請多標記數據。如果沒錢要認命(比如我),那就給訓練數據加增強,什麼圖像裁剪,對稱變換,旋轉平移,都可以讓模型在驗證集上的表現更好。此外,增加常用的正則化也可以提升模型的表現。

3、調模型的層數和卷積核數量

走到這一步的時候都是迫不得已了。這兩個參數都是對模型理論容量具有巨大影響的參數,一旦調整了之後所有東西都要重新調。增大模型的層數和卷積核的數量都會提升模型的容量。不同的是,增大模型層數(讓模型變高)可以讓模型獲得更好的非線性,模型容量指數增加,缺點是加大層數會讓模型更難訓練,面臨梯度消失的風險,引入死單元。增加捲積核(讓模型變胖)可以在不引入訓練困難的情況下讓模型更好的擬合訓練集,也就是降低 training loss,但是會更容易過擬合。

總之,理想情況下表現優越的模型一般長的高高瘦瘦(深,每層卷積核不多),但是爲了便於我們訓練,有時候不得不讓他更矮壯一些。模型的調參除了學習速率和正則化這些比較耗時的工作外,還需要一些靈感,來確定模型的身材。

努力多調吧,你在訓練模型的時候它也在訓練你。

 

2.理解NN,可視化之類 - 楊軍的回答 - 知乎 https://www.zhihu.com/question/25097993/answer/127374415

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章