【深度學習基礎】經典卷積神經網路

語言: CN / TW / HK

導語

卷積神經網路(Convolutional Neural Networks, CNN)是一類包含卷積計算且具有深度結構的前饋神經網路(Feedforward Neural Networks),是深度學習(deep learning)的代表演算法之一。經典的神經網路結構,分別是LeNet-5AlexNetVGGNet。本問對經典卷積神經網路進行講解。

本文來源於吳恩達老師的深度學習課程[1]筆記部分。

作者: 黃海廣[2]

備註: 筆記和作業(含資料、原始作業檔案)、影片都在 github[3]中下載。

正文開始

經典網路(Classic networks)

我們來學習幾個經典的神經網路結構,分別是LeNet-5AlexNetVGGNet,開始吧。

首先看看LeNet-5的網路結構,假設你有一張32×32×1的圖片,LeNet-5可以識別圖中的手寫數字,比如像這樣手寫數字7。LeNet-5是針對灰度圖片訓練的,所以圖片的大小隻有32×32×1。實際上LeNet-5的結構和我們上週講的最後一個範例非常相似,使用6個5×5的過濾器,步幅為1。由於使用了6個過濾器,步幅為1,padding為0,輸出結果為28×28×6,影象尺寸從32×32縮小到28×28。然後進行池化操作,在這篇論文寫成的那個年代,人們更喜歡使用平均池化,而現在我們可能用最大池化更多一些。在這個例子中,我們進行平均池化,過濾器的寬度為2,步幅為2,影象的尺寸,高度和寬度都縮小了2倍,輸出結果是一個14×14×6的影象。我覺得這張圖片應該不是完全按照比例繪製的,如果嚴格按照比例繪製,新影象的尺寸應該剛好是原影象的一半。

接下來是卷積層,我們用一組16個5×5的過濾器,新的輸出結果有16個通道。LeNet-5的論文是在1998年撰寫的,當時人們並不使用padding,或者總是使用valid卷積,這就是為什麼每進行一次卷積,影象的高度和寬度都會縮小,所以這個影象從14到14縮小到了10×10。然後又是池化層,高度和寬度再縮小一半,輸出一個5×5×16的影象。將所有數字相乘,乘積是400。

下一層是全連線層,在全連線層中,有400個節點,每個節點有120個神經元,這裡已經有了一個全連線層。但有時還會從這400個節點中抽取一部分節點構建另一個全連線層,就像這樣,有2個全連線層。

最後一步就是利用這84個特徵得到最後的輸出,我們還可以在這裡再加一個節點用來預測 的值, 有10個可能的值,對應識別0-9這10個數字。在現在的版本中則使用softmax函式輸出十種分類結果,而在當時,LeNet-5網路在輸出層使用了另外一種,現在已經很少用到的分類器。

相比現代版本,這裡得到的神經網路會小一些,只有約6萬個引數。而現在,我們經常看到含有一千萬到一億個引數的神經網路,比這大1000倍的神經網路也不在少數。

不管怎樣,如果我們從左往右看,隨著網路越來越深,影象的高度和寬度在縮小,從最初的32×32縮小到28×28,再到14×14、10×10,最後只有5×5。與此同時,隨著網路層次的加深,通道數量一直在增加,從1增加到6個,再到16個。

這個神經網路中還有一種模式至今仍然經常用到,就是一個或多個卷積層後面跟著一個池化層,然後又是若干個卷積層再接一個池化層,然後是全連線層,最後是輸出,這種排列方式很常用。

對於那些想嘗試閱讀論文的同學,我再補充幾點。接下來的部分主要針對那些打算閱讀經典論文的同學,所以會更加深入。這些內容你完全可以跳過,算是對神經網路歷史的一種回顧吧,聽不懂也不要緊。

讀到這篇經典論文時,你會發現,過去,人們使用sigmod函式和tanh函式,而不是ReLu函式,這篇論文中使用的正是sigmod函式和tanh函式。這種網路結構的特別之處還在於,各網路層之間是有關聯的,這在今天看來顯得很有趣。

比如說,你有一個 的網路,有 個通道,使用尺寸為 的過濾器,每個過濾器的通道數和它上一層的通道數相同。這是由於在當時,計算機的執行速度非常慢,為了減少計算量和引數,經典的LeNet-5網路使用了非常複雜的計算方式,每個過濾器都採用和輸入模組一樣的通道數量。論文中提到的這些複雜細節,現在一般都不用了。

我認為當時所進行的最後一步其實到現在也還沒有真正完成,就是經典的LeNet-5網路在池化後進行了非線性函式處理,在這個例子中,池化層之後使用了sigmod函式。如果你真的去讀這篇論文,這會是最難理解的部分之一,我們會在後面的課程中講到。

下面要講的網路結構簡單一些,幻燈片的大部分類容來自於原文的第二段和第三段,原文的後幾段介紹了另外一種思路。文中提到的這種圖形變形網路如今並沒有得到廣泛應用,所以在讀這篇論文的時候,我建議精讀第二段,這段重點介紹了這種網路結構。泛讀第三段,這裡面主要是一些有趣的實驗結果。

我要舉例說明的第二種神經網路是AlexNet,是以論文的第一作者Alex Krizhevsky的名字命名的,另外兩位合著者是ilya SutskeverGeoffery Hinton

AlexNet首先用一張227×227×3的圖片作為輸入,實際上原文中使用的影象是224×224×3,但是如果你嘗試去推導一下,你會發現227×227這個尺寸更好一些。第一層我們使用96個11×11的過濾器,步幅為4,由於步幅是4,因此尺寸縮小到55×55,縮小了4倍左右。然後用一個3×3的過濾器構建最大池化層, ,步幅 為2,卷積層尺寸縮小為27×27×96。接著再執行一個5×5的卷積,padding之後,輸出是27×27×276。然後再次進行最大池化,尺寸縮小到13×13。再執行一次same卷積,相同的padding,得到的結果是13×13×384,384個過濾器。再做一次same卷積,就像這樣。再做一次同樣的操作,最後再進行一次最大池化,尺寸縮小到6×6×256。6×6×256等於9216,將其展開為9216個單元,然後是一些全連線層。最後使用softmax函式輸出識別的結果,看它究竟是1000個可能的物件中的哪一個。

實際上,這種神經網路與LeNet有很多相似之處,不過AlexNet要大得多。正如前面講到的LeNetLeNet-5大約有6萬個引數,而AlexNet包含約6000萬個引數。當用於訓練影象和資料集時,AlexNet能夠處理非常相似的基本構造模組,這些模組往往包含著大量的隱藏單元或資料,這一點AlexNet表現出色。AlexNetLeNet表現更為出色的另一個原因是它使用了ReLu啟用函式。

同樣的,我還會講一些比較深奧的內容,如果你並不打算閱讀論文,不聽也沒有關係。第一點,在寫這篇論文的時候,GPU的處理速度還比較慢,所以AlexNet採用了非常複雜的方法在兩個GPU上進行訓練。大致原理是,這些層分別拆分到兩個不同的GPU上,同時還專門有一個方法用於兩個GPU進行交流。

論文還提到,經典的AlexNet結構還有另一種型別的層,叫作“區域性響應歸一化層”(Local Response Normalization),即LRN層,這類層應用得並不多,所以我並沒有專門講。區域性響應歸一層的基本思路是,假如這是網路的一塊,比如是13×13×256,LRN要做的就是選取一個位置,比如說這樣一個位置,從這個位置穿過整個通道,能得到256個數字,並進行歸一化。進行區域性響應歸一化的動機是,對於這張13×13的影象中的每個位置來說,我們可能並不需要太多的高啟用神經元。但是後來,很多研究者發現LRN起不到太大作用,這應該是被我劃掉的內容之一,因為並不重要,而且我們現在並不用LRN來訓練網路。

如果你對深度學習的歷史感興趣的話,我認為在AlexNet之前,深度學習已經在語音識別和其它幾個領域獲得了一些關注,但正是通過這篇論文,計算機視覺群體開始重視深度學習,並確信深度學習可以應用於計算機視覺領域。此後,深度學習在計算機視覺及其它領域的影響力與日俱增。如果你並不打算閱讀這方面的論文,其實可以不用學習這節課。但如果你想讀懂一些相關的論文,這是比較好理解的一篇,學起來會容易一些。

AlexNet網路結構看起來相對複雜,包含大量超引數,這些數字(55×55×96、27×27×96、27×27×256……)都是Alex Krizhevsky及其合著者不得不給出的。

這節課要講的第三個,也是最後一個範例是VGG,也叫作VGG-16網路。值得注意的一點是,VGG-16網路沒有那麼多超引數,這是一種只需要專注於構建卷積層的簡單網路。首先用3×3,步幅為1的過濾器構建卷積層,padding引數為same卷積中的引數。然後用一個2×2,步幅為2的過濾器構建最大池化層。因此VGG網路的一大優點是它確實簡化了神經網路結構,下面我們具體講講這種網路結構。

假設要識別這個影象,在最開始的兩層用64個3×3的過濾器對輸入影象進行卷積,輸出結果是224×224×64,因為使用了same卷積,通道數量也一樣。VGG-16其實是一個很深的網路,這裡我並沒有把所有卷積層都畫出來。

假設這個小圖是我們的輸入影象,尺寸是224×224×3,進行第一個卷積之後得到224×224×64的特徵圖,接著還有一層224×224×64,得到這樣2個厚度為64的卷積層,意味著我們用64個過濾器進行了兩次卷積。正如我在前面提到的,這裡採用的都是大小為3×3,步幅為1的過濾器,並且都是採用same卷積,所以我就不再把所有的層都畫出來了,只用一串數字代表這些網路。

接下來建立一個池化層,池化層將輸入影象進行壓縮,從224×224×64縮小到多少呢?沒錯,減少到112×112×64。然後又是若干個卷積層,使用129個過濾器,以及一些same卷積,我們看看輸出什麼結果,112×112×128.然後進行池化,可以推匯出池化後的結果是這樣(56×56×128)。接著再用256個相同的過濾器進行三次卷積操作,然後再池化,然後再卷積三次,再池化。如此進行幾輪操作後,將最後得到的7×7×512的特徵圖進行全連線操作,得到4096個單元,然後進行softmax啟用,輸出從1000個物件中識別的結果。

順便說一下,VGG-16的這個數字16,就是指在這個網路中包含16個卷積層和全連線層。確實是個很大的網路,總共包含約1.38億個引數,即便以現在的標準來看都算是非常大的網路。但VGG-16的結構並不複雜,這點非常吸引人,而且這種網路結構很規整,都是幾個卷積層後面跟著可以壓縮影象大小的池化層,池化層縮小影象的高度和寬度。同時,卷積層的過濾器數量變化存在一定的規律,由64翻倍變成128,再到256和512。作者可能認為512已經足夠大了,所以後面的層就不再翻倍了。無論如何,每一步都進行翻倍,或者說在每一組卷積層進行過濾器翻倍操作,正是設計此種網路結構的另一個簡單原則。這種相對一致的網路結構對研究者很有吸引力,而它的主要缺點是需要訓練的特徵數量非常巨大。

有些文章還介紹了VGG-19網路,它甚至比VGG-16還要大,如果你想了解更多細節,請參考幻燈片下方的註文,閱讀由Karen SimonyanAndrew Zisserman撰寫的論文。由於VGG-16的表現幾乎和VGG-19不分高下,所以很多人還是會使用VGG-16。我最喜歡它的一點是,文中揭示了,隨著網路的加深,影象的高度和寬度都在以一定的規律不斷縮小,每次池化後剛好縮小一半,而通道數量在不斷增加,而且剛好也是在每組卷積操作後增加一倍。也就是說,影象縮小的比例和通道數增加的比例是有規律的。從這個角度來看,這篇論文很吸引人。

以上就是三種經典的網路結構,如果你對這些論文感興趣,我建議從介紹AlexNet的論文開始,然後就是VGG的論文,最後是LeNet的論文。雖然有些晦澀難懂,但對於瞭解這些網路結構很有幫助。

參考資料

[1]  深度學習課程: https\://mooc.study.163.com/university/deeplearning_ai [2]黃海廣: https\://github.com/fengdu78 [3]github: https\://github.com/fengdu78/deeplearning_ai_books