轉(zhuǎn)自:https://www.zhihu.com/question/25097993
我和@楊軍類似, 也是半路出家. 現(xiàn)在的工作內(nèi)容主要就是使用CNN做CV任務(wù). 干調(diào)參這種活也有兩年時(shí)間了. 我的回答可能更多的還是側(cè)重工業(yè)應(yīng)用, 技術(shù)上只限制在CNN這塊.
先說下我的觀點(diǎn), 調(diào)參就是trial-and-error. 沒有其他捷徑可以走. 唯一的區(qū)別是有些人盲目的嘗試, 有些人思考后再嘗試. 快速嘗試, 快速糾錯(cuò)這是調(diào)參的關(guān)鍵.
看了楊軍的回答. 對于這個(gè)回答, 下面的評論里面
說的很對. 這個(gè)回答主要內(nèi)容更多的是側(cè)重理解網(wǎng)絡(luò). 而非訓(xùn)練網(wǎng)絡(luò).
我要再強(qiáng)調(diào)下, 楊軍的回答更多的涉及是理解網(wǎng)絡(luò)而非訓(xùn)練網(wǎng)絡(luò). 是的, 沒錯(cuò). 你看完回答中的所有內(nèi)容, 對不起, 你還是不知道怎么實(shí)際訓(xùn)練一個(gè)網(wǎng)絡(luò), 尤其是復(fù)雜任務(wù)下的網(wǎng)絡(luò)(因?yàn)楹唵稳蝿?wù)根本不需要, 直接上來效果就會很好, 除非你要刷簡單任務(wù)的排行榜).
- 首先說下可視化:
我個(gè)人的理解, 對于可視化, 更多的還是幫助人類以自己熟悉的方式來觀察網(wǎng)絡(luò). 因?yàn)? 你是不可能邊觀察網(wǎng)絡(luò), 還邊調(diào)參的. 你只是訓(xùn)練完成后(或者準(zhǔn)確率到達(dá)一個(gè)階段后), 才能可視化. 在這之前, 網(wǎng)絡(luò)沒有學(xué)習(xí)到良好的參數(shù), 你可視化了也沒意義, 網(wǎng)絡(luò)達(dá)到不錯(cuò)的準(zhǔn)確率了, 你看看其實(shí)也就聽個(gè)響. 同樣, 你的網(wǎng)絡(luò)訓(xùn)練的一塌糊涂, 你可視化也沒什么意義, 唯一能夠看到的就是中間結(jié)果亂七八糟, 或者全黑全白, 這時(shí)候你直接看最后準(zhǔn)確率就可以知道這網(wǎng)絡(luò)沒救了.
- 關(guān)于權(quán)重的可視化[Visualize Layer Weights](現(xiàn)在是否強(qiáng)求smooth其實(shí)意義不大, 這個(gè)后面說.):
同樣, 你看到一個(gè)不滿足平滑結(jié)果的圖像, 你知道, 這網(wǎng)絡(luò)訓(xùn)練的不好, 但是為什么呢? 是數(shù)據(jù)不好? 沒有預(yù)處理? 網(wǎng)絡(luò)結(jié)構(gòu)問題? Learning Rate太大或者太小? 或者就是差了一個(gè)LRN層(之前我就遇到, 加個(gè)LRN就能出smooth的weights, 當(dāng)然這其實(shí)和預(yù)處理有關(guān))?
Smooth是需要看一下的, 心里有個(gè)數(shù). 但是具體調(diào)參怎么調(diào)是沒轍的. 第一, 你不可能告訴網(wǎng)絡(luò), 這層你得學(xué)個(gè)邊界檢測的功能出來. 第二, 不同任務(wù)下會有不同的weights(雖然底層的特征有很大的通用性), 你覺得你憑什么來指導(dǎo)一個(gè)看圖片比你快得多的機(jī)器?
再說現(xiàn)在是否需要強(qiáng)求smooth. 現(xiàn)在的趨勢是鼓勵(lì)使用小filter, 3x3大小, 多加層次(這樣, 非線性更好點(diǎn)). 換句話說, 3x3的圖片, 總共才9個(gè)像素, 你怎么判斷smooth與否呢? 當(dāng)然如果你使用大的filter, 一般5x5往上, 運(yùn)氣不差的話, 你是可以看到smooth的結(jié)果的.
咱們再說另外一個(gè)極端, 一個(gè)網(wǎng)絡(luò),運(yùn)行的完美(滿足應(yīng)用要求就算完美), 打開一看, 這weights不smooth啊. 你告訴我, 你打算怎么辦? 沒錯(cuò), 具有不平滑的權(quán)重的網(wǎng)絡(luò)同樣可以獲得很好的結(jié)果(這種情況我都習(xí)以為常了).
- 那么可視化網(wǎng)絡(luò)就不重要了?
非常重要, 但是不在訓(xùn)練這塊, 而是幫助理解網(wǎng)絡(luò)的原理這塊. 理解網(wǎng)絡(luò)原理后, 你才能在設(shè)計(jì)結(jié)構(gòu)的時(shí)候心里有感覺(只是有感覺而已), 網(wǎng)絡(luò)出了問題, 或者在某些情況下不滿意, 有更好的直覺去調(diào)整.(沒錯(cuò), 只是直覺, 雖然有些情況下的調(diào)整從網(wǎng)絡(luò)原理來看邏輯上應(yīng)該可以工作, 但是人家就是不工作, 你能咬機(jī)器去么?)
- 那么怎樣訓(xùn)練一個(gè)不錯(cuò)的網(wǎng)絡(luò)呢?
這是一個(gè)很好的鏈接, 說明了如何從零開始不斷的trial-and-error(其實(shí)這里面沒遇到什么error):
Using convolutional neural nets to detect facial keypoints tutorial
========================================================
我自己的經(jīng)驗(yàn), 有下面這些:
基本原則:
快速試錯(cuò)
一些大的注意事項(xiàng):
1. 剛開始, 先上小規(guī)模數(shù)據(jù), 模型往大了放, 只要不爆顯存, 能用256個(gè)filter你就別用128個(gè). 直接奔著過擬合去. 沒錯(cuò), 就是訓(xùn)練過擬合網(wǎng)絡(luò), 連測試集驗(yàn)證集這些都可以不用.
為什么?
- 你要驗(yàn)證自己的訓(xùn)練腳本的流程對不對. 這一步小數(shù)據(jù)量, 生成速度快, 但是所有的腳本都是和未來大規(guī)模訓(xùn)練一致的(除了少跑點(diǎn)循環(huán))
- 如果小數(shù)據(jù)量下, 你這么粗暴的大網(wǎng)絡(luò)奔著過擬合去都沒效果. 那么, 你要開始反思自己了, 模型的輸入輸出是不是有問題? 要不要檢查自己的代碼(永遠(yuǎn)不要懷疑工具庫, 除非你動(dòng)過代碼)? 模型解決的問題定義是不是有問題? 你對應(yīng)用場景的理解是不是有錯(cuò)? 不要懷疑NN的能力, 不要懷疑NN的能力, 不要懷疑NN的能力. 就我們調(diào)參狗能遇到的問題, NN沒法擬合的, 這概率是有多小?
- 你可以不這么做, 但是等你數(shù)據(jù)準(zhǔn)備了兩天, 結(jié)果發(fā)現(xiàn)有問題要重新生成的時(shí)候, 你這周時(shí)間就醬油了.
2. Loss設(shè)計(jì)要合理.
- 一般來說分類就是Softmax, 回歸就是L2的loss. 但是要注意loss的錯(cuò)誤范圍(主要是回歸), 你預(yù)測一個(gè)label是10000的值, 模型輸出0, 你算算這loss多大, 這還是單變量的情況下. 一般結(jié)果都是nan. 所以不僅僅輸入要做normalization, 輸出也要這么弄.
- 多任務(wù)情況下, 各loss想法限制在一個(gè)量級上, 或者最終限制在一個(gè)量級上, 初期可以著重一個(gè)任務(wù)的loss
3. 觀察loss勝于觀察準(zhǔn)確率
準(zhǔn)確率雖然是評測指標(biāo), 但是訓(xùn)練過程中還是要注意loss的. 你會發(fā)現(xiàn)有些情況下, 準(zhǔn)確率是突變的, 原來一直是0, 可能保持上千迭代, 然后突然變1. 要是因?yàn)檫@個(gè)你提前中斷訓(xùn)練了, 只有老天替你惋惜了. 而loss是不會有這么詭異的情況發(fā)生的, 畢竟優(yōu)化目標(biāo)是loss.
給NN一點(diǎn)時(shí)間, 要根據(jù)任務(wù)留給NN的學(xué)習(xí)一定空間. 不能說前面一段時(shí)間沒起色就不管了. 有些情況下就是前面一段時(shí)間看不出起色, 然后開始穩(wěn)定學(xué)習(xí).
4. 確認(rèn)分類網(wǎng)絡(luò)學(xué)習(xí)充分
分類網(wǎng)絡(luò)就是學(xué)習(xí)類別之間的界限. 你會發(fā)現(xiàn), 網(wǎng)絡(luò)就是慢慢的從類別模糊到類別清晰的. 怎么發(fā)現(xiàn)? 看Softmax輸出的概率的分布. 如果是二分類, 你會發(fā)現(xiàn), 剛開始的網(wǎng)絡(luò)預(yù)測都是在0.5上下, 很模糊. 隨著學(xué)習(xí)過程, 網(wǎng)絡(luò)預(yù)測會慢慢的移動(dòng)到0,1這種極值附近. 所以, 如果你的網(wǎng)絡(luò)預(yù)測分布靠中間, 再學(xué)習(xí)學(xué)習(xí).
5. Learning Rate設(shè)置合理
- 太大: loss爆炸, 或者nan
- 太小: 半天loss沒反映(但是, LR需要降低的情況也是這樣, 這里可視化網(wǎng)絡(luò)中間結(jié)果, 不是weights, 有效果, 倆者可視化結(jié)果是不一樣的, 太小的話中間結(jié)果有點(diǎn)水波紋或者噪點(diǎn)的樣子, 因?yàn)閒ilter學(xué)習(xí)太慢的原因, 試過就會知道很明顯)
- 需要進(jìn)一步降低了: loss在當(dāng)前LR下一路降了下來, 但是半天不再降了.
- 如果有個(gè)復(fù)雜點(diǎn)的任務(wù), 剛開始, 是需要人肉盯著調(diào)LR的. 后面熟悉這個(gè)任務(wù)網(wǎng)絡(luò)學(xué)習(xí)的特性后, 可以扔一邊跑去了.
- 如果上面的Loss設(shè)計(jì)那塊你沒法合理, 初始情況下容易爆, 先上一個(gè)小LR保證不爆, 等loss降下來了, 再慢慢升LR, 之后當(dāng)然還會慢慢再降LR, 雖然這很蛋疼.
- LR在可以工作的最大值下往小收一收, 免得ReLU把神經(jīng)元弄死了. 當(dāng)然, 我是個(gè)心急的人, 總愛設(shè)個(gè)大點(diǎn)的.
6 對比訓(xùn)練集和驗(yàn)證集的loss
判斷過擬合, 訓(xùn)練是否足夠, 是否需要early stop的依據(jù), 這都是中規(guī)中矩的原則, 不多說了.
7 清楚receptive field的大小
CV的任務(wù), context window是很重要的. 所以你對自己模型的receptive field的大小要心中有數(shù). 這個(gè)對效果的影響還是很顯著的. 特別是用FCN, 大目標(biāo)需要很大的receptive field. 不像有fully connection的網(wǎng)絡(luò), 好歹有個(gè)fc兜底, 全局信息都有.
簡短的注意事項(xiàng):
- 預(yù)處理: -mean/std zero-center就夠了, PCA, 白化什么的都用不上. 我個(gè)人觀點(diǎn), 反正CNN能學(xué)習(xí)encoder, PCA用不用其實(shí)關(guān)系不大, 大不了網(wǎng)絡(luò)里面自己學(xué)習(xí)出來一個(gè).
- shuffle, shuffle, shuffle.
- 網(wǎng)絡(luò)原理的理解最重要, CNN的conv這塊, 你得明白sobel算子的邊界檢測.
- Dropout, Dropout, Dropout(不僅僅可以防止過擬合, 其實(shí)這相當(dāng)于做人力成本最低的Ensemble, 當(dāng)然, 訓(xùn)練起來會比沒有Dropout的要慢一點(diǎn), 同時(shí)網(wǎng)絡(luò)參數(shù)你最好相應(yīng)加一點(diǎn), 對, 這會再慢一點(diǎn)).
- CNN更加適合訓(xùn)練回答是否的問題, 如果任務(wù)比較復(fù)雜, 考慮先用分類任務(wù)訓(xùn)練一個(gè)模型再finetune.
- 無腦用ReLU(CV領(lǐng)域).
- 無腦用3x3.
- 無腦用xavier.
- LRN一類的, 其實(shí)可以不用. 不行可以再拿來試試看.
- filter數(shù)量2^n.
- 多尺度的圖片輸入(或者網(wǎng)絡(luò)內(nèi)部利用多尺度下的結(jié)果)有很好的提升效果.
- 第一層的filter, 數(shù)量不要太少. 否則根本學(xué)不出來(底層特征很重要).
- sgd adam 這些選擇上, 看你個(gè)人選擇. 一般對網(wǎng)絡(luò)不是決定性的. 反正我無腦用sgd + momentum.
- batch normalization我一直沒用, 雖然我知道這個(gè)很好, 我不用僅僅是因?yàn)槲覒? 所以要鼓勵(lì)使用batch normalization.
- 不要完全相信論文里面的東西. 結(jié)構(gòu)什么的覺得可能有效果, 可以拿去試試.
- 你有95%概率不會使用超過40層的模型.
- shortcut的聯(lián)接是有作用的.
- 暴力調(diào)參最可取, 畢竟, 自己的生命最重要. 你調(diào)完這個(gè)模型說不定過兩天這模型就扔掉了.
- 機(jī)器, 機(jī)器, 機(jī)器.
- Google的inception論文, 結(jié)構(gòu)要好好看看.
- 一些傳統(tǒng)的方法, 要稍微了解了解. 我自己的程序就用過1x14的手寫filter, 寫過之后你看看inception里面的1x7, 7x1 就會會心一笑..
來源:https://www.zhihu.com/question/25097993/answer/161393876
趁著模型正在跑夸盟,我來強(qiáng)答一發(fā)。
我只對卷積網(wǎng)絡(luò)有一點(diǎn)點(diǎn)了解酿联,所以接下來談的都是和卷積網(wǎng)絡(luò)相關(guān)的內(nèi)容江咳。
調(diào)參請?jiān)隍?yàn)證集上!調(diào)參請?jiān)隍?yàn)證集上哥放!調(diào)參請?jiān)隍?yàn)證集上歼指!
首先我們假設(shè)我們手上有一個(gè)正確的爹土,沒有bug,可以訓(xùn)練的模型踩身,以及預(yù)先設(shè)立的誤差目標(biāo)胀茵。那么分三種情況:
1、模型表現(xiàn)非常好挟阻,在訓(xùn)練集和驗(yàn)證集上都滿足我們的目標(biāo)琼娘。那不用調(diào)了。
2附鸽、模型在訓(xùn)練集上的誤差很小脱拼,且各種(softmax 等等) loss 能減小到一個(gè)很小的值(對于我自己而言小于0.01),但是驗(yàn)證集的 loss 相對較大(對我的問題而言坷备,一般會在0.3~0.6)熄浓。那就是過擬合了。
3省撑、在訓(xùn)練集和驗(yàn)證集上的loss都比較大赌蔑,都大于0.3,那可能就是欠擬合了丁侄。
——————————————————————————————————————————
模型的訓(xùn)練是在擬合訓(xùn)練集的規(guī)律惯雳,模型的使用卻是將規(guī)律作用于測試集。那么我們假設(shè)訓(xùn)練集和測試集所包含的規(guī)律是大方向相同的鸿摇,小細(xì)節(jié)存在差異的石景。
如果一個(gè)模型在訓(xùn)練集上一直一直訓(xùn)練下去,那么它會很好的擬合訓(xùn)練集所有的大方向規(guī)律和小細(xì)節(jié)規(guī)律拙吉,過擬合就是必然的了潮孽。因?yàn)橛?xùn)練的目標(biāo)是將訓(xùn)練集 loss 降到 0。理想的訓(xùn)練過程如圖:
[圖片上傳失敗...(image-4fb843-1642167527497)]
我們假設(shè)模型在驗(yàn)證集的表現(xiàn)由兩部分組成:1筷黔、對訓(xùn)練集規(guī)律的掌握(主要指標(biāo) trainset loss)往史,2、學(xué)習(xí)結(jié)果對訓(xùn)練集的適應(yīng)程度(主要指標(biāo) validation set loss)佛舱。如上圖所示椎例,調(diào)參的本質(zhì)就是要找到那個(gè)best model 平衡點(diǎn)。
——————————————————————————————————————————
出現(xiàn)上述情況該調(diào)什么请祖?調(diào)試hyperparameters 的先后順序是什么订歪?
1、優(yōu)先調(diào) learning rate!優(yōu)先調(diào) learning rate!優(yōu)先調(diào) learning rate!
學(xué)習(xí)速率會很大程度上影響模型的表現(xiàn)肆捕。同樣的模型采用不同的learning rate 可能會表現(xiàn)迥異刷晋。所以憑感覺建好一個(gè)模型后如果對表現(xiàn)不滿意應(yīng)該優(yōu)先調(diào)學(xué)習(xí)速率。我前段時(shí)間在知乎上看一個(gè)哥們說學(xué)習(xí)速率可以有解析解,希望他早日成功拯救我脫離調(diào)學(xué)習(xí)速率的苦海眼虱。模型具有理論容量和有效容量兩種能力指標(biāo)喻奥,理論容量是由卷積核數(shù)量,模型深度等決定的捏悬。但是有效容量會受學(xué)習(xí)速率影響撞蚕。
2、加 Dropout邮破, 加 BN, 加Data Argument
一般而言诈豌,在設(shè)計(jì)模型之初我們都信奉大力出奇跡。模型盡量深抒和,卷積核盡量多,強(qiáng)行讓模型擬合訓(xùn)練集彤蔽。這時(shí)容易遇到的問題就是過擬合摧莽。解決過擬合的第一要素是模型的正則化,最有效方法是加大訓(xùn)練數(shù)據(jù)集顿痪。如果有錢任性镊辕,那請多標(biāo)記數(shù)據(jù)。如果沒錢要認(rèn)命(比如我)蚁袭,那就給訓(xùn)練數(shù)據(jù)加增強(qiáng)征懈,什么圖像裁剪,對稱變換揩悄,旋轉(zhuǎn)平移卖哎,都可以讓模型在驗(yàn)證集上的表現(xiàn)更好。此外删性,增加常用的正則化也可以提升模型的表現(xiàn)亏娜。
3、調(diào)模型的層數(shù)和卷積核數(shù)量
走到這一步的時(shí)候都是迫不得已了蹬挺。這兩個(gè)參數(shù)都是對模型理論容量具有巨大影響的參數(shù)维贺,一旦調(diào)整了之后所有東西都要重新調(diào)。增大模型的層數(shù)和卷積核的數(shù)量都會提升模型的容量巴帮。不同的是溯泣,增大模型層數(shù)(讓模型變高)可以讓模型獲得更好的非線性,模型容量指數(shù)增加榕茧,缺點(diǎn)是加大層數(shù)會讓模型更難訓(xùn)練垃沦,面臨梯度消失的風(fēng)險(xiǎn),引入死單元雪猪。增加卷積核(讓模型變胖)可以在不引入訓(xùn)練困難的情況下讓模型更好的擬合訓(xùn)練集栏尚,也就是降低 training loss,但是會更容易過擬合。
總之译仗,理想情況下表現(xiàn)優(yōu)越的模型一般長的高高瘦瘦(深抬虽,每層卷積核不多),但是為了便于我們訓(xùn)練纵菌,有時(shí)候不得不讓他更矮壯一些阐污。模型的調(diào)參除了學(xué)習(xí)速率和正則化這些比較耗時(shí)的工作外,還需要一些靈感咱圆,來確定模型的身材笛辟。
來源:https://www.zhihu.com/question/25097993/answer/37525469
感覺除了層數(shù)和每層隱節(jié)點(diǎn)的個(gè)數(shù),也沒啥好調(diào)的序苏。其它參數(shù)手幢,近兩年論文基本都用同樣的參數(shù)設(shè)定:迭代幾十到幾百epoch。sgd忱详,mini batch size從幾十到幾百皆可围来。步長0.1,可手動(dòng)收縮匈睁,weight decay取0.005监透,momentum取0.9。dropout加relu航唆。weight用高斯分布初始化胀蛮,bias全初始化為0。最后記得輸入特征和預(yù)測目標(biāo)都做好歸一化糯钙。做完這些你的神經(jīng)網(wǎng)絡(luò)就應(yīng)該跑出基本靠譜的結(jié)果粪狼,否則反省一下自己的人品。
今天給大家講講DNN(深度神經(jīng)網(wǎng)絡(luò))在訓(xùn)練過程中遇到的一些問題超营,然后我們應(yīng)該怎么去注意它鸳玩,并學(xué)會怎么去訓(xùn)練它。
1演闭、數(shù)據(jù)集的準(zhǔn)備:
必須要保證大量不跟、高質(zhì)量且?guī)в袦?zhǔn)確標(biāo)簽的數(shù)據(jù),沒有該條件的數(shù)據(jù)米碰,訓(xùn)練學(xué)習(xí)很困難的(但是最近我看了以為作者寫的一篇文章窝革,說明不一定需要大量數(shù)據(jù)集,也可以訓(xùn)練的很好吕座,有空和大家來分享其思想---很厲害的想法)虐译;
2、數(shù)據(jù)預(yù)處理:
這個(gè)不多說吴趴,就是0均值和1方差化漆诽,其實(shí)還有很多方法;
3、Minibatch:
這個(gè)有時(shí)候還要根據(jù)你的硬件設(shè)備而定厢拭,一般建議用128,8這組兰英,但是128,1也很好,只是效率會非常慢供鸠,注意的是:千萬不要用過大的數(shù)值畦贸,否則很容易過擬合;
4楞捂、梯度歸一化:
其實(shí)就是計(jì)算出來梯度之后薄坏,要除以Minibatch的數(shù)量,這個(gè)可以通過閱讀源碼得知(我之前有寫過SGD)寨闹;
5胶坠、學(xué)習(xí)率:
① 一般都會有默認(rèn)的學(xué)習(xí)率,但是剛開始還是用一般的去學(xué)習(xí)鼻忠,然后逐漸的減小它涵但;
② 一個(gè)建議值是0.1,適用于很多NN的問題帖蔓,一般傾向于小一點(diǎn);但是如果對于的大數(shù)據(jù)瞳脓,何凱明老師也說過塑娇,要把學(xué)習(xí)率調(diào)到很小,他說0.00001都不為過(如果記得不錯(cuò)劫侧,應(yīng)該是這么說的)埋酬;
③ 一個(gè)對于調(diào)度學(xué)習(xí)率的建議:如果在驗(yàn)證集上性能不再增加就讓學(xué)習(xí)率除以2或者5,然后繼續(xù)烧栋,學(xué)習(xí)率會一直變得很小写妥,到最后就可以停止訓(xùn)練了;
④ 很多人用的一個(gè)設(shè)計(jì)學(xué)習(xí)率的原則就是監(jiān)測一個(gè)比率(每次更新梯度的norm除以當(dāng)前weight的norm)审姓,如果這個(gè)比率在10e-3附近珍特,且小于這個(gè)值,學(xué)習(xí)會很慢魔吐,如果大于這個(gè)值扎筒,那么學(xué)習(xí)很不穩(wěn)定,由此會帶來學(xué)習(xí)失敗酬姆。
6嗜桌、驗(yàn)證集的使用:
使用驗(yàn)證集,可以知道什么時(shí)候開始降低學(xué)習(xí)率和什么時(shí)候停止訓(xùn)練辞色;
7骨宠、weight初始化:
① 如果你不想繁瑣的話,直接用0.02randn(num_params)*來初始化,當(dāng)然別的值也可以去嘗試层亿;
② 如果上面那個(gè)建議不太好使桦卒,那么就依次初始化每一個(gè)weight矩陣用init_scale / sqrt(layer_width) * randn,init_scale可以被設(shè)置為0.1或者1棕所;
③ 初始化參數(shù)對結(jié)果的影響至關(guān)重要闸盔,要引起重視;
④ 在深度網(wǎng)絡(luò)中琳省,隨機(jī)初始化權(quán)重迎吵,使用SGD的話一般處理的都不好,這是因?yàn)槌跏蓟臋?quán)重太小了针贬。這種情況下對于淺層網(wǎng)絡(luò)有效击费,但是當(dāng)足夠深的時(shí)候就不行,因?yàn)?strong>weight更新的時(shí)候桦他,是靠很多weight相乘的蔫巩,越乘越小,類似梯度消失的意思快压。
8圆仔、RNN&&LSTM(這方面沒有深入了解,借用別人的意思):
如果訓(xùn)練RNN或者LSTM蔫劣,務(wù)必保證gradient的norm被約束在15或者5(前提還是要先歸一化gradient)坪郭,這一點(diǎn)在RNN和LSTM中很重要;
9脉幢、梯度檢查:
檢查下梯度歪沃,如果是你自己計(jì)算的梯度;如果使用LSTM來解決長時(shí)依賴的問題嫌松,記得初始化bias的時(shí)候要大一點(diǎn)沪曙;
10、數(shù)據(jù)增廣:
盡可能想辦法多的擴(kuò)增訓(xùn)練數(shù)據(jù)萎羔,如果使用的是圖像數(shù)據(jù)液走,不妨對圖像做一點(diǎn)扭轉(zhuǎn),剪切外驱,分割等操作來擴(kuò)充數(shù)據(jù)訓(xùn)練集合育灸;
11、dropout:(先空著昵宇,下次我要單獨(dú)詳細(xì)講解Dropout)
12磅崭、評價(jià)結(jié)果:
評價(jià)最終結(jié)果的時(shí)候,多做幾次瓦哎,然后平均一下他們的結(jié)果砸喻。
補(bǔ)充:
**1柔逼、選擇優(yōu)化算法 **
傳統(tǒng)的隨機(jī)梯度下降算法雖然適用很廣,但并不高效割岛,最近出現(xiàn)很多更靈活的優(yōu)化算法愉适,例如Adagrad、RMSProp等癣漆,可在迭代優(yōu)化的過程中自適應(yīng)的調(diào)節(jié)學(xué)習(xí)速率等超參數(shù)维咸,效果更佳;
**2惠爽、參數(shù)設(shè)置技巧 **
無論是多核CPU還是GPU加速癌蓖,內(nèi)存管理仍然以字節(jié)為基本單元做硬件優(yōu)化,因此將參數(shù)設(shè)定為2的指數(shù)倍婚肆,如64租副,128,512较性,1024等用僧,將有效提高矩陣分片、張量計(jì)算等操作的硬件處理效率赞咙;
**3责循、正則優(yōu)化 **
除了在神經(jīng)網(wǎng)絡(luò)單元上添加傳統(tǒng)的L1/L2正則項(xiàng)外,Dropout更經(jīng)常在深度神經(jīng)網(wǎng)絡(luò)應(yīng)用來避免模型的過擬合攀操。初始默認(rèn)的0.5的丟棄率是保守的選擇沼死,如果模型不是很復(fù)雜,設(shè)置為0.2就可以崔赌;
**4、其他方法 **
除了上述訓(xùn)練調(diào)優(yōu)的方法外耸别,還有其他一些常用方法健芭,包括:使用mini-batch learning方法、遷移訓(xùn)練學(xué)習(xí)秀姐、打亂訓(xùn)練集順序慈迈、對比訓(xùn)練誤差和測試誤差調(diào)節(jié)迭代次數(shù)、日志可視化觀察等等省有。
轉(zhuǎn)載請注明:煉丹實(shí)驗(yàn)室
之前曾經(jīng)寫過一篇文章痒留,講了一些深度學(xué)習(xí)訓(xùn)練的技巧,其中包含了部分調(diào)參心得:深度學(xué)習(xí)訓(xùn)練心得蠢沿。不過由于一般深度學(xué)習(xí)實(shí)驗(yàn)惑灵,相比普通機(jī)器學(xué)習(xí)任務(wù)暮现,時(shí)間較長,因此調(diào)參技巧就顯得尤為重要。同時(shí)個(gè)人實(shí)踐中,又有一些新的調(diào)參心得橡疼,因此這里單獨(dú)寫一篇文章,談一下自己對深度學(xué)習(xí)調(diào)參的理解,大家如果有其他技巧魔策,也歡迎多多交流。
好的實(shí)驗(yàn)環(huán)境是成功的一半
由于深度學(xué)習(xí)實(shí)驗(yàn)超參眾多河胎,代碼風(fēng)格良好的實(shí)驗(yàn)環(huán)境闯袒,可以讓你的人工或者自動(dòng)調(diào)參更加省力,有以下幾點(diǎn)可能需要注意:
- 將各個(gè)參數(shù)的設(shè)置部分集中在一起游岳。如果參數(shù)的設(shè)置分布在代碼的各個(gè)地方政敢,那么修改的過程想必會非常痛苦。
- 可以輸出模型的損失函數(shù)值以及訓(xùn)練集和驗(yàn)證集上的準(zhǔn)確率吭历。
- 可以考慮設(shè)計(jì)一個(gè)子程序堕仔,可以根據(jù)給定的參數(shù),啟動(dòng)訓(xùn)練并監(jiān)控和周期性保存評估結(jié)果晌区。再由一個(gè)主程序摩骨,分配參數(shù)以及并行啟動(dòng)一系列子程序。
畫圖
畫圖是一個(gè)很好的習(xí)慣朗若,一般是訓(xùn)練數(shù)據(jù)遍歷一輪以后恼五,就輸出一下訓(xùn)練集和驗(yàn)證集準(zhǔn)確率。同時(shí)畫到一張圖上哭懈。這樣訓(xùn)練一段時(shí)間以后灾馒,如果模型一直沒有收斂,那么就可以停止訓(xùn)練遣总,嘗試其他參數(shù)了睬罗,以節(jié)省時(shí)間。
如果訓(xùn)練到最后旭斥,訓(xùn)練集容达,測試集準(zhǔn)確率都很低,那么說明模型有可能欠擬合垂券。那么后續(xù)調(diào)節(jié)參數(shù)方向花盐,就是增強(qiáng)模型的擬合能力。例如增加網(wǎng)絡(luò)層數(shù)菇爪,增加節(jié)點(diǎn)數(shù)算芯,減少dropout值,減少L2正則值等等凳宙。
如果訓(xùn)練集準(zhǔn)確率較高熙揍,測試集準(zhǔn)確率比較低,那么模型有可能過擬合近速,這個(gè)時(shí)候就需要向提高模型泛化能力的方向诈嘿,調(diào)節(jié)參數(shù)堪旧。
從粗到細(xì)分階段調(diào)參
實(shí)踐中,一般先進(jìn)行初步范圍搜索奖亚,然后根據(jù)好結(jié)果出現(xiàn)的地方淳梦,再縮小范圍進(jìn)行更精細(xì)的搜索。
- 建議先參考相關(guān)論文昔字,以論文中給出的參數(shù)作為初始參數(shù)爆袍。至少論文中的參數(shù),是個(gè)不差的結(jié)果作郭。
- 如果找不到參考陨囊,那么只能自己嘗試了〖性埽可以先從比較重要蜘醋,對實(shí)驗(yàn)結(jié)果影響比較大的參數(shù)開始,同時(shí)固定其他參數(shù)咏尝,得到一個(gè)差不多的結(jié)果以后压语,在這個(gè)結(jié)果的基礎(chǔ)上,再調(diào)其他參數(shù)编检。例如學(xué)習(xí)率一般就比正則值胎食,dropout值重要的話,學(xué)習(xí)率設(shè)置的不合適允懂,不僅結(jié)果可能變差厕怜,模型甚至?xí)o法收斂。
- 如果實(shí)在找不到一組參數(shù)蕾总,可以讓模型收斂粥航。那么就需要檢查,是不是其他地方出了問題生百,例如模型實(shí)現(xiàn)躁锡,數(shù)據(jù)等等≈檬蹋可以參考我寫的深度學(xué)習(xí)網(wǎng)絡(luò)調(diào)試技巧
提高速度
調(diào)參只是為了尋找合適的參數(shù),而不是產(chǎn)出最終模型拦焚。一般在小數(shù)據(jù)集上合適的參數(shù)蜡坊,在大數(shù)據(jù)集上效果也不會太差。因此可以嘗試對數(shù)據(jù)進(jìn)行精簡赎败,以提高速度秕衙,在有限的時(shí)間內(nèi)可以嘗試更多參數(shù)。
- 對訓(xùn)練數(shù)據(jù)進(jìn)行采樣僵刮。例如原來100W條數(shù)據(jù)据忘,先采樣成1W鹦牛,進(jìn)行實(shí)驗(yàn)看看。
- 減少訓(xùn)練類別勇吊。例如手寫數(shù)字識別任務(wù)曼追,原來是10個(gè)類別,那么我們可以先在2個(gè)類別上訓(xùn)練汉规,看看結(jié)果如何礼殊。
超參數(shù)范圍
建議優(yōu)先在對數(shù)尺度上進(jìn)行超參數(shù)搜索。比較典型的是學(xué)習(xí)率和正則化項(xiàng)针史,我們可以從諸如0.001 0.01 0.1 1 10晶伦,以10為階數(shù)進(jìn)行嘗試。因?yàn)樗麄儗τ?xùn)練的影響是相乘的效果啄枕。不過有些參數(shù)婚陪,還是建議在原始尺度上進(jìn)行搜索,例如dropout值: 0.3 0.5 0.7)频祝。
經(jīng)驗(yàn)參數(shù)
這里給出一些參數(shù)的經(jīng)驗(yàn)值泌参,避免大家調(diào)參的時(shí)候,毫無頭緒智润。
- learning rate: 1 0.1 0.01 0.001, 一般從1開始嘗試及舍。很少見learning rate大于10的。學(xué)習(xí)率一般要隨著訓(xùn)練進(jìn)行衰減窟绷。衰減系數(shù)一般是0.5锯玛。 衰減時(shí)機(jī),可以是驗(yàn)證集準(zhǔn)確率不再上升時(shí)兼蜈,或固定訓(xùn)練多少個(gè)周期以后攘残。
不過更建議使用自適應(yīng)梯度的辦法,例如adam,adadelta,rmsprop等为狸,這些一般使用相關(guān)論文提供的默認(rèn)值即可歼郭,可以避免再費(fèi)勁調(diào)節(jié)學(xué)習(xí)率。對RNN來說辐棒,有個(gè)經(jīng)驗(yàn)病曾,如果RNN要處理的序列比較長,或者RNN層數(shù)比較多漾根,那么learning rate一般小一些比較好泰涂,否則有可能出現(xiàn)結(jié)果不收斂,甚至Nan等問題辐怕。 - 網(wǎng)絡(luò)層數(shù): 先從1層開始逼蒙。
- 每層結(jié)點(diǎn)數(shù): 16 32 128,超過1000的情況比較少見寄疏。超過1W的從來沒有見過是牢。
- batch size: 128上下開始僵井。batch size值增加,的確能提高訓(xùn)練速度驳棱。但是有可能收斂結(jié)果變差批什。如果顯存大小允許,可以考慮從一個(gè)比較大的值開始嘗試蹈胡。因?yàn)閎atch size太大渊季,一般不會對結(jié)果有太大的影響,而batch size太小的話罚渐,結(jié)果有可能很差却汉。
- clip c(梯度裁剪): 限制最大梯度,其實(shí)是value = sqrt(w12+w22….),如果value超過了閾值,就算一個(gè)衰減系系數(shù),讓value的值等于閾值: 5,10,15
- dropout: 0.5
- L2正則:1.0荷并,超過10的很少見合砂。
- 詞向量embedding大小:128源织,256
- 正負(fù)樣本比例: 這個(gè)是非常忽視翩伪,但是在很多分類問題上,又非常重要的參數(shù)谈息。很多人往往習(xí)慣使用訓(xùn)練數(shù)據(jù)中默認(rèn)的正負(fù)類別比例缘屹,當(dāng)訓(xùn)練數(shù)據(jù)非常不平衡的時(shí)候,模型很有可能會偏向數(shù)目較大的類別侠仇,從而影響最終訓(xùn)練結(jié)果轻姿。除了嘗試訓(xùn)練數(shù)據(jù)默認(rèn)的正負(fù)類別比例之外,建議對數(shù)目較小的樣本做過采樣逻炊,例如進(jìn)行復(fù)制互亮。提高他們的比例,看看效果如何余素,這個(gè)對多分類問題同樣適用豹休。
在使用mini-batch方法進(jìn)行訓(xùn)練的時(shí)候,盡量讓一個(gè)batch內(nèi)桨吊,各類別的比例平衡威根,這個(gè)在圖像識別等多分類任務(wù)上非常重要。
自動(dòng)調(diào)參
人工一直盯著實(shí)驗(yàn)视乐,畢竟太累医窿。自動(dòng)調(diào)參當(dāng)前也有不少研究。下面介紹幾種比較實(shí)用的辦法:
- Gird Search. 這個(gè)是最常見的炊林。具體說,就是每種參數(shù)確定好幾個(gè)要嘗試的值卷要,然后像一個(gè)網(wǎng)格一樣渣聚,把所有參數(shù)值的組合遍歷一下独榴。優(yōu)點(diǎn)是實(shí)現(xiàn)簡單暴力,如果能全部遍歷的話奕枝,結(jié)果比較可靠棺榔。缺點(diǎn)是太費(fèi)時(shí)間了,特別像神經(jīng)網(wǎng)絡(luò)隘道,一般嘗試不了太多的參數(shù)組合症歇。
- Random Search。Bengio在Random Search for Hyper-Parameter Optimization中指出谭梗,Random Search比Gird Search更有效忘晤。實(shí)際操作的時(shí)候,一般也是先用Gird Search的方法激捏,得到所有候選參數(shù)设塔,然后每次從中隨機(jī)選擇進(jìn)行訓(xùn)練。
- Bayesian Optimization. 貝葉斯優(yōu)化远舅,考慮到了不同參數(shù)對應(yīng)的實(shí)驗(yàn)結(jié)果值闰蛔,因此更節(jié)省時(shí)間。和網(wǎng)絡(luò)搜索相比簡直就是老牛和跑車的區(qū)別图柏。具體原理可以參考這個(gè)論文: Practical Bayesian Optimization of Machine Learning Algorithms 序六,這里同時(shí)推薦兩個(gè)實(shí)現(xiàn)了貝葉斯調(diào)參的Python庫,可以上手即用:
- jaberg/hyperopt, 比較簡單蚤吹。
- fmfn/BayesianOptimization例诀, 比較復(fù)雜,支持并行調(diào)參距辆。
總結(jié)
- 合理性檢查余佃,確定模型,數(shù)據(jù)和其他地方?jīng)]有問題跨算。
- 訓(xùn)練時(shí)跟蹤損失函數(shù)值爆土,訓(xùn)練集和驗(yàn)證集準(zhǔn)確率。
- 使用Random Search來搜索最優(yōu)超參數(shù)诸蚕,分階段從粗(較大超參數(shù)范圍訓(xùn)練較少周期)到細(xì)(較小超參數(shù)范圍訓(xùn)練較長周期)進(jìn)行搜索步势。
神經(jīng)網(wǎng)絡(luò)的代碼,比一般的代碼要難調(diào)試不少背犯,和編譯錯(cuò)誤以及運(yùn)行時(shí)程序崩潰相比坏瘩,神經(jīng)網(wǎng)絡(luò)比較棘手的地方,往往在于程序運(yùn)行正常漠魏,但是結(jié)果無法收斂倔矾,這個(gè)檢查起來可要麻煩多了。下面是根據(jù)我平時(shí)調(diào)試神經(jīng)網(wǎng)絡(luò)的經(jīng)驗(yàn),總結(jié)的一些比較通用的調(diào)試技巧哪自,后續(xù)會再寫一篇文章丰包,專門介紹一下theano如何進(jìn)行調(diào)試,希望能對大家調(diào)試神經(jīng)網(wǎng)絡(luò)有所幫助壤巷。
遇到Nan怎么辦邑彪?
Nan問題,我相信大部分人都遇到過胧华,一般可能是下面幾個(gè)原因造成的:
- 除0問題寄症。這里實(shí)際上有兩種可能,一種是被除數(shù)的值是無窮大矩动,即Nan有巧,另一種就是除數(shù)的值是0。之前產(chǎn)生的Nan或者0铅忿,有可能會被傳遞下去剪决,造成后面都是Nan。請先檢查一下神經(jīng)網(wǎng)絡(luò)中有可能會有除法的地方檀训,例如softmax層柑潦,再認(rèn)真的檢查一下數(shù)據(jù)。我有一次幫別人調(diào)試代碼峻凫,甚至還遇到過渗鬼,訓(xùn)練數(shù)據(jù)文件中,有些值就是Nan荧琼。譬胎。。這樣讀進(jìn)來以后命锄,開始訓(xùn)練堰乔,只要遇到Nan的數(shù)據(jù),后面也就Nan了脐恩「浜睿可以嘗試加一些日志,把神經(jīng)網(wǎng)絡(luò)的中間結(jié)果輸出出來驶冒,看看哪一步開始出現(xiàn)Nan苟翻。后面會介紹Theano的處理辦法。
- 梯度過大骗污,造成更新后的值為Nan崇猫。特別是RNN,在序列比較長的時(shí)候需忿,很容易出現(xiàn)梯度爆炸的問題诅炉。一般有以下幾個(gè)解決辦法蜡歹。
- 對梯度做clip(梯度裁剪),限制最大梯度,其實(shí)是value = sqrt(w12+w22….),如果value超過了閾值,就算一個(gè)衰減系系數(shù),讓value的值等于閾值: 5,10,15涕烧。
- 減少學(xué)習(xí)率季稳。初始學(xué)習(xí)率過大,也有可能造成這個(gè)問題澈魄。需要注意的是,即使使用adam之類的自適應(yīng)學(xué)習(xí)率算法進(jìn)行訓(xùn)練仲翎,也有可能遇到學(xué)習(xí)率過大問題痹扇,而這類算法,一般也有一個(gè)學(xué)習(xí)率的超參溯香,可以把這個(gè)參數(shù)改的小一些鲫构。
- 初始參數(shù)值過大,也有可能出現(xiàn)Nan問題玫坛。輸入和輸出的值结笨,最好也做一下歸一化。具體方法可以參考我之前的一篇文章:深度學(xué)習(xí)個(gè)人煉丹心得 - 煉丹實(shí)驗(yàn)室 - 知乎專欄
神經(jīng)網(wǎng)絡(luò)學(xué)不出東西怎么辦湿镀?
可能我們并沒有遇到炕吸,或者解決了Nan等問題,網(wǎng)絡(luò)一直在正常的訓(xùn)練勉痴,但是cost降不下來赫模,預(yù)測的時(shí)候,結(jié)果不正常蒸矛。
- 請打印出訓(xùn)練集的cost值和測試集上cost值的變化趨勢瀑罗,正常情況應(yīng)該是訓(xùn)練集的cost值不斷下降,最后趨于平緩雏掠,或者小范圍震蕩斩祭,測試集的cost值先下降,然后開始震蕩或者慢慢上升乡话。如果訓(xùn)練集cost值不下降摧玫,有可能是代碼有bug,有可能是數(shù)據(jù)有問題(本身有問題蚊伞,數(shù)據(jù)處理有問題等等)席赂,有可能是超參(網(wǎng)絡(luò)大小,層數(shù)时迫,學(xué)習(xí)率等)設(shè)置的不合理颅停。
請人工構(gòu)造10條數(shù)據(jù),用神經(jīng)網(wǎng)絡(luò)反復(fù)訓(xùn)練掠拳,看看cost是否下降癞揉,如果還不下降,那么可能網(wǎng)絡(luò)的代碼有bug,需要認(rèn)真檢查了喊熟。如果cost值下降柏肪,在這10條數(shù)據(jù)上做預(yù)測,看看結(jié)果是不是符合預(yù)期芥牌。那么很大可能網(wǎng)絡(luò)本身是正常的烦味。那么可以試著檢查一下超參和數(shù)據(jù)是不是有問題。 - 如果神經(jīng)網(wǎng)絡(luò)代碼壁拉,全部是自己實(shí)現(xiàn)的谬俄,那么強(qiáng)烈建議做梯度檢查。確保梯度計(jì)算沒有錯(cuò)誤弃理。
- 先從最簡單的網(wǎng)絡(luò)開始實(shí)驗(yàn)溃论,不要僅僅看cost值,還要看一看神經(jīng)網(wǎng)絡(luò)的預(yù)測輸出是什么樣子痘昌,確保能跑出預(yù)期結(jié)果钥勋。例如做語言模型實(shí)驗(yàn)的時(shí)候,先用一層RNN辆苔,如果一層RNN正常算灸,再嘗試LSTM,再進(jìn)一步嘗試多層LSTM姑子。
- 如果可能的話乎婿,可以輸入一條指定數(shù)據(jù),然后自己計(jì)算出每一步正確的輸出結(jié)果街佑,再檢查一下神經(jīng)網(wǎng)絡(luò)每一步的結(jié)果谢翎,是不是一樣的。