吴恩达老师深度学习视频课笔记:深度学习的实用层面
????????訓(xùn)練、驗(yàn)證和測(cè)試數(shù)據(jù)集(training、development and test sets):訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),我們需要作出很多決策,如神經(jīng)網(wǎng)絡(luò)分多少層(layers)、每層含有多少個(gè)隱藏層單元(hidden units)、學(xué)習(xí)率(learning rates)、各層采用哪些激活函數(shù)(activation functions)等。開(kāi)始一個(gè)新應(yīng)用時(shí),我們不可能從一開(kāi)始就準(zhǔn)確預(yù)測(cè)出這些信息和其它的超參數(shù)。實(shí)際上,應(yīng)用型機(jī)器學(xué)習(xí)是一個(gè)高度迭代的過(guò)程。通常在項(xiàng)目啟動(dòng)時(shí),我們會(huì)先有一個(gè)初步想法,比如構(gòu)建一個(gè)含有特定層數(shù)(certain number of layers)、特定隱藏層單元數(shù)量、特定數(shù)據(jù)集的神經(jīng)網(wǎng)絡(luò)。然后編碼并嘗試運(yùn)行這些代碼。通過(guò)運(yùn)行和實(shí)驗(yàn),你得到該神經(jīng)網(wǎng)絡(luò)結(jié)果,告知你設(shè)置這些配置信息后的運(yùn)行結(jié)果是怎樣的。然后基于輸出結(jié)果,重新完善你的想法、改變策略,或者為了找到更好的神經(jīng)網(wǎng)絡(luò)不斷迭代更新自己的方案。
????????我們通常會(huì)把數(shù)據(jù)集分為三部分:一部分作為訓(xùn)練集(training set);一部分作為交叉驗(yàn)證集(hold-out cross validation set),有時(shí)也稱為驗(yàn)證集(development set);一部分作為測(cè)試集(test set)。首先,對(duì)訓(xùn)練集執(zhí)行訓(xùn)練算法,然后通過(guò)驗(yàn)證集選擇最好的模型,最后在測(cè)試集上對(duì)選擇的最終模型進(jìn)行評(píng)估。為了無(wú)偏評(píng)估(unbiased estimate)算法的狀態(tài),在機(jī)器學(xué)習(xí)發(fā)展的小數(shù)據(jù)量時(shí)代,常見(jiàn)的做法是將數(shù)據(jù)集七三分,即70%作為訓(xùn)練集,30%作為測(cè)試集;如果有驗(yàn)證集,則60%作為訓(xùn)練集,20%作為驗(yàn)證集,20%作為測(cè)試集。如果數(shù)據(jù)集僅有100、1000或10000,按上述比例劃分是非常合理的。但是在大數(shù)據(jù)時(shí)代,數(shù)據(jù)量可能是百萬(wàn)級(jí)別,或更大,那么驗(yàn)證集和測(cè)試集占數(shù)據(jù)總量的比例會(huì)趨向于變得更小。驗(yàn)證集的目的就是驗(yàn)證不同的算法,校驗(yàn)?zāi)姆N算法更有效,因此驗(yàn)證集要足夠大才能評(píng)估。通過(guò)驗(yàn)證集可以選擇幾種較好的算法,最后通過(guò)測(cè)試集選擇最終的算法。測(cè)試集的主要目的是評(píng)估算法的效果。在訓(xùn)練模型時(shí),要保證驗(yàn)證集和測(cè)試集的數(shù)據(jù)來(lái)自同一分布。有時(shí)沒(méi)有測(cè)試集也是可以的,因?yàn)闇y(cè)試集的主要目的是對(duì)所選定的神經(jīng)網(wǎng)絡(luò)做出無(wú)偏評(píng)估(unbiased estimate)。如果不需要無(wú)偏評(píng)估也可以不設(shè)置測(cè)試集。在機(jī)器學(xué)習(xí)中,如果只有一個(gè)訓(xùn)練集和一個(gè)驗(yàn)證集而沒(méi)有測(cè)試集,在這種情況下,人們經(jīng)常將訓(xùn)練集稱為訓(xùn)練集,而把驗(yàn)證集稱為測(cè)試集。
????????偏差(bias)/方差(variance):高偏差我們稱為欠擬合(underfitting),高方差稱為過(guò)擬合(overfitting)。理解偏差和方差的兩個(gè)關(guān)鍵是訓(xùn)練集誤差(train set error)和驗(yàn)證集誤差(development set error)。
????????通過(guò)查看訓(xùn)練集誤差和驗(yàn)證集誤差,我們便可以判斷出現(xiàn)有算法是否具有高方差,高偏差,如下圖。假設(shè):(1)、訓(xùn)練集誤差為1%,驗(yàn)證集誤差為11%,此種情況屬于高方差;(2)、訓(xùn)練集誤差為15%,驗(yàn)證集誤差為16%,此種情況屬于高偏差;(3)、訓(xùn)練集誤差為15%,驗(yàn)證集誤差為30%,此種情況屬于高偏差、高方差;(4)、訓(xùn)練集誤差為0.5%,驗(yàn)證集誤差為1%,此種情況正常,屬于低偏差、低方差。注:以上假設(shè)的前提是:基于最優(yōu)誤差(optimal error)或貝葉斯誤差(Bayes error)接近0%,即人眼辨別的錯(cuò)誤率接近0%,且訓(xùn)練集和驗(yàn)證集數(shù)據(jù)來(lái)自相同分布。
????????當(dāng)我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時(shí)用到的基本方法(basic recipe)是判斷算法偏差或方差是否偏高。初始模型訓(xùn)練完成后,我們首先要判斷算法的偏差高不高,如果偏差過(guò)高,甚至無(wú)法擬合數(shù)據(jù)集,就需要試圖選擇(pick)一個(gè)新網(wǎng)絡(luò),比如含有更多隱藏層或者隱藏單元的網(wǎng)絡(luò),或者花費(fèi)更多的時(shí)間來(lái)訓(xùn)練網(wǎng)絡(luò),或者嘗試更先進(jìn)(more advanced)的優(yōu)化算法或者嘗試其它不同的神經(jīng)網(wǎng)絡(luò)架構(gòu)(neural network architectures)。一般采用更大規(guī)模的網(wǎng)絡(luò)會(huì)有所幫助。反復(fù)嘗試,直到擬合數(shù)據(jù)為止。一旦偏差降低到可接受的數(shù)值,然后檢查方差是否正常。如果方差高,最好的解決辦法是采用更多的數(shù)據(jù)。如果無(wú)法獲得更多數(shù)據(jù),我們也可以嘗試通過(guò)正則化(regularization)來(lái)減少過(guò)擬合。有時(shí)為了能夠找到更合適的神經(jīng)網(wǎng)絡(luò)架構(gòu),我們不得不反復(fù)嘗試,直到找到一個(gè)低偏差和低方差的架構(gòu)。
????????有兩點(diǎn)需要注意:第一:高偏差和高方差是兩種不同的情況,通常會(huì)用訓(xùn)練集、驗(yàn)證集來(lái)診斷算法是否存在偏差或方差問(wèn)題;要清楚存在問(wèn)題的是偏差還是方差,還是兩者都有問(wèn)題。第二:只要持續(xù)訓(xùn)練一個(gè)更大的網(wǎng)絡(luò),準(zhǔn)備更多的數(shù)據(jù),就可以減少偏差或方差,而不影響另一方,也不用太過(guò)于關(guān)注如何平衡偏差和方差。
????????正則化(regularization):解決高方差(過(guò)度擬合)一般有兩種方法,一個(gè)是正則化,一個(gè)是準(zhǔn)備更多數(shù)據(jù)。正則化是一種非常實(shí)用的減少方差的方法。
????????L1范數(shù)正則化、L2范數(shù)正則化。λ是正則化參數(shù),通常用驗(yàn)證集來(lái)配置這個(gè)參數(shù)。L2范數(shù)正則化也被稱為權(quán)重衰減(weight decay)。在神經(jīng)網(wǎng)絡(luò)中,L2范數(shù)一般被稱為弗羅貝尼烏斯范數(shù)(frobenius norm),如下圖。
????????為了調(diào)試梯度下降,務(wù)必使用帶有正則化的J函數(shù)(成本函數(shù)),它可以保證在所有調(diào)幅范圍內(nèi)單調(diào)遞減。
????????Dropout正則化:直觀上,dropout可以隨機(jī)刪除(knocking out)網(wǎng)絡(luò)中的神經(jīng)單元,好像每次迭代之后,神經(jīng)網(wǎng)絡(luò)都會(huì)變得比之前更小。dropout可以采用inverted dropout方法,其有一個(gè)參數(shù)為keep_prob,如果你擔(dān)心某些層比其它層更容易發(fā)生過(guò)擬合,可以把某些層的keep_prob值設(shè)置的比其它層更低。也可以有些層應(yīng)用dropout,而有些層不使用dropout。應(yīng)用dropout,只含有一個(gè)超參即keep_prob。dropout的一大缺點(diǎn)就是成本函數(shù)J不再被明確定義,因?yàn)槊看蔚紩?huì)隨機(jī)移除一些節(jié)點(diǎn)。
????????其它幾種減少神經(jīng)網(wǎng)絡(luò)過(guò)擬合的方法:(1)、訓(xùn)練數(shù)據(jù)擴(kuò)增(dataaugmentation):水平翻轉(zhuǎn)原有圖像、隨意裁剪原有圖像、旋轉(zhuǎn)并隨機(jī)縮放原有圖像等增加額外假(fake)訓(xùn)練數(shù)據(jù),這樣可以不用增加額外的花費(fèi),代價(jià)幾乎為0。(2)、early stopping:提早停止訓(xùn)練神經(jīng)網(wǎng)絡(luò),因?yàn)轵?yàn)證集誤差通常會(huì)先呈下降趨勢(shì),然后在某個(gè)節(jié)點(diǎn)處開(kāi)始上升,在此節(jié)點(diǎn)處停止訓(xùn)練神經(jīng)網(wǎng)絡(luò)。
????????加速訓(xùn)練的方法:歸一化輸入(normalize your inputs)。歸一化輸入需要兩個(gè)步驟:第一:零均值化(subtract out or to zero out the mean);第二:歸一化方差(normalizethe variances);如下圖。
????????需要用同樣的方法調(diào)整測(cè)試集,我們希望不論是在訓(xùn)練數(shù)據(jù)還是在測(cè)試數(shù)據(jù)都是通過(guò)相同的μ和σ2,其中μ和σ2是由訓(xùn)練集數(shù)據(jù)計(jì)算得來(lái)的。歸一化輸入的原因:應(yīng)用梯度下降法,使學(xué)習(xí)算法運(yùn)行的更快,可以更快地找到最小值,更容易優(yōu)化,如下圖。如果輸入特征處于不同范圍內(nèi),可能有些特征值從0到1,有些從1到1000,那么歸一化特征值就非常重要。如果特征值處于相似范圍內(nèi),那么歸一化就不是很重要了。
????????梯度消失與梯度爆炸(vanishing/exploding gradients):當(dāng)你訓(xùn)練深度網(wǎng)絡(luò)時(shí),導(dǎo)數(shù)或坡度(slope)有時(shí)會(huì)變得非常大或非常小,這加大了訓(xùn)練的難度,明智地選擇隨機(jī)初始化權(quán)重可以避免這個(gè)問(wèn)題,即設(shè)置的權(quán)重矩陣,既不會(huì)增長(zhǎng)過(guò)快,也不會(huì)太快下降到0。
????????梯度的數(shù)值逼近(numerical approximation of gradients):在實(shí)施back propagation時(shí),有一個(gè)測(cè)試叫梯度校驗(yàn)(gradient checking),它的作用是確保back propagation正確實(shí)施,可以使用雙邊誤差(two sided difference),如下圖:
????? ? GitHub:https://github.com/fengbingchun/NN_Test??
總結(jié)
以上是生活随笔為你收集整理的吴恩达老师深度学习视频课笔记:深度学习的实用层面的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Windows7/10上快速搭建Tess
- 下一篇: OpenCV支持中文字符输出实现