深度學(xué)習(xí)和機(jī)器學(xué)習(xí)深度的不同之處 淺談深度學(xué)習(xí)的訓(xùn)練和調(diào)參
掃描二維碼
隨時(shí)隨地手機(jī)看文章
近年來(lái),深度學(xué)習(xí)作為機(jī)器學(xué)習(xí)中比較火的一種方法出現(xiàn)在我們面前,但是和非深度學(xué)習(xí)的機(jī)器學(xué)習(xí)相比(我將深度學(xué)習(xí)歸于機(jī)器學(xué)習(xí)的領(lǐng)域內(nèi)),還存在著幾點(diǎn)很大的不同,具體來(lái)說(shuō),有以下幾點(diǎn):
1、深度學(xué)習(xí),顧名思義,網(wǎng)絡(luò)變深了,這就意味著這種深度學(xué)習(xí)類的網(wǎng)絡(luò)可能有更多的layers,這意味著什么呢?也即表示這種深層的網(wǎng)絡(luò)需要學(xué)習(xí)更多的參數(shù),盡管我們知道在CNN中有共享參數(shù)等等技巧,但在此前提下,不妨認(rèn)為隨著網(wǎng)絡(luò)層數(shù)的增多,需要學(xué)習(xí)的參數(shù)也在增加,那問(wèn)題又來(lái)了,參數(shù)增加有什么問(wèn)題嗎?當(dāng)然有問(wèn)題,這是我們?cè)跈C(jī)器學(xué)習(xí)領(lǐng)域內(nèi)探討的最多的一個(gè)問(wèn)題,因?yàn)槲覀兊哪康亩际菫榱藴p少泛化誤差,提高模型的泛化能力,而在這一點(diǎn),顯然深度學(xué)習(xí)比一般意義的機(jī)器學(xué)習(xí)模型要復(fù)雜,復(fù)雜的模型訓(xùn)練不當(dāng),我們知道的,模型的泛化能力會(huì)顯著下降。
2、深度學(xué)習(xí)比一般意義的機(jī)器學(xué)習(xí)模型要復(fù)雜,不僅表現(xiàn)在上一點(diǎn)的模型本身(指的是layers和parameters),也表現(xiàn)在不同的工作原理上。深度學(xué)習(xí)不再需要人工設(shè)計(jì)指定的特征,分類的特征是模型自己去學(xué)到的,這一點(diǎn)上意味著深度學(xué)習(xí)需要有更多的data,這又是和一般意義上的機(jī)器學(xué)習(xí)有所區(qū)別的。舉個(gè)例子,同樣是識(shí)別車輛,Haar-like+Adaboost可能只需要2-3k訓(xùn)練集,但對(duì)于深度學(xué)習(xí)來(lái)說(shuō),可能需要20-30k的數(shù)據(jù)集,當(dāng)然這么多的data本身是和模型相匹配的,但是在一般意義上,不妨認(rèn)為深度學(xué)習(xí)需要更多的data(本文不探討大數(shù)據(jù)和深度學(xué)習(xí)(人工智能)的關(guān)系,只在一般意義上做出說(shuō)明)。
綜上所述,其實(shí)我們已經(jīng)認(rèn)識(shí)到了深度學(xué)習(xí)的本質(zhì),其實(shí)很簡(jiǎn)單,就是數(shù)據(jù)和模型,兩者之間相輔相成,相互促進(jìn)。認(rèn)識(shí)到了深度學(xué)習(xí)的本質(zhì)和與一般意義上的機(jī)器學(xué)習(xí)的區(qū)別,你才能明白調(diào)參和訓(xùn)練的技巧和建議對(duì)于深度學(xué)習(xí)而言是多么的重要,毫不夸張的說(shuō),直接影響到我們剛剛談到的模型的泛化能力,而且是根本原因。
從我們準(zhǔn)備數(shù)據(jù)集到訓(xùn)練到理想的模型的過(guò)程順序,我們把其分成如下幾個(gè)部分分別敘述。
1、Data augmentaTIon(數(shù)據(jù)增強(qiáng))。
個(gè)人理解數(shù)據(jù)增強(qiáng)主要是在準(zhǔn)備數(shù)據(jù)集時(shí),由于需要的data較多又得不到滿足,則可以通過(guò)對(duì)顏色(color)、尺度(scale)、裁剪(crop)、翻轉(zhuǎn)(Flip)、添加噪聲(Noise)、旋轉(zhuǎn)(RotaTIon)等等,這樣就增加了數(shù)據(jù)集的數(shù)目,解決的是data不足的問(wèn)題,近幾年GAN模型的研究也取得了較大的發(fā)展,其主要的出發(fā)點(diǎn)就是解決了監(jiān)督學(xué)習(xí)data不足的問(wèn)題,經(jīng)??捎糜谔摂M場(chǎng)景的仿真等等,感興趣的可以深入研究。
2、Pre-processing(數(shù)據(jù)預(yù)處理)。
個(gè)人理解的是有了數(shù)據(jù)之后,難道就一定能很好的利用這些數(shù)據(jù)嗎?如何評(píng)價(jià)這些數(shù)據(jù)的好壞?那要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,預(yù)處理的前提是要正確的理解數(shù)據(jù)。數(shù)據(jù)之間存在相關(guān)性嗎?假設(shè)你用了data augmentaTIon,那顯然數(shù)據(jù)集之間的相關(guān)性是較大的,說(shuō)直白點(diǎn),你用了兩張一模一樣的數(shù)據(jù)在訓(xùn)練集里,意義何在?所以接下來(lái)要講的數(shù)據(jù)預(yù)處理很重要。常用的方法有:normalizaTIon(歸一化)、PCA(主成分分析)、Whitening(白化)等。
(1)Normalization。可以這樣認(rèn)為,歸一化主要在干這樣一件事:把數(shù)據(jù)從一個(gè)一般的分布,變成0均值、單位方差的分布,為什么這么干呢?原因是這么做更容易收斂,這種方法在Caffe框架中普遍使用(mean value或者mean binaryproto 文件)。Batch Normalization(BN)是一個(gè)升級(jí)版本,作者主要考慮當(dāng)使用了飽和的激活函數(shù)時(shí),例如sigmoid函數(shù)變成0均值、單位方差則會(huì)出現(xiàn)在該函數(shù)中間近似線性的那一段,這是非常糟糕的,中間線性的部分的擬合能力最差,因此降低了模型的表達(dá)capacity,所以BN應(yīng)運(yùn)而生,實(shí)驗(yàn)表明,其效果sigmoid函數(shù)比Relu函數(shù)要好。
(2)PCA。研究如何以最少的信息丟失將眾多原有的變量信息濃縮到少數(shù)幾個(gè)維度上,即所謂的主成分。首先計(jì)算出協(xié)方差矩陣,然后求出協(xié)方差矩陣的特征向量,并用其對(duì)原特征進(jìn)行線性變換,實(shí)現(xiàn)降維。
(3)Whitening。去除特征向量中各個(gè)特征之間的相關(guān)性,同時(shí)保證每個(gè)特征的方差一致。 設(shè)特征向量 X = (X1,X2,X3),對(duì)于向量 X,可以計(jì)算出相應(yīng)的協(xié)方差矩陣(根據(jù)已有數(shù)據(jù)集來(lái)估計(jì))。我們希望協(xié)方差矩陣是一個(gè)對(duì)角矩陣,因?yàn)檫@意味著 X 的每個(gè)元素之間都是互不關(guān)聯(lián)的,但是我們的數(shù)據(jù)并不具備這樣的性質(zhì)。為了解耦數(shù)據(jù),我們需要對(duì)原始特征向量執(zhí)行一個(gè)變換,從而使得變換后的向量 Y 的各個(gè)特征之間相關(guān)性為0。設(shè) Σ 是 X 的協(xié)方差矩陣,有:ΣΦ=ΦΛ, 那么 Λ 中的每個(gè)元素都是協(xié)方差矩陣的特征值,Φ 的每個(gè)列向量是相應(yīng)的特征向量。如果對(duì)特征向量做變換:Y = XΦ = X(Φ1,Φ2,Φ3),此時(shí)根據(jù)向量 Y 計(jì)算出來(lái)的協(xié)方差矩陣是一個(gè)對(duì)角矩陣。對(duì)角矩陣 Λ 的特征值就是 Y 的每個(gè)元素的方差,可以全部相同,也可能不相同,如果對(duì)變換后的特征向量的某些維度進(jìn)行縮放,使得 Λ 的每個(gè)元素都相等,那么整個(gè)過(guò)程就是 whitening。
3、Initialization(初始化)。
當(dāng)前兩步完成之后,可以考慮模型參數(shù)的初始化方式了。此處舉出實(shí)例,Caffe中的參數(shù)初始化方式有7種方法,分別為:constant、gaussian、positive_unitball、uniform、xavier、msra和bilinear。用的較多的是xavier用在權(quán)重初始化上,constant用在偏置初始化上。
4、Activation Functions(激活函數(shù))。
深度學(xué)習(xí)之所以具有豐富的表達(dá)能力,非常關(guān)鍵的一點(diǎn)是激活函數(shù),這就相當(dāng)于一系列疊加在一起的非線性處理單元,可以想象出這一系列疊加的非線性處理單元原則上可以逼近任意函數(shù)(這指的是從輸入到輸出效果)。幾種常用的激活函數(shù):sigmoid、tanh和Relu,但是我們又介紹過(guò)之前廣泛使用的sigmoid和tanh等飽和激活函數(shù),使用它們?cè)诤苌罹W(wǎng)絡(luò)模型中的訓(xùn)練效果往往很不好,因?yàn)榇嬖谔荻认У膯?wèn)題,例如下圖中是一個(gè)sigmoid函數(shù)的例子,由于神經(jīng)網(wǎng)絡(luò)在反向傳播時(shí),需要乘以激活函數(shù)的一階導(dǎo)數(shù),這樣逐層往前傳,可想0.930=0.042,這就產(chǎn)生了兩個(gè)極端,出現(xiàn)了如下圖所示的梯度消失區(qū),一旦梯度都已經(jīng)很小了,還怎么學(xué)習(xí)?我們?cè)贑affe中常用Relu函數(shù)有效地避免這一問(wèn)題。
圖1:sigmoid函數(shù)
5、During training(訓(xùn)練過(guò)程中)。
在訓(xùn)練過(guò)程中,要掌握學(xué)習(xí)率的變化策略,一般而言Caffe定義學(xué)習(xí)率在超參數(shù)配置文件中(solver.prototxt),并選擇了學(xué)習(xí)速率的衰減策略(學(xué)習(xí)速率都是開(kāi)始的時(shí)候大,然后之后變小,如何變,怎么變,我們將其稱為策略,所以在論文中一般都會(huì)談到這一問(wèn)題),更為重要的是,可以在網(wǎng)絡(luò)層定義中指定lr_mult選擇某一層的學(xué)習(xí)率,該技巧也可為之后的調(diào)參做準(zhǔn)備。另外一點(diǎn)非常重要的是fine-tune,微調(diào)的用處通常情況下就是你選擇了一個(gè)較為深的model,也就是較為復(fù)雜的model,你并不需要把所有的layers都重新訓(xùn)練,而只是訓(xùn)練了其中的some layers,此時(shí)我們完全可以站在巨人的肩膀上(利用預(yù)訓(xùn)練模型的weights初始化),可以省去很多工作,更為重要的是,加上合適的調(diào)參還會(huì)提高模型的泛化能力(因?yàn)轭A(yù)訓(xùn)練的模型往往還未收斂)。
具體來(lái)說(shuō),存在以下幾種情形:
注意微調(diào)的時(shí)候,在Caffe中操作需要改變微調(diào)的那些層的名字(同時(shí)根據(jù)自己的需要改變layer參數(shù),例如圖片的通道、全連接層輸出的類別數(shù)目等)。
6、Regularizations(正則化)。
正則化也稱為Weight-decay(限制權(quán)值)。正則化應(yīng)該講是一種避免over-fitting的有效方法,這里我們插入一段對(duì)over-fitting的分析,就我的認(rèn)識(shí)而言,從事機(jī)器學(xué)習(xí)的工程師們經(jīng)常會(huì)遇到很多問(wèn)題,很多bug,但是可以這樣說(shuō)over-fitting是所有工程師都必須面對(duì)的一個(gè)問(wèn)題,其具有很強(qiáng)的通用性,這是由于方法本身所決定的。既然大家都會(huì)遇到這個(gè)問(wèn)題,又該如何解決呢?回頭看,我們說(shuō)過(guò)深度學(xué)習(xí)的本質(zhì)就是數(shù)據(jù)和模型,那解決過(guò)擬合的根本途徑也必須從這兩個(gè)方向出發(fā),那什么是過(guò)擬合呢?形象一點(diǎn)說(shuō)就是你認(rèn)為你的model在訓(xùn)練集上已經(jīng)表現(xiàn)很好了,可是當(dāng)你把它使用在驗(yàn)證集上的時(shí)候,效果則很差,進(jìn)一步說(shuō)就是數(shù)據(jù)集太少或者模型太復(fù)雜,兩者顯然不匹配?,F(xiàn)在我們開(kāi)始從這兩個(gè)方向分析,解決方法兩個(gè):增加數(shù)據(jù)集和減小模型的復(fù)雜度(限制網(wǎng)絡(luò)的capacity)。此處正則化就是從減小模型的復(fù)雜度出發(fā)的一項(xiàng)技術(shù),其本質(zhì)就是控制模型學(xué)習(xí)的特征數(shù)目,使其最小化,從而防止在訓(xùn)練過(guò)程中引入訓(xùn)練集的抽樣誤差,正則化包括L2正則化和L1正則化。
7、Dropout。
Dropout是指在深度學(xué)習(xí)網(wǎng)絡(luò)的訓(xùn)練過(guò)程中,對(duì)于神經(jīng)網(wǎng)絡(luò)單元,按照一定的概率將其暫時(shí)從網(wǎng)絡(luò)中丟棄,如下圖所示。對(duì)于隨機(jī)梯度下降來(lái)說(shuō),由于是隨機(jī)丟棄,因此每一個(gè)mini-batch都在訓(xùn)練不同的網(wǎng)絡(luò)(對(duì)于一個(gè)有N個(gè)節(jié)點(diǎn)的神經(jīng)網(wǎng)絡(luò),采用dropout后,可以認(rèn)為其是2n個(gè)模型的集合),同時(shí)每個(gè)網(wǎng)絡(luò)只見(jiàn)過(guò)一個(gè)訓(xùn)練數(shù)據(jù)(每次都是隨機(jī)的新網(wǎng)絡(luò)),從而將這些多個(gè)模型組合起來(lái),以每個(gè)模型的平均輸出作為結(jié)果,caffe中也定義了Dropout層。
圖2 Dropout示例
8、Insights from Figures。
如果說(shuō)通過(guò)上面的方法,你都做了,還是存在問(wèn)題,那就需要仔細(xì)的檢查了,檢查的方法有很多,其中最為形象生動(dòng)的,也就是這里要說(shuō)的就是畫圖,從圖中進(jìn)行推斷。我們知道Caffe也給我們提供了很多畫圖的tools(稱其為可視化),這對(duì)寫論文、科研分析還是挺好的。言歸正傳,下面從網(wǎng)上找到幾張圖片,這些圖片都可以從log中通過(guò)tools畫出,讓我們來(lái)看一看。
圖3表示的是不同學(xué)習(xí)率下的loss變化曲線,很明顯圖中的四條曲線隨著迭代次數(shù)的增加表現(xiàn)出不同的性能,黃色的曲線隨著迭代次數(shù)的增加,loss先減少而后劇烈增加,往往引發(fā)loss等于Nan,這是由于選擇的學(xué)習(xí)率太大的緣故(ps:本人親測(cè),有幾次我在修改一些模型時(shí),開(kāi)始的loss就很大,然后選擇了較大的學(xué)習(xí)率,一下子就Nan了);藍(lán)色的曲線隨著迭代次數(shù)的增加,loss的減少速率很慢很慢,而且設(shè)置的最大迭代次數(shù)已經(jīng)很大,但網(wǎng)絡(luò)并沒(méi)有收斂,這說(shuō)明選擇的學(xué)習(xí)率太小了;綠色的曲線隨著迭代次數(shù)的增加,loss的很快減少,并且網(wǎng)絡(luò)收斂在一個(gè)loss較高的地方居高不下,這說(shuō)明選擇的學(xué)習(xí)率有點(diǎn)大了,已達(dá)到局部最優(yōu),可觀察在網(wǎng)絡(luò)loss不降時(shí)降低學(xué)習(xí)率;紅色的曲線隨著迭代的次數(shù)的增加,loss緩慢下降,曲線相對(duì)平滑,最終收斂在loss很低的水平上,說(shuō)明選擇的學(xué)習(xí)率較好。當(dāng)然圖中是理想的曲線,只能說(shuō)明變化趨勢(shì),實(shí)際情況下曲線是有波動(dòng)的,有些毛刺感(ps:大量的實(shí)踐證明可以接受的就是局部最優(yōu)和全局最優(yōu)了,也就是紅色和綠色曲線代表的過(guò)程,當(dāng)然大多數(shù)同志們遇到的都是局部最優(yōu),此時(shí)我們考慮在局部最優(yōu)的基礎(chǔ)上減小學(xué)習(xí)率繼續(xù)訓(xùn)練,兩者的區(qū)別就是局部最優(yōu)會(huì)保持在一個(gè)較高的loss上,當(dāng)然怎么衡量loss高低沒(méi)有標(biāo)準(zhǔn),所以局部最優(yōu)不代表訓(xùn)練結(jié)果就差,局部最優(yōu)的結(jié)果也可以媲美全局最優(yōu),因?yàn)槲覀兏静恢廊肿顑?yōu)在哪個(gè)地方)。
圖3:學(xué)習(xí)率與loss的關(guān)系曲線
圖4表示的是不同迭代次數(shù)的loss變化曲線,從圖中可以看到隨著迭代次數(shù)的增加,loss的變化趨勢(shì)是減小的,注意圖中標(biāo)注出的“寬度”,如果曲線的寬度太大了,則說(shuō)明有可能你選擇的batch太小了,而其實(shí)batch的選擇在深度學(xué)習(xí)中也不是隨便來(lái)的,太大了不好,太小了也不好,太大了會(huì)有顯存溢出的錯(cuò)誤,太小了有可能某個(gè)label很難被學(xué)到,這往往導(dǎo)致模型不收斂,或者出現(xiàn)loss為Nan等錯(cuò)誤。這個(gè)時(shí)候可以用accum_batch_size來(lái)解決由于硬件不足不能選擇較大batch的問(wèn)題。
圖4:迭代次數(shù)與loss的關(guān)系曲線
圖5是模型在訓(xùn)練集和驗(yàn)證集上的精度曲線。紅色曲線表示的是模型在訓(xùn)練集上的分類精度,可以看到,還不錯(cuò),隨著迭代次數(shù)增加,分類的精度也在增加,并且有收斂的趨勢(shì);綠色曲線表示的是模型在驗(yàn)證集上的分類精度,可以看出,與訓(xùn)練集的精度相比,差距很大,說(shuō)明模型over-fitting了,應(yīng)該運(yùn)用上面說(shuō)到過(guò)的解決方法解決。如果圖中兩者之間沒(méi)什么大的差距而且精度都很低,應(yīng)該增加模型的capacity,提升性能。
圖5:模型在訓(xùn)練集和驗(yàn)證集上的精度曲線
我們都在通往真理的路上。