【Deep Learning】深度學(xué)習(xí)調(diào)參技巧的總結(jié)
(給機(jī)器學(xué)習(xí)算法與Python實(shí)戰(zhàn)加星標(biāo),提升AI技能)

編輯:Amusi ?|? 來源:知乎?轉(zhuǎn)自:cver
https://www.zhihu.com/question/25097993
本文僅作為學(xué)術(shù)分享,如果侵權(quán),會(huì)刪文處理
深度學(xué)習(xí)調(diào)參有哪些技巧?
深度學(xué)習(xí)的效果很大程度上取決于參數(shù)調(diào)節(jié)的好壞,那么怎么才能最快最好的調(diào)到合適的參數(shù)呢?求解
作者:Jarvix
https://www.zhihu.com/question/25097993/answer/153674495
瀉藥
只想說一句:初始化
一次慘痛的教訓(xùn)是用normal初始化cnn的參數(shù),最后acc只能到70%多,僅僅改成xavier,acc可以到98%。
還有一次給word embedding初始化,最開始使用了TensorFlow中默認(rèn)的initializer(即glorot_uniform_initializer,也就是大家經(jīng)常說的無腦使用xavier),訓(xùn)練速度慢不說,結(jié)果也不好。改為uniform,訓(xùn)練速度飆升,結(jié)果也飆升。
所以,初始化就跟黑科技一樣,用對(duì)了超參都不用調(diào);沒用對(duì),跑出來的結(jié)果就跟模型有bug一樣不忍直視。
作者:BBuf
https://www.zhihu.com/question/25097993/answer/934100939
大概調(diào)了快一年CNN(2019年1月到今天),看到這個(gè)話題挺感興趣的,以下是我的總結(jié)
做工程
卷積是CNN的主流組件。平時(shí)有設(shè)計(jì)一些解決分類,回歸任務(wù)的網(wǎng)絡(luò),里面的卷積核基本都設(shè)置為
,要說原因的話應(yīng)該去問問VGG16吧。兩個(gè)
的卷積核堆疊能獲得
卷積核的感受野并且參數(shù)比
卷積核少,所以是大量推薦使用的。可以適當(dāng)使用
卷積。為什么要提這一點(diǎn)呢,這是因?yàn)?/span>
卷積可以減少計(jì)算量,并且
卷積可以在某個(gè)方向強(qiáng)調(diào)感受野,也就是說假如如果你要對(duì)一個(gè)長方形形狀的目標(biāo)進(jìn)行分類,你可以使用
的卷積核搭配
的卷積核對(duì)長邊方向設(shè)定更大的感受野,或許可以獲得泛化性能的提升。ACNet結(jié)構(gòu)。這個(gè)研究來自于ICCV2019,可以在
卷積的基礎(chǔ)上加上
和
的旁路卷積核,最后在推理階段把三個(gè)卷積核都fusion到
卷積核上,在許多經(jīng)典CV任務(wù)上都可以獲得大概1個(gè)點(diǎn)的提升。大家可以看看這篇文章解讀:3*3卷積+1*3卷積+3*1卷積=白給的精度提升卷積核權(quán)重初始化方式。對(duì)于
weight的初始化我一般都是使用xavier初始化。當(dāng)然也可以可以嘗試何凱明大神的He初始化。對(duì)于bias的初始化全置于0。Batch Normalization。這是我一直在使用的技巧,可以很大程度的加快收斂速度。建議搭建自己網(wǎng)絡(luò)的時(shí)候盡量加上BN,如果有BN了全連接層就沒必要加Dropout了。目標(biāo)檢測(cè)不能盲目去掉
fpn結(jié)構(gòu)。在針對(duì)自己的數(shù)據(jù)調(diào)檢測(cè)任務(wù)如yolov3的時(shí)候不能盲目砍掉fpn結(jié)構(gòu),盡管你分析出某個(gè)分支的Anchor基本不可能會(huì)對(duì)你預(yù)測(cè)的目標(biāo)起作用,但如果你直接去掉分支很可能會(huì)帶來漏檢。優(yōu)化器的選擇。我基本都是帶動(dòng)量的
SGD。如果優(yōu)化不動(dòng)可以試試Adam。激活函數(shù)。可以先用
ReLU做一版,如果想再提升精度可以將ReLU改成PReLU試試。我更傾向于直接使用ReLU。batch_size:在不同類型的任務(wù)中,batch_size的影響也不同,大家可以看看這篇batch_size對(duì)模型性能影響的文章,來自公眾號(hào)AI開發(fā)者。Batch_size是怎么影響模型性能的初始學(xué)習(xí)率。一般我是從
0.01開始設(shè)置,我個(gè)人認(rèn)為這個(gè)學(xué)習(xí)率和學(xué)習(xí)率衰減策略是相關(guān)的,但不宜設(shè)置的過大過小,0.01和0.1應(yīng)該是比較常用的。學(xué)習(xí)率衰減策略我一般使用multistep方式,step_size的設(shè)置要看視你的的max_iter而定。數(shù)據(jù)與處理之
zero-center。第一次見到這個(gè)詞是在看cs231n的視頻上。主要有2個(gè)步驟,第一個(gè)是減均值,第二個(gè)是除以方差。這樣做下來最后的輸入是滿足均值為0方差為1的概率分布的,一般減均值是最常用的,后面的除以方差用不用可能需要自己動(dòng)手試驗(yàn)一下看看效果。殘差結(jié)構(gòu)和密集連接。
resnet的殘差結(jié)構(gòu)和dense net密集連接結(jié)構(gòu),做工程的時(shí)候考慮到速度近乎不可能說完全使用完整版本的resnet和densenet的完整結(jié)構(gòu),但我們可以自己動(dòng)手將我們網(wǎng)絡(luò)的某些模塊替換為殘差結(jié)構(gòu)和密集連接,替換的時(shí)候可以適當(dāng)降低這倆結(jié)構(gòu)的復(fù)雜度,類似于通道數(shù)減半,密集連接中只保留一半連接等等。這里需要做一些消融實(shí)驗(yàn)來驗(yàn)證改進(jìn)后的精度。關(guān)于loss。優(yōu)秀的
loss一般是對(duì)模型的泛化性能有所改善的,但在用loss的時(shí)候往往并不是直接替換loss那么簡(jiǎn)單,需要仔細(xì)思考loss背后的數(shù)學(xué)原理,要用對(duì)地方才可有提升。例如,如何將Focal Loss用到Y(jié)OLOv3中提升map,大家可以看看這個(gè)帖子。https://www.zhihu.com/question/293369755。找到模型調(diào)參時(shí)的可靠評(píng)價(jià)指標(biāo)。在調(diào)整參數(shù)訓(xùn)練模型時(shí)一定要找到正確的評(píng)價(jià)指標(biāo),沒調(diào)整一個(gè)參數(shù)就要記錄一下模型的評(píng)價(jià)指標(biāo)如準(zhǔn)確率,
map值,miou值等。并且在調(diào)參時(shí)建議將調(diào)整的參數(shù)和在測(cè)試集上的精度組合成一個(gè)字符串給模型重命令,方便之后快速review。使用了帶
backbone的網(wǎng)絡(luò),如訓(xùn)練VGG16-SSD建議選擇finetune的方式,從頭訓(xùn)練不僅費(fèi)時(shí)費(fèi)力,甚至難以收斂。在做分割實(shí)驗(yàn)的時(shí)候我發(fā)現(xiàn)用upsamling 加1*1卷積代替反卷積做上采樣得到的結(jié)果更平滑,并且miou差距不大,所以我認(rèn)為這兩者都是都可以使用的。
一些Anchor-based目標(biāo)檢測(cè)算法為了提高精度,都是瘋狂給框,ap值確實(shí)上去了,但也導(dǎo)致了fp會(huì)很多,并且這部分fp沒有回歸,在nms階段也濾不掉。相比于ap提升而言,工程上減少fp更加重要。Gaussian yolov3的fp相比于yolov3會(huì)減少40%,Anchor-free算法暫時(shí)接觸得不多,就不太了解了。
做比賽
特征提取。VGG16,VGG19,ResNet50,Xception是非常好用的幾個(gè)特征提取模型。建議使用訓(xùn)練好的經(jīng)典模型對(duì)數(shù)據(jù)集提取特征向量存儲(chǔ)到本地,更方便使用,同時(shí)可以大幅度降低顯存消耗。
ensemble:
將不同的經(jīng)典網(wǎng)絡(luò)提取出的特征向量,假設(shè)
VGG16提取出的特征向量維度是[N,c1],ResNet50提取的特征向量維度是[N,c2],Xception提取的特征向量維度是[N, c3],那么我們可以使用三個(gè)系數(shù)a、b、c將其組合為形狀為[N, a*c1+b*c2+c*c3],其中a、b、c三個(gè)參數(shù)的取值代表我們使用哪個(gè)模型的特征多一些,如果是分類回歸比賽,我們?cè)诤竺娼犹卣魈幚砭W(wǎng)絡(luò)就可以了。可以取不同的a、b、c得到不同的特征,然后對(duì)結(jié)果做voting,soft-voting等多種處理,一般結(jié)果不會(huì)太差啦。可以使用不同的初始化方式訓(xùn)練出模型,然后做ensemble。
可以使用用不同超參數(shù)(如學(xué)習(xí)率,
batch_size,優(yōu)化器)訓(xùn)練出不同模型,然后做ensemble。
因?yàn)槲揖妥隽艘稽c(diǎn)點(diǎn)入門級(jí)比賽,上面介紹的方法取得了還不錯(cuò)的結(jié)果,所以我就在這里獻(xiàn)丑啦,方法確實(shí)挺無腦的,大家笑一笑就好啦。繼續(xù)想了下,我好像除了這些有接觸或者使用到,暫時(shí)沒有什么其它的了,如果想起其他的了,之后補(bǔ)充下。
作者:Captain Jack
https://www.zhihu.com/question/25097993/answer/127472322
我和@楊軍類似, 也是半路出家. 現(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)鍵.
看了楊軍的回答. 對(duì)于這個(gè)回答, 下面的評(píng)論里面@紀(jì)秋佳說的很對(duì). 這個(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)容, 對(duì)不起, 你還是不知道怎么實(shí)際訓(xùn)練一個(gè)網(wǎng)絡(luò), 尤其是復(fù)雜任務(wù)下的網(wǎng)絡(luò)(因?yàn)楹?jiǎn)單任務(wù)根本不需要, 直接上來效果就會(huì)很好, 除非你要刷簡(jiǎn)單任務(wù)的排行榜).
首先說下可視化:
我個(gè)人的理解, 對(duì)于可視化, 更多的還是幫助人類以自己熟悉的方式來觀察網(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è)邊界檢測(cè)的功能出來. 第二, 不同任務(wù)下會(huì)有不同的weights(雖然底層的特征有很大的通用性), 你覺得你憑什么來指導(dǎo)一個(gè)看圖片比你快得多的機(jī)器?
再說現(xiàn)在是否需要強(qiáng)求smooth. 現(xiàn)在的趨勢(shì)是鼓勵(lì)使用小filter, 3x3大小, 多加層次(這樣, 非線性更好點(diǎn)). 換句話說, 3x3的圖片, 總共才9個(gè)像素, 你怎么判斷smooth與否呢? 當(dāng)然如果你使用大的filter, 一般5x5往上, 運(yùn)氣不差的話, 你是可以看到smooth的結(jié)果的.
咱們?cè)僬f另外一個(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ò), 連測(cè)試集驗(yàn)證集這些都可以不用.
為什么?
+ 你要驗(yàn)證自己的訓(xùn)練腳本的流程對(duì)不對(duì). 這一步小數(shù)據(jù)量, 生成速度快, 但是所有的腳本都是和未來大規(guī)模訓(xùn)練一致的(除了少跑點(diǎn)循環(huán))
+ 如果小數(shù)據(jù)量下, 你這么粗暴的大網(wǎng)絡(luò)奔著過擬合去都沒效果. 那么, 你要開始反思自己了, 模型的輸入輸出是不是有問題? 要不要檢查自己的代碼(永遠(yuǎn)不要懷疑工具庫, 除非你動(dòng)過代碼)? 模型解決的問題定義是不是有問題? 你對(duì)應(yīng)用場(chǎ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ù)測(cè)一個(gè)label是10000的值, 模型輸出0, 你算算這loss多大, 這還是單變量的情況下. 一般結(jié)果都是nan. 所以不僅僅輸入要做normalization, 輸出也要這么弄.
+ 多任務(wù)情況下, 各loss想法限制在一個(gè)量級(jí)上, 或者最終限制在一個(gè)量級(jí)上, 初期可以著重一個(gè)任務(wù)的loss
3. 觀察loss勝于觀察準(zhǔn)確率
準(zhǔn)確率雖然是評(píng)測(cè)指標(biāo), 但是訓(xùn)練過程中還是要注意loss的. 你會(huì)發(fā)現(xiàn)有些情況下, 準(zhǔn)確率是突變的, 原來一直是0, 可能保持上千迭代, 然后突然變1. 要是因?yàn)檫@個(gè)你提前中斷訓(xùn)練了, 只有老天替你惋惜了. 而loss是不會(huì)有這么詭異的情況發(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í)類別之間的界限. 你會(huì)發(fā)現(xiàn), 網(wǎng)絡(luò)就是慢慢的從類別模糊到類別清晰的. 怎么發(fā)現(xiàn)? 看Softmax輸出的概率的分布. 如果是二分類, 你會(huì)發(fā)現(xiàn), 剛開始的網(wǎng)絡(luò)預(yù)測(cè)都是在0.5上下, 很模糊. 隨著學(xué)習(xí)過程, 網(wǎng)絡(luò)預(yù)測(cè)會(huì)慢慢的移動(dòng)到0,1這種極值附近. 所以, 如果你的網(wǎng)絡(luò)預(yù)測(cè)分布靠中間, 再學(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í)太慢的原因, 試過就會(huì)知道很明顯)
? + 需要進(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)然還會(huì)慢慢再降LR, 雖然這很蛋疼.
? + LR在可以工作的最大值下往小收一收, 免得ReLU把神經(jīng)元弄死了. 當(dāng)然, 我是個(gè)心急的人, 總愛設(shè)個(gè)大點(diǎn)的.
6 對(duì)比訓(xùn)練集和驗(yàn)證集的loss
? ?判斷過擬合, 訓(xùn)練是否足夠, 是否需要early stop的依據(jù), 這都是中規(guī)中矩的原則, 不多說了.
7 清楚receptive field的大小
? ?CV的任務(wù), context window是很重要的. 所以你對(duì)自己模型的receptive field的大小要心中有數(shù). 這個(gè)對(duì)效果的影響還是很顯著的. 特別是用FCN, 大目標(biāo)需要很大的receptive field. 不像有fully connection的網(wǎng)絡(luò), 好歹有個(gè)fc兜底, 全局信息都有.
簡(jiǎn)短的注意事項(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算子的邊界檢測(cè).
Dropout, Dropout, Dropout(不僅僅可以防止過擬合, 其實(shí)這相當(dāng)于做人力成本最低的Ensemble, 當(dāng)然, 訓(xùn)練起來會(huì)比沒有Dropout的要慢一點(diǎn), 同時(shí)網(wǎng)絡(luò)參數(shù)你最好相應(yīng)加一點(diǎn), 對(duì), 這會(huì)再慢一點(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è)人選擇. 一般對(duì)網(wǎng)絡(luò)不是決定性的. 反正我無腦用sgd + momentum.
batch normalization我一直沒用, 雖然我知道這個(gè)很好, 我不用僅僅是因?yàn)槲覒? 所以要鼓勵(lì)使用batch normalization.
不要完全相信論文里面的東西. 結(jié)構(gòu)什么的覺得可能有效果, 可以拿去試試.
你有95%概率不會(huì)使用超過40層的模型.
shortcut的聯(lián)接是有作用的.
暴力調(diào)參最可取, 畢竟, 自己的生命最重要. 你調(diào)完這個(gè)模型說不定過兩天這模型就扔掉了.
機(jī)器, 機(jī)器, 機(jī)器.
Google的inception論文, 結(jié)構(gòu)要好好看看.
一些傳統(tǒng)的方法, 要稍微了解了解. 我自己的程序就用過1x14的手寫filter, 寫過之后你看看inception里面的1x7, 7x1 就會(huì)會(huì)心一笑..
作者:隨機(jī)漫步的傻瓜
https://www.zhihu.com/question/25097993/answer/951804080
1、首先,調(diào)參的時(shí)候你要整理好自己的心情。別誤會(huì),我的意思是讓你狂躁一點(diǎn)。因?yàn)檫@玩意有時(shí)候的確是個(gè)玄學(xué),經(jīng)常調(diào)半天毛用都沒有,然后只是換一個(gè)初始值,分分鐘給你干到95%以上。是的,你其實(shí)啥也沒做,但大部分時(shí)候這玩意兒跟人很像,“出身”很重要。
2、如上所述,好的初始點(diǎn) + 合適的LR + 好的優(yōu)化方法基本可以解決大部分問題。如果還不行可以考慮換個(gè)loss。其它的花樣太多往往很虛。
3、一定要注意實(shí)時(shí)保存自己的結(jié)果,熟悉使用各種seed,養(yǎng)成好的習(xí)慣。有時(shí)候你覺得一個(gè)不太好的結(jié)果其實(shí)可能是你能調(diào)到的最好的結(jié)果了,你也不想因?yàn)闆]保存的緣故然后回頭發(fā)現(xiàn)再也找不著了的對(duì)吧?所謂今天你看我不起,明天我讓你高攀不起。別問我怎么知道的。
4、新手剛上來調(diào)參的時(shí)候沒什么經(jīng)驗(yàn),所以一定要低調(diào)!啥叫低調(diào)?低調(diào)就是一開始調(diào)的時(shí)候千萬別考慮太遠(yuǎn),在能承受的范圍內(nèi),盡可能先把濾波器搞得多多的,把數(shù)據(jù)搞得少少的,直奔過擬合去!所謂小步試錯(cuò),快速迭代,互聯(lián)網(wǎng)公司都是這么干的。雖然過擬合也不好搞,但總歸是有不少套路的,比起過擬合,欠擬合的問題遠(yuǎn)遠(yuǎn)可怕的多。畢竟結(jié)果都訓(xùn)練不出來還扯什么遠(yuǎn)方?
5、有很多無腦的配置確實(shí)可以嘗試,比如3x3的卷積核,relu激活函數(shù),加shuffle,加數(shù)據(jù)增強(qiáng),加BN,加Dropout等。dropout可以從0. 5往上加,optimizer可以用Adam或者SGD+0.8/0.9的Momentum。大部分時(shí)候這些經(jīng)驗(yàn)比你自己辛苦挑出來的奇技淫巧要有價(jià)值的多,但不是絕對(duì)的。
6、一定要記得實(shí)時(shí)打印一些結(jié)果,比如訓(xùn)練loss、訓(xùn)練accuracy、驗(yàn)證accuracy,能畫出圖的就畫個(gè)圖。一邊看圖一邊可以發(fā)現(xiàn)不少問題,尤其是關(guān)于學(xué)習(xí)率和過擬合的。另外,前面某位大神說的很對(duì),看圖的時(shí)候loss要比accuracy有用的多,因?yàn)閍ccuracy就像女人一樣經(jīng)常善變,可能下一個(gè)step就差很多,而loss畢竟有個(gè)相對(duì)穩(wěn)定下降的大趨勢(shì)。
7、在你夜深人靜的時(shí)候,或者不忙的時(shí)候,別忘了多想想原理。多研究研究別人的優(yōu)秀結(jié)果,尤其是那些成熟的架構(gòu)、和一些state-of-the-art的結(jié)果,自己的數(shù)據(jù)集也可以多翻翻,閑來無事搞點(diǎn)可視化什么的,既鍛煉了技術(shù)又能幫助發(fā)現(xiàn)。除了調(diào)參,應(yīng)用的時(shí)候不妨直接把別人的某些層拿過來自己用,能節(jié)省不少時(shí)間。
8、最后,什么都不是絕對(duì)的。很多原理性的文章,你看看就好。什么東西都是有條件的,離開了這個(gè)條件就啥也不是,而恰巧有時(shí)候這個(gè)條件可能僅僅就是運(yùn)氣而已。所以萬一復(fù)現(xiàn)不出來,別較真,該丟則丟。調(diào)參雖苦,也一定不要忘了同時(shí)調(diào)整自己的心態(tài):多行善事、及時(shí)記錄、少吹牛逼、多逛知乎。
作者:京東白條
https://www.zhihu.com/question/25097993/answer/651617880
相信很多剛開始接觸深度學(xué)習(xí)朋友,會(huì)感覺深度學(xué)習(xí)調(diào)參就像玄學(xué)一般,有時(shí)候參數(shù)調(diào)的好,模型會(huì)快速收斂,參數(shù)沒調(diào)好,可能迭代幾次loss值就直接變成Nan了。
記得剛開始研究深度學(xué)習(xí)時(shí),做過兩個(gè)小例子。一個(gè)是用tensorflow構(gòu)建了一個(gè)十分簡(jiǎn)單的只有一個(gè)輸入層和一個(gè)softmax輸出層的Mnist手寫識(shí)別網(wǎng)絡(luò),第一次我對(duì)權(quán)重矩陣W和偏置b采用的是正態(tài)分布初始化,一共迭代了20個(gè)epoch,當(dāng)?shù)甑谝粋€(gè)epoch時(shí),預(yù)測(cè)的準(zhǔn)確度只有10%左右(和隨機(jī)猜一樣,Mnist是一個(gè)十分類問題),當(dāng)?shù)甓畟€(gè)epoch,精度也僅僅達(dá)到了60%的樣子。
然后我僅僅是將權(quán)重矩陣W初始化方法改成了全為0的初始化,其他的參數(shù)均保持不變,結(jié)果在訓(xùn)練完第一個(gè)epoch后預(yù)測(cè)精度就達(dá)到了85%以上,最終20個(gè)epoch后精度達(dá)到92%。另一個(gè)例子是回歸問題的預(yù)測(cè),當(dāng)時(shí)采用的SGD優(yōu)化器,一開始學(xué)習(xí)率設(shè)定的0.1,模型可以正常訓(xùn)練,只是訓(xùn)練速度有些慢,我試著將學(xué)習(xí)率調(diào)整到0.3,希望可以加速訓(xùn)練速度,結(jié)果沒迭代幾輪loss就變成Nan了。于是從那時(shí)起我就深刻的感受到參數(shù)調(diào)節(jié)在深度學(xué)習(xí)模型訓(xùn)練中的重要意義。
其實(shí)上述問題產(chǎn)生的原因也很好理解,對(duì)于參數(shù)初始化,因?yàn)槲覀儗W(xué)習(xí)的本來就是權(quán)重W與偏置b,如果初始化足夠好,直接就初始化到最優(yōu)解,那都不用進(jìn)行訓(xùn)練了。良好的初始化,可以讓參數(shù)更接近最優(yōu)解,這可以大大提高收斂速度,也可以防止落入局部極小。對(duì)于學(xué)習(xí)率,學(xué)習(xí)率如果取太大,會(huì)使模型訓(xùn)練非常震蕩,可以想象我們最小化一個(gè)二次拋物線,選取一個(gè)很大的學(xué)習(xí)率,那么迭代點(diǎn)會(huì)一直在拋物線的兩邊震蕩,收斂不到最小值,甚至還有螺旋上升迭代點(diǎn)的可能。
下面對(duì)深度學(xué)習(xí)調(diào)參技巧談些心得,雖說不能讓你通過以下閱讀成為一個(gè)調(diào)參高手,但最起碼可以提供一些調(diào)參的思路。
1. 激活函數(shù)選擇:
常用的激活函數(shù)有relu、leaky-relu、sigmoid、tanh等。對(duì)于輸出層,多分類任務(wù)選用softmax輸出,二分類任務(wù)選用sigmoid輸出,回歸任務(wù)選用線性輸出。而對(duì)于中間隱層,則優(yōu)先選擇relu激活函數(shù)(relu激活函數(shù)可以有效的解決sigmoid和tanh出現(xiàn)的梯度彌散問題,多次實(shí)驗(yàn)表明它會(huì)比其他激活函數(shù)以更快的速度收斂)。另外,構(gòu)建序列神經(jīng)網(wǎng)絡(luò)(RNN)時(shí)要優(yōu)先選用tanh激活函數(shù)。
2、學(xué)習(xí)率設(shè)定:
一般學(xué)習(xí)率從0.1或0.01開始嘗試。學(xué)習(xí)率設(shè)置太大會(huì)導(dǎo)致訓(xùn)練十分不穩(wěn)定,甚至出現(xiàn)Nan,設(shè)置太小會(huì)導(dǎo)致?lián)p失下降太慢。學(xué)習(xí)率一般要隨著訓(xùn)練進(jìn)行衰減。衰減系數(shù)設(shè)0.1,0.3,0.5均可,衰減時(shí)機(jī),可以是驗(yàn)證集準(zhǔn)確率不再上升時(shí),或固定訓(xùn)練多少個(gè)周期以后自動(dòng)進(jìn)行衰減。
3、防止過擬合:
一般常用的防止過擬合方法有使用L1正則項(xiàng)、L2正則項(xiàng)、dropout、提前終止、數(shù)據(jù)集擴(kuò)充等。如果模型在訓(xùn)練集上表現(xiàn)比較好但在測(cè)試集上表現(xiàn)欠佳可以選擇增大L1或L2正則的懲罰力度(L2正則經(jīng)驗(yàn)上首選1.0,超過10很少見),或增大dropout的隨機(jī)失活概率(經(jīng)驗(yàn)首選0.5);或者當(dāng)隨著訓(xùn)練的持續(xù)在測(cè)試集上不增反降時(shí),使用提前終止訓(xùn)練的方法。當(dāng)然最有效的還是增大訓(xùn)練集的規(guī)模,實(shí)在難以獲得新數(shù)據(jù)也可以使用數(shù)據(jù)集增強(qiáng)的方法,比如CV任務(wù)可以對(duì)數(shù)據(jù)集進(jìn)行裁剪、翻轉(zhuǎn)、平移等方法進(jìn)行數(shù)據(jù)集增強(qiáng),這種方法往往都會(huì)提高最后模型的測(cè)試精度。
4、優(yōu)化器選擇:
如果數(shù)據(jù)是稀疏的,就用自適應(yīng)方法,即 Adagrad, Adadelta, RMSprop, Adam。整體來講,Adam 是最好的選擇。SGD 雖然能達(dá)到極小值,但是比其它算法用的時(shí)間長,而且可能會(huì)被困在鞍點(diǎn)。如果需要更快的收斂,或者是訓(xùn)練更深更復(fù)雜的神經(jīng)網(wǎng)絡(luò),需要用一種自適應(yīng)的算法。
5、殘差塊與BN層:
如果你希望訓(xùn)練一個(gè)更深更復(fù)雜的網(wǎng)絡(luò),那么殘差塊絕對(duì)是一個(gè)重要的組件,它可以讓你的網(wǎng)絡(luò)訓(xùn)練的更深。
BN層具有加速訓(xùn)練速度,有效防止梯度消失與梯度爆炸,具有防止過擬合的效果,所以構(gòu)建網(wǎng)絡(luò)時(shí)最好要加上這個(gè)組件。
6.自動(dòng)調(diào)參方法:
(1)Grid Search:網(wǎng)格搜索,在所有候選的參數(shù)選擇中,通過循環(huán)遍歷,嘗試每一種可能性,表現(xiàn)最好的參數(shù)就是最終的結(jié)果。其原理就像是在數(shù)組里找最大值。缺點(diǎn)是太費(fèi)時(shí)間了,特別像神經(jīng)網(wǎng)絡(luò),一般嘗試不了太多的參數(shù)組合。
(2)Random Search:經(jīng)驗(yàn)上,Random Search比Gird Search更有效。實(shí)際操作的時(shí)候,一般也是先用Gird Search的方法,得到所有候選參數(shù),然后每次從中隨機(jī)選擇進(jìn)行訓(xùn)練。另外Random Search往往會(huì)和由粗到細(xì)的調(diào)參策略結(jié)合使用,即在效果比較好的參數(shù)附近進(jìn)行更加精細(xì)的搜索。
(3)Bayesian Optimization:貝葉斯優(yōu)化,考慮到了不同參數(shù)對(duì)應(yīng)的 ? ?實(shí)驗(yàn)結(jié)果值,因此更節(jié)省時(shí)間,貝葉斯調(diào)參比Grid Search迭代次數(shù)少, ?速度快;而且其針對(duì)非凸問題依然穩(wěn)健。
7.參數(shù)隨機(jī)初始化與數(shù)據(jù)預(yù)處理:
參數(shù)初始化很重要,它決定了模型的訓(xùn)練速度與是否可以躲開局部極小。relu激活函數(shù)初始化推薦使用He normal,tanh初始化推薦使用Glorot normal,其中Glorot normal也稱作Xavier normal初始化;數(shù)據(jù)預(yù)處理方法一般也就采用數(shù)據(jù)歸一化即可。
推薦閱讀
(點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)
機(jī)器學(xué)習(xí)中算法與模型的區(qū)別
學(xué)深度學(xué)習(xí)是不是需要先學(xué)機(jī)器學(xué)習(xí)? 臥槽,我學(xué)會(huì)了用Python預(yù)測(cè)股票價(jià)格
老鐵,三連支持一下,好嗎?↓↓↓
