0
雷鋒網(wǎng)按:本文原作者曹榮禹,本文原載于知乎專欄——機(jī)器學(xué)習(xí)教程。雷鋒網(wǎng)已獲得轉(zhuǎn)載授權(quán)。
當(dāng)我們?cè)谔幚韴D像識(shí)別或者圖像分類或者其他機(jī)器學(xué)習(xí)任務(wù)的時(shí)候,我們總是迷茫于做出哪些改進(jìn)能夠提升模型的性能(識(shí)別率、分類準(zhǔn)確率)。。?;蛘哒f我們?cè)诼L而苦惱的調(diào)參過程中到底調(diào)的是哪些參數(shù)。。。所以,我花了一部分時(shí)間在公開數(shù)據(jù)集 CIFAR-10 [1] 上進(jìn)行探索,來總結(jié)出一套方法能夠快速高效并且有目的性地進(jìn)行網(wǎng)絡(luò)訓(xùn)練和參數(shù)調(diào)整。
CIFAR-10 數(shù)據(jù)集有 60000 張圖片,每張圖片均為分辨率為 32*32 的彩色圖片(分為 RGB3 個(gè)信道)。CIFAR-10 的分類任務(wù)是將每張圖片分成青蛙、卡車、飛機(jī)等 10 個(gè)類別中的一個(gè)類別。本文主要使用基于卷積神經(jīng)網(wǎng)絡(luò)的方法(CNN)來設(shè)計(jì)模型,完成分類任務(wù)。
首先,為了能夠在訓(xùn)練網(wǎng)絡(luò)的同時(shí)能夠檢測網(wǎng)絡(luò)的性能,我對(duì)數(shù)據(jù)集進(jìn)行了訓(xùn)練集 / 驗(yàn)證集 / 測試集的劃分。訓(xùn)練集主要用戶進(jìn)行模型訓(xùn)練,驗(yàn)證集主要進(jìn)行參數(shù)調(diào)整,測試集主要進(jìn)行模型性能的評(píng)估。因此,我將 60000 個(gè)樣本的數(shù)據(jù)集分成了,45000 個(gè)樣本作為訓(xùn)練集,5000 個(gè)樣本作為驗(yàn)證集,10000 個(gè)樣本作為測試集。接下來,我們一步步來分析,如果進(jìn)行模型設(shè)計(jì)和改進(jìn)。
對(duì)于任何的機(jī)器學(xué)習(xí)問題,我們一上來肯定是采用最簡單的模型,一方面能夠快速地 run 一個(gè)模型,以了解這個(gè)任務(wù)的難度,另一方面能夠有一個(gè) baseline 版本的模型,利于進(jìn)行對(duì)比實(shí)驗(yàn)。所以,我按照以往經(jīng)驗(yàn)和網(wǎng)友的推薦,設(shè)計(jì)了以下的模型。
模型的輸入數(shù)據(jù)是網(wǎng)絡(luò)的輸入是一個(gè) 4 維 tensor,尺寸為 (128, 32, 32, 3),分別表示一批圖片的個(gè)數(shù) 128、圖片的寬的像素點(diǎn)個(gè)數(shù) 32、高的像素點(diǎn)個(gè)數(shù) 32 和信道個(gè)數(shù) 3。首先使用多個(gè)卷積神經(jīng)網(wǎng)絡(luò)層進(jìn)行圖像的特征提取,卷積神經(jīng)網(wǎng)絡(luò)層的計(jì)算過程如下步驟:
卷積層 1:卷積核大小 3*3,卷積核移動(dòng)步長 1,卷積核個(gè)數(shù) 64,池化大小 2*2,池化步長 2,池化類型為最大池化,激活函數(shù) ReLU。
卷積層 2:卷積核大小 3*3,卷積核移動(dòng)步長 1,卷積核個(gè)數(shù) 128,池化大小 2*2,池化步長 2,池化類型為最大池化,激活函數(shù) ReLU。
卷積層 3:卷積核大小 3*3,卷積核移動(dòng)步長 1,卷積核個(gè)數(shù) 256,池化大小 2*2,池化步長 2,池化類型為最大池化,激活函數(shù) ReLU。
全連接層:隱藏層單元數(shù) 1024,激活函數(shù) ReLU。
分類層:隱藏層單元數(shù) 10,激活函數(shù) softmax。
參數(shù)初始化,所有權(quán)重矩陣使用 random_normal(0.0, 0.001),所有偏置向量使用 constant(0.0)。使用 cross entropy 作為目標(biāo)函數(shù),使用 Adam 梯度下降法進(jìn)行參數(shù)更新,學(xué)習(xí)率設(shè)為固定值 0.001。
該網(wǎng)絡(luò)是一個(gè)有三層卷積層的神經(jīng)網(wǎng)絡(luò),能夠快速地完成圖像地特征提取。全連接層用于將圖像特征整合成分類特征,分類層用于分類。cross entropy 也是最常用的目標(biāo)函數(shù)之一,分類任務(wù)使用 cross entropy 作為目標(biāo)函數(shù)非常適合。Adam 梯度下降法也是現(xiàn)在非常流行的梯度下降法的改進(jìn)方法之一,學(xué)習(xí)率過大會(huì)導(dǎo)致模型難以找到較優(yōu)解,設(shè)置過小則會(huì)降低模型訓(xùn)練效率,因此選擇適中的 0.001。這樣,我們最基礎(chǔ)版本的 CNN 模型就已經(jīng)搭建好了,接下來進(jìn)行訓(xùn)練和測試以觀察結(jié)果。
訓(xùn)練 5000 輪,觀察到 loss 變化曲線、訓(xùn)練集準(zhǔn)確率變化曲線和驗(yàn)證集準(zhǔn)確率變化曲線如下圖。測試集準(zhǔn)確率為 69.36%。
結(jié)果分析:首先我們觀察訓(xùn)練 loss(目標(biāo)函數(shù)值)變化,剛開始 loss 從 200 不斷減小到接近 0,但是在 100 輪左右開始出現(xiàn)震蕩,并且隨著訓(xùn)練幅度越來越大,說明模型不穩(wěn)定。然后觀察訓(xùn)練集和驗(yàn)證集的準(zhǔn)確率,發(fā)現(xiàn)訓(xùn)練集準(zhǔn)確率接近于 1,驗(yàn)證集準(zhǔn)確率穩(wěn)定在 70% 左右,說明模型的泛化能力不強(qiáng)并且出現(xiàn)了過擬合情況。最后評(píng)估測試集,發(fā)現(xiàn)準(zhǔn)確率為 69.36%,也沒有達(dá)到很滿意的程度,說明我們對(duì)模型需要進(jìn)行很大的改進(jìn),接下來進(jìn)行漫長的調(diào)參之旅吧!
使用數(shù)據(jù)增強(qiáng)技術(shù)(data augmentation),主要是在訓(xùn)練數(shù)據(jù)上增加微小的擾動(dòng)或者變化,一方面可以增加訓(xùn)練數(shù)據(jù),從而提升模型的泛化能力,另一方面可以增加噪聲數(shù)據(jù),從而增強(qiáng)模型的魯棒性。主要的數(shù)據(jù)增強(qiáng)方法有:翻轉(zhuǎn)變換 flip、隨機(jī)修剪(random crop)、色彩抖動(dòng)(color jittering)、平移變換(shift)、尺度變換(scale)、對(duì)比度變換(contrast)、噪聲擾動(dòng)(noise)、旋轉(zhuǎn)變換 / 反射變換 (rotation/reflection)等,可以參考 Keras 的官方文檔 [2] 。獲取一個(gè) batch 的訓(xùn)練數(shù)據(jù),進(jìn)行數(shù)據(jù)增強(qiáng)步驟之后再送入網(wǎng)絡(luò)進(jìn)行訓(xùn)練。
我主要做的數(shù)據(jù)增強(qiáng)操作有如下方面:
圖像切割:生成比圖像尺寸小一些的矩形框,對(duì)圖像進(jìn)行隨機(jī)的切割,最終以矩形框內(nèi)的圖像作為訓(xùn)練數(shù)據(jù)。
圖像翻轉(zhuǎn):對(duì)圖像進(jìn)行左右翻轉(zhuǎn)。
圖像白化:對(duì)圖像進(jìn)行白化操作,即將圖像本身歸一化成 Gaussian(0,1) 分布。
為了進(jìn)行對(duì)比實(shí)驗(yàn),觀測不同數(shù)據(jù)增強(qiáng)方法的性能,實(shí)驗(yàn) 1 只進(jìn)行圖像切割,實(shí)驗(yàn) 2 只進(jìn)行圖像翻轉(zhuǎn),實(shí)驗(yàn) 3 只進(jìn)行圖像白化,實(shí)驗(yàn) 4 同時(shí)進(jìn)行這三種數(shù)據(jù)增強(qiáng)方法,同樣訓(xùn)練 5000 輪,觀察到 loss 變化曲線、訓(xùn)練集準(zhǔn)確率變化曲線和驗(yàn)證集準(zhǔn)確率變化曲線對(duì)比如下圖。
結(jié)果分析:我們觀察訓(xùn)練曲線和驗(yàn)證曲線,很明顯地發(fā)現(xiàn)圖像白化的效果好,其次是圖像切割,再次是圖像翻轉(zhuǎn),而如果同時(shí)使用這三種數(shù)據(jù)增強(qiáng)技術(shù),不僅能使訓(xùn)練過程的 loss 更穩(wěn)定,而且能使驗(yàn)證集的準(zhǔn)確率提升至 82% 左右,提升效果十分明顯。而對(duì)于測試集,準(zhǔn)確率也提升至 80.42%。說明圖像增強(qiáng)確實(shí)通過增加訓(xùn)練集數(shù)據(jù)量達(dá)到了提升模型泛化能力以及魯棒性的效果,從準(zhǔn)確率上看也帶來了將近 10% 左右的提升,因此,數(shù)據(jù)增強(qiáng)確實(shí)有很大的作用。但是對(duì)于 80% 左右的識(shí)別準(zhǔn)確率我們還是不夠滿意,接下來繼續(xù)調(diào)參。
接下來的步驟是從模型角度進(jìn)行一些改進(jìn),這方面的改進(jìn)是誕生論文的重要區(qū)域,由于某一個(gè)特定問題對(duì)某一個(gè)模型的改進(jìn)千變?nèi)f化,沒有辦法全部去嘗試,因此一般會(huì)實(shí)驗(yàn)一些 general 的方法,比如批正則化(batch normalization)、權(quán)重衰減(weight decay)。我這里實(shí)驗(yàn)了 4 種改進(jìn)方法,接下來依次介紹。
權(quán)重衰減(weight decay):對(duì)于目標(biāo)函數(shù)加入正則化項(xiàng),限制權(quán)重參數(shù)的個(gè)數(shù),這是一種防止過擬合的方法,這個(gè)方法其實(shí)就是機(jī)器學(xué)習(xí)中的 l2 正則化方法,只不過在神經(jīng)網(wǎng)絡(luò)中舊瓶裝新酒改名為 weight decay [3]。
dropout:在每次訓(xùn)練的時(shí)候,讓某些的特征檢測器停過工作,即讓神經(jīng)元以一定的概率不被激活,這樣可以防止過擬合,提高泛化能力 [4]。
批正則化(batch normalization):batch normalization 對(duì)神經(jīng)網(wǎng)絡(luò)的每一層的輸入數(shù)據(jù)都進(jìn)行正則化處理,這樣有利于讓數(shù)據(jù)的分布更加均勻,不會(huì)出現(xiàn)所有數(shù)據(jù)都會(huì)導(dǎo)致神經(jīng)元的激活,或者所有數(shù)據(jù)都不會(huì)導(dǎo)致神經(jīng)元的激活,這是一種數(shù)據(jù)標(biāo)準(zhǔn)化方法,能夠提升模型的擬合能力 [5]。
LRN:LRN 層模仿生物神經(jīng)系統(tǒng)的側(cè)抑制機(jī)制,對(duì)局部神經(jīng)元的活動(dòng)創(chuàng)建競爭機(jī)制,使得響應(yīng)比較大的值相對(duì)更大,提高模型泛化能力。
為了進(jìn)行對(duì)比實(shí)驗(yàn),實(shí)驗(yàn) 1 只使用權(quán)重衰減,實(shí)驗(yàn) 2 使用權(quán)重衰減 + dropout,實(shí)驗(yàn) 3 使用權(quán)重衰減 + dropout + 批正則化,實(shí)驗(yàn) 4 使用權(quán)重衰減 + dropout + 批正則化 + LRN,同樣都訓(xùn)練 5000 輪,觀察到 loss 變化曲線、訓(xùn)練集準(zhǔn)確率變化曲線和驗(yàn)證集準(zhǔn)確率變化曲線對(duì)比如下圖。
結(jié)果分析:我們觀察訓(xùn)練曲線和驗(yàn)證曲線,隨著每一個(gè)模型提升的方法,都會(huì)使訓(xùn)練集誤差和驗(yàn)證集準(zhǔn)確率有所提升,其中,批正則化技術(shù)和 dropout 技術(shù)帶來的提升非常明顯,而如果同時(shí)使用這些模型提升技術(shù),會(huì)使驗(yàn)證集的準(zhǔn)確率從 82% 左右提升至 88% 左右,提升效果十分明顯。而對(duì)于測試集,準(zhǔn)確率也提升至 85.72%。我們?cè)僮⒁饪醋髨D,使用 batch normalization 之后,loss 曲線不再像之前會(huì)出現(xiàn)先下降后上升的情況,而是一直下降,這說明 batch normalization 技術(shù)可以加強(qiáng)模型訓(xùn)練的穩(wěn)定性,并且能夠很大程度地提升模型泛化能力。所以,如果能提出一種模型改進(jìn)技術(shù)并且從原理上解釋同時(shí)也使其適用于各種模型,那么就是非常好的創(chuàng)新點(diǎn),也是我想挑戰(zhàn)的方向?,F(xiàn)在測試集準(zhǔn)確率提升至 85% 左右,接下來我們從其他的角度進(jìn)行調(diào)參。
在很多關(guān)于神經(jīng)網(wǎng)絡(luò)的論文中,都采用了變化學(xué)習(xí)率的技術(shù)來提升模型性能,大致的想法是這樣的:
首先使用較大的學(xué)習(xí)率進(jìn)行訓(xùn)練,觀察目標(biāo)函數(shù)值和驗(yàn)證集準(zhǔn)確率的收斂曲線。
如果目標(biāo)函數(shù)值下降速度和驗(yàn)證集準(zhǔn)確率上升速度出現(xiàn)減緩時(shí),減小學(xué)習(xí)率。
循環(huán)步驟 2,直到減小學(xué)習(xí)率也不會(huì)影響目標(biāo)函數(shù)下降或驗(yàn)證集準(zhǔn)確率上升為止。
為了進(jìn)行對(duì)比實(shí)驗(yàn),實(shí)驗(yàn) 1 只使用 0.01 的學(xué)習(xí)率訓(xùn)練,實(shí)驗(yàn) 2 前 10000 個(gè) batch 使用 0.01 的學(xué)習(xí)率,10000 個(gè) batch 之后學(xué)習(xí)率降到 0.001,實(shí)驗(yàn) 3 前 10000 個(gè) batch 使用 0.01 的學(xué)習(xí)率,10000~20000 個(gè) batch 使用 0.001 的學(xué)習(xí)率,20000 個(gè) batch 之后學(xué)習(xí)率降到 0.0005。同樣都訓(xùn)練 5000 輪,觀察到 loss 變化曲線、訓(xùn)練集準(zhǔn)確率變化曲線和驗(yàn)證集準(zhǔn)確率變化曲線對(duì)比如下圖。
結(jié)果分析:我們觀察到,當(dāng) 10000 個(gè) batch 時(shí),學(xué)習(xí)率從 0.01 降到 0.001 時(shí),目標(biāo)函數(shù)值有明顯的下降,驗(yàn)證集準(zhǔn)確率有明顯的提升,而當(dāng) 20000 個(gè) batch 時(shí),學(xué)習(xí)率從 0.001 降到 0.0005 時(shí),目標(biāo)函數(shù)值沒有明顯的下降,但是驗(yàn)證集準(zhǔn)確率有一定的提升,而對(duì)于測試集,準(zhǔn)確率也提升至 86.24%。這說明,學(xué)習(xí)率的變化確實(shí)能夠提升模型的擬合能力,從而提升準(zhǔn)確率。學(xué)習(xí)率在什么時(shí)候進(jìn)行衰減、率減多少也需要進(jìn)行多次嘗試。一般在模型基本成型之后,使用這種變化的學(xué)習(xí)率的方法,以獲取一定的改進(jìn),精益求精。
現(xiàn)在深度學(xué)習(xí)大熱,所以,在計(jì)算資源足夠的情況下,想要獲得模型性能的提升,大家最常見打的想法就是增加網(wǎng)絡(luò)的深度,讓深度神經(jīng)網(wǎng)絡(luò)來解決問題,但是簡單的網(wǎng)絡(luò)堆疊不一定就能達(dá)到很好地效果,抱著深度學(xué)習(xí)的想法,我按照 plain-cnn 模型 [6],我做了接下來的實(shí)驗(yàn)。
卷積層 1:卷積核大小 3*3,卷積核移動(dòng)步長 1,卷積核個(gè)數(shù) 16,激活函數(shù) ReLU,使用 batch_normal 和 weight_decay,接下來的 n 層,卷積核大小 3*3,卷積核移動(dòng)步長 1,卷積核個(gè)數(shù) 16,激活函數(shù) ReLU,使用 batch_normal 和 weight_decay。
卷積層 2:卷積核大小 3*3,卷積核移動(dòng)步長 2,卷積核個(gè)數(shù) 32,激活函數(shù) ReLU,使用 batch_normal 和 weight_decay,接下來的 n 層,卷積核大小 3*3,卷積核移動(dòng)步長 1,卷積核個(gè)數(shù) 32,激活函數(shù) ReLU,使用 batch_normal 和 weight_decay。
卷積層 3:卷積核大小 3*3,卷積核移動(dòng)步長 2,卷積核個(gè)數(shù) 64,激活函數(shù) ReLU,使用 batch_normal 和 weight_decay,接下來的 n 層,卷積核大小 3*3,卷積核移動(dòng)步長 1,卷積核個(gè)數(shù) 64,激活函數(shù) ReLU,使用 batch_normal 和 weight_decay。
池化層:使用全局池化,對(duì) 64 個(gè)隱藏單元分別進(jìn)行全局池化。
全連接層:隱藏層單元數(shù) 10,激活函數(shù) softmax,使用 batch_normal 和 weight_decay。
為了進(jìn)行對(duì)比實(shí)驗(yàn),進(jìn)行 4 組實(shí)驗(yàn),每組的網(wǎng)絡(luò)層數(shù)分別設(shè)置 8,14,20 和 32。同樣都訓(xùn)練 5000 輪,觀察到 loss 變化曲線、訓(xùn)練集準(zhǔn)確率變化曲線和驗(yàn)證集準(zhǔn)確率變化曲線對(duì)比如下圖。
結(jié)果分析:我們驚訝的發(fā)現(xiàn),加深了網(wǎng)絡(luò)層數(shù)之后,性能反而下降了,達(dá)不到原來的驗(yàn)證集準(zhǔn)確率,網(wǎng)絡(luò)層數(shù)從 8 層增加到 14 層,準(zhǔn)確率有所上升,但從 14 層增加到 20 層再增加到 32 層,準(zhǔn)確率不升反降,這說明如果網(wǎng)絡(luò)層數(shù)過大,由于梯度衰減的原因,導(dǎo)致網(wǎng)絡(luò)性能下降,因此,需要使用其他方法解決梯度衰減問題,使得深度神經(jīng)網(wǎng)絡(luò)能夠正常 work。
2015 年,Microsoft 用殘差網(wǎng)絡(luò) [7] 拿下了當(dāng)年的 ImageNet,這個(gè)殘差網(wǎng)絡(luò)就很好地解決了梯度衰減的問題,使得深度神經(jīng)網(wǎng)絡(luò)能夠正常 work。由于網(wǎng)絡(luò)層數(shù)加深,誤差反傳的過程中會(huì)使梯度不斷地衰減,而通過跨層的直連邊,可以使誤差在反傳的過程中減少衰減,使得深層次的網(wǎng)絡(luò)可以成功訓(xùn)練,具體的過程可以參見其論文 [7]。
通過設(shè)置對(duì)比實(shí)驗(yàn),觀察殘差網(wǎng)絡(luò)的性能,進(jìn)行 4 組實(shí)驗(yàn),每組的網(wǎng)絡(luò)層數(shù)分別設(shè)置 20,32,44 和 56。觀察到 loss 變化曲線和驗(yàn)證集準(zhǔn)確率變化曲線對(duì)比如下圖。
結(jié)果分析:我們觀察到,網(wǎng)絡(luò)從 20 層增加到 56 層,訓(xùn)練 loss 在穩(wěn)步降低,驗(yàn)證集準(zhǔn)確率在穩(wěn)步提升,并且當(dāng)網(wǎng)絡(luò)層數(shù)是 56 層時(shí)能夠在驗(yàn)證集上達(dá)到 91.55% 的準(zhǔn)確率。這說明,使用了殘差網(wǎng)絡(luò)的技術(shù),可以解決梯度衰減問題,發(fā)揮深層網(wǎng)絡(luò)的特征提取能力,使模型獲得很強(qiáng)的擬合能力和泛化能力。當(dāng)我們訓(xùn)練深度網(wǎng)絡(luò)的時(shí)候,殘差網(wǎng)絡(luò)很有可能作為終極武器發(fā)揮至關(guān)重要的作用。
對(duì)于 CIFAR-10 圖像分類問題,我們從最簡單的卷積神經(jīng)網(wǎng)絡(luò)開始,分類準(zhǔn)確率只能達(dá)到 70% 左右,通過不斷地增加提升模型性能的方法,最終將分類準(zhǔn)確里提升到了 90% 左右,這 20% 的準(zhǔn)確率的提升來自于對(duì)數(shù)據(jù)的改進(jìn)、對(duì)模型的改進(jìn)、對(duì)訓(xùn)練過程的改進(jìn)等,具體每一項(xiàng)提升如下表所示。
改進(jìn)方法 獲得準(zhǔn)確率 提升
基本神經(jīng)網(wǎng)絡(luò) 69.36% -
+ 數(shù)據(jù)增強(qiáng) 80.42% 11.06%
+ 模型改進(jìn) 85.72% 16.36%
+ 變化學(xué)習(xí)率 86.24% 16.88%
+ 深度殘差網(wǎng)絡(luò) 91.55% 22.19%
其中,數(shù)據(jù)增強(qiáng)技術(shù)使用翻轉(zhuǎn)圖像、切割圖像、白化圖像等方法增加數(shù)據(jù)量,增加模型的擬合能力。模型改進(jìn)技術(shù)包括 batch normalization、weight decay、dropout 等防止過擬合,增加模型的泛化能力。變化學(xué)習(xí)率通過在訓(xùn)練過程中遞減學(xué)習(xí)率,使得模型能夠更好的收斂,增加模型的擬合能力。加深網(wǎng)絡(luò)層數(shù)和殘差網(wǎng)絡(luò)技術(shù)通過加深模型層數(shù)和解決梯度衰減問題,增加模型的擬合能力。這些改進(jìn)方法的一步步堆疊,一步步遞進(jìn),使得網(wǎng)絡(luò)的擬合能力和泛化能力越來越強(qiáng),最終獲得更高的分類準(zhǔn)確率。
本文的所有代碼見我的 github,persistforever/cifar10-tensorflow
本文介紹的調(diào)參歷程,希望能幫助到大家,聽說過這么一句話,“讀研期間學(xué)習(xí)人工智能,什么都不用學(xué),學(xué)好調(diào)參就行了”,而 “調(diào)參” 二字卻包含著無數(shù)的知識(shí),希望大家能多分享神經(jīng)網(wǎng)絡(luò)相關(guān)的干貨。
[1]. CIFAR-10 and CIFAR-100 datasets
[2]. https://keras.io/preprocessing/image/
[3]. Krogh A, Hertz J A. A simple weight decay can improve generalization. In ICML, 1991.
[4]. Srivastava N, Hinton G, Krizhevsky A, et al. Dropout: a simple way to prevent neural networks from overfitting. In JMLR, 2014.
[5]. Ioffe S, Szegedy C. Batch normalization: accelerating deep network training by reducing internal covariate shift. In JMLR, 2015.
[6]. K. Simonyan and A. Zisserman. Very deep convolutional networks for large-scale image recognition. In ICLR, 2015.
[7]. He K, Zhang X, Ren S, et al. Deep Residual Learning for Image Recognition. In CVPR, 2016.
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。