前言https://www.toutiao.com/article/7148037223852589603/?log_from=58b1a47715ecc_1667455680617 深度學(xué)習(xí)現(xiàn)在這么火熱的一大原因就是卷積神經(jīng)網(wǎng)絡(luò)(以下簡(jiǎn)稱(chēng)CNN)在2012的ImageNet競(jìng)賽上取得了令人驚訝的進(jìn)步,準(zhǔn)確率提升了10%。所以專(zhuān)欄第一篇我想談?wù)劸矸e神經(jīng)網(wǎng)絡(luò)。 在學(xué)習(xí)卷積神經(jīng)網(wǎng)絡(luò)的過(guò)程中,我發(fā)現(xiàn)大部分資料集中在什么是卷積層,什么是Pooling層,怎么計(jì)算每層的輸出尺寸,卷積層和Pooling層以什么形式疊加,這些問(wèn)題上。這些資料雖然帶我入了CNN的門(mén),然而等我回過(guò)神來(lái),我卻發(fā)現(xiàn)我連為什么要使用CNN都答不上來(lái)。同時(shí)我產(chǎn)生了更多疑問(wèn),比如為什么要使用卷積層?為什么要使用Pooling層?為什么要這樣堆疊不同的層?單一個(gè)因?yàn)樗鹷ork是不能讓我通體舒暢的。 本文的目標(biāo)是介紹CNN的基本結(jié)構(gòu),并在這個(gè)過(guò)程中穿插著我對(duì)上述問(wèn)題的回答。我將從以下幾個(gè)部分展開(kāi)全文:
PS:以下的討論都是建立在一個(gè)已經(jīng)訓(xùn)練好的CNN模型上的,本文不會(huì)討論如何訓(xùn)練CNN網(wǎng)絡(luò),也不會(huì)分析CNN下的BP算法,比起這些如何理解CNN更加重要。 1. CNN在圖像分類(lèi)問(wèn)題上有什么優(yōu)勢(shì)?現(xiàn)存問(wèn)題和新方法的出現(xiàn)是一對(duì)孿生兄弟。在想不通CNN有什么優(yōu)勢(shì)的時(shí)候,把目光放在了之前研究的劣勢(shì)上,無(wú)疑可以幫助我們縷清思緒。這里用水果分類(lèi)來(lái)分析一下SVM以及神經(jīng)網(wǎng)絡(luò)的劣勢(shì)。 如果我們有一組水果的圖片,里面有草莓,香蕉和橘子。在圖片尺寸較大的情況下,使用SVM分類(lèi)的步驟是
在最后一步中,不使用SVM,用別的分類(lèi)器也是可以的,比如KNN,貝葉斯,甚至神經(jīng)網(wǎng)絡(luò)都是可以的。雖然不同算法中性能會(huì)有差異,但是這里我想說(shuō)的是在圖像分類(lèi)問(wèn)題上的瓶頸并不在算法的性能上,而是在特征的提取上。 區(qū)分草莓和橘子的特征是容易提取的,那橘子和橙子呢?如果上述四個(gè)特征不能很好的區(qū)分橘子和橙子,想要進(jìn)一步提升算法的性能怎么辦?通常的做法是需要提取新的特征。那么新特征應(yīng)該如何選擇呢?對(duì)于我這種水果盲來(lái)說(shuō),這個(gè)問(wèn)題是具有一定難度的。 除了橘子橙子問(wèn)題,我們還有貓狗如何區(qū)分,狗品種如何識(shí)別等一系列問(wèn)題。我想對(duì)于大部分人來(lái)說(shuō),狗狗品種的識(shí)別是非常有難度的。轉(zhuǎn)了一圈回來(lái),突然發(fā)現(xiàn),圖像分類(lèi)任務(wù)的瓶頸竟然出現(xiàn)在特征選擇上。(誠(chéng)然目前有SIFT、HOG、LBP、LDP等自動(dòng)提取特征的算法,但是效果并不理想,有局限性。) 如果我們用神經(jīng)網(wǎng)絡(luò)直接對(duì)貓狗進(jìn)行分類(lèi)呢?這樣不就避開(kāi)了特征提取這一步了嗎?假設(shè)輸入圖片大小為30*30,那么設(shè)置900個(gè)輸入神經(jīng)元,隱含層設(shè)置1000個(gè)神經(jīng)元,輸出神經(jīng)元個(gè)數(shù)對(duì)應(yīng)需要的輸出數(shù)量不久好了嗎?甚至用SVM也可以這樣做,把一張30×30的圖看作900維空間中的一個(gè)點(diǎn),代表貓的點(diǎn)和代表狗的點(diǎn)在這個(gè)900維的空間中必然是相聚于兩個(gè)簇,然后我們就又可以使用SVM來(lái)劃出分界線了。 但是這樣計(jì)算開(kāi)銷(xiāo)就太大了,對(duì)于30×30的圖片我們也許可以這樣做,對(duì)于1000×1000的圖片我們這樣做的話就需要至少一百萬(wàn)個(gè)隱層神經(jīng)元,這樣我們就至少要更新 ...emmmm...10^12個(gè)參數(shù)。而SVM的話,則相當(dāng)于在一百萬(wàn)維的空間中運(yùn)行了。運(yùn)算量將會(huì)大的難以估計(jì)。另外,圖片中并不是所有的信息都和是我們需要的。背景對(duì)我們的分類(lèi)毫無(wú)價(jià)值,然而在這種一股腦全部拿來(lái)做輸入的情況下,背景也被當(dāng)成了特征進(jìn)入了模型當(dāng)中,準(zhǔn)確度自然會(huì)有所下降。 總之,如果不人工提取特征,那么計(jì)算量會(huì)非常大,精確度也無(wú)法保證。而人工提取特征的方式又會(huì)在某些問(wèn)題下難以進(jìn)行,比如狗狗品種分類(lèi)。 而CNN通過(guò)他獨(dú)有的方式,成功解決了這兩個(gè)問(wèn)題。也就是說(shuō),CNN是一個(gè)可以自動(dòng)提取特征,而且待訓(xùn)練參數(shù)相對(duì)不那么多的神經(jīng)網(wǎng)絡(luò),這就是CNN在圖像分類(lèi)任務(wù)中的決定性優(yōu)勢(shì)。 2.為什么要使用卷積層?和神經(jīng)網(wǎng)絡(luò)模型類(lèi)似,CNN的設(shè)計(jì)靈感同樣來(lái)自于對(duì)神經(jīng)細(xì)胞的研究。
值得注意的是,最低級(jí)的V1區(qū)需要提取邊緣特征,而在上面提到的分類(lèi)中,神經(jīng)網(wǎng)絡(luò)實(shí)際上是把30×30的圖片按照900個(gè)像素點(diǎn)處理的。那么有沒(méi)有一種方法能夠讓神經(jīng)網(wǎng)絡(luò)像人一樣,按照邊緣來(lái)理解呢?有的,這個(gè)方法就是卷積。 卷積計(jì)算并不復(fù)雜,矩陣對(duì)應(yīng)元素相乘的和就是卷積的結(jié)果,到了神經(jīng)網(wǎng)絡(luò)中會(huì)多出偏置b還有激活函數(shù),具體方法如下圖: 圖片源于Udacity深度學(xué)習(xí)納米學(xué)位課程 圖片展示的是由九個(gè)權(quán)重組成的矩陣 (?1?11?11?11?1?1) 和圖片上九個(gè)像素點(diǎn)組成矩陣 (011000000) 進(jìn)行卷積過(guò)程。在偏置b為0,激活函數(shù)使用ReLU的情況下,過(guò)程就像圖片右下角的公式一樣,對(duì)應(yīng)元素乘積的和,再加上值為0的b,然后外套激活函數(shù)得到輸出0。 你可能會(huì)想這部分的計(jì)算和普通的神經(jīng)網(wǎng)絡(luò)沒(méi)什么差別,形式都是f(wx+b)。那么這么處理和邊緣有什么關(guān)系?多做幾次卷積就知道了。 圖片源于Udacity深度學(xué)習(xí)納米學(xué)位課程 Filter指的是權(quán)重組成矩陣,Input Layer中存的是圖片中的全部像素。Convolutional Layer存的是Filter與圖片中所有3×3矩陣依次卷積后得到的結(jié)果。在輸出中我們可以看到兩個(gè)三,他們比其他的元素0都要大,是什么決定了卷積結(jié)果的大小?觀察后發(fā)現(xiàn),圖中參與卷積的部分1的排列和活動(dòng)窗口中1的排列完全一樣時(shí),輸出為3。而像素的排列方式其實(shí)就是圖片中的形狀,這說(shuō)明如果圖像中的形狀和Filter中的形狀相似的話,輸出值就大,不像就小。因此,卷積的操作建立了神經(jīng)網(wǎng)絡(luò)與圖像邊緣的聯(lián)系。 實(shí)際上CNN經(jīng)過(guò)訓(xùn)練之后,F(xiàn)ilter中就是圖片的邊緣啊,角落之類(lèi)的特征。也就是說(shuō),卷積層是在自動(dòng)提取圖片中的特征。 除此之外,卷積還有一種局部連接的思想在里面。它對(duì)圖片的處理方式是一塊一塊的,并不是所有像素值一起處理,因此可以極大的降低參數(shù)值的總量。這里我需要使用那張經(jīng)典的圖片來(lái)說(shuō)明卷積層是如何降低參數(shù)總量的: 圖片源于百度圖片 對(duì)于一張1000×1000的圖片來(lái)說(shuō),對(duì)他進(jìn)行分類(lèi),至少需要10的12次方個(gè)參數(shù)。而如果對(duì)圖片使用卷積操作,每個(gè)神經(jīng)元只和圖像上的10×10的像素連接的話,參數(shù)總量就變成了10的8次方。但是這樣的操作會(huì)導(dǎo)致一個(gè)問(wèn)題,每個(gè)神經(jīng)元只對(duì)應(yīng)圖片一部分的內(nèi)容,那么這個(gè)神經(jīng)元學(xué)到的內(nèi)容就不能應(yīng)用到其他神經(jīng)元上。比如說(shuō)有這樣一個(gè)訓(xùn)練集,同樣姿態(tài)的貓出現(xiàn)在黑色神經(jīng)元負(fù)責(zé)的區(qū)域中,但是測(cè)試集中,貓可能出現(xiàn)在圖片的任何位置。按照局部鏈接的做法,其他區(qū)域的貓是無(wú)法被正確識(shí)別的。 而為了讓出現(xiàn)在任何位置的貓都能夠被正確識(shí)別,提出了權(quán)重共享。讓紅綠藍(lán)黑神經(jīng)元中的參數(shù)全都一樣,這樣就可以使得模型的準(zhǔn)確率不受物體位置的影響,看起來(lái)就像同一個(gè)Filter滑過(guò)了整個(gè)圖片。從提取特征的角度上來(lái)講,一個(gè)Filter顯然不能滿足需求,因此需要生成多個(gè)不同的Filter來(lái)對(duì)圖片進(jìn)行卷積。更棒的是,為了獲得平移不變性而使用的權(quán)重共享法,又意外的再一次降低了待訓(xùn)練參數(shù)總數(shù)。 就算使用100個(gè)權(quán)值共享的10×10Filter來(lái)卷積,總參數(shù)也才10的4次方。也就是說(shuō),參數(shù)相較于普通的神經(jīng)網(wǎng)絡(luò)而言,總共下降了整整8個(gè)數(shù)量級(jí),這種提升是夸張的。 寫(xiě)到這里,卷積層的工作方式就已經(jīng)全部出來(lái)了。具體工作流程如下圖: 圖片源于百度圖片 藍(lán)色的部分代表輸入圖像;綠色的部分代表輸出矩陣;周?chē)奶摼€是padding操作,可以看作圖像的一部分;下方不斷移動(dòng)的陰影就是Filter,其大小,數(shù)量,一次移動(dòng)的距離都是可以自定義的;陰影至上方綠色的連線代表相乘再相加之后的結(jié)果輸出到了輸出矩陣的哪個(gè)位置。卷積層的這種操作方式,成功的模擬了生物視覺(jué)系統(tǒng)中的邊緣特征提取部分。 而CNN中對(duì)于分級(jí)結(jié)構(gòu)的模擬,是通過(guò)卷積層的層層疊加實(shí)現(xiàn)的。AlexNet的論文中不止一次的提到,網(wǎng)絡(luò)的深度對(duì)CNN性能的影響是顯著的。可以認(rèn)為卷積層的不斷疊加會(huì)使得提取到的特征越來(lái)越復(fù)雜,整個(gè)流程就像上述引用中提到的人類(lèi)的視覺(jué)系統(tǒng)的工作方式一樣運(yùn)行,最終完成對(duì)圖片的分類(lèi)。 那么現(xiàn)在就可以很輕松的回答標(biāo)題的問(wèn)題了,使用卷積層是因?yàn)榫矸e層本質(zhì)上是在自動(dòng)提取圖片的特征,而且在提取特征的同時(shí),極大的降低了網(wǎng)絡(luò)總體待訓(xùn)參數(shù)的總量。這兩個(gè)特性使得CNN克服了特征提取困難,待訓(xùn)參數(shù)龐大的問(wèn)題,成功制霸圖片分類(lèi)問(wèn)題。 3.為什么要使用池化層你可能會(huì)問(wèn),卷積層就已經(jīng)把參數(shù)降了下來(lái),還解決了特征提取的問(wèn)題,那還加一個(gè)池化層干什么呢?我認(rèn)為,池化層只是工程上想讓網(wǎng)絡(luò)更深而做出的一個(gè)無(wú)奈之舉。 就以最經(jīng)常出現(xiàn)的最大池化為例,來(lái)看看所謂的池化操作有多么隨便吧。 一個(gè)2×2的最大池化操作如上圖,他做的就是把2×2窗口中的最大值存下來(lái)。所以綠色部分留下來(lái)了6;棕黃色部分是8;棕紅色部分是3;藍(lán)色部分是4。對(duì),就是這么簡(jiǎn)單,就是這么隨便。這個(gè)操作一眼看上去優(yōu)點(diǎn)我沒(méi)想出來(lái),但是缺點(diǎn)卻顯而易見(jiàn)——損失了細(xì)節(jié)。為什么損失細(xì)節(jié)也要做這一步呢?我能想到的唯一的原因是要壓縮矩陣,這樣可以在模型中多加幾層卷積層,用來(lái)提取更高維,更復(fù)雜的特征。而從壓縮的角度上來(lái)看,這一步可謂簡(jiǎn)單有效,一個(gè)取最大值的操作,就讓矩陣大小變?yōu)樗姆种弧?/span> AlexNet的出現(xiàn)是2012年,那時(shí)候用的是GTX580,3G顯存,文章中提到只用一塊GPU是不行的,因?yàn)轱@存會(huì)爆,因此用了兩塊GPU并行進(jìn)行的這個(gè)任務(wù)。想必其作者也是苦于總是爆顯存,而不得已加上的池化層。就算這樣,還要用到兩塊GPU才成功訓(xùn)練了整個(gè)網(wǎng)絡(luò)。 然而池化層的應(yīng)用似乎帶來(lái)了更多的便利之處。由于其只取最大值,忽視掉了其他影響較小的值,所以在當(dāng)內(nèi)容發(fā)生很小的變化的時(shí)候包括一些平移旋轉(zhuǎn),CNN 仍然能夠穩(wěn)定識(shí)別對(duì)應(yīng)內(nèi)容。也就說(shuō)池化層給模型帶來(lái)了一定程度上的不變性。 而應(yīng)不應(yīng)該使用池化層還是一個(gè)正在討論的問(wèn)題,有的網(wǎng)絡(luò)用,有的網(wǎng)絡(luò)不用。按照我的理解,在顯存夠用的情況下,不用池化層。這種丟失細(xì)節(jié)提升模型不變性的方法有一點(diǎn)七傷拳的意思。而且我們希望得到的模型并不是在不知道圖片變化了的情況下可以得到正確的結(jié)果,我們希望的是模型可以認(rèn)識(shí)到差異卻依然能做出正確的分類(lèi)才對(duì)。不過(guò)在以準(zhǔn)確率為綱的今天,如果用池化層能提升準(zhǔn)確率,就加上吧,無(wú)可厚非。 4.全連接層的作用在經(jīng)過(guò)幾次卷積和池化的操作之后,卷積神經(jīng)網(wǎng)絡(luò)的最后一步是全連接層。這一步就和最最普通的神經(jīng)網(wǎng)絡(luò)沒(méi)有什么區(qū)別。我認(rèn)為這里的神經(jīng)網(wǎng)絡(luò)就是充當(dāng)一個(gè)分類(lèi)器的作用,輸入是不同特征的特征值,輸出是分類(lèi)。我甚至認(rèn)為在訓(xùn)練好之后,把全連接層砍掉,把卷積部分的輸出當(dāng)作是特征,全連接換成SVM或者別的分類(lèi)器,重新訓(xùn)練,也是可以取得良好效果的。 5.總結(jié)這里重新整理一下本文的內(nèi)容:
|
|