【深度学习】2.1深度学习的实用层面
訓(xùn)練/開(kāi)發(fā)/測(cè)試集
訓(xùn)練數(shù)據(jù)中包含訓(xùn)練集、簡(jiǎn)單交叉驗(yàn)證集(也叫驗(yàn)證集)、測(cè)試集。
我們對(duì)訓(xùn)練集執(zhí)行訓(xùn)練算法,通過(guò)驗(yàn)證集選擇最好的模型,經(jīng)過(guò)充分驗(yàn)證,選定最終模型,然后就可以在測(cè)試集上進(jìn)行評(píng)估了。為了無(wú)偏評(píng)估算法的運(yùn)行狀況,在機(jī)器學(xué)習(xí)發(fā)展的小數(shù)據(jù)量時(shí)代,通常將所有數(shù)據(jù)三七分,也就是70%驗(yàn)證集,30%測(cè)試集。如果沒(méi)有明確設(shè)置驗(yàn)證集,也可以按照60%訓(xùn)練集、20%驗(yàn)證集和20%測(cè)試集來(lái)劃分。但在大數(shù)據(jù)時(shí)代,數(shù)據(jù)量可能是百萬(wàn)級(jí)別,那么驗(yàn)證集和測(cè)試集占數(shù)據(jù)總量的比例會(huì)趨向于變得更小。因?yàn)轵?yàn)證集的目的就是驗(yàn)證不同的算法,檢驗(yàn)?zāi)姆N算法更有效,因此驗(yàn)證集要足夠大才能評(píng)估;測(cè)試集的主要目的是正確評(píng)估分類器的性能。假如有100萬(wàn)條數(shù)據(jù),其中1萬(wàn)條作驗(yàn)證集,1萬(wàn)條作測(cè)試集即可,即訓(xùn)練集占98%、驗(yàn)證集和測(cè)試集各占1%。對(duì)于數(shù)據(jù)量過(guò)百萬(wàn)的應(yīng)用,訓(xùn)練集可以達(dá)到99.5%,驗(yàn)證集和測(cè)試集各占0.25%或者測(cè)試集占0.4%、測(cè)試集占0.1%。
不管哪種劃分,一定要確保驗(yàn)證集和測(cè)試集的數(shù)據(jù)來(lái)自同一分布。因?yàn)橐抿?yàn)證集來(lái)評(píng)估不同的模型,盡可能地優(yōu)化性能,但由于深度學(xué)習(xí)算法需要大量的訓(xùn)練數(shù)據(jù),為了獲取更大規(guī)模的訓(xùn)練數(shù)據(jù)集,可以采用當(dāng)前流行的各種創(chuàng)意策略,例如網(wǎng)頁(yè)抓取,代價(jià)就是訓(xùn)練集數(shù)據(jù)與驗(yàn)證集和測(cè)試集數(shù)據(jù)有可能不是來(lái)自同一分布。但只要遵循這個(gè)經(jīng)驗(yàn)法則,機(jī)器學(xué)習(xí)算法會(huì)變得更快。
最后一點(diǎn),就算沒(méi)有測(cè)試集也沒(méi)關(guān)系,測(cè)試集的目的是對(duì)最終所選定的神經(jīng)網(wǎng)絡(luò)系統(tǒng)做出無(wú)偏評(píng)估。如果不需要無(wú)偏評(píng)估,也可以不設(shè)置測(cè)試集。所以如果只有驗(yàn)證集,沒(méi)有測(cè)試集,要做的就是在訓(xùn)練集上訓(xùn)練,嘗試不同的模型框架,在驗(yàn)證集上評(píng)估這些模型,然后迭代并選出適用的模型。因?yàn)轵?yàn)證集中已經(jīng)涵蓋測(cè)試集數(shù)據(jù),所以它不再提供無(wú)偏性能評(píng)估。
在機(jī)器學(xué)習(xí)中,如果只有一個(gè)訓(xùn)練集和一個(gè)驗(yàn)證集,而沒(méi)有獨(dú)立的測(cè)試集,那么訓(xùn)練集仍被稱為訓(xùn)練集,但驗(yàn)證集被稱為測(cè)試集。
總結(jié)一下, 搭建訓(xùn)練集、驗(yàn)證集和測(cè)試集能夠加速神經(jīng)網(wǎng)絡(luò)的集成,也可以更有效地衡量算法的偏差和方差,從而幫助我們更高效地選擇合適的方法來(lái)優(yōu)化算法。
偏差/方差
如果給一個(gè)數(shù)據(jù)集擬合一條直線,可能得到一個(gè)邏輯回歸擬合,但它并不能很好地?cái)M合該數(shù)據(jù)集,這是偏差高的情況,也稱為“欠擬合”。
如果擬合一個(gè)非常復(fù)雜的分類器,比如深度神經(jīng)網(wǎng)絡(luò)或含有隱藏單元的神經(jīng)網(wǎng)絡(luò),但分類器方差較高,數(shù)據(jù)過(guò)度擬合,稱為“過(guò)擬合”。
在這兩者之間,有一種復(fù)雜程度適中,數(shù)據(jù)擬合適度的分類器,稱為“適度擬合”。
在一個(gè)只有x1和x2兩個(gè)特征的二維數(shù)據(jù)集中,可以繪制數(shù)據(jù),將偏差和方差可視化。在多維空間數(shù)據(jù)中,繪制數(shù)據(jù)和可視化分割邊界無(wú)法實(shí)現(xiàn),但可以通過(guò)幾個(gè)指標(biāo)來(lái)研究偏差和方差。
沿用貓咪分類的例子,左邊的是貓咪,右邊的圖不是:
理解偏差和方差的兩個(gè)關(guān)鍵數(shù)據(jù)是訓(xùn)練集誤差和驗(yàn)證集誤差。舉幾個(gè)例子:
1.
假設(shè)我們可以辨別圖片中的小貓,訓(xùn)練集錯(cuò)誤率是1%,驗(yàn)證集錯(cuò)誤率是11%。可以看出,訓(xùn)練集設(shè)置得非常好,而驗(yàn)證集設(shè)置相對(duì)較差。這可能是因?yàn)槲覀冞^(guò)度擬合了訓(xùn)練集,某種程度上,驗(yàn)證集并沒(méi)有充分利用交叉驗(yàn)證集的作用。我們稱這種情況為“高方差”。通過(guò)訓(xùn)練集誤差和驗(yàn)證集誤差,便可以判斷算法是否具有高方差。
2.
假設(shè)訓(xùn)練集錯(cuò)誤率是15%,驗(yàn)證集錯(cuò)誤率是16%,該案例中人的錯(cuò)誤率幾乎為0%(人們?yōu)g覽這些圖片可以分辨出是不是貓),算法并沒(méi)有在訓(xùn)練集中得到很好訓(xùn)練,如果訓(xùn)練數(shù)據(jù)的擬合度不高,就是數(shù)據(jù)欠擬合,就可以說(shuō)這種算法偏差比較高。相反,它對(duì)于驗(yàn)證集產(chǎn)生的結(jié)果卻是合理的,驗(yàn)證集中的錯(cuò)誤率只比訓(xùn)練集的多了1%,所以這種算法偏差高,因?yàn)樗踔敛荒軘M合訓(xùn)練集。
3.
假設(shè)訓(xùn)練集錯(cuò)誤率是15%(偏差相當(dāng)高),但驗(yàn)證集的評(píng)估結(jié)果更糟糕,驗(yàn)證集錯(cuò)誤率是30%。我們會(huì)認(rèn)為這種算法偏差高,因?yàn)樗谟?xùn)練集上結(jié)果不理想;方差也很高;這是方差偏差都很糟糕的情況。
4.
假設(shè)訓(xùn)練集錯(cuò)誤率是0.5%,驗(yàn)證集錯(cuò)誤率是1%,這種情況偏差和方差都很低。
以上這些分析都是基于假設(shè)預(yù)測(cè)的,假設(shè)人眼辨別的錯(cuò)誤率接近0%。一般來(lái)說(shuō),最優(yōu)誤差也被稱為貝葉斯誤差,所以最優(yōu)誤差接近0%。
如果最優(yōu)誤差或貝葉斯誤差非常高,比如15%,那么上面情況2的分類器中,15%的訓(xùn)練集錯(cuò)誤集就是合理的,偏差不高,方差也非常低。
但是,當(dāng)所有分類器都不適用時(shí),如何分析偏差和方差呢?
比如,圖片很模糊,即使是人眼,或者沒(méi)有系統(tǒng)可以準(zhǔn)確無(wú)誤地識(shí)別圖片,這種情況下,最優(yōu)誤差會(huì)更高。那么分析過(guò)程就要有一些改變了。
對(duì)于訓(xùn)練數(shù)據(jù),訓(xùn)練集誤差可以判斷數(shù)據(jù)擬合情況,可以判斷是否有偏差問(wèn)題,然后查看錯(cuò)誤率有多高。當(dāng)完成訓(xùn)練集訓(xùn)練,開(kāi)始驗(yàn)證集驗(yàn)證時(shí),我們可以判斷方差是否過(guò)高。從訓(xùn)練集到驗(yàn)證集的這個(gè)過(guò)程中,可以判斷方差是否過(guò)高。以上分析的前提都是假設(shè)基本誤差很小,訓(xùn)練集和驗(yàn)證集數(shù)據(jù)來(lái)自相同分布。如果沒(méi)有這些假設(shè)作為前提,分析過(guò)程會(huì)更加復(fù)雜,之后會(huì)討論。
機(jī)器學(xué)習(xí)基礎(chǔ)
在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)用到的基本方法為:
初始模型訓(xùn)練完成后,首先要知道算法的偏差高不高。如果偏差較高,試著評(píng)估訓(xùn)練集或訓(xùn)練數(shù)據(jù)的性能;如果偏差的確很高,甚至無(wú)法擬合訓(xùn)練集,那么就需要選擇一個(gè)新網(wǎng)絡(luò),比如含有更多隱層或者隱藏單元的網(wǎng)絡(luò),或者花費(fèi)更多時(shí)間來(lái)訓(xùn)練算法,或者嘗試更先進(jìn)的優(yōu)化算法。訓(xùn)練學(xué)習(xí)算法時(shí),需要不斷嘗試這些方法,反復(fù)嘗試,直到解決掉偏差問(wèn)題可以擬合數(shù)據(jù)為止,這是最低標(biāo)準(zhǔn)。
如果網(wǎng)絡(luò)足夠大,只要能擴(kuò)大網(wǎng)絡(luò)規(guī)模,通常可以很好的擬合訓(xùn)練集。
一旦偏差降低到可接受的數(shù)值,就需要去檢查一下方差有沒(méi)有什么問(wèn)題。為了評(píng)估方差,需要查看驗(yàn)證集性能。一個(gè)性能理想的訓(xùn)練集就能推出驗(yàn)證集的性能也理想嗎?如果方差高,最好的方法就是采取很多數(shù)據(jù)。但有時(shí)無(wú)法獲得更多數(shù)據(jù),那么就可以嘗試通過(guò)正則化來(lái)減少過(guò)擬合。但是如果能找到更合適的神經(jīng)網(wǎng)絡(luò)框架,就有可能同時(shí)減少偏差和方差。
總之就是不斷嘗試,直到找到一個(gè)低偏差、低方差的框架。
其中,需要注意以下兩點(diǎn):
1.
高偏差和高方差是兩種不同的情況,后續(xù)要嘗試的方法也可能完全不同。通常用訓(xùn)練驗(yàn)證集來(lái)判斷算法是否存在偏差或方差問(wèn)題,然后根據(jù)結(jié)果選擇嘗試部分方法。比如,若算法存在高方差問(wèn)題,可以準(zhǔn)備更多訓(xùn)練數(shù)據(jù);若算法存在高偏差問(wèn)題,準(zhǔn)備更多數(shù)據(jù)可能用處不大。
2.
在機(jī)器學(xué)習(xí)的初期階段,關(guān)于所謂的偏差方差權(quán)衡的探討屢見(jiàn)不鮮。因?yàn)槲覀兡車L試的方法很多,但在初期,我們很難只減少偏差或方差卻不影響到另外一方。但在當(dāng)前的深度學(xué)習(xí)和大數(shù)據(jù)時(shí)代,只要持續(xù)訓(xùn)練一個(gè)更大的網(wǎng)絡(luò),只要準(zhǔn)備了更多數(shù)據(jù),那么只要正則適度,通常構(gòu)建一個(gè)更大的網(wǎng)絡(luò)就可以在不影響方差的同時(shí)減少偏差;而采用更多數(shù)據(jù)通常可以在不過(guò)多影響偏差的同時(shí)減少方差。這兩步實(shí)際要做的工作就是訓(xùn)練網(wǎng)絡(luò),選擇網(wǎng)絡(luò)或者準(zhǔn)備更多數(shù)據(jù)。
正則化
如果神經(jīng)網(wǎng)絡(luò)過(guò)度擬合了數(shù)據(jù),即存在高方差問(wèn)題,那么正則化是一個(gè)很有效的方法;另一個(gè)解決高方差的方法就是準(zhǔn)備更多數(shù)據(jù),這也是非常可靠的方法。正則化是一種非常實(shí)用的減少方差的方法,通常有助于避免過(guò)度擬合或減少網(wǎng)絡(luò)誤差。正則化時(shí)會(huì)出現(xiàn)偏差方差權(quán)衡問(wèn)題,偏差可能略有增加,如果網(wǎng)絡(luò)足夠大,增幅通常不會(huì)太高。
L2正則化、L1正則化。
如果用的是L1正則化,W最終會(huì)是稀疏的,也就是說(shuō)W向量中有很多0,這其實(shí)并沒(méi)有降低太多存儲(chǔ)內(nèi)存。更常用的是L2正則化。
λ是正則化參數(shù),通常使用驗(yàn)證集或交叉驗(yàn)證來(lái)配置這個(gè)參數(shù)。在python編程語(yǔ)言中,λ(lambda)是一個(gè)保留字段,因此我們將正則化參數(shù)寫為lambd,以免與python中的保留字段沖突。
如何在神經(jīng)網(wǎng)絡(luò)中實(shí)現(xiàn)L2正則化呢?
神經(jīng)網(wǎng)絡(luò)含有一個(gè)成本函數(shù),該函數(shù)中包含從w[1]、b[1]到w[L]、b[L]所有參數(shù),其中L表示神經(jīng)網(wǎng)絡(luò)所含的層數(shù)。因此成本函數(shù)等于損失總和乘以訓(xùn)練數(shù)據(jù)m的總和,正則項(xiàng)為λ/2m乘以參數(shù)矩陣W的總和。稱||W[l]||2為范數(shù)平方。這個(gè)矩陣范數(shù)(即平方范數(shù))被定義為矩陣中所有元素的平方和,也被叫做**“弗羅貝尼烏斯范數(shù)”**,用下表F標(biāo)注。
L2正則化有時(shí)也被稱為“權(quán)重衰退”,因?yàn)樗拖褚话愕奶荻认陆?#xff0c;w被更新為少了α乘以backprop輸出的最初梯度值,同時(shí)w也乘以了這個(gè)小于1的系數(shù)。
為什么正則化可以減少過(guò)擬合?
在增加正則化項(xiàng)時(shí),應(yīng)用之前定義的代價(jià)函數(shù)J,增加了一項(xiàng)是為了預(yù)防權(quán)重過(guò)大。如果使用梯度下降函數(shù),在調(diào)試梯度下降時(shí),其中一步就是把代價(jià)函數(shù)J設(shè)計(jì)成對(duì)于梯度下降的每個(gè)調(diào)幅都單調(diào)遞減的函數(shù);如果使用正規(guī)化函數(shù),此時(shí)J已經(jīng)有了新的定義(多了一項(xiàng)),若再使用原函數(shù)J,也就是第一個(gè)正則化項(xiàng),缺少第二個(gè)正則化項(xiàng)時(shí),可能看不到單調(diào)遞減的現(xiàn)象了。
總之,L2正則化是訓(xùn)練深度學(xué)習(xí)模型時(shí)最常用的一種方法。
Dropout正則化
它也是一個(gè)非常實(shí)用的正則化方法,dropout意為隨機(jī)失活。
假設(shè)在訓(xùn)練下圖這樣的神經(jīng)網(wǎng)絡(luò),它存在過(guò)擬合,這就是Dropout正則化需要處理的。
首先復(fù)制這個(gè)神經(jīng)網(wǎng)絡(luò),dropout會(huì)遍歷網(wǎng)絡(luò)的每一層,并設(shè)置消除神經(jīng)網(wǎng)絡(luò)中節(jié)點(diǎn)的概率。假設(shè)網(wǎng)絡(luò)中的每一層每個(gè)節(jié)點(diǎn)都以拋硬幣的方式設(shè)置概率,那么每個(gè)節(jié)點(diǎn)得以保留和消除的概率都是0.5,設(shè)置完節(jié)點(diǎn)概率,就會(huì)消除一些節(jié)點(diǎn)。
然后刪掉從該節(jié)點(diǎn)進(jìn)出的連線,最后得到一個(gè)節(jié)點(diǎn)更小、規(guī)模更小的網(wǎng)絡(luò)。
然后用backprop方法進(jìn)行訓(xùn)練,這是網(wǎng)絡(luò)節(jié)點(diǎn)精簡(jiǎn)后的一個(gè)樣本。對(duì)于其他樣本,照舊以拋硬幣的方式設(shè)置概率,保留一類節(jié)點(diǎn)集合,刪除其他類型的節(jié)點(diǎn)集合。對(duì)于每個(gè)訓(xùn)練樣本,都將采用一個(gè)精簡(jiǎn)后的神經(jīng)網(wǎng)絡(luò)(neural networks)來(lái)訓(xùn)練他。
不過(guò)針對(duì)每個(gè)樣本訓(xùn)練規(guī)模極小的網(wǎng)絡(luò),正則化就更為重要了。
那么如何實(shí)施dropout呢?
方法有好幾種,最常用的方法為反向隨機(jī)失活(inverted dropout)。用一個(gè)三層(l=3,layer)網(wǎng)絡(luò)來(lái)舉例說(shuō)明:
首先定義向量d:d3表示一個(gè)三層的dropout向量。如果對(duì)a3進(jìn)行因子分解,效果也是一樣的。
keep_prob是一個(gè)具體數(shù)字,在本例中令它為0.8,它表示保留某個(gè)隱藏單元的概率(在最開(kāi)始的示例中這個(gè)數(shù)值為0.5),0.8意為消除任意一個(gè)隱藏單元的概率時(shí)是0.2,它的作用就是生成隨機(jī)矩陣。
l = 3 keep_prob = 0.8#此段代碼應(yīng)在上一段代碼之前d3是一個(gè)矩陣,每個(gè)樣本和每個(gè)隱藏單元其在d3中的對(duì)應(yīng)值為1的概率都是0.8,其對(duì)應(yīng)值為0的概率是0.2。
接下來(lái)要從第三層中獲取激活函數(shù),即a3含有要計(jì)算的激活函數(shù),
a3 = np.multiply(a3, d3)#此處也可寫作a3 *= d3讓a3和d3相乘的作用就是過(guò)濾d3中所有等于0的元素,在python中d3是一個(gè)布爾型數(shù)組,值為true和false,而不是1和0,但乘法運(yùn)算依然有效,python會(huì)自動(dòng)將true和false翻譯為1和0。
最后,向外擴(kuò)展a3,用它除以0.8或者除以keep_prob參數(shù)
a3 /= keep_prob假設(shè)第三隱層上有50個(gè)單元或50個(gè)神經(jīng)元,在一維上a3是50,通過(guò)因子分解將它拆分為50×m維的,保留和刪除它們的概率分別是80%和20%,這意味著最后被刪除或歸零的單元平均有10個(gè),那么z[4] = w[4]a[3] + b[4],我們的預(yù)期是a[3] 減少20%,也就是說(shuō)a[3] 中有20%的元素被歸零。為了不影響z[4]的期望值,需要用w[4]a[3]除以0.8,它將會(huì)修正或彌補(bǔ)我們所需的那20%,a[3]的期望值也不會(huì)變。
a3 /= keep_prob就是所謂的反向dropout方法,它的功能是不論keep_prob的值是多少,0.8、0.9或1(若設(shè)為1,那么就不存在dropout,因?yàn)樗鼤?huì)保留所有節(jié)點(diǎn)),通過(guò)除以0.8,確保a1的期望值不變。
現(xiàn)在我們使用的是d向量,不同的訓(xùn)練樣本,清除的隱藏單元也不同。實(shí)際上,如果通過(guò)相同訓(xùn)練集多次傳遞數(shù)據(jù),每次訓(xùn)練數(shù)據(jù)的梯度不同,那么就會(huì)隨機(jī)對(duì)不同隱藏單元?dú)w零;有時(shí)卻并非如此,比如需要將相同隱藏單元?dú)w零,第一次迭代梯度下降時(shí),把一些隱藏單元?dú)w零,第二次迭代梯度下降時(shí),也就是第二次遍歷訓(xùn)練集時(shí),對(duì)不同類型的隱層單元?dú)w零。向量d或d3用來(lái)決定第三層中哪些單元?dú)w零,無(wú)論用foreprop還是backprop。
在測(cè)試階段,已經(jīng)給出了X,或是想預(yù)測(cè)的變量,用的是標(biāo)準(zhǔn)計(jì)數(shù)法。第0層的激活函數(shù)標(biāo)注為測(cè)試樣本X,a[0] = X。
我們在測(cè)試階段不采用dropout方法,尤其是z[1] = w[1]a[0] + b[1],a[1] = g[1](z[1]),z[2] = w[2]a[1] + b[2],a[2] = g[2](z[2]),…,直到最后一層預(yù)測(cè)值為y hat。
理論上,只需要多次運(yùn)行預(yù)測(cè)處理過(guò)程,每一次不同的隱藏單元會(huì)被隨機(jī)歸零,預(yù)測(cè)處理遍歷它們,但是計(jì)算效率低,得出的結(jié)果也幾乎相同,與這個(gè)不同程序產(chǎn)生的結(jié)果極為相似。反向dropout方法沒(méi)必要在測(cè)試階段額外添加尺度參數(shù),這與訓(xùn)練階段不同。
理解Dropout
dropout的功能類似于L2正則化,不同的是被應(yīng)用的方式不同,dropout也會(huì)有所不同,甚至更適用于不同的輸入范圍。
實(shí)施dropout的另一個(gè)細(xì)節(jié)是要選擇keep_prob參數(shù)的值,并且不同層的keep_prob也可以變化。
對(duì)于上面這個(gè),第一層矩陣w[1]是3×7,第二個(gè)權(quán)重矩陣是7×7,w[3]是7×3,以此類推。這樣,w[2]是最大的權(quán)重矩陣,因?yàn)閣[2]擁有最大參數(shù)集,即7×7。為了預(yù)防矩陣的過(guò)擬合,對(duì)于這一層,即第二層,它的keep_prob值應(yīng)該相對(duì)較低,假設(shè)是0.5(缺點(diǎn)是為了使用交叉驗(yàn)證,需要搜索更多的超級(jí)參數(shù));對(duì)于其它層,過(guò)擬合的程度可能沒(méi)那么嚴(yán)重,它們的keep_prob值可能高一些,假設(shè)是0.7;如果在某一層,不必?fù)?dān)心其過(guò)擬合的問(wèn)題,那么keep_prob可以為1(keep_prob=1意味著保留所有單元,并且不在這一層使用dropout)。對(duì)于有可能出現(xiàn)過(guò)擬合且含有諸多參數(shù)的層,可以把keep_prob值設(shè)置成比較小的值,以便應(yīng)用更強(qiáng)大的dropout。事實(shí)上,也可以對(duì)輸入層使用dropout,但我們一般讓其為1或比較高的值,如0.9。
dropout在計(jì)算機(jī)視覺(jué)領(lǐng)域是很常用的,因?yàn)樵诖祟I(lǐng)域沒(méi)有足夠的數(shù)據(jù),所以一直存在過(guò)擬合,它幾乎成為一種默認(rèn)方法。但是!dropout是一種正則化方法,它有助于預(yù)防過(guò)擬合,因此,除非算法過(guò)擬合,不然是不用使用dropout,所以它在其他領(lǐng)域應(yīng)用的比較少。
dropout的一大缺點(diǎn)就是代價(jià)函數(shù)J不再被明確定義,每次迭代都會(huì)隨機(jī)移除一些節(jié)點(diǎn),且所優(yōu)化的代價(jià)函數(shù)J實(shí)際上并沒(méi)有明確定義,或者說(shuō)在某種程度上很難計(jì)算。
排除dropout的bug的方法就是:先不使用dropout,即令keep_prob值為1,看看代價(jià)函數(shù)J是否是單調(diào)下降的,再去設(shè)置keep_prob值。
其他正則化方法
除了L2正則化和隨機(jī)失活(dropout)正則化,還有幾種方法可以減少神經(jīng)網(wǎng)絡(luò)中的過(guò)擬合。
1.數(shù)據(jù)擴(kuò)增
假設(shè)我們正在擬合貓咪圖片分類器,想要通過(guò)擴(kuò)增訓(xùn)練數(shù)據(jù)來(lái)解決過(guò)擬合,但擴(kuò)增訓(xùn)練數(shù)據(jù)代價(jià)高,而且有時(shí)無(wú)法擴(kuò)增數(shù)據(jù),但可以通過(guò)隨意翻轉(zhuǎn)、裁剪圖片來(lái)增加訓(xùn)練集,額外生成假訓(xùn)練數(shù)據(jù)。雖然訓(xùn)練集有冗余,不如額外收集一組新圖片好,但這樣節(jié)省了獲取更多貓咪圖片的花費(fèi)。
像這樣人工合成數(shù)據(jù)的話,還要通過(guò)算法驗(yàn)證,比如圖片裁剪之后貓還在上面。
對(duì)于光學(xué)字符識(shí)別,可以通過(guò)隨意旋轉(zhuǎn)或扭曲數(shù)字來(lái)擴(kuò)增數(shù)據(jù)。
2.early stopping
運(yùn)行梯度下降時(shí),可以繪制訓(xùn)練誤差或只繪制代價(jià)函數(shù)J的優(yōu)化過(guò)程,在訓(xùn)練集上用0-1記錄分類誤差次數(shù),呈單調(diào)下降趨勢(shì)。通過(guò)early stopping還可繪制驗(yàn)證集誤差,它可以是驗(yàn)證集上的分類誤差,或是驗(yàn)證集上的代價(jià)函數(shù)、邏輯損失和對(duì)數(shù)損失等。
驗(yàn)證集誤差通常會(huì)先呈下降趨勢(shì),然后在某個(gè)節(jié)點(diǎn)處開(kāi)始上升。early stopping的作用就是神經(jīng)網(wǎng)絡(luò)已經(jīng)在這個(gè)迭代過(guò)程中表現(xiàn)得很好了,就在還未上升處停止訓(xùn)練,得到驗(yàn)證集誤差。
其工作原理就是:當(dāng)還未在神經(jīng)網(wǎng)絡(luò)上運(yùn)行太多迭代過(guò)程的時(shí)候,參數(shù)w接近0,因?yàn)殡S機(jī)初始化w值時(shí),它的值可能都是較小的隨機(jī)值。所以在長(zhǎng)期訓(xùn)練神經(jīng)網(wǎng)絡(luò)之前,w依然很小,在迭代過(guò)程和訓(xùn)練過(guò)程中,w的值會(huì)變得越來(lái)越大。當(dāng)神經(jīng)網(wǎng)絡(luò)中參數(shù)w的值已經(jīng)非常大了,early stopping要做的就是在中間點(diǎn)停止迭代過(guò)程,從而得到一個(gè)w值中等大小的佛羅貝尼烏斯范數(shù)。early stopping就表示提早停止訓(xùn)練神經(jīng)網(wǎng)絡(luò)。
機(jī)器學(xué)習(xí)過(guò)程包括的步驟中,其中一步是選擇一個(gè)算法來(lái)優(yōu)化代價(jià)函數(shù)J,可以用梯度下降來(lái)解決這個(gè)問(wèn)題,也可以用momentum算法、RMSprop、Adam等等。但是優(yōu)化代價(jià)函數(shù)J之后,不希望發(fā)生過(guò)擬合,就可以通過(guò)正則化、擴(kuò)增數(shù)據(jù)等方法去解決。在機(jī)器學(xué)習(xí)中,超級(jí)參數(shù)激增,算法的選擇也變得復(fù)雜。如果用一組工具優(yōu)化代價(jià)函數(shù)J ,留意w和b,讓J(w,b)的值越小越好,機(jī)器學(xué)習(xí)就會(huì)變得簡(jiǎn)單。在預(yù)防過(guò)擬合的同時(shí),也要減小方差。在一個(gè)時(shí)間做一個(gè)任務(wù),這個(gè)原理有時(shí)被稱為“正交化”。而early stopping的缺點(diǎn)就是不能獨(dú)立地處理降低方差和預(yù)防過(guò)擬合這兩個(gè)問(wèn)題,因?yàn)樘嵩缤V固荻认陆?#xff0c;也就是停止了優(yōu)化代價(jià)函數(shù)J,所以代價(jià)函數(shù)J可能不是很小,同時(shí)又不希望出現(xiàn)過(guò)擬合。
early stopping的優(yōu)點(diǎn)是只運(yùn)行一次坡度下降,就可以找出w的較小值、中間值和較大值,而無(wú)需像L2正則化那樣,嘗試超級(jí)參數(shù)λ的很多值。
(個(gè)人比較偏向L2正則化,多嘗試一些值,少做一些計(jì)算)
正則化輸入
加速神經(jīng)網(wǎng)絡(luò)訓(xùn)練的方法之一就是歸一化輸入,它需要兩個(gè)步驟,即零均值化和歸一化方差(讓x1、x2…的方差均為1)。然后用同樣的方法調(diào)整測(cè)試集,而不是在訓(xùn)練集和測(cè)試集上分別預(yù)估μ和σ2,因?yàn)橄M?xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)都是通過(guò)相同的μ和σ2定義的相同數(shù)據(jù)轉(zhuǎn)換,其中μ和σ2都是通過(guò)數(shù)據(jù)計(jì)算得到的。
如果輸入特征處于不同范圍內(nèi),可能有些特征值從0到1,有些從1到1000,那么歸一化特征值就非常重要了;如果特征值處于相似范圍內(nèi),那么歸一化就不是很重要了。但執(zhí)行這類歸一化并不會(huì)產(chǎn)生什么危害。
梯度消失與梯度爆炸
當(dāng)訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),導(dǎo)數(shù)或坡度有時(shí)會(huì)變得非常大,或非常小,甚至以指數(shù)方式變小,這會(huì)加大訓(xùn)練的難度。
假設(shè)正在訓(xùn)練這樣一個(gè)極深的神經(jīng)網(wǎng)絡(luò):
假設(shè)使用線性激活函數(shù)g(z),忽略b,那么
y hat= w[L] w[L-1] w[L-2]… w[3] w[2] w[1]X = w[L] w[L-1] w[L-2]… w[3] w[2] z[1] = w[L] w[L-1] w[L-2]… w[3] z[2] = …,其中w[1]X = z[1],a[1] = g(z[1]) = z[1],a[2] = g(z[2]) = g(w[2]a[1])。
假設(shè)每個(gè)權(quán)重矩陣w[l] = [[1.5, 0], [0, 1.5]](比1稍微大一點(diǎn)),那么y hat= w[L][[1.5, 0], [0, 1.5]]L-1X = 1.5L-1X,對(duì)于一個(gè)深度神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),L值較大,那么y hat的值也會(huì)非常大,因此對(duì)于一個(gè)神經(jīng)網(wǎng)絡(luò),y的值將爆炸式增長(zhǎng)。
相反的,如果權(quán)重是0.5,它比1小,該項(xiàng)會(huì)變成0.5L,因此每個(gè)矩陣都小于1,假設(shè)x1、x2都是1,那么激活函數(shù)將變成0.5,0.5,第二層就是0.25…直到最后一項(xiàng)變成1/2L,所以作為自定義函數(shù),激活函數(shù)的值將以指數(shù)級(jí)下降,它是與網(wǎng)絡(luò)層數(shù)量L相關(guān)的函數(shù)。
權(quán)重w[l]只比1大一點(diǎn),或者說(shuō)只比單位矩陣大一點(diǎn),深度神經(jīng)網(wǎng)絡(luò)的激活函數(shù)將爆炸式增長(zhǎng);如果w[l]比1略小一點(diǎn),在深度神經(jīng)網(wǎng)絡(luò)中,激活函數(shù)將以指數(shù)級(jí)遞減。
神經(jīng)網(wǎng)絡(luò)的權(quán)重初始化
針對(duì)梯度消失和梯度爆炸問(wèn)題,提出了一個(gè)不完整的解決辦法,雖然不能徹底解決問(wèn)題,卻有助于為神經(jīng)網(wǎng)絡(luò)更好地選擇隨機(jī)初始化參數(shù)。
先舉一個(gè)神經(jīng)單元權(quán)重初始化的例子,然后再演變到整個(gè)深度網(wǎng)絡(luò)。
只有一個(gè)神經(jīng)元時(shí):
單個(gè)神經(jīng)元可能有4個(gè)輸入特征,從x1到x4,經(jīng)過(guò)a=g(z)處理,最終得到y(tǒng) hat。
z = w1x1 + w2x2 +…+ wnxn ,令b=0,暫時(shí)忽略它。為了預(yù)防z值過(guò)大或過(guò)小,可以看出,n越大,希望 wi越小,最合理的方法就是設(shè)置 wi = 1/n,其中n表示神經(jīng)元的輸入特征數(shù)量。事實(shí)上要做的就是設(shè)置某層權(quán)重矩陣W[l],
W[l] = np.random.randn(shape) * np.sqrt(1/n[l-1])。
如果使用的是Relu激活函數(shù),g[l](z)=Relu(z),那么方差設(shè)置為2/n,而不是1/n效果會(huì)更好。
梯度的數(shù)值逼近
在實(shí)施backprop時(shí),有一個(gè)測(cè)試叫做梯度檢驗(yàn),其作用是確保backprop正確實(shí)施。為了逐漸實(shí)現(xiàn)梯度檢驗(yàn),首先對(duì)計(jì)算梯度做數(shù)值逼近。
較大的三角形(底邊從0.99-1.01)的高寬比值更接近于θ的導(dǎo)數(shù),我們得到的是一個(gè)雙邊公差,而不是單邊公差。
對(duì)于這個(gè)大三角形,右邊式子就是它的高寬比:
g(θ)和大三角形的高寬比非常接近,逼近誤差為0.0001。所以使用雙邊誤差的方法更逼近導(dǎo)數(shù)。
在梯度檢驗(yàn)和反向傳播中使用該方法時(shí),它與運(yùn)行兩次單邊公差的速度一樣,但結(jié)果更準(zhǔn)確,因此還是很值得使用的。
梯度檢驗(yàn)
梯度檢驗(yàn)可以用來(lái)調(diào)試和檢驗(yàn)backprop,非常好用。假設(shè)網(wǎng)絡(luò)中含有參數(shù)W[1]、b[1]、…、W[L]、b[L]。
1.為了執(zhí)行梯度檢驗(yàn),首先需要把所有參數(shù)轉(zhuǎn)換為一個(gè)巨大的向量數(shù)據(jù),也就是把所有矩陣W轉(zhuǎn)換成向量,作連接運(yùn)算,得到一個(gè)巨型向量θ。代價(jià)函數(shù)J則有:J(W[1],b[1],…,W[L],b[L]) = J(θ)。
2.接著可以得到與W和b順序相同的數(shù)據(jù)dW[1], db[1], …, dW[L], db[L]。用他們來(lái)初始化大向量dθ,dθ和θ的維度相同。同樣的,dW[1]也轉(zhuǎn)化成一個(gè)矩陣,且它與W[1]具有相同維度;db[1]與b[1]具有相同維度。經(jīng)過(guò)相同的轉(zhuǎn)換和連接運(yùn)算操作之后,就可以把所有導(dǎo)數(shù)轉(zhuǎn)換成一個(gè)大向量dθ。
3.dθ和代價(jià)函數(shù)J的梯度或坡度的關(guān)系就是實(shí)施梯度檢驗(yàn)(grad check)的過(guò)程。現(xiàn)在J是超級(jí)參數(shù)θ的一個(gè)函數(shù),J(θ) = J(θ1, θ2,…),不論超級(jí)參數(shù)向量θ的維度是多少。為了實(shí)施梯度檢驗(yàn),需要做的就是循環(huán)執(zhí)行,從而對(duì)每個(gè)i,也就是對(duì)每個(gè)θ組成元素,使用雙邊誤差計(jì)算dθapprox[i] = [J(θ1, θ2, … , θi+ε, …) - J(θ1, θ2, … , θi-ε, …)] / 2ε,只對(duì)θi加減ε,其他項(xiàng)保持不變。這個(gè)值應(yīng)該逼近dθ[i] = δJ/ δθi ,對(duì)i的每個(gè)值都執(zhí)行這個(gè)運(yùn)算。
4.最后得到兩個(gè)向量dθapprox和dθ,它們具有相同的維度,需要我們驗(yàn)證它們是否接近。
計(jì)算這兩個(gè)向量的距離(歐幾里得范數(shù))||dθapprox - dθ||2,即誤差平方之和,然后求平方根,得到歐式距離。
然后用向量長(zhǎng)度做歸一化,結(jié)果為||dθapprox - dθ||2 / [||dθapprox||2 + ||dθ||2],分母是用于預(yù)防這些向量太小或太大,分母使這個(gè)方程式變成比率。如果我們使用的ε為10-7,算出來(lái)的這個(gè)值小于或接近10-7,那么導(dǎo)數(shù)逼近就很有可能是正確的;如果算出來(lái)的值接近10-5,就需要注意了,也許這個(gè)值沒(méi)問(wèn)題,但還需要再次檢查這個(gè)向量的所有項(xiàng),確保沒(méi)有一項(xiàng)誤差過(guò)大,否則可能有bug;如果算出來(lái)是10-3,就需要很擔(dān)心是否存在bug了,計(jì)算結(jié)果應(yīng)該比10-3小很多才對(duì),應(yīng)檢查所有的θ項(xiàng),看是否有一個(gè)具體的i值,使得dθapprox和dθ大不相同,并用它來(lái)追蹤一些求導(dǎo)計(jì)算是否正確。
關(guān)于梯度檢驗(yàn)實(shí)現(xiàn)的注記
因此dropout可作為優(yōu)化代價(jià)函數(shù)J的一種方法,但是代價(jià)函數(shù)J被定義為對(duì)所有指數(shù)極大的節(jié)點(diǎn)自己求和,而在任何迭代過(guò)程中,這些節(jié)點(diǎn)都有可能被消除,所以很難計(jì)算代價(jià)函數(shù)J。
3 ??
總結(jié)
以上是生活随笔為你收集整理的【深度学习】2.1深度学习的实用层面的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 金山词霸使用牛津词典取词的笨方法
- 下一篇: OC load 和 initialize