鏈接:https://zhuanlan.zhihu.com/p/158739701編輯:王萌 澳門城市大學(xué)(深度學(xué)習(xí)沖鴨公眾號(hào))本文僅作學(xué)術(shù)分享,,若侵權(quán),,請(qǐng)聯(lián)系后臺(tái)刪文處理接觸深度學(xué)習(xí)也有一兩年了,一直沒有將一些實(shí)戰(zhàn)經(jīng)驗(yàn)整理一下形成文字,。本文打算用來記錄一些在深度學(xué)習(xí)實(shí)踐中的調(diào)試過程,,記錄一些經(jīng)驗(yàn)之談。因?yàn)槟壳吧疃葘W(xué)習(xí)業(yè)界的理論基礎(chǔ)尚且薄弱,,很多工程實(shí)踐中的問題沒法用理論解釋得很好,這里的只是實(shí)踐中的一些經(jīng)驗(yàn)之談,,以供參考以及排錯(cuò),。本文將持續(xù)更新。需要強(qiáng)調(diào)的是,,本文的很多單純只是經(jīng)驗(yàn),,在盡可能列出參考文獻(xiàn)的同時(shí)卻并無嚴(yán)格理論驗(yàn)證,,希望大家見諒,。歡迎大家集思廣益,,共同維護(hù)這個(gè)經(jīng)驗(yàn)集,為整個(gè)社區(qū)貢獻(xiàn)微弱力量,。1,、在分類問題中,損失函數(shù)及其快速得下降為0.0000在分類問題中,,我們一般采用的是交叉熵[1]作為損失函數(shù),,如式(1.1)所示其中和是預(yù)測結(jié)果,以概率分布的形式表達(dá),,如等,,一般是通過softmax層實(shí)現(xiàn),和是樣本真實(shí)標(biāo)簽,,在單分類問題中,,采用的是獨(dú)熱編碼[2],只有一個(gè)分量是為1的,,如,。(公式第二行是向量化表達(dá))我們發(fā)現(xiàn),交叉熵?fù)p失的下確界是0,,但是永遠(yuǎn)都不可能達(dá)到0,,因?yàn)橐_(dá)到0,那么所有的預(yù)測向量分布就必須完全和真實(shí)標(biāo)簽一致,,退化為獨(dú)熱編碼,。但是實(shí)際上在神經(jīng)網(wǎng)絡(luò)中,經(jīng)過了softmax層之后,,是不可能使得除了目標(biāo)分量的其他所有分量為0的(這個(gè)這里只是拋出了結(jié)論,,討論需要比較長的篇幅。),,因此永遠(yuǎn)不可能達(dá)到0的,,正是因?yàn)槿绱耍徊骒負(fù)p失可以一直優(yōu)化,,這也是其比MSE損失優(yōu)的一個(gè)點(diǎn)之一,。既然注意到了不可能為0,我們就可以分析,,這肯定是自己程序問題,,我們將經(jīng)過softmax之前的logit打印出,如:發(fā)現(xiàn)了沒有,,這些值都很大,,而softmax函數(shù)為:我們會(huì)發(fā)現(xiàn),過大或者過小的指數(shù)項(xiàng),,比如1023,,會(huì)涉及到計(jì)算,,這個(gè)數(shù)值在TensorFlow或者大部分框架中是溢出的,顯示為inf,,因此就會(huì)把該分量拉成1,,而其他變成了0。這種操作是會(huì)導(dǎo)致嚴(yán)重的過擬合的,。因此,,一般來說,logit值不能太大,,否則將會(huì)出現(xiàn)數(shù)值計(jì)算問題,。那么如何解決? 出現(xiàn)這種問題的情況很多時(shí)候是因?yàn)?strong>參數(shù)初始化導(dǎo)致的數(shù)值計(jì)算問題,,比如都采用了方差過小的高斯分布進(jìn)行初始化,,那么就會(huì)把網(wǎng)絡(luò)的輸出的范圍拉的特別大,導(dǎo)致以上的問題,。因此在參數(shù)初始化中,,確保每一層的初始化都是在一定范圍內(nèi)的,可以考慮采用Xavier初始化,,Kaiming初始化等,。(這個(gè)初始化的影響我們將會(huì)以后討論,這是一個(gè)新的話題,。)2,、在正則化的過程中對(duì)神經(jīng)網(wǎng)絡(luò)的偏置也進(jìn)行了正則一般來說,我們常用的是二范數(shù)正則,,也即是嶺回歸,,如式子(2.1)一般來說,我們只會(huì)對(duì)神經(jīng)網(wǎng)絡(luò)的權(quán)值進(jìn)行正則操作,,使得權(quán)值具有一定的稀疏性[21]或者控制其尺寸,,使得其不至于幅度太大[3],減少模型的容量以減少過擬合的風(fēng)險(xiǎn),。同時(shí),,我們注意到神經(jīng)網(wǎng)絡(luò)中每一層的權(quán)值的作用是調(diào)節(jié)每一層超平面的方向(因?yàn)榫褪瞧浞ㄏ蛄浚虼酥灰壤恢?,不?huì)影響超平面的形狀的,。但是,我們必須注意到,,每一層中的偏置是調(diào)節(jié)每一層超平面的平移長度的,,如果你對(duì)偏置進(jìn)行了正則,那么我們的可能就會(huì)變得很小,或者很稀疏,,這樣就導(dǎo)致你的每一層的超平面只能局限于很小的一個(gè)范圍內(nèi),,使得模型的容量大大減少,一般會(huì)導(dǎo)致欠擬合[7]的現(xiàn)象,。因此,,一般我們不會(huì)對(duì)偏置進(jìn)行正則的,,注意了,。3、學(xué)習(xí)率太大導(dǎo)致不收斂不收斂是個(gè)范圍很大的問題,,有很多可能性,,其中有一種是和網(wǎng)絡(luò)結(jié)構(gòu)無關(guān)的原因,就是學(xué)習(xí)率設(shè)置的太大了,,如下圖所示,,太大的學(xué)習(xí)率將會(huì)導(dǎo)致嚴(yán)重的抖動(dòng),使得無法收斂,,甚至在某些情況下可能使得損失變得越來越大直到無窮,。這個(gè)時(shí)候請(qǐng)調(diào)整你的學(xué)習(xí)率,嘗試是否可以收斂,。當(dāng)然,,這里的“太大”目前沒有理論可以衡量,不過我喜歡從的Adam優(yōu)化器[4]開始進(jìn)行嘗試優(yōu)化,。下圖展示了過大過小的學(xué)習(xí)率對(duì)模型性能的影響曲線圖: 4,、別在softmax層前面的輸入施加了激活函數(shù)假設(shè)我們的網(wǎng)絡(luò)提取出來的最后的特征向量是,如果我們最后的分類的類別有類,,那么我們會(huì)用一個(gè)全連接層將其映射到對(duì)應(yīng)維度的空間里面,,如式(4.2)。那么,,這個(gè)全連接層雖然說可以看成是分類器,,但是我們最好把它看成是上一層的“近線性可分特征”的一個(gè)維度轉(zhuǎn)換(有點(diǎn)繞,意思是我們這里只是一個(gè)維度的轉(zhuǎn)換,,而不涉及到kernel),,不管怎么說,這個(gè)時(shí)候,,我們的輸出是不能有激活函數(shù)的,,如下式是不可以的:這時(shí)候的輸出,具有和分類類別相同的維度,,在很多框架中被稱之為logits值,,這個(gè)值一般是在實(shí)數(shù)范圍內(nèi)的,一般不會(huì)太大,,參考筆記第一點(diǎn)的情況,。原始數(shù)據(jù)輸入可能千奇百怪,每個(gè)特征維的值范圍可能有著數(shù)量級(jí)上的差別,,這個(gè)時(shí)候如果我們不對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,,將會(huì)大大增大設(shè)計(jì)網(wǎng)絡(luò)的負(fù)擔(dān)。一般來說我們希望輸入的數(shù)據(jù)是中心對(duì)齊的,,也即是0均值的[5],,可以加速網(wǎng)絡(luò)收斂的速度。同時(shí),,我們希望不同維度上的數(shù)值范圍是一致的,,可以采用一些歸一化[6]的手段進(jìn)行處理(這個(gè)時(shí)候假設(shè)每個(gè)維度重要性是一樣的,比如我們圖片的三個(gè)通道等),。6,、別忘了對(duì)你的訓(xùn)練數(shù)據(jù)進(jìn)行打亂經(jīng)常,你的訓(xùn)練過程非常完美,,能夠很好地?cái)M合訓(xùn)練數(shù)據(jù),,但是在測試過程中確實(shí)一塌糊涂,是的,,你的模型這個(gè)時(shí)候過擬合[7]了,。這個(gè)時(shí)候你會(huì)檢查模型的有效性,不過在進(jìn)行這一步之前,,不妨先檢查下你的數(shù)據(jù)加載器(Data Loader)是否是正常設(shè)計(jì)的,。一般來說,我們的訓(xùn)練數(shù)據(jù)在訓(xùn)練過程中,,每一個(gè)epoch[8]中,,都是需要進(jìn)行打亂(shuffle)的,很多框架的數(shù)據(jù)加載器參數(shù)列表中都會(huì)有這項(xiàng)選項(xiàng),,比如pytorch的DataLoader類[9],。為什么需要打亂呢?那是因?yàn)槿绻淮騺y我們的訓(xùn)練數(shù)據(jù),,我們的模型就有可能學(xué)習(xí)到訓(xùn)練數(shù)據(jù)的個(gè)體與個(gè)體之間特定的排列順序,,而這種排列順序,在很多情況下是無用的,,會(huì)導(dǎo)致過擬合的糟糕現(xiàn)象,。因此,我們?cè)谟?xùn)練過程中,,在每一個(gè)epoch訓(xùn)練中都對(duì)訓(xùn)練集進(jìn)行打亂,,以確保模型不能“記憶”樣本之間的特定排序。這其實(shí)也是正則的一種手段。7,、一個(gè)batch中,label不要全部相同這個(gè)情況有點(diǎn)類似與筆記的第六點(diǎn),,我們需要盡量給訓(xùn)練過程中人為引入不確定性,,這是很多正則手段,包括dropout,,stochastic depth等的思路,,這樣能夠有效地減少過擬合的風(fēng)險(xiǎn)。因此,,一個(gè)batch中,,盡量確保你的樣本是來自于各個(gè)類的(針對(duì)分類問題而言),,這樣你的模型會(huì)減少執(zhí)著與某個(gè)類別的概率,,減少過擬合風(fēng)險(xiǎn),同時(shí)也會(huì)加快收斂速度,。 在高維度情況下的優(yōu)化,其優(yōu)化平面會(huì)出現(xiàn)很多鞍點(diǎn)(既是梯度為0,,但卻不是極點(diǎn)),,通常,鞍點(diǎn)會(huì)比局部極值更容易出現(xiàn)(直觀感受就是,,因?yàn)楦呔S度情況下,,一個(gè)點(diǎn)周圍有很多維度,如果是極值點(diǎn),,那么就需要其他所有維度都是朝向同一個(gè)方向“彎曲”的,,而這個(gè)要比鞍點(diǎn)的各個(gè)方向“彎曲”的情況可能要小),,因此這個(gè)時(shí)候我們更擔(dān)心陷于鞍點(diǎn),,而不是局部極小值點(diǎn)(當(dāng)然局部極小值點(diǎn)也是一個(gè)大麻煩,不過鞍點(diǎn)更麻煩),。如果采用普通的SGD優(yōu)化器,,那么就會(huì)陷于任何一個(gè)梯度為0的點(diǎn),也就是說,,極有可能會(huì)陷于鞍點(diǎn),。如果要使用SGD方法,建議使用帶有momentum的SGD方法,,可以有效避免陷入鞍點(diǎn)的風(fēng)險(xiǎn),。下圖是某個(gè)函數(shù)的三維曲線圖和等高線圖,我們可以看到有若干個(gè)局部最優(yōu)點(diǎn)和鞍點(diǎn),這些點(diǎn)對(duì)于vanilla SGD來說是不容易處理的,。9,、檢查各層梯度,對(duì)梯度爆炸進(jìn)行截?cái)?/strong>有些時(shí)候,,你會(huì)發(fā)現(xiàn)在訓(xùn)練過程中,,你的損失突然變得特別大,或者特別小,,這個(gè)時(shí)候不妨檢查下每一層的梯度(用tensorboard的distribution可以很好地檢查),,很可能是發(fā)生了梯度爆炸(gradient explosion)的情況,特別是在存在LSTM等時(shí)序的網(wǎng)絡(luò)中,,很容易出現(xiàn)這種情況,。因此,這個(gè)時(shí)候我們會(huì)用梯度截?cái)噙M(jìn)行處理,,操作很簡單粗暴,,就是設(shè)置一個(gè)閾值,把超過這個(gè)閾值的梯度全部拉到這個(gè)閾值,,如下圖所示:在tensorflow中也提供了相應(yīng)的API供梯度截?cái)嗍褂肹10],,如:tf.clip_by_value( t, clip_value_min, # 指定截?cái)嘧钚≈?/code> clip_value_max, # 指定截?cái)嘧畲笾?/code> name=None ) 具體使用見[11],在應(yīng)用梯度之前,,對(duì)梯度截?cái)噙M(jìn)行處理,。有些時(shí)候,,你的訓(xùn)練過程可以很好地收斂,,當(dāng)使用MSE損失[12]的時(shí)候甚至可能達(dá)到0.0000的情況。但是,,當(dāng)你把模型拿到測試集中評(píng)估的時(shí)候,,卻發(fā)現(xiàn)性能極差,仿佛沒有訓(xùn)練一樣,。這是過擬合嗎,?顯然是的,但是這可能并不是你的模型的問題,,請(qǐng)檢查你的數(shù)據(jù)加載中訓(xùn)練集的樣本標(biāo)簽是否正確對(duì)應(yīng),。這個(gè)問題很白癡,但是卻真的很容易在數(shù)據(jù)加載過程中因?yàn)榉N種原因把label信息和對(duì)應(yīng)樣本給混掉,。根據(jù)文獻(xiàn)[13]中的實(shí)驗(yàn),,用MSE損失的情況下,就算是你的label完全隨機(jī)的,,和樣本一點(diǎn)關(guān)系都沒有,,也可以通過基于SGD的優(yōu)化算法達(dá)到0.0000損失的,。因此,請(qǐng)務(wù)必確保你的樣本label是正確的,。在分類問題中我們一般都是采用的是交叉熵?fù)p失,如式子(1.1)所示,,在一些實(shí)驗(yàn)中,,如果我們繪制出訓(xùn)練損失和分類準(zhǔn)確度的曲線圖,我們可能會(huì)有下圖這種情況[14]:其中上圖為分類損失,,紫色為訓(xùn)練損失,,藍(lán)色為測試損失,下圖為分類準(zhǔn)確度,,綠色為訓(xùn)練準(zhǔn)確度,,藍(lán)色為測試準(zhǔn)確度。我們不難發(fā)現(xiàn)一個(gè)比較有意思的現(xiàn)象,,就是當(dāng)測試損失開始到最低點(diǎn),,開始向上反彈的時(shí)候,其測試準(zhǔn)確度卻還是上升的,,而不是下降,。 這是為什么呢,?為什么分類準(zhǔn)確度不會(huì)順著分類損失的增大而減少呢,? 這個(gè)涉及到了分類過程中對(duì)某個(gè)類的“置信程度”的多少,比如:模型是對(duì)第一類相當(dāng)確信的,,但是在第二種情況:這對(duì)第一類的置信程度就很低了,,雖然按照貝葉斯決策,還是會(huì)選擇第一類作為決策結(jié)果,。因此這就是導(dǎo)致以上現(xiàn)象的原因,,在那個(gè)拐點(diǎn)后面,這個(gè)模型對(duì)于分類的置信程度其實(shí)已經(jīng)變得很差了,,雖然對(duì)于準(zhǔn)確度而言,,其還能分類正確。 但是這其實(shí)正是過擬合的一種表現(xiàn),,模型已經(jīng)對(duì)自己的分類結(jié)果不確信了,。Batch Normalization[15],,中文譯作批規(guī)范化,,在深度學(xué)習(xí)中是一種加快收斂速度,提高性能的一個(gè)利器,,其本質(zhì)和我們對(duì)輸入的原數(shù)據(jù)進(jìn)行0均值單位方差規(guī)范化差不多,,是以batch為單位,,對(duì)中間層的輸出進(jìn)行規(guī)范化,可以緩和內(nèi)部協(xié)方差偏移(Internal Covariate Shift)的現(xiàn)象,。其基本公式很簡單,,如下:不過這里并不打算對(duì)BN進(jìn)行詳細(xì)講解,只是想告訴大家,,因?yàn)锽N操作在訓(xùn)練過程中是對(duì)每個(gè)batch進(jìn)行處理的,,從每個(gè)batch中求得均值和方差才能進(jìn)行操作。如果你的batch特別?。ū热缡鞘芟抻谟布l件或者網(wǎng)絡(luò)要求小batch),,那么BN層的batch均值和方差可能就會(huì)不能很好符合整個(gè)訓(xùn)練集的統(tǒng)計(jì)特征,導(dǎo)致差的性能,。實(shí)際上,,實(shí)驗(yàn)[16]說明了這個(gè)關(guān)系,當(dāng)batch小于16時(shí),,性能大幅度下降,。因此,少在太小的batch中使用BN層,,如果實(shí)在要使用,,在發(fā)生性能問題時(shí)優(yōu)先檢查BN層。13,、數(shù)值計(jì)算問題,,出現(xiàn)NanNan(Not An Number)是一個(gè)在數(shù)值計(jì)算中容易出現(xiàn)的問題,在深度學(xué)習(xí)中因?yàn)樯婕暗胶芏鄵p失函數(shù),,有些損失函數(shù)的定義域并不是整個(gè)實(shí)數(shù),,比如常用的對(duì)數(shù),因此一不小心就會(huì)出現(xiàn)Nan,。在深度學(xué)習(xí)中,,如果某一層出現(xiàn)了Nan,那么是具有傳遞性的,,后面的層也會(huì)出現(xiàn)Nan,,因此可以通過二分法對(duì)此進(jìn)行排錯(cuò)。一般來說,,在深度學(xué)習(xí)中出現(xiàn)Nan是由于除0異?;蛘呤且?yàn)閾p失函數(shù)中的(比如交叉熵,KL散度)對(duì)數(shù)操作中,,輸入小于或者等于0了,,一般等于0的情況比較多,因此通常會(huì):這里的是個(gè)很小的值,,一般取即可,,可以防止因?yàn)閷?duì)數(shù)操作中輸入0導(dǎo)致的Nan異常,。需要注意的是,有些時(shí)候因?yàn)閰?shù)初始化或者學(xué)習(xí)率太大也會(huì)導(dǎo)致數(shù)值計(jì)算溢出,,這也是會(huì)出現(xiàn)Nan的,,一般這樣會(huì)出現(xiàn)在較前面的層里面。BN層有兩種常見的放置位置,,如下圖所示:第一個(gè)是放在激活函數(shù)之前:在原始BN的論文[15]中,Batch Norm(BN)層是位于激活層之前的,,因?yàn)槭菍?duì)原始的,,未經(jīng)過激活的logit數(shù)據(jù)進(jìn)行數(shù)據(jù)分布的重整。然而,,不少實(shí)驗(yàn)證實(shí)似乎BN層放在激活層之后效果會(huì)更好,,這個(gè)原因目前不明。Update 2020/5/18: 在新的文獻(xiàn)[28]中,,作者嘗試解釋了以下BN用法的原因,,有興趣的讀者可以移步去細(xì)讀下。
graph LR weights --> BatchNorm BatchNorm --> ReLU graph LR ReLU --> BatchNorm+dropout BatchNorm+dropout --> weights 15,、dropout層應(yīng)用在卷積層中可能導(dǎo)致更差的性能dropout[19]是hinton大神與2012年提出的一種神經(jīng)網(wǎng)絡(luò)正則手段,,其可以簡單解釋為在訓(xùn)練過程中,按一定概率讓神經(jīng)網(wǎng)絡(luò)中的某些神經(jīng)元輸出為0,,其原因可以有幾個(gè)解釋,,一個(gè)是作為一種集成模型進(jìn)行解釋,另一個(gè)可以看成是在特征提取學(xué)習(xí)過程中給數(shù)據(jù)加入噪聲,,可以看成是一種數(shù)據(jù)增強(qiáng)的正則手段,。在原始論文中,dropout被應(yīng)用于全連接層中,,而沒有應(yīng)用在卷積層中,Hinton的解釋是因?yàn)榫矸e層參數(shù)并不多,,過擬合風(fēng)險(xiǎn)較小不適合采用dropout這種大殺器的正則手段,。有人也認(rèn)為因?yàn)榫矸e網(wǎng)絡(luò)是局部感知的,用dropout正則對(duì)于其在后層中對(duì)于全局信息的獲取可能具有負(fù)作用[20],。不過在一些工作中,,也有人將dropout層應(yīng)用在卷積層中的[17-18],其層次安排為:,,不過其丟棄率都是選擇的較小數(shù)如,,等,個(gè)人覺得這里的作用大概是對(duì)中間數(shù)據(jù)進(jìn)行加入噪聲,,以便于數(shù)據(jù)增強(qiáng)的正則手段,。個(gè)人建議是可以嘗試在卷積層中使用少量的dropout,,用較小的丟棄率,但是最后別忘了扔掉這些dropout再進(jìn)行一些探索,,也許可以具有更好的效果,。16、較小的batch size可以提供較好的泛化現(xiàn)代的深度學(xué)習(xí)優(yōu)化器基本上都是基于SGD算法進(jìn)行修改而成的,,在每一次訓(xùn)練中都是以一個(gè)batch size為單位進(jìn)行訓(xùn)練的,,在這個(gè)過程中相當(dāng)于在統(tǒng)計(jì)這個(gè)batch中樣本的一些統(tǒng)計(jì)特性,因此batch size是會(huì)影響模型的超曲線形狀的,。一般來說較大的batch size比如128,,256會(huì)和整個(gè)訓(xùn)練集的統(tǒng)計(jì)性質(zhì)更相近,從而使得具有較少的多樣性,,而較小的batch size 比如16,,32,因?yàn)閎atch size較小,,不同batch之間的差異性較大,,這種差異性可以看成是正則手段,有機(jī)會(huì)提高模型的泛化性能,。(不過有些文章似乎不同意這個(gè)觀點(diǎn),,認(rèn)為較大batch size有較好性能,個(gè)人建議是大batch size和小batch size都可以跑跑,,有可能能提升性能,。)這個(gè)應(yīng)該是老生常談了,,但是初學(xué)者經(jīng)常會(huì)出現(xiàn)這種錯(cuò)誤,,在初始化權(quán)值的時(shí)候?qū)?quán)值全部初始化為了0,在反向傳播的過程中,,對(duì)于某個(gè)權(quán)值的更新公式為[22]:這個(gè)公式推導(dǎo)具體參見[22],,這里不累述了,我們可以發(fā)現(xiàn),,當(dāng)初始化權(quán)值參數(shù)全部為0的時(shí)候,,我們的將全部為0,這個(gè)時(shí)候?qū)τ谀硞€(gè)權(quán)值的梯度也就變?yōu)榱?,,因此整個(gè)網(wǎng)絡(luò)的任何參數(shù)都得不到更新,,將會(huì)導(dǎo)致訓(xùn)練無法進(jìn)行。而對(duì)于偏置的初始化不同,,對(duì)于偏置的更新公式如[22]:我們可以發(fā)現(xiàn),,對(duì)于偏置的更新而言,不依賴與初始值,,因此偏置的初始化可以初始化為全0,。這個(gè)也是初學(xué)者很容易犯的錯(cuò)誤,就是忘記給每一層添加偏置,。我們?cè)诠P記第二點(diǎn)中提到了神經(jīng)網(wǎng)絡(luò)中偏置的作用,,總的來說就是對(duì)超平面進(jìn)行平移的,因此一般來說,,我們的神經(jīng)網(wǎng)絡(luò)都是需要添加偏置的,,不然你的超平面就只能是通過原點(diǎn)的了,這樣大大減少了模型的容量,,經(jīng)常會(huì)使得模型欠擬合,。19、驗(yàn)證準(zhǔn)確率遠(yuǎn)大于測試準(zhǔn)確率有些時(shí)候,,你發(fā)現(xiàn)你的驗(yàn)證集準(zhǔn)確率遠(yuǎn)大于測試集的準(zhǔn)確率,,在排除了代碼問題和操作問題之后,其實(shí)也可能是因?yàn)橛?xùn)練集和測試集劃分的問題,。一般來說,,你的驗(yàn)證集是從訓(xùn)練集中劃分出來的[23],因此你的驗(yàn)證集和訓(xùn)練集可以視為是同分布的,,但是并不能確保你的訓(xùn)練集和測試集是同分布的,,如果訓(xùn)練集和測試集的分布差的比較大,就可能出現(xiàn)這種情況,。這個(gè)時(shí)候,,可以考慮遷移學(xué)習(xí)中的一些方法。20,、KL散度出現(xiàn)負(fù)數(shù)Kullback–Leibler散度,,簡稱KL散度[24],也稱為相對(duì)熵,,是一種用于度量兩個(gè)分布之間相似性的常用手段,,公式如(20.1),其中第二行形式的變形描述了相對(duì)熵的特性,。我們注意到KL散度是不可能為負(fù)數(shù)的,,其中是定義在同一個(gè)概率空間[25]里面的同型的分布,維度相同,。從相對(duì)熵的定義來看,這個(gè)公式描述了用分布去近似所造成的不一致性的程度,。在深度學(xué)習(xí)和機(jī)器學(xué)習(xí)中,,一般是用來描述兩個(gè)維度相同的概率分布之間的相似度。注意到,,這里的都是概率分布,,因此是需要經(jīng)過softmax 層的,,才能保證概率和為1,不然可能會(huì)出現(xiàn)KL散度為負(fù)數(shù)的笑話,。而且,,在一些框架如Pytorch中,其輸入值需要是log_softmax 而目標(biāo)值需要是softmax 值,,也就說輸入值需要進(jìn)行對(duì)數(shù)操作后再轉(zhuǎn)變?yōu)楦怕史植糩27],。[1] Janocha K, Czarnecki W M. On loss functions for deep neural networks in classification[J]. arXiv preprint arXiv:1702.05659, 2017.(Overview about loss function used in DNN)[2] tf.one_hot()進(jìn)行獨(dú)熱編碼[4] Kinga D, Adam J B. A method for stochastic optimization[C]//International Conference on Learning Representations (ICLR). 2015, 5.[5] 深度學(xué)習(xí)系列:深度學(xué)習(xí)中激活函數(shù)的選擇[6] 機(jī)器學(xué)習(xí)之特征歸一化(normalization)[7] 機(jī)器學(xué)習(xí)模型的容量,過擬合與欠擬合[8] 在機(jī)器學(xué)習(xí)中epoch, iteration, batch_size的區(qū)別[9] Pytorch Dataloader doc[11] 梯度截?cái)嗟膖ensorflow實(shí)現(xiàn)[12] 均方誤差(MSE)和均方根誤差(RMSE)和平均絕對(duì)誤差(MAE)[13]. Du S S, Zhai X, Poczos B, et al. Gradient Descent Provably Optimizes Over-parameterized Neural Networks[J]. arXiv preprint arXiv:1810.02054, 2018.[14] The inconsistency between the loss curve and metric curve?[15] Ioffe S, Szegedy C. Batch normalization: accelerating deep network training by reducing internal covariate shift[C]// International Conference on International Conference on Machine Learning. JMLR.org, 2015:448-456.[16] Wu Y, He K. Group normalization[J]. arXiv preprint arXiv:1803.08494, 2018.[17] Park S, Kwak N. Analysis on the dropout effect in convolutional neural networks[C]//Asian Conference on Computer Vision. Springer, Cham, 2016: 189-204.[18] Where should I place dropout layers in a neural network?[19] Hinton G E, Srivastava N, Krizhevsky A, et al. Improving neural networks by preventing co-adaptation of feature detectors[J]. arXiv preprint arXiv:1207.0580, 2012.[20] Why do I never see dropout applied in convolutional layers?[22] 深度學(xué)習(xí)系列:反向傳播算法的公式推導(dǎo)[23] 訓(xùn)練集,、測試集,、檢驗(yàn)集的區(qū)別與交叉檢驗(yàn)[24] Kullback–Leibler divergence[27] KL Divergence produces negative values[28] Chen G, Chen P, Shi Y, et al. Rethinking the Usage of Batch Normalization and Dropout in the Training of Deep Neural Networks[J]. arXiv preprint arXiv:1905.05928, 2019.[29] https://forums./t/rethinking-batchnorm-dropout-combine-together-for-independent-component-layer/46232如有問題請(qǐng)指出,聯(lián)系方式:github: https://github.com/FesianXu由于微信平臺(tái)算法改版,,公號(hào)內(nèi)容將不再以時(shí)間排序展示,,如果大家想第一時(shí)間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】,。星標(biāo)具體步驟為: (1)點(diǎn)擊頁面最上方“深度學(xué)習(xí)自然語言處理”,,進(jìn)入公眾號(hào)主頁。 (2)點(diǎn)擊右上角的小點(diǎn)點(diǎn),,在彈出頁面點(diǎn)擊“設(shè)為星標(biāo)”,,就可以啦。
感謝支持,,比心,。 投稿或交流學(xué)習(xí),備注:昵稱-學(xué)校(公司)-方向,,進(jìn)入DL&NLP交流群,。
方向有很多:機(jī)器學(xué)習(xí)、深度學(xué)習(xí),,python,,情感分析、意見挖掘,、句法分析,、機(jī)器翻譯、人機(jī)對(duì)話,、知識(shí)圖譜,、語音識(shí)別等。
|