深度學習調參技巧

訓練技巧對深度學習來說是非常重要的,作為一門實驗性質很強的科學,同樣的網絡結構使用不同的訓練方法訓練承璃,結果可能會有很大的差異。這里我總結了近一年來的煉丹心得蚌本,分享給大家盔粹,也歡迎大家補充指正。

參數(shù)初始化程癌。

下面幾種方式,隨便選一個,結果基本都差不多舷嗡。但是一定要做。否則可能會減慢收斂速度嵌莉,影響收斂結果进萄,甚至造成Nan等一系列問題。

下面的n_in為網絡的輸入大小锐峭,n_out為網絡的輸出大小中鼠,n為n_in或(n_in+n_out)*0.5

Xavier初始法論文:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

He初始化論文:https://arxiv.org/abs/1502.01852

  • uniform均勻分布初始化: w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])

  • Xavier初始法,適用于普通激活函數(shù)(tanh,sigmoid):scale = np.sqrt(3/n)

  • He初始化沿癞,適用于ReLU:scale = np.sqrt(6/n)

  • normal高斯分布初始化: w = np.random.randn(n_in,n_out) * stdev # stdev為高斯分布的標準差援雇,均值設為0

  • Xavier初始法,適用于普通激活函數(shù) (tanh,sigmoid):stdev = np.sqrt(n)

  • He初始化椎扬,適用于ReLU:stdev = np.sqrt(2/n)

  • svd初始化:對RNN有比較好的效果惫搏。參考論文:https://arxiv.org/abs/1312.6120

數(shù)據(jù)預處理方式

  • zero-center ,這個挺常用的. X -= np.mean(X, axis = 0) # zero-center X /= np.std(X, axis = 0) # normalize
  • PCA whitening,這個用的比較少.

訓練技巧

  • 要做梯度歸一化,即算出來的梯度除以minibatch size
  • clip c(梯度裁剪): 限制最大梯度,其實是value = sqrt(w12+w22….),如果value超過了閾值,就算一個衰減系系數(shù),讓value的值等于閾值: 5,10,15
  • dropout對小數(shù)據(jù)防止過擬合有很好的效果,值一般設為0.5,小數(shù)據(jù)上dropout+sgd在我的大部分實驗中,效果提升都非常明顯.因此可能的話蚕涤,建議一定要嘗試一下晶府。 dropout的位置比較有講究, 對于RNN,建議放到輸入->RNN與RNN->輸出的位置.關于RNN如何用dropout,可以參考這篇論文:http://arxiv.org/abs/1409.2329
  • adam,adadelta等,在小數(shù)據(jù)上,我這里實驗的效果不如sgd, sgd收斂速度會慢一些,但是最終收斂后的結果钻趋,一般都比較好川陆。如果使用sgd的話,可以選擇從1.0或者0.1的學習率開始,隔一段時間,在驗證集上檢查一下,如果cost沒有下降,就對學習率減半. 我看過很多論文都這么搞,我自己實驗的結果也很好. 當然,也可以先用ada系列先跑,最后快收斂的時候,更換成sgd繼續(xù)訓練.同樣也會有提升.據(jù)說adadelta一般在分類問題上效果比較好,adam在生成問題上效果比較好蛮位。
  • 除了gate之類的地方,需要把輸出限制成0-1之外,盡量不要用sigmoid,可以用tanh或者relu之類的激活函數(shù).1. sigmoid函數(shù)在-4到4的區(qū)間里较沪,才有較大的梯度。之外的區(qū)間失仁,梯度接近0尸曼,很容易造成梯度消失問題。2. 輸入0均值萄焦,sigmoid函數(shù)的輸出不是0均值的控轿。
  • rnn的dim和embdding size,一般從128上下開始調整. batch size,一般從128左右開始調整.batch size合適最重要,并不是越大越好.
  • word2vec初始化,在小數(shù)據(jù)上,不僅可以有效提高收斂速度,也可以可以提高結果.
  • 盡量對數(shù)據(jù)做shuffle
  • LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的結果,來自這篇論文:http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf, 我這里實驗設成1.0,可以提高收斂速度.實際使用中,不同的任務,可能需要嘗試不同的值.
  • Batch Normalization據(jù)說可以提升效果冤竹,不過我沒有嘗試過,建議作為最后提升模型的手段茬射,參考論文:Accelerating Deep Network Training by Reducing Internal Covariate Shift
  • 如果你的模型包含全連接層(MLP)鹦蠕,并且輸入和輸出大小一樣,可以考慮將MLP替換成Highway Network,我嘗試對結果有一點提升在抛,建議作為最后提升模型的手段钟病,原理很簡單,就是給輸出加了一個gate來控制信息的流動刚梭,詳細介紹請參考論文: http://arxiv.org/abs/1505.00387
  • 來自@張馨宇的技巧:一輪加正則肠阱,一輪不加正則,反復進行朴读。

Ensemble

Ensemble是論文刷結果的終極核武器,深度學習中一般有以下幾種方式

  • 同樣的參數(shù),不同的初始化方式
  • 不同的參數(shù),通過cross-validation,選取最好的幾組
  • 同樣的參數(shù),模型訓練的不同階段屹徘,即不同迭代次數(shù)的模型。
  • 不同的模型,進行線性融合. 例如RNN和傳統(tǒng)模型.

只想說一句:初始化

一次慘痛的教訓是用normal初始化cnn的參數(shù)衅金,最后acc只能到70%多缘回,僅僅改成xavier,acc可以到98%典挑。

還有一次給word embedding初始化,最開始使用了TensorFlow中默認的initializer(即glorot_uniform_initializer啦吧,也就是大家經常說的無腦使用xavier)您觉,訓練速度慢不說,結果也不好授滓。改為uniform琳水,訓練速度飆升,結果也飆升般堆。

所以在孝,初始化就跟黑科技一樣,用對了超參都不用調淮摔;沒用對私沮,跑出來的結果就跟模型有bug一樣不忍直視。

作者:Jarvix賈博士
鏈接:https://www.zhihu.com/question/25097993/answer/153674495
來源:知乎
著作權歸作者所有和橙。商業(yè)轉載請聯(lián)系作者獲得授權仔燕,非商業(yè)轉載請注明出處。


作者:Captain Jack
鏈接:https://www.zhihu.com/question/25097993/answer/127472322
來源:知乎
著作權歸作者所有魔招。商業(yè)轉載請聯(lián)系作者獲得授權晰搀,非商業(yè)轉載請注明出處。

我和

@楊軍

類似, 也是半路出家. 現(xiàn)在的工作內容主要就是使用CNN做CV任務. 干調參這種活也有兩年時間了. 我的回答可能更多的還是側重工業(yè)應用, 技術上只限制在CNN這塊.

先說下我的觀點, 調參就是trial-and-error. 沒有其他捷徑可以走. 唯一的區(qū)別是有些人盲目的嘗試, 有些人思考后再嘗試. 快速嘗試, 快速糾錯這是調參的關鍵.

看了楊軍的回答. 對于這個回答, 下面的評論里面

@紀秋佳

說的很對. 這個回答主要內容更多的是側重理解網絡. 而非訓練網絡.

我要再強調下, 楊軍的回答更多的涉及是理解網絡而非訓練網絡. 是的, 沒錯. 你看完回答中的所有內容, 對不起, 你還是不知道怎么實際訓練一個網絡, 尤其是復雜任務下的網絡(因為簡單任務根本不需要, 直接上來效果就會很好, 除非你要刷簡單任務的排行榜).

  • 首先說下可視化:

我個人的理解, 對于可視化, 更多的還是幫助人類以自己熟悉的方式來觀察網絡. 因為, 你是不可能邊觀察網絡, 還邊調參的. 你只是訓練完成后(或者準確率到達一個階段后), 才能可視化. 在這之前, 網絡沒有學習到良好的參數(shù), 你可視化了也沒意義, 網絡達到不錯的準確率了, 你看看其實也就聽個響. 同樣, 你的網絡訓練的一塌糊涂, 你可視化也沒什么意義, 唯一能夠看到的就是中間結果亂七八糟, 或者全黑全白, 這時候你直接看最后準確率就可以知道這網絡沒救了.

  • 關于權重的可視化[Visualize Layer Weights](現(xiàn)在是否強求smooth其實意義不大, 這個后面說.):

同樣, 你看到一個不滿足平滑結果的圖像, 你知道, 這網絡訓練的不好, 但是為什么呢? 是數(shù)據(jù)不好? 沒有預處理? 網絡結構問題? Learning Rate太大或者太小? 或者就是差了一個LRN層(之前我就遇到, 加個LRN就能出smooth的weights, 當然這其實和預處理有關)?

Smooth是需要看一下的, 心里有個數(shù). 但是具體調參怎么調是沒轍的. 第一, 你不可能告訴網絡, 這層你得學個邊界檢測的功能出來. 第二, 不同任務下會有不同的weights(雖然底層的特征有很大的通用性), 你覺得你憑什么來指導一個看圖片比你快得多的機器?

再說現(xiàn)在是否需要強求smooth. 現(xiàn)在的趨勢是鼓勵使用小filter, 3x3大小, 多加層次(這樣, 非線性更好點). 換句話說, 3x3的圖片, 總共才9個像素, 你怎么判斷smooth與否呢? 當然如果你使用大的filter, 一般5x5往上, 運氣不差的話, 你是可以看到smooth的結果的.

咱們再說另外一個極端, 一個網絡,運行的完美(滿足應用要求就算完美), 打開一看, 這weights不smooth啊. 你告訴我, 你打算怎么辦? 沒錯, 具有不平滑的權重的網絡同樣可以獲得很好的結果(這種情況我都習以為常了).

  • 那么可視化網絡就不重要了?

非常重要, 但是不在訓練這塊, 而是幫助理解網絡的原理這塊. 理解網絡原理后, 你才能在設計結構的時候心里有感覺(只是有感覺而已), 網絡出了問題, 或者在某些情況下不滿意, 有更好的直覺去調整.(沒錯, 只是直覺, 雖然有些情況下的調整從網絡原理來看邏輯上應該可以工作, 但是人家就是不工作, 你能咬機器去么?)

  • 那么怎樣訓練一個不錯的網絡呢?

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

========================================================
我自己的經驗, 有下面這些:

基本原則:
快速試錯

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

為什么?

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

2. Loss設計要合理.

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

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

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

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

分類網絡就是學習類別之間的界限. 你會發(fā)現(xiàn), 網絡就是慢慢的從類別模糊到類別清晰的. 怎么發(fā)現(xiàn)? 看Softmax輸出的概率的分布. 如果是二分類, 你會發(fā)現(xiàn), 剛開始的網絡預測都是在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的依據(jù), 這都是中規(guī)中矩的原則, 不多說了.

7 清楚receptive field的大小
CV的任務, context window是很重要的. 所以你對自己模型的receptive field的大小要心中有數(shù). 這個對效果的影響還是很顯著的. 特別是用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的要慢一點, 同時網絡參數(shù)你最好相應加一點, 對, 這會再慢一點).
  5. CNN更加適合訓練回答是否的問題, 如果任務比較復雜, 考慮先用分類任務訓練一個模型再finetune.
  6. 無腦用ReLU(CV領域).
  7. 無腦用3x3.
  8. 無腦用xavier.
  9. LRN一類的, 其實可以不用. 不行可以再拿來試試看.
  10. filter數(shù)量2^n.
  11. 多尺度的圖片輸入(或者網絡內部利用多尺度下的結果)有很好的提升效果.
  12. 第一層的filter, 數(shù)量不要太少. 否則根本學不出來(底層特征很重要).
  13. sgd adam 這些選擇上, 看你個人選擇. 一般對網絡不是決定性的. 反正我無腦用sgd + momentum.
  14. batch normalization我一直沒用, 雖然我知道這個很好, 我不用僅僅是因為我懶. 所以要鼓勵使用batch normalization.
  15. 不要完全相信論文里面的東西. 結構什么的覺得可能有效果, 可以拿去試試.
  16. 你有95%概率不會使用超過40層的模型.
  17. shortcut的聯(lián)接是有作用的.
  18. 暴力調參最可取, 畢竟, 自己的生命最重要. 你調完這個模型說不定過兩天這模型就扔掉了.
  19. 機器, 機器, 機器.
  20. Google的inception論文, 結構要好好看看.
  21. 一些傳統(tǒng)的方法, 要稍微了解了解. 我自己的程序就用過1x14的手寫filter, 寫過之后你看看inception里面的1x7, 7x1 就會會心一笑...

作者:楊軍
鏈接:https://www.zhihu.com/question/25097993/answer/127374415
來源:知乎
著作權歸作者所有办斑。商業(yè)轉載請聯(lián)系作者獲得授權外恕,非商業(yè)轉載請注明出處。

Share一些自己關于深度學習模型調試技巧的總結思考(以CNN為主)。

最近因為一些需要鳞疲,參與了一些CNN建模調參的工作罪郊,出于個人習性,我并不習慣于通過單純的trial-and-error的方式來調試經常給人以”black-box”印象的Deep Learning模型建丧,所以在工作推進過程中排龄,花了一些時間去關注了深度學習模型調試以及可視化的資料(可視化與模型調試存在著極強的聯(lián)系,所以在后面我并沒有對這兩者加以區(qū)分)翎朱,這篇文章也算是這些工作的一個階段性總結橄维。

這里總結的內容,對于模型高手來說拴曲,應該說都是基本的know-how了争舞。

我本人是計算機體系結構專業(yè)出身,中途轉行做算法策略澈灼,所以實際上我倒是在大規(guī)模機器學習系統(tǒng)的開發(fā)建設以及訓練加速方面有更大的興趣和關注竞川。不過機器學習系統(tǒng)這個領域跟常規(guī)系統(tǒng)基礎設施(比如Redis/LevelDB以及一些分布式計算的基礎設施等)還有所區(qū)別,雖然也可以說是一種基礎設施叁熔,但是它跟跑在這個基礎設施上的業(yè)務問題有著更強且直接的聯(lián)系委乌,所以我也會花費一定的精力來關注數(shù)據(jù)、業(yè)務建模的技術進展和實際問題場景荣回。
說得通俗一些遭贸,對自己服務的業(yè)務理解得更清晰,才可能設計開發(fā)出更好的算法基礎設施心软。

另外在進入文章主體之前想聲明的是壕吹,這篇文章對于Deep Learning的入門者參考價值會更高,對于Deep Learning老手删铃,只期望能聊作幫助大家技術總結的一個余閑讀物而已耳贬。

文章的主要內容源于Stanford CS231n Convolutional Neural Networks for Visual Recognition課程[1]里介紹的一些通過可視化手段,調試理解CNN網絡的技巧猎唁,在[1]的基礎上我作了一些沿展閱讀咒劲,算是把[1]的內容進一步豐富系統(tǒng)化了一下。限于時間精力诫隅,我也沒有能夠把里面提到的所有調試技巧全部進行嘗試缎患,不過在整理這篇文章的時候,我還是參考了不止一處文獻阎肝,也結合之前以及最近跟一些朋友的技術交流溝通挤渔,對這些方法的有效性我還是有著很強的confidence。

1.Visualize Layer Activations
通過將神經網絡隱藏層的激活神經元以矩陣的形式可視化出來风题,能夠讓我們看到一些有趣的insights判导。
在[8]的頭部嫉父,嵌入了一個web-based的CNN網絡的demo,可以看到每個layer activation的可視化效果眼刃。
2.Visualize Layer Weights
除了可視化隱藏層的activation以外绕辖,可視化隱藏層的模型weight矩陣也能幫助我們獲得一些insights。
3.Retrieving Images That Maximally Activate a Neuron
為了理解3提到的方法擂红,需要先理解CNN里Receptive Field的概念仪际,在[5][6]里關于Receptive Field給出了直觀的介紹:

image.png

如果用文字來描述的話,就是對應于卷積核所生成的Feature Map里的一個neuron昵骤,在計算這個neuron的標量數(shù)值時树碱,是使用卷積核在輸入層的圖片上進行卷積計算得來的,對于Feature Map的某個特定neuron变秦,用于計算該neuron的輸入層數(shù)據(jù)的local patch就是這個neuron的receptive field成榜。
而對于一個特定的卷積層的Feature Map里的某個神經元,我們可以找到使得這個神經元的activation最大的那些圖片蹦玫,然后再從這個Feature Map neuron還原到原始圖片上的receptive field赎婚,即可以看到是哪張圖片的哪些region maximize了這個neuron的activation。在[7]里使用這個技巧樱溉,對于某個pooling層的輸出進行了activation maximization可視化的工作:


不過挣输,在[9]里,關于3提到的方法進行了更為細致的研究福贞,在[9]里撩嚼,發(fā)現(xiàn),通過尋找maximizing activation某個特定neuron的方法也許并沒有真正找到本質的信息肚医。因為即便是對于某一個hidden layer的neurons進行線性加權,也同樣會對一組圖片表現(xiàn)出相近的semantic親和性向瓷,并且肠套,這個發(fā)現(xiàn)在不同的數(shù)據(jù)集上得到了驗證。
如下面在MNIST和ImageNet數(shù)據(jù)集上的觀察:




4.Embedding the Hidden Layer Neurons with t-SNE
這個方法描述起來比較直觀猖任,就是通過t-SNE[10]對隱藏層進行降維你稚,然后以降維之后的兩維數(shù)據(jù)分別作為x、y坐標(也可以使用t-SNE將數(shù)據(jù)降維到三維朱躺,將這三維用作x刁赖、y、z坐標长搀,進行3d clustering)宇弛,對數(shù)據(jù)進行clustering,人工review同一類圖片在降維之后的低維空間里是否處于相鄰的區(qū)域源请。t-SNE降維以后的clustering圖往往需要在較高分辨率下才能比較清楚地看到效果枪芒,這里我沒有給出引用圖彻况,大家可以自行前往這里[15]里看到相關的demo圖。
使用這個方法舅踪,可以讓我們站在一個整體視角觀察模型在數(shù)據(jù)集上的表現(xiàn)纽甘。
5.Occluding Parts of the Image
這個方法在[11]里被提出。我個人非常喜歡這篇文章抽碌,因為這篇文章寫得非常清晰悍赢,并且給出的示例也非常直觀生動,是那種非常適合推廣到工業(yè)界實際應用場景的論文货徙,能夠獲得ECCV 2014 best paper倒也算在意料之中左权。在[11]里,使用了[12]里提出的Deconvolutional Network破婆,對卷積層形成的feature map進行reconstruction涮总,將feature map的activation投影到輸入圖片所在的像素空間,從而提供了更直觀的視角來觀察每個卷積層學習到了什么東西祷舀,一來可以幫助理解模型瀑梗;二來可以指導模型的調優(yōu)設計。
[11]的工作主要是在AlexNet這個模型上做的裳扯,將Deconvolutional Network引入到AlexNet模型以后的大致topology如下:

..., 詳情見知乎回答: https://www.zhihu.com/question/25097993/answer/127374415
最后說一下我的感受抛丽,卷積神經網絡自從2012年以AlexNet模型的形態(tài)在ImageNet大賽里大放異彩之后,就成為了圖像識別領域的標配饰豺,甚至現(xiàn)在文本和語音領域也開始在使用卷積神經網絡進行建模了亿鲜。不過以卷積神經網絡為代表的深層神經網絡一直被詬病“black-box”,這對于DL模型在工業(yè)界的應用推廣還是帶來了一定的阻礙冤吨。
對于”black-box”這個說法蒿柳,一方面,我覺得確實得承認DL這種model跟LR漩蟆、GBDT這些shallow model相比垒探,理解、調試的復雜性高了不少怠李。想像一下圾叼,理解一個LR或是GBDT模型的工作機理,一個沒有受到過系統(tǒng)機器學習訓練的工程師捺癞,只要對LR或GBDT的基本概念有一定認識夷蚊,也大致可以通過ad-hoc的方法來進行good case/bad case的分析了。而CNN這樣的模型髓介,理解和調試其的技巧惕鼓,則往往需要資深的專業(yè)背景人士來提出,并且這些技巧也都還存在一定的局限性唐础。對于LR模型來說呜笑,我們可以清晰地描述一維特征跟目標label的關系(即便存在特征共線性或是交叉特征夫否,也不難理解LR模型的行為表現(xiàn)),而DL模型叫胁,即便這幾年在模型的可解釋性凰慈、調試技巧方面有不少研究人員帶來了新的進展,在我來看也還是停留在一個相對”rough”的控制粒度驼鹅,對技巧的應用也還是存在一定的門檻微谓。
另一方面,我們應該也對學術界输钩、工業(yè)界在DL模型調試方面的進展保持一定的關注豺型。我自己的體會,DL模型與shallow model的應用曲線相比买乃,目前還是存在一定的差異的姻氨。從網上拉下來一個pre-trained好的模型,應用在一個跟pre-trained模型相同的應用場景剪验,能夠快速地拿到7肴焊,80分的收益,但是功戚,如果應用場景存在差異娶眷,或者對模型質量要求更高杂数,后續(xù)的模型優(yōu)化往往會存在較高的門檻(這也是模型調試没隘、可視化技巧發(fā)揮用武之地的地方),而模型離線tune好以后鸟蜡,布署到線上系統(tǒng)的overhead也往往更高一些乘粒,不論是在線serving的latency要求(這也催生了一些新的商業(yè)機會豌注,比如Nervana和寒武紀這樣的基于軟硬件協(xié)同設計技術的神經網絡計算加速公司),還是對memory consumption的需求灯萍。以前有人說過一句話“現(xiàn)在是個人就會在自己的簡歷上寫自己懂Deep Learning,但其實只有1%的人知道怎樣真正design一個DL model竟稳,剩下的只是找來一個現(xiàn)成的DL model跑一跑了事”属桦。這話聽來刺耳熊痴,但其實有幾分道理他爸。
回到我想表達的觀點,一方面我們能夠看到DL model應用的門檻相較于shallow model要高果善,另一方面能夠看到這個領域的快速進展诊笤。所以對這個領域的技術進展保持及時的跟進,對于模型的設計調優(yōu)以及在業(yè)務中的真正應用會有著重要的幫助巾陕。像LR讨跟、GBDT這種經典的shallow model那樣纪他,搞明白基本建模原理就可以捋起袖子在業(yè)務中開搞,不需要再分配太多精力關注模型技術的進展的工作方式晾匠,在當下的DL建模場景茶袒,我個人認為這種技術工作的模式并不適合。也許未來隨著技術凉馆、工具平臺的進步薪寓,可以把DL也做得更為易用,到那時澜共,使用DL建模的人也能跟現(xiàn)在使用shallow model一樣向叉,可以從模型技術方面解放出更多精力,用于業(yè)務問題本身了嗦董。

References:
[1]. Visualizing what ConvNets Learn. CS231n Convolutional Neural Networks for Visual Recognition
CS231n Convolutional Neural Networks for Visual Recognition
[2]. Matthew Zeiler. Visualizing and Understanding Convolutional Networks. Visualizing and Understanding Convolutional Networks.
[3]. Daniel Bruckner. deepViz: Visualizing Convolutional Neural Networks for Image Classification.
http://vis.berkeley.edu/courses/cs294-10-fa13/wiki/images/f/fd/DeepVizPaper.pdf
[4]. ConvNetJS MNIST Demo. ConvNetJS MNIST demo
[5]. Receptive Field. CS231n Convolutional Neural Networks for Visual Recognition
[6]. Receptive Field of Neurons in LeNet. deep learning
[7]. Ross Girshick. Rich feature hierarchies for accurate object detection and semantic segmentation
Tech report. Arxiv, 2011.
[8]. CS231n: Convolutional Neural Networks for Visual Recognition. Stanford University CS231n: Convolutional Neural Networks for Visual Recognition
[9]. Christian Szegedy. Intriguing properties of neural networks. Arxiv, 2013.
[10]. t-SNE. t-SNE – Laurens van der Maaten
[11]. Matthew D.Zeiler. Visualizing and Understanding Convolutional Networks. Arxiv, 2011.
[12]. Matthew D.Zeiler. Adaptive Deconvolutional Networks for Mid and High Level Feature Learning, ICCV 2011.
[13]. Neural Networks Part 3: Learning and Evaluation. CS231n Convolutional Neural Networks for Visual Recognition
[14]. ConvNetJS---Deep Learning in Your Browser.ConvNetJS: Deep Learning in your browser
[15]. Colah. Visualizing MNIST: An Exploration of Dimensionality Reduction. http://colah.github.io/posts/2014-10-Visualizing-MNIST/


神經網絡的代碼母谎,比一般的代碼要難調試不少,和編譯錯誤以及運行時程序崩潰相比京革,神經網絡比較棘手的地方奇唤,往往在于程序運行正常,但是結果無法收斂存崖,這個檢查起來可要麻煩多了冻记。下面是根據(jù)我平時調試神經網絡的經驗,總結的一些比較通用的調試技巧来惧,后續(xù)會再寫一篇文章冗栗,專門介紹一下theano如何進行調試,希望能對大家調試神經網絡有所幫助供搀。

遇到Nan怎么辦隅居?

Nan問題,我相信大部分人都遇到過葛虐,一般可能是下面幾個原因造成的:

  1. 除0問題胎源。這里實際上有兩種可能,一種是被除數(shù)的值是無窮大屿脐,即Nan涕蚤,另一種就是除數(shù)的值是0。之前產生的Nan或者0的诵,有可能會被傳遞下去万栅,造成后面都是Nan。請先檢查一下神經網絡中有可能會有除法的地方西疤,例如softmax層烦粒,再認真的檢查一下數(shù)據(jù)。我有一次幫別人調試代碼代赁,甚至還遇到過扰她,訓練數(shù)據(jù)文件中兽掰,有些值就是Nan。徒役。孽尽。這樣讀進來以后,開始訓練忧勿,只要遇到Nan的數(shù)據(jù)泻云,后面也就Nan了『桑可以嘗試加一些日志宠纯,把神經網絡的中間結果輸出出來,看看哪一步開始出現(xiàn)Nan层释。后面會介紹Theano的處理辦法婆瓜。
  2. 梯度過大,造成更新后的值為Nan贡羔。特別是RNN廉白,在序列比較長的時候,很容易出現(xiàn)梯度爆炸的問題乖寒。一般有以下幾個解決辦法猴蹂。
    1. 對梯度做clip(梯度裁剪),限制最大梯度,其實是value = sqrt(w12+w22….),如果value超過了閾值,就算一個衰減系系數(shù),讓value的值等于閾值: 5,10,15楣嘁。
    2. 減少學習率磅轻。初始學習率過大,也有可能造成這個問題逐虚。需要注意的是聋溜,即使使用adam之類的自適應學習率算法進行訓練,也有可能遇到學習率過大問題叭爱,而這類算法撮躁,一般也有一個學習率的超參,可以把這個參數(shù)改的小一些买雾。
  3. 初始參數(shù)值過大把曼,也有可能出現(xiàn)Nan問題。輸入和輸出的值漓穿,最好也做一下歸一化嗤军。具體方法可以參考我之前的一篇文章:深度學習個人煉丹心得 - 煉丹實驗室 - 知乎專欄

神經網絡學不出東西怎么辦?

可能我們并沒有遇到器净,或者解決了Nan等問題型雳,網絡一直在正常的訓練当凡,但是cost降不下來山害,預測的時候纠俭,結果不正常。

  1. 請打印出訓練集的cost值和測試集上cost值的變化趨勢浪慌,正常情況應該是訓練集的cost值不斷下降冤荆,最后趨于平緩,或者小范圍震蕩权纤,測試集的cost值先下降钓简,然后開始震蕩或者慢慢上升。如果訓練集cost值不下降汹想,有可能是代碼有bug外邓,有可能是數(shù)據(jù)有問題(本身有問題,數(shù)據(jù)處理有問題等等)古掏,有可能是超參(網絡大小损话,層數(shù),學習率等)設置的不合理槽唾。
    請人工構造10條數(shù)據(jù)丧枪,用神經網絡反復訓練,看看cost是否下降庞萍,如果還不下降拧烦,那么可能網絡的代碼有bug,需要認真檢查了钝计。如果cost值下降恋博,在這10條數(shù)據(jù)上做預測,看看結果是不是符合預期私恬。那么很大可能網絡本身是正常的交播。那么可以試著檢查一下超參和數(shù)據(jù)是不是有問題。
  2. 如果神經網絡代碼践付,全部是自己實現(xiàn)的秦士,那么強烈建議做梯度檢查。確保梯度計算沒有錯誤永高。
  3. 先從最簡單的網絡開始實驗隧土,不要僅僅看cost值,還要看一看神經網絡的預測輸出是什么樣子命爬,確保能跑出預期結果曹傀。例如做語言模型實驗的時候,先用一層RNN饲宛,如果一層RNN正常皆愉,再嘗試LSTM,再進一步嘗試多層LSTM。
  4. 如果可能的話幕庐,可以輸入一條指定數(shù)據(jù)久锥,然后自己計算出每一步正確的輸出結果,再檢查一下神經網絡每一步的結果异剥,是不是一樣的瑟由。

參考資料

http://russellsstewart.com/notes/0.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市冤寿,隨后出現(xiàn)的幾起案子歹苦,更是在濱河造成了極大的恐慌,老刑警劉巖督怜,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殴瘦,死亡現(xiàn)場離奇詭異,居然都是意外死亡号杠,警方通過查閱死者的電腦和手機痴施,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來究流,“玉大人辣吃,你說我怎么就攤上這事》姨剑” “怎么了神得?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長偷仿。 經常有香客問我哩簿,道長,這世上最難降的妖魔是什么酝静? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任节榜,我火速辦了婚禮,結果婚禮上别智,老公的妹妹穿的比我還像新娘宗苍。我一直安慰自己,他們只是感情好薄榛,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布讳窟。 她就那樣靜靜地躺著,像睡著了一般敞恋。 火紅的嫁衣襯著肌膚如雪丽啡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天硬猫,我揣著相機與錄音补箍,去河邊找鬼改执。 笑死,一個胖子當著我的面吹牛坑雅,可吹牛的內容都是我干的辈挂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼霞丧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冕香?” 一聲冷哼從身側響起蛹尝,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悉尾,沒想到半個月后突那,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡构眯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年愕难,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惫霸。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡猫缭,死狀恐怖,靈堂內的尸體忽然破棺而出壹店,到底是詐尸還是另有隱情猜丹,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布硅卢,位于F島的核電站射窒,受9級特大地震影響,放射性物質發(fā)生泄漏将塑。R本人自食惡果不足惜脉顿,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望点寥。 院中可真熱鬧艾疟,春花似錦、人聲如沸敢辩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽责鳍。三九已至碾褂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間历葛,已是汗流浹背正塌。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工嘀略, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乓诽。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓帜羊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸠天。 傳聞我的和親對象是個殘疾皇子讼育,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容