對(duì)于深度學(xué)習(xí)本人也是半路出家. 現(xiàn)在的工作內(nèi)容主要就是使用CNN做CV任務(wù). 干調(diào)參這種活也有兩年時(shí)間了. 我的回答可能更多的還是側(cè)重工業(yè)應(yīng)用, 技術(shù)上只限制在CNN這塊.
先說(shuō)下我的觀點(diǎn), 調(diào)參就是trial-and-error. 沒(méi)有其他捷徑可以走. 唯一的區(qū)別是有些人盲目的嘗試, 有些人思考后再?lài)L試.快速?lài)L試, 快速糾錯(cuò)這是調(diào)參的關(guān)鍵.
◆ 首先說(shuō)下可視化
我個(gè)人的理解, 對(duì)于可視化, 更多的還是幫助人類(lèi)以自己熟悉的方式來(lái)觀察網(wǎng)絡(luò). 因?yàn)? 你是不可能邊觀察網(wǎng)絡(luò), 還邊調(diào)參的. 你只是訓(xùn)練完成后(或者準(zhǔn)確率到達(dá)一個(gè)階段后), 才能可視化. 在這之前, 網(wǎng)絡(luò)沒(méi)有學(xué)習(xí)到良好的參數(shù), 你可視化了也沒(méi)意義, 網(wǎng)絡(luò)達(dá)到不錯(cuò)的準(zhǔn)確率了, 你看看其實(shí)也就聽(tīng)個(gè)響. 同樣, 你的網(wǎng)絡(luò)訓(xùn)練的一塌糊涂, 你可視化也沒(méi)什么意義, 唯一能夠看到的就是中間結(jié)果亂七八糟, 或者全黑全白, 這時(shí)候你直接看最后準(zhǔn)確率就可以知道這網(wǎng)絡(luò)沒(méi)救了.
◆ 關(guān)于權(quán)重的可視化[Visualize Layer Weights](現(xiàn)在是否強(qiáng)求smooth其實(shí)意義不大, 這個(gè)后面說(shuō).)
同樣, 你看到一個(gè)不滿(mǎn)足平滑結(jié)果的圖像, 你知道, 這網(wǎng)絡(luò)訓(xùn)練的不好, 但是為什么呢? 是數(shù)據(jù)不好? 沒(méi)有預(yù)處理? 網(wǎng)絡(luò)結(jié)構(gòu)問(wèn)題? Learning Rate太大或者太小? 或者就是差了一個(gè)LRN層(之前我就遇到, 加個(gè)LRN就能出smooth的weights, 當(dāng)然這其實(shí)和預(yù)處理有關(guān))?
Smooth是需要看一下的, 心里有個(gè)數(shù). 但是具體調(diào)參怎么調(diào)是沒(méi)轍的. 第一, 你不可能告訴網(wǎng)絡(luò), 這層你得學(xué)個(gè)邊界檢測(cè)的功能出來(lái). 第二, 不同任務(wù)下會(huì)有不同的weights(雖然底層的特征有很大的通用性), 你覺(jué)得你憑什么來(lái)指導(dǎo)一個(gè)看圖片比你快得多的機(jī)器?
再說(shuō)現(xiàn)在是否需要強(qiáng)求smooth. 現(xiàn)在的趨勢(shì)是鼓勵(lì)使用小filter, 3x3大小, 多加層次(這樣, 非線性更好點(diǎn)). 換句話(huà)說(shuō), 3x3的圖片, 總共才9個(gè)像素, 你怎么判斷smooth與否呢? 當(dāng)然如果你使用大的filter, 一般5x5往上, 運(yùn)氣不差的話(huà), 你是可以看到smooth的結(jié)果的.
咱們?cè)僬f(shuō)另外一個(gè)極端, 一個(gè)網(wǎng)絡(luò),運(yùn)行的完美(滿(mǎn)足應(yīng)用要求就算完美), 打開(kāi)一看, 這weights不smooth啊. 你告訴我, 你打算怎么辦? 沒(méi)錯(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í)候心里有感覺(jué)(只是有感覺(jué)而已), 網(wǎng)絡(luò)出了問(wèn)題, 或者在某些情況下不滿(mǎn)意, 有更好的直覺(jué)去調(diào)整.(沒(méi)錯(cuò), 只是直覺(jué), 雖然有些情況下的調(diào)整從網(wǎng)絡(luò)原理來(lái)看邏輯上應(yīng)該可以工作, 但是人家就是不工作, 你能咬機(jī)器去么?)
◆ 那么怎樣訓(xùn)練一個(gè)不錯(cuò)的網(wǎng)絡(luò)呢?
這是一個(gè)很好的鏈接, 說(shuō)明了如何從零開(kāi)始不斷的trial-and-error(其實(shí)這里面沒(méi)遇到什么error):Using convolutional neural nets to detect facial keypoints tutorial
(鏈接網(wǎng)址:http://suo.im/533arJ)
對(duì)于調(diào)參我自己的經(jīng)驗(yàn),有下面這些:
基本原則:快速試錯(cuò)
一些大的注意事項(xiàng):
★ 1. 剛開(kāi)始,先上小規(guī)模數(shù)據(jù),模型往大了放, 只要不爆顯存, 能用256個(gè)filter你就別用128個(gè). 直接奔著過(guò)擬合去. 沒(méi)錯(cuò), 就是訓(xùn)練過(guò)擬合網(wǎng)絡(luò), 連測(cè)試集驗(yàn)證集這些都可以不用.
為什么?
你要驗(yàn)證自己的訓(xùn)練腳本的流程對(duì)不對(duì). 這一步小數(shù)據(jù)量, 生成速度快, 但是所有的腳本都是和未來(lái)大規(guī)模訓(xùn)練一致的(除了少跑點(diǎn)循環(huán))
如果小數(shù)據(jù)量下, 你這么粗暴的大網(wǎng)絡(luò)奔著過(guò)擬合去都沒(méi)效果. 那么, 你要開(kāi)始反思自己了, 模型的輸入輸出是不是有問(wèn)題? 要不要檢查自己的代碼(永遠(yuǎn)不要懷疑工具庫(kù), 除非你動(dòng)過(guò)代碼)? 模型解決的問(wèn)題定義是不是有問(wèn)題? 你對(duì)應(yīng)用場(chǎng)景的理解是不是有錯(cuò)? 不要懷疑NN的能力, 不要懷疑NN的能力, 不要懷疑NN的能力. 就我們調(diào)參狗能遇到的問(wèn)題, NN沒(méi)法擬合的, 這概率是有多小?
你可以不這么做, 但是等你數(shù)據(jù)準(zhǔn)備了兩天, 結(jié)果發(fā)現(xiàn)有問(wèn)題要重新生成的時(shí)候, 你這周時(shí)間就醬油了.
★ 2. Loss設(shè)計(jì)要合理.
一般來(lái)說(shuō)分類(lèi)就是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)練過(guò)程中還是要注意loss的. 你會(huì)發(fā)現(xiàn)有些情況下, 準(zhǔn)確率是突變的, 原來(lái)一直是0, 可能保持上千迭代, 然后突然變1. 要是因?yàn)檫@個(gè)你提前中斷訓(xùn)練了, 只有老天替你惋惜了. 而loss是不會(huì)有這么詭異的情況發(fā)生的, 畢竟優(yōu)化目標(biāo)是loss.
給NN一點(diǎn)時(shí)間, 要根據(jù)任務(wù)留給NN的學(xué)習(xí)一定空間. 不能說(shuō)前面一段時(shí)間沒(méi)起色就不管了. 有些情況下就是前面一段時(shí)間看不出起色, 然后開(kāi)始穩(wěn)定學(xué)習(xí).
★ 4. 確認(rèn)分類(lèi)網(wǎng)絡(luò)學(xué)習(xí)充分
分類(lèi)網(wǎng)絡(luò)就是學(xué)習(xí)類(lèi)別之間的界限. 你會(huì)發(fā)現(xiàn), 網(wǎng)絡(luò)就是慢慢的從類(lèi)別模糊到類(lèi)別清晰的. 怎么發(fā)現(xiàn)? 看Softmax輸出的概率的分布. 如果是二分類(lèi), 你會(huì)發(fā)現(xiàn), 剛開(kāi)始的網(wǎng)絡(luò)預(yù)測(cè)都是在0.5上下, 很模糊. 隨著學(xué)習(xí)過(guò)程, 網(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沒(méi)反映(但是, LR需要降低的情況也是這樣, 這里可視化網(wǎng)絡(luò)中間結(jié)果, 不是weights, 有效果, 倆者可視化結(jié)果是不一樣的, 太小的話(huà)中間結(jié)果有點(diǎn)水波紋或者噪點(diǎn)的樣子, 因?yàn)閒ilter學(xué)習(xí)太慢的原因, 試過(guò)就會(huì)知道很明顯)
需要進(jìn)一步降低了: loss在當(dāng)前LR下一路降了下來(lái), 但是半天不再降了.
如果有個(gè)復(fù)雜點(diǎn)的任務(wù), 剛開(kāi)始, 是需要人肉盯著調(diào)LR的. 后面熟悉這個(gè)任務(wù)網(wǎng)絡(luò)學(xué)習(xí)的特性后, 可以扔一邊跑去了.
如果上面的Loss設(shè)計(jì)那塊你沒(méi)法合理, 初始情況下容易爆, 先上一個(gè)小LR保證不爆, 等loss降下來(lái)了, 再慢慢升LR, 之后當(dāng)然還會(huì)慢慢再降LR, 雖然這很蛋疼.
LR在可以工作的最大值下往小收一收, 免得ReLU把神經(jīng)元弄死了. 當(dāng)然, 我是個(gè)心急的人, 總愛(ài)設(shè)個(gè)大點(diǎn)的.
★ 6. 對(duì)比訓(xùn)練集和驗(yàn)證集的loss
判斷過(guò)擬合, 訓(xùn)練是否足夠, 是否需要early stop的依據(jù), 這都是中規(guī)中矩的原則, 不多說(shuō)了.
★ 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):
1、預(yù)處理: -mean/std zero-center就夠了, PCA, 白化什么的都用不上. 我個(gè)人觀點(diǎn), 反正CNN能學(xué)習(xí)encoder, PCA用不用其實(shí)關(guān)系不大, 大不了網(wǎng)絡(luò)里面自己學(xué)習(xí)出來(lái)一個(gè).
2、shuffle, shuffle, shuffle.
3、網(wǎng)絡(luò)原理的理解最重要, CNN的conv這塊, 你得明白sobel算子的邊界檢測(cè).
4、Dropout, Dropout, Dropout(不僅僅可以防止過(guò)擬合, 其實(shí)這相當(dāng)于做人力成本最低的Ensemble, 當(dāng)然, 訓(xùn)練起來(lái)會(huì)比沒(méi)有Dropout的要慢一點(diǎn), 同時(shí)網(wǎng)絡(luò)參數(shù)你最好相應(yīng)加一點(diǎn), 對(duì), 這會(huì)再慢一點(diǎn)).
5、CNN更加適合訓(xùn)練回答是否的問(wèn)題, 如果任務(wù)比較復(fù)雜, 考慮先用分類(lèi)任務(wù)訓(xùn)練一個(gè)模型再finetune.
6、無(wú)腦用ReLU(CV領(lǐng)域).
7、無(wú)腦用3x3.
8、無(wú)腦用xavier.
9、LRN一類(lèi)的, 其實(shí)可以不用. 不行可以再拿來(lái)試試看.
10、filter數(shù)量2^n.
11、多尺度的圖片輸入(或者網(wǎng)絡(luò)內(nèi)部利用多尺度下的結(jié)果)有很好的提升效果.
12、第一層的filter, 數(shù)量不要太少. 否則根本學(xué)不出來(lái)(底層特征很重要).
13、sgd adam 這些選擇上, 看你個(gè)人選擇. 一般對(duì)網(wǎng)絡(luò)不是決定性的. 反正我無(wú)腦用sgd + momentum.
14、batch normalization我一直沒(méi)用, 雖然我知道這個(gè)很好, 我不用僅僅是因?yàn)槲覒? 所以要鼓勵(lì)使用batch normalization.
15、不要完全相信論文里面的東西. 結(jié)構(gòu)什么的覺(jué)得可能有效果, 可以拿去試試.
16、你有95%概率不會(huì)使用超過(guò)40層的模型.
17、shortcut的聯(lián)接是有作用的.
18、暴力調(diào)參最可取, 畢竟, 自己的生命最重要. 你調(diào)完這個(gè)模型說(shuō)不定過(guò)兩天這模型就扔掉了.
19、機(jī)器, 機(jī)器, 機(jī)器.
20、Google的inception論文, 結(jié)構(gòu)要好好看看.
21、一些傳統(tǒng)的方法, 要稍微了解了解. 我自己的程序就用過(guò)1x14的手寫(xiě)filter, 寫(xiě)過(guò)之后你看看inception里面的1x7, 7x1 就會(huì)會(huì)心一笑...
-
可視化
+關(guān)注
關(guān)注
1文章
1353瀏覽量
22791 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5598瀏覽量
124396
發(fā)布評(píng)論請(qǐng)先 登錄
自制飛控板能用地面站軟件進(jìn)行刷固件或者調(diào)參嗎?
ADRC的使用方法和調(diào)參大致的方向
教你怎樣學(xué)會(huì)PID調(diào)參
PID調(diào)參的相關(guān)資料分享
針對(duì)PID調(diào)參進(jìn)行詳細(xì)的講解
NAZA_驅(qū)動(dòng)調(diào)參軟件及說(shuō)明書(shū)
關(guān)于如何從零開(kāi)始構(gòu)建深度學(xué)習(xí)項(xiàng)目的詳細(xì)教程
深度學(xué)習(xí)和機(jī)器學(xué)習(xí)深度的不同之處 淺談深度學(xué)習(xí)的訓(xùn)練和調(diào)參
模型調(diào)參:CANape與Simulink的強(qiáng)強(qiáng)聯(lián)手
NNI:自動(dòng)幫你做機(jī)器學(xué)習(xí)調(diào)參的神器
機(jī)器學(xué)習(xí)8大調(diào)參技巧
深度學(xué)習(xí)的調(diào)參經(jīng)驗(yàn)
評(píng)論