深度學(xué)習(xí)中訓(xùn)練參數(shù)的調(diào)節(jié)技巧
在這篇文章中:
二位迂、caffe訓(xùn)練時(shí)Loss變?yōu)閚an的原因
三坝橡、一些訓(xùn)練時(shí)候出現(xiàn)的問(wèn)題
2计寇、為什么Caffe中引入了這個(gè)inner_num锣杂,inner_num等于什么
5踱蠢、BatchNorm層是否支持in place運(yùn)算,為什么棋电?
四茎截、過(guò)擬合解決:dropout苇侵、batch Normalization
1、dropout——另類Bagging(類似隨機(jī)森林RF)
1榆浓、學(xué)習(xí)率
步長(zhǎng)的選擇:你走的距離長(zhǎng)短,越短當(dāng)然不會(huì)錯(cuò)過(guò)撕攒,但是耗時(shí)間陡鹃。步長(zhǎng)的選擇比較麻煩。步長(zhǎng)越小抖坪,越容易得到局部最優(yōu)化(到了比較大的山谷杉适,就出不去了),而大了會(huì)全局最優(yōu)
重要性:學(xué)習(xí)率>正則值>dropout
學(xué)習(xí)率:0.001柳击,0.01猿推,0.1,1捌肴,10 …….以10為階數(shù)嘗試
小數(shù)據(jù)集上合適的參數(shù)大數(shù)據(jù)集上一般不會(huì)差蹬叭,可以先減少訓(xùn)練類別。
一般來(lái)說(shuō)状知,前1000步秽五,很大,0.1饥悴;到了后面坦喘,迭代次數(shù)增高逆皮,下降0.01绰精,再多,然后再小一些碗旅。
2贷揽、權(quán)重
梯度消失的情況棠笑,就是當(dāng)數(shù)值接近于正向∞,求導(dǎo)之后就更小的禽绪,約等于0蓖救,偏導(dǎo)為0 梯度爆炸,數(shù)值無(wú)限大
對(duì)于梯度消失現(xiàn)象:激活函數(shù) Sigmoid會(huì)發(fā)生梯度消失的情況印屁,所以激活函數(shù)一般不用循捺,收斂不了了。Tanh(x)雄人,沒(méi)解決梯度消失的問(wèn)題从橘。 ReLu Max(0,x),比較好,代表Max門單元洋满,解決了梯度消失的問(wèn)題晶乔,而且起到了降維
權(quán)重初始化,可以隨機(jī)也可以一開始設(shè)置一定的圖形分布牺勾,用高斯初始化
3正罢、層數(shù)
越多,靈敏度越好驻民,收斂地更好翻具,激活函數(shù)也越多,曲線的性能也更好 但是回还,神經(jīng)元過(guò)擬合裆泳,并且計(jì)算量較大層數(shù)越多。在節(jié)點(diǎn)多的情況下一般會(huì)考慮:Drop-out
節(jié)點(diǎn)太多也不好柠硕,所以需要?jiǎng)h除一些無(wú)效的節(jié)點(diǎn) 但是去掉節(jié)點(diǎn)工禾,這里卻是隨機(jī)的,隨機(jī)去掉(30%-60%)的節(jié)點(diǎn) 注意:隨機(jī)的選擇蝗柔,去掉一些節(jié)點(diǎn)闻葵。但是drop-out也不一定是避免過(guò)擬合 很常見(jiàn)。一般不drop-out一定會(huì)過(guò)擬合癣丧,有drop-out概率低一些
4槽畔、過(guò)擬合
上面的drop-out就算一種。其他過(guò)擬合可能也會(huì)使用:BN,batch normalization(歸一化)
在caffe操作時(shí)候胁编,模型訓(xùn)練中如何解決過(guò)擬合現(xiàn)象厢钧?
看到驗(yàn)證集的數(shù)據(jù)趨于平穩(wěn),譬如第1000次之后嬉橙,驗(yàn)證集的loss平穩(wěn)了早直,那么就截取1000次,把學(xué)習(xí)率降低為原來(lái)的0.1憎夷,拿來(lái)第10000次結(jié)果莽鸿,修改文件,繼續(xù)訓(xùn)練拾给。
欠擬合:
表現(xiàn)形式:訓(xùn)練集,測(cè)試集準(zhǔn)確率都很低
解決辦法:增加網(wǎng)絡(luò)層數(shù)兔沃,增加節(jié)點(diǎn)數(shù)蒋得,減少dropout值,減少L2正則值等.
5乒疏、Loss設(shè)計(jì)與觀察
一般來(lái)說(shuō)分類就是Softmax, 回歸就是L2的loss. 但是要注意loss的錯(cuò)誤范圍(主要是回歸), 你預(yù)測(cè)一個(gè)label是10000的值, 模型輸出0, 你算算這loss多大, 這還是單變量的情況下. 一般結(jié)果都是nan. 所以不僅僅輸入要做normalization, 輸出也要额衙。
準(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. 對(duì)比訓(xùn)練集和驗(yàn)證集的loss。 判斷過(guò)擬合, 訓(xùn)練是否足夠, 是否需要early stop的依據(jù)
二、caffe訓(xùn)練時(shí)Loss變?yōu)閚an的原因
1窍侧、梯度爆炸
原因:梯度變得非常大县踢,使得學(xué)習(xí)過(guò)程難以繼續(xù)
現(xiàn)象:觀察log,注意每一輪迭代后的loss伟件。loss隨著每輪迭代越來(lái)越大硼啤,最終超過(guò)了浮點(diǎn)型表示的范圍,就變成了NaN斧账。 措施: 1. 減小solver.prototxt中的base_lr谴返,至少減小一個(gè)數(shù)量級(jí)。如果有多個(gè)loss layer咧织,需要找出哪個(gè)損失層導(dǎo)致了梯度爆炸嗓袱,并在train_val.prototxt中減小該層的loss_weight,而非是減小通用的base_lr习绢。 2. 設(shè)置clip gradient渠抹,用于限制過(guò)大的diff
2、不當(dāng)?shù)膿p失函數(shù)
原因:有時(shí)候損失層中l(wèi)oss的計(jì)算可能導(dǎo)致NaN的出現(xiàn)闪萄。比如逼肯,給InfogainLoss層(信息熵?fù)p失)輸入沒(méi)有歸一化的值,使用帶有bug的自定義損失層等等桃煎。
現(xiàn)象:觀測(cè)訓(xùn)練產(chǎn)生的log時(shí)一開始并不能看到異常篮幢,loss也在逐步的降低,但突然之間NaN就出現(xiàn)了为迈。
措施:看看你是否能重現(xiàn)這個(gè)錯(cuò)誤三椿,在loss layer中加入一些輸出以進(jìn)行調(diào)試。 示例:有一次我使用的loss歸一化了batch中l(wèi)abel錯(cuò)誤的次數(shù)葫辐。如果某個(gè)label從未在batch中出現(xiàn)過(guò)搜锰,loss就會(huì)變成NaN。在這種情況下耿战,可以用足夠大的batch來(lái)盡量避免這個(gè)錯(cuò)誤蛋叼。
3、不當(dāng)?shù)妮斎?/p>
原因:輸入中就含有NaN剂陡。
現(xiàn)象:每當(dāng)學(xué)習(xí)的過(guò)程中碰到這個(gè)錯(cuò)誤的輸入狈涮,就會(huì)變成NaN。觀察log的時(shí)候也許不能察覺(jué)任何異常鸭栖,loss逐步的降低歌馍,但突然間就變成NaN了。 措施:重整你的數(shù)據(jù)集晕鹊,確保訓(xùn)練集和驗(yàn)證集里面沒(méi)有損壞的圖片松却。調(diào)試中你可以使用一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)來(lái)讀取輸入層暴浦,有一個(gè)缺省的loss,并過(guò)一遍所有輸入晓锻,如果其中有錯(cuò)誤的輸入歌焦,這個(gè)缺省的層也會(huì)產(chǎn)生NaN。 案例:有一次公司需要訓(xùn)練一個(gè)模型砚哆,把標(biāo)注好的圖片放在了七牛上独撇,拉下來(lái)的時(shí)候發(fā)生了dns劫持,有一張圖片被換成了淘寶的購(gòu)物二維碼窟社,且這個(gè)二維碼格式與原圖的格式不符合券勺,因此成為了一張“損壞”圖片。每次訓(xùn)練遇到這個(gè)圖片的時(shí)候就會(huì)產(chǎn)生NaN灿里。 良好的習(xí)慣是关炼,你有一個(gè)檢測(cè)性的網(wǎng)絡(luò),每次訓(xùn)練目標(biāo)網(wǎng)絡(luò)之前把所有的樣本在這個(gè)檢測(cè)性的網(wǎng)絡(luò)里面過(guò)一遍匣吊,去掉非法值儒拂。
4、池化層中步長(zhǎng)比核的尺寸大
如下例所示色鸳,當(dāng)池化層中stride > kernel的時(shí)候會(huì)在y中產(chǎn)生NaN
layer{? ? ? name:"faulty_pooling"? ? ? type:"Pooling"? ? ? bottom:"x"? ? ? top:"y"? ? ? pooling_param{? ? ? pool: AVE? ? ? stride:5? ? ? kernel:3}}
http://stackoverflow.com/questions/33962226/common-causes-of-NaNs-during-training
.
三社痛、一些訓(xùn)練時(shí)候出現(xiàn)的問(wèn)題
1、為啥label需要從0開始命雀?
在使用SoftmaxLoss層作為損失函數(shù)層的單標(biāo)簽分類問(wèn)題中蒜哀,label要求從零開始,例如1000類的ImageNet分類任務(wù)吏砂,label的范圍是0~999撵儿。這個(gè)限制來(lái)自于Caffe的一個(gè)實(shí)現(xiàn)機(jī)制,label會(huì)直接作為數(shù)組的下標(biāo)使用狐血,具體代碼SoftmaxLoss.cpp中133行和139行的實(shí)現(xiàn)代碼淀歇。
132行第一層for循環(huán)中的outer_num等于batch size,對(duì)于人臉識(shí)別和圖像分類等單標(biāo)簽分類任務(wù)而言匈织,inner_num等于1浪默。如果label從1開始,會(huì)導(dǎo)致bottom_diff數(shù)組訪問(wèn)越界缀匕。 .
2纳决、為什么Caffe中引入了這個(gè)inner_num,inner_num等于什么
從FCN全卷積網(wǎng)絡(luò)的方向去思考弦追。FCN中l(wèi)abel標(biāo)簽長(zhǎng)度=圖片尺寸 caffe引入inner_num使得輸入image的size可以是任意大小岳链,innuer_num大小即為softmax層輸入的height*width .
3、在標(biāo)簽正確的前提下劲件,如果倒數(shù)第一個(gè)全連接層num_output > 實(shí)際的類別數(shù)掸哑,Caffe的訓(xùn)練是否會(huì)報(bào)錯(cuò)?
不會(huì)報(bào)錯(cuò)且無(wú)影響 .
4零远、BN中的use_global_status
圖2. ResNet部署階模型Proto文件片段
但是如果直接拿這個(gè)Proto用于訓(xùn)練(基于隨機(jī)初始化)苗分,則會(huì)導(dǎo)致模型不收斂,原因在于在Caffe的batch_norm_layer.cpp實(shí)現(xiàn)中牵辣,use_global_stats==true時(shí)會(huì)強(qiáng)制使用模型中存儲(chǔ)的BatchNorm層均值與方差參數(shù)摔癣,而非基于當(dāng)前batch內(nèi)計(jì)算均值和方差。
首先看use_global_stats變量是如何計(jì)算的:
圖3. use_global_stats計(jì)算
再看這個(gè)變量的作用:
圖4. use_global_stats為true時(shí)的行為
以下代碼在use_global_stats為false的時(shí)候通過(guò)moving average策略計(jì)算模型中最終存儲(chǔ)的均值和方差:
圖5. BatchNorm層均值和方差的moving average
因此纬向,對(duì)于隨機(jī)初始化訓(xùn)練BatchNorm層择浊,只需要在Proto文件中移除use_global_stats參數(shù)即可,Caffe會(huì)根據(jù)當(dāng)前的Phase(TRAIN或者TEST)自動(dòng)去設(shè)置use_global_stats的值逾条。 .
5琢岩、BatchNorm層是否支持in place運(yùn)算,為什么师脂?
BN是對(duì)輸入那一層做歸一化操作担孔,要對(duì)每個(gè)元素-均值/標(biāo)準(zhǔn)差,且輸入輸出規(guī)格相當(dāng)吃警,是可以進(jìn)行in place糕篇。 標(biāo)準(zhǔn)的ReLU函數(shù)為max(x, 0),而一般為當(dāng)x > 0時(shí)輸出x酌心,但x <= 0時(shí)輸出negative_slope拌消。RELU層支持in-place計(jì)算,這意味著bottom的輸出和輸入相同以避免內(nèi)存的消耗安券。 .
四墩崩、過(guò)擬合解決:dropout、batch Normalization
來(lái)源于:https://github.com/exacity/deeplearningbook-chinese/releases/
1完疫、dropout——另類Bagging(類似隨機(jī)森林RF)
引用自Dropout作者: 在標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)中泰鸡,每個(gè)參數(shù)接收的導(dǎo)數(shù)表明其應(yīng)該如何變化才能使最終損失函數(shù)降低,并給定所有其它神經(jīng)網(wǎng)絡(luò)單元的狀態(tài)壳鹤。因此神經(jīng)單元可能以一種可以修正其它神經(jīng)網(wǎng)絡(luò)單元的錯(cuò)誤的方式進(jìn)行改變盛龄。而這就可能導(dǎo)致復(fù)雜的共適應(yīng)(co-adaptations)。由于這些共適應(yīng)現(xiàn)象沒(méi)有推廣到未見(jiàn)的數(shù)據(jù)芳誓,將導(dǎo)致過(guò)擬合余舶。我們假設(shè)對(duì)每個(gè)隱藏層的神經(jīng)網(wǎng)絡(luò)單元,Dropout通過(guò)使其它隱藏層神經(jīng)網(wǎng)絡(luò)單元不可靠從而阻止了共適應(yīng)的發(fā)生锹淌。因此匿值,一個(gè)隱藏層神經(jīng)元不能依賴其它特定神經(jīng)元去糾正其錯(cuò)誤。(來(lái)源:賽爾譯文 Dropout分析)
Dropout可以被認(rèn)為是集成非常多的大神經(jīng) 網(wǎng)絡(luò)的實(shí)用Bagging方法赂摆。當(dāng)每個(gè)模型是一個(gè)大型神經(jīng)網(wǎng)絡(luò)時(shí),這似乎是不切實(shí)際的,因?yàn)橛?xùn)練和 評(píng)估這樣的網(wǎng)絡(luò)需要花費(fèi)很多運(yùn)行時(shí)間和內(nèi)存挟憔。 Dropout提供了一種廉價(jià)的Bagging集成近似,能夠訓(xùn)練和評(píng)估指數(shù)級(jí)的神經(jīng)網(wǎng)絡(luò)钟些。 操作方法:將一些單元的輸出乘零就能有效地刪除一個(gè)單元。
(1)具體工作過(guò)程:
Dropout以概率p關(guān)閉神經(jīng)元绊谭,相應(yīng)的政恍,以大小為q=1-p的概率開啟其他神經(jīng)元。每個(gè)單個(gè)神經(jīng)元有同等概率被關(guān)閉达传。當(dāng)一個(gè)神經(jīng)元被丟棄時(shí)篙耗,無(wú)論其輸入及相關(guān)的學(xué)習(xí)參數(shù)是多少,其輸出都會(huì)被置為0宪赶。 丟棄的神經(jīng)元在訓(xùn)練階段的前向傳播和后向傳播階段都不起作用:因?yàn)檫@個(gè)原因宗弯,每當(dāng)一個(gè)單一的神經(jīng)元被丟棄時(shí),訓(xùn)練階段就好像是在一個(gè)新的神經(jīng)網(wǎng)絡(luò)上完成搂妻。 訓(xùn)練階段蒙保,可以使用伯努利隨機(jī)變量、二項(xiàng)式隨機(jī)變量來(lái)對(duì)一組神經(jīng)元上的Dropout進(jìn)行建模叽讳。
(2)dropout類型: 正向dropout追他、反向dropout。 反向Dropout有助于只定義一次模型并且只改變了一個(gè)參數(shù)(保持/丟棄概率)以使用同一模型進(jìn)行訓(xùn)練和測(cè)試岛蚤。相反邑狸,直接Dropout,迫使你在測(cè)試階段修改網(wǎng)絡(luò)涤妒。因?yàn)槿绻悴怀艘员壤蜃觪单雾,神經(jīng)網(wǎng)絡(luò)的輸出將產(chǎn)生更高的相對(duì)于連續(xù)神經(jīng)元所期望的值(因此神經(jīng)元可能飽和):這就是為什么反向Dropout是更加常見(jiàn)的實(shí)現(xiàn)方式。
(3)dropout與其他規(guī)則
故反向Dropout應(yīng)該與限制參數(shù)值的其他歸一化技術(shù)一起使用她紫,以便簡(jiǎn)化學(xué)習(xí)速率選擇過(guò)程
正向Dropout:通常與L2正則化和其它參數(shù)約束技術(shù)(如Max Norm1)一起使用硅堆。正則化有助于保持模型參數(shù)值在可控范圍內(nèi)增長(zhǎng)。 反向Dropout:學(xué)習(xí)速率被縮放至q的因子贿讹,我們將其稱q為推動(dòng)因子(boosting factor)渐逃,因?yàn)樗苿?dòng)了學(xué)習(xí)速率。此外民褂,我們將r(q)稱為有效學(xué)習(xí)速率(effective learning rate)茄菊。總之赊堪,有效學(xué)習(xí)速率相對(duì)于所選擇的學(xué)習(xí)速率更高:由于這個(gè)原因面殖,限制參數(shù)值的正則化可以幫助簡(jiǎn)化學(xué)習(xí)速率選擇過(guò)程。 (來(lái)源:賽爾譯文 Dropout分析)
(4)優(yōu)勢(shì):
看作是對(duì)輸入內(nèi)容的信息高度智能化哭廉、自適應(yīng)破壞的一種形式,而不是 對(duì)輸入原始值的破壞脊僚。
Dropout不僅僅是訓(xùn)練一個(gè)Bagging的集成模型,并且是共享隱藏單元的集成模型。這意味著無(wú)論其他隱藏單元是否在模型中,每個(gè)隱藏單元必須都能夠表現(xiàn)良好遵绰。隱藏單元必須準(zhǔn)備好進(jìn)行模型之間的交換和互換辽幌。
計(jì)算方便是Dropout的一個(gè)優(yōu)點(diǎn)增淹。訓(xùn)練過(guò)程中使用Dropout產(chǎn)生 n 個(gè)隨機(jī)二進(jìn)制 數(shù)與狀態(tài)相乘,每個(gè)樣本每次更新只需 O(n)的計(jì)算復(fù)雜度。
Dropout的另一個(gè)顯著優(yōu)點(diǎn)是不怎么限制適用的模型或訓(xùn)練過(guò)程舶衬。幾乎在所有 使用分布式表示且可以用隨機(jī)梯度下降訓(xùn)練的模型上都表現(xiàn)很好埠通。包括前饋神經(jīng)網(wǎng) 絡(luò)赎离、概率模型,如受限玻爾茲曼機(jī)(Srivastava et al., 2014),以及循環(huán)神經(jīng)網(wǎng)絡(luò)(Bayer and Osendorfer, 2014; Pascanu et al., 2014a)逛犹。許多其他差不多強(qiáng)大正則化策略對(duì)模 型結(jié)構(gòu)的限制更嚴(yán)格。
(5)劣勢(shì):
Dropout是一個(gè)正則化技術(shù),它減少了模型的有效容量梁剔。為了抵消這種影響,我們必須增大模型規(guī)模虽画。不出意外的話,使 用Dropout時(shí)最佳驗(yàn)證集的誤差會(huì)低很多,但這是以更大的模型和更多訓(xùn)練算法的迭 代次數(shù)為代價(jià)換來(lái)的。對(duì)于非常大的數(shù)據(jù)集,正則化帶來(lái)的泛化誤差減少得很小荣病。在 這些情況下,使用Dropout和更大模型的計(jì)算代價(jià)可能超過(guò)正則化帶來(lái)的好處码撰。
只有極少的訓(xùn)練樣本可用時(shí),Dropout不會(huì)很有效。在只有不到 5000 的樣本 的Alternative Splicing數(shù)據(jù)集上 (Xiong et al., 2011),貝葉斯神經(jīng)網(wǎng)絡(luò) (Neal, 1996)比Dropout表現(xiàn)更好 (Srivastava et al., 2014)个盆。當(dāng)有其他未分類的數(shù)據(jù)可用時(shí),無(wú)監(jiān) 督特征學(xué)習(xí)比Dropout更有優(yōu)勢(shì)脖岛。 .
2、batch Normalization
batch normalization的主要目的是改善優(yōu)化,但噪音具有正則化的效果,有時(shí)使Dropout變得沒(méi)有必要颊亮。 參數(shù)訓(xùn)練過(guò)程中多層之間協(xié)調(diào)更新的問(wèn)題:在其他層不改變的假設(shè)下,梯度用于如何更新每一個(gè)參數(shù)柴梆。但是,一般情況下會(huì)同時(shí)更新所有層终惑。 這造成了很難選擇一個(gè)合適的學(xué)習(xí)速率,因?yàn)槟骋粚又袇?shù)更新的效果很大程度上取決 于其他所有層绍在。 batch normalization可應(yīng)用于網(wǎng)絡(luò) 的任何輸入層或隱藏層。設(shè) H 是需要標(biāo)準(zhǔn)化的某層的minibatch激勵(lì)函數(shù),布置為 設(shè)計(jì)矩陣,每個(gè)樣本的激勵(lì)出現(xiàn)在矩陣的每一行中雹有。標(biāo)準(zhǔn)化 H,我們替代它為
其中 μ 是包含每個(gè)單元均值的向量,σ 是包含每個(gè)單元標(biāo)準(zhǔn)差的向量偿渡。 反向傳播這些操作,計(jì)算均值和標(biāo)準(zhǔn)差,并應(yīng)用它們于標(biāo)準(zhǔn)化 H。這意味著,梯度不會(huì)再簡(jiǎn)單地增加 hi 的標(biāo)準(zhǔn)差或均值;標(biāo)準(zhǔn)化操作會(huì) 除掉這一操作的影響,歸零其在梯度中的元素霸奕。
以前的方法添加代價(jià)函數(shù)的懲罰,以鼓勵(lì)單位標(biāo)準(zhǔn)化激勵(lì)統(tǒng)計(jì)量,或是 在每個(gè)梯度下降步驟之后重新標(biāo)準(zhǔn)化單位統(tǒng)計(jì)量溜宽。 前者通常會(huì)導(dǎo)致不完全的標(biāo)準(zhǔn)化, 而后者通常會(huì)顯著地消耗時(shí)間,因?yàn)閷W(xué)習(xí)算法會(huì)反復(fù)改變均值和方差而標(biāo)準(zhǔn)化步驟 會(huì)反復(fù)抵消這種變化。 batch normalization重新參數(shù)化模型,以使一些單元總是被定 義標(biāo)準(zhǔn)化,巧妙地回避了這兩個(gè)問(wèn)題质帅。