性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

徐土豆
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專題目錄 查看專題
深度學(xué)習(xí)debug沉思錄第一集
深度學(xué)習(xí)debug沉思錄第二集
作者動(dòng)態(tài) 更多
給定計(jì)算預(yù)算下的最佳LLM模型尺寸與預(yù)訓(xùn)練數(shù)據(jù)量分配
2天前
大模型推理時(shí)的尺度擴(kuò)展定律
3天前
世界多胞體與世界模型
1星期前
獎(jiǎng)勵(lì)模型中的尺度擴(kuò)展定律和獎(jiǎng)勵(lì)劫持
1星期前
MeCo——給預(yù)訓(xùn)練數(shù)據(jù)增加源信息,就能減少33%的訓(xùn)練量并且提升效果
2星期前

深度學(xué)習(xí)debug沉思錄第一集

接觸深度學(xué)習(xí)也有一兩年了,一直沒有將一些實(shí)戰(zhàn)經(jīng)驗(yàn)整理一下形成文字。本文打算用來紀(jì)錄一些在深度學(xué)習(xí)實(shí)踐中的調(diào)試過程,紀(jì)錄一些經(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)證,希望大家見諒。本文轉(zhuǎn)載自徐飛翔的“深度學(xué)習(xí)debug沉思錄”。

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

文章目錄

  • 1. 在分類問題中,損失函數(shù)及其快速得下降為0.0000
  • 2. 在正則化的過程中對(duì)神經(jīng)網(wǎng)絡(luò)的偏置也進(jìn)行了正則
  • 3.學(xué)習(xí)率太大導(dǎo)致不收斂
  • 4. 別在softmax層前面的輸入施加了激活函數(shù)
  • 5.檢查原數(shù)據(jù)輸入的值范圍
  • 6. 別忘了對(duì)你的訓(xùn)練數(shù)據(jù)進(jìn)行打亂
  • 7. 一個(gè)batch中,label不要全部相同
  • 8.少用vanilla SGD優(yōu)化器
  • 9. 檢查各層梯度,對(duì)梯度爆炸進(jìn)行截?cái)?/li>
  • 10.檢查你的樣本label
  • 11.分類問題中的分類置信度問題
  • 12.少在太小的批次中使用BatchNorm層
  • 13.數(shù)值計(jì)算問題,出現(xiàn)Nan
  • 14. BN層放置的位置問題
  • 15. dropout層應(yīng)用在卷積層中可能導(dǎo)致更差的性能
  • 16. 較小的batch size可以提供較好的泛化
  • 17. 初始化權(quán)值不能初始化為全0
  • 18. 別忘了你的偏置
  • 19. 驗(yàn)證準(zhǔn)確率遠(yuǎn)大于測(cè)試準(zhǔn)確率
  • 20. KL散度出現(xiàn)負(fù)數(shù)
  • Reference

1.在分類問題中,損失函數(shù)及其快速得下降為0.0000

在分類問題中,我們一般采用的是交叉熵[1]作為損失函數(shù),如式(1.1)所示

               (1.1)

其中是預(yù)測(cè)結(jié)果,以概率分布的形式表達(dá),如[ 0.2 , 0.3 , 0.3 , 0.2 ] [0.2,0.3,0.3,0.2][0.2,0.3,0.3,0.2]等,一般是通過softmax層實(shí)現(xiàn),是樣本真實(shí)標(biāo)簽,在單分類問題中,采用的是獨(dú)熱編碼[2],只有一個(gè)分量是為1的,如[ 0.0 , 1.0 , 0.0 , 0.0 ] [0.0,1.0,0.0,0.0][0.0,1.0,0.0,0.0]。(公式第二行是向量化表達(dá))

我們發(fā)現(xiàn),交叉熵?fù)p失的下確界是0,但是永遠(yuǎn)都不可能達(dá)到0,因?yàn)橐_(dá)到0,那么所有的預(yù)測(cè)向量分布就必須完全和真實(shí)標(biāo)簽一致,退化為獨(dú)熱編碼。但是實(shí)際上在神經(jīng)網(wǎng)絡(luò)中,經(jīng)過了softmax層之后,是不可能使得除了目標(biāo)分量的其他所有分量為0的(這個(gè)這里只是拋出了結(jié)論,討論需要比較長(zhǎng)的篇幅。),因此永遠(yuǎn)不可能達(dá)到0的,正是因?yàn)槿绱?,交叉熵?fù)p失可以一直優(yōu)化,這也是其比MSE損失優(yōu)的一個(gè)點(diǎn)之一。

既然注意到了不可能為0,我們就可以分析,這肯定是自己程序問題,我們將經(jīng)過softmax之前的logit打印出,如:[ 1023 , − 201 , 1021 , 124 ] [1023,-201,1021,124]

既然注意到了不可能為0,我們就可以分析,這肯定是自己程序問題,我們將經(jīng)過softmax之前的logit打印出,如:

[ 1023 , − 201 , 1021 , 124 ] 

發(fā)現(xiàn)了沒有,這些值都很大,而softmax函數(shù)為:

(1.2)

我們會(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)

       (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)?span>就是其法向量),因此只要比例一致,不會(huì)影響超平面的形狀的。但是,我們必須注意到,每一層中的偏置是調(diào)節(jié)每一層超平面的平移長(zhǎng)度的,如果你對(duì)偏置進(jìn)行了正則,那么我們的b可能就會(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ù)

softmax函數(shù)如式(4.1)所示:

(4.1)

假設(shè)我們的網(wǎng)絡(luò)提取出來的最后的特征向量是,如果我們最后的分類的類別有n類,那么我們會(huì)用一個(gè)全連接層將其映射到對(duì)應(yīng)維度的空間里面,如式(4.2)。                            

      

那么,這個(gè)全連接層雖然說可以看成是分類器,但是我們最好把它看成是上一層的“近線性可分特征”的一個(gè)維度轉(zhuǎn)換(有點(diǎn)繞,意思是我們這里只是一個(gè)維度的轉(zhuǎn)換,而不涉及到kernel),不管怎么說,這個(gè)時(shí)候,我們的輸出是不能有激活函數(shù)的,如下式是不可以的

(4.3)

這時(shí)候的輸出,具有和分類類別相同的維度,在很多框架中被稱之為logits值,這個(gè)值一般是在實(shí)數(shù)范圍內(nèi)的,一般不會(huì)太大,參考筆記第一點(diǎn)的情況。

5.檢查原數(shù)據(jù)輸入的值范圍

原始數(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ù),但是在測(cè)試過程中確實(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í)也是正則的一種手段。

在訓(xùn)練中,大概如:

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ì)加快收斂速度。

8.少用vanilla SGD優(yōu)化器

在高維度情況下的優(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)行處理,操作很簡(jiǎn)單粗暴,就是設(shè)置一個(gè)閾值,把超過這個(gè)閾值的梯度全部拉到這個(gè)閾值,如下圖所示:

在tensorflow中也提供了相應(yīng)的API供梯度截?cái)嗍褂肹10],如:

tf.clip_by_value(
t,
clip_value_min, # 指定截?cái)嘧钚≈?clip_value_max, # 指定截?cái)嘧畲笾?name=None
)

具體使用見[11],在應(yīng)用梯度之前,對(duì)梯度截?cái)噙M(jìn)行處理。

10.檢查你的樣本label

有些時(shí)候,你的訓(xùn)練過程可以很好地收斂,當(dāng)使用MSE損失[12]的時(shí)候甚至可能達(dá)到0.0000的情況。但是,當(dāng)你把模型拿到測(cè)試集中評(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是正確的。

11.分類問題中的分類置信度問題

在分類問題中我們一般都是采用的是交叉熵?fù)p失,如式子(1.1)所示,在一些實(shí)驗(yàn)中,如果我們繪制出訓(xùn)練損失和分類準(zhǔn)確度的曲線圖,我們可能會(huì)有下圖這種情況[14]:

其中上圖為分類損失,紫色為訓(xùn)練損失,藍(lán)色為測(cè)試損失,下圖為分類準(zhǔn)確度,綠色為訓(xùn)練準(zhǔn)確度,藍(lán)色為測(cè)試準(zhǔn)確度。我們不難發(fā)現(xiàn)一個(gè)比較有意思的現(xiàn)象,就是當(dāng)測(cè)試損失開始到最低點(diǎn),開始向上反彈的時(shí)候,其測(cè)試準(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é)果不確信了。

12.少在太小的批次中使用BatchNorm層

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)象。其基本公式很簡(jiǎ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)Nan

Nan(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)在較前面的層里面。

14.BN層放置的位置問題

BN層有兩種常見的放置位置,如下圖所示: 第一個(gè)是放在激活函數(shù)之前:

第二個(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ì)讀下。

傳統(tǒng)用法:

graph LR
weights --> BatchNorm
BatchNorm --> ReLU

[28]的作者提出的用法:

graph LR
ReLU --> BatchNorm+dropout
BatchNorm+dropout --> weights

15. dropout層應(yīng)用在卷積層中可能導(dǎo)致更差的性能

dropout[19]是hinton大神與2012年提出的一種神經(jīng)網(wǎng)絡(luò)正則手段,其可以簡(jiǎn)單解釋為在訓(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],其層次安排為:

CONV->RELU->DROP,不過其丟棄率p都是選擇的較小數(shù)如0.1,0.2等,個(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都可以跑跑,有可能能提升性能。

17. 初始化權(quán)值不能初始化為全0

這個(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。

18. 別忘了你的偏置

這個(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)大于測(cè)試準(zhǔn)確率

有些時(shí)候,你發(fā)現(xiàn)你的驗(yàn)證集準(zhǔn)確率遠(yuǎn)大于測(cè)試集的準(zhǔn)確率,在排除了代碼問題和操作問題之后,其實(shí)也可能是因?yàn)橛?xùn)練集和測(cè)試集劃分的問題。一般來說,你的驗(yàn)證集是從訓(xùn)練集中劃分出來的[23],因此你的驗(yàn)證集和訓(xùn)練集可以視為是同分布的,但是并不能確保你的訓(xùn)練集和測(cè)試集是同分布的,如果訓(xùn)練集和測(cè)試集的分布差的比較大,就可能出現(xiàn)這種情況。這個(gè)時(shí)候,可以考慮遷移學(xué)習(xí)中的一些方法。

20. KL散度出現(xiàn)負(fù)數(shù)

Kullback–Leibler散度,簡(jiǎn)稱KL散度[24],也稱為相對(duì)熵,是一種用于度量?jī)蓚€(gè)分布之間相似性的常用手段,公式如(20.1),其中第二行形式的變形描述了相對(duì)熵的特性。

我們注意到KL散度是不可能為負(fù)數(shù)的,其中P,Q是定義在同一個(gè)概率空間[25]里面的同型的分布,維度相同。從相對(duì)熵的定義來看,這個(gè)公式描述了用分布Q去近似P所造成的不一致性的程度。在深度學(xué)習(xí)和機(jī)器學(xué)習(xí)中,一般是用來描述兩個(gè)維度相同的概率分布之間的相似度。注意到,這里的P,Q 都是概率分布,因此是需要經(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]。

Reference

[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ú)熱編碼

[3]. 曲線擬合問題與L2正則

[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

[10]. tf.clip_by_value

[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?

[21]. L1正則 

[22]. 《深度學(xué)習(xí)系列》反向傳播算法的公式推導(dǎo)

[23]. 訓(xùn)練集,測(cè)試集,檢驗(yàn)集的區(qū)別與交叉檢驗(yàn)

[24]. Kullback–Leibler divergence

[25]. Probability space

[26]. 如何理解K-L散度(相對(duì)熵)

[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.fast.ai/t/rethin...

未完待續(xù),敬請(qǐng)期待?。。?/p>

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 4
收藏 3
關(guān)注 52
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧