當前位置:
首頁 > 知識 > 從LeNet-5到DenseNet

從LeNet-5到DenseNet

本文作者山隹木又,本文首發於作者的知乎專欄サイ桑的煉丹爐》, AI研習社獲其授權發布。

卷積、池化等操作不再贅述,總結一下從LeNet到DenseNet的發展歷程。

圖1. LeNet-5 網路結構

一、LeNet-5

卷積神經網路的開山之作,麻雀雖小五臟俱全,卷積層、池化層、全鏈接層一直沿用至今。

這個網路結構非常簡單,如圖1所示。

層數很淺,並且kernel大小單一,C1、C3、C5三個卷積層使用的kernel大小全部都是5×5,不過在我個人看來,這個kernel的大小是經過了無數次實驗得來的最優結果,並且有一定的特徵提取能力,才能如此經得起時間的考驗。C5的feature map大小為1×1是因為,S4的feature map大小為5×5而kernel大小與其相同,所以卷積的結果大小是1×1。

S2和S4兩個池化層使用的window大小均為2×2,這裡的池化有兩種,一個是平均池化(在window內對所有數值求平均值),一個是最大池化(取window內的最大值)。

F6是一個有84個神經元的全連接層,猜測這個神經元數量也是實驗所得較優的情況得來。

LeNet有一個很有趣的地方,就是S2層與C3層的連接方式。在原文里,這個方式稱為「Locally Connect」,學習了CNN很久之後的一天,在回顧CNN原理的時候發現了這種神奇的連接方式:

圖2. S2與C3層的局部連接

規定左上角為(0,0),右下角為(15,5),那麼在(n,m)位置的「X」表示S2層的第m個feature map與C3層的第n個kernel進行卷積操作。例如說,C3層的第0個kernel只與S2層的前三個feature map有連接,與其餘三個feature map是沒有連接的;C3層的第15個kernel與S2層的所有feature map都有連接。這難道不就是ShuffleNet?

順便分享一個很好的LeNet可視化項目:LeNet-5可視化(http://t.cn/RbmYJ5b)

二、AlexNet

圖3. AlexNet結構圖

AlexNet在2012年的ImageNet競賽上以,比以往最低錯誤率低10個百分點的成績奪冠。在介紹該網路的論文ImageNet Classification with Deep Convolutional Neural Networks(http://t.cn/RjKHKs0)中有很多乾貨:

一)、網路結構

網路一共有8層可學習層——5層卷積層和3層全鏈接層。網路的輸入為150,528(224x224x3)維,各層的神經元數量為:

253,440=>186,624=>64,896=>64,896=>43,264=>4096=>4096=>1000(ImageNet有1000個類)

舉個例子,計算一個186,624是怎麼來的(如果有人會計算253,440,教えてください!):

27x27x256=186,624

舉個例子,怎麼計算feature map尺寸:

,224為輸入大小,11為kernel大小,4為stride。

網路與之前的網路相比引入了以下新特徵:

1、ReLU非線性單元:

激活函數的作用是為了引入非線性,這麼說很抽象,但是在沒有激活函數的時候,無論有多少層MLP,得到的網路輸出依然是關於輸入的線性函數,如下圖所示:

傳統的激活函數一般是sigmoid和tanh兩種飽和非線性函數,就訓練時間來說,使用這些飽和的非線性函數會比使用非飽和的非線性函數ReLU,模型收斂需要更長的時間。而對於大型的數據集來說,更快的學習過程意味著可以節省更多的時間。除此之外,ReLU也引入了一定的稀疏性,在特徵表示的範疇內,數據有一定的稀疏性,也就是說,有一部分的數據其實是冗餘的。通過引入ReLU,可以模擬這種稀疏性,以最大近似的方式來保留數據的特徵。

2、多GPU訓練

在論文給出的圖3中我們可以看到,兩個網路是並行的,但是這並不意味著AlexNet一定是並行結構的,這張圖只是告訴我們,將AlexNet部署在多GPU上時的工作方式(為什麼要部署在多GPU上?因為當時的GTX580隻有3GB的顯存,不足以容納該網路最大的模型):每個GPU上並行地、分別地運行AlexNet的一部分(例如將4096個神經元的全連接層拆分為兩個並行的2048個神經元的全連接層,第一個卷積層有96個feature map而在一塊GPU上只有48個feature map等),兩塊GPU只在特定的層上有交互。

3、局部響應歸一化層(Local Response Normalization Layer)

LRN層只存在於第一層卷積層和第二層卷積層的激活函數後面,引入這一層的主要目的,主要是為了防止過擬合,增加模型的泛化能力。具體方法是在某一確定位置(x,y)將前後各2/n個feature map求和作為下一層的輸入。但是存在爭論,說LRN Layer其實並沒有什麼效果,在這裡不討論。

4、Overlapping Pooling

池化操作提取的是一小部分的代表性特徵,減少冗餘信息。傳統的卷積層中,相鄰的池化單元是不重疊的,具體點說就是,對於一個8x8的feature map,如果池化的stride=2、window的size=2,我們得到的就是傳統的池化操作。如果stride=2,window的size=3,那麼在進行池化的過程中,相鄰的池化window之間會有重疊的部分,這種池化就是overlapping pooling。論文也指出,這種池化只能「稍微」減輕過擬合。

二)、減輕過擬合

1、數據增強的兩種方式

1)、平移、翻轉、對稱等:

從256x256的圖片中隨機截取224x224的部分出來:

訓練時,取出所有的patch以及它們的水平對稱結果,這種操作將整個數據集放大了2048倍,為什麼是2048倍呢?因為在vertical和horizontal兩個方向上,各有32個位置可以進行crop,也就是32x32個patches。還有它們的horizontal reflection(水平對稱),也就是再翻一番,所以,一張圖片就可以獲得2048個patches。

測試時,取四個角以及中心共五處的patch,加以對這些patch進行水平對稱得到的patch來測試網路(一共是10個patches),也就是在預測時將10個patches逐一計算出softmax後的結果,再對所有的預測結果取平均,得到真正的分類。

2)、改變RGB通道的強度:

也就是,對每個RGB圖片的像素變為:

這裡的p和λ是RGB值3x3協方差矩陣的特徵向量和特徵值。α是均值為1標準差為0.1的高斯隨機變數。

這麼做的原因是利用了自然圖片的一條重要性質:物體的鑒別特徵並不會因為圖片強度和顏色的變化而變化,也就是說,一定程度上改變圖片的對比度、亮度、物體的顏色,並不會影響我們對物體的識別。在ImageNet上使用這個方法,降低了1%的top-1 error。

2、Dropout(自己的總結):

1)、Dropout是一種Bagging的近似:

Bagging定義k個不同的模型,從training set採樣出k個不同的數據集,在第i個模型上用第i個數據集進行訓練,最後綜合k個模型的結果,獲得最終的模型。但是需要的空間、時間都很大,在DNN中並不現實。

Dropout的目的是在指數級子網路的深度神經網路中近似Bagging。也就是說,在訓練時,每次Dropout後,訓練的網路是整個深度神經網路的其中一個子網路。在測試時,將dropout層取消,這樣得到的前向傳播結果其實就是若干個子網路前向傳播綜合結果的一種近似。

3、Learning rate decay:

隨著訓練的進行,逐漸減小學習率。

三、VGGNet(deep)

VGGNet與AlexNet很相似,都是卷積池化-卷積池化-...-全連接的套路,不同的是kernel大小,卷積stride,網路深度。

VGGNet將小卷積核帶入人們的視線,分析一下大小卷積核的區別與優劣:

在上面提到的AlexNet中第一個卷積層使用的kernel大小為11x11,stride為4,C3和C5層中使用的都是5x5的卷積核;而出現在VGGNet中大多數的卷積核都是大小為3x3,stride為1的。

直觀上我們會覺得大的卷積核更好,因為它可以提取到更大區域內的信息,但是實際上,大卷積核可以用多個小卷積核進行代替。例如,一個5x5的卷積核就可以用兩個串聯的3x3卷積核來代替,一個7x7的卷積核就可以用三個串聯的3x3卷積核來代替。這樣的替代方式有兩點好處:

1、減少了參數個數:

兩個串聯的小卷積核需要3x3x2=18個參數,一個5x5的卷積核則有25個參數。

三個串聯的小卷積核需要3x3x3=27個參數,一個7x7的卷積核則有49個參數。

大大減少了參數的數量。

2、引入了更多的非線性:

多少個串聯的小卷積核就對應著多少次激活(activation)的過程,而一個大的卷積核就只有一次激活的過程。引入了更多的非線性變換,也就意味著模型的表達能力會更強,可以去擬合更高維的分布。

值得一提的是,VGGNet結構的C裡面還用到了1x1的卷積核。但是這裡對這種卷積核的使用並不是像Inception裡面拿來對通道進行整合,模擬升維和降維,這裡並沒有改變通道數,所以可以理解為是進一步的引入非線性。

VGGNet相比於AlexNet層數更深,參數更多,但是卻可以更快的收斂,在網上被解釋為「更深的網路層數和更小的卷積核起到了隱式的正則化效果」,這句話讀來讓人一頭霧水。我自己的解讀是:更小的卷積和步長核使得在反向傳播的過程中,kernel所需要考慮的loss來自於更多次的卷積,來自於整張feature map的更多patch,並且kernel自身需要更新的參數也變少了,這樣梯度下降更新的方向就更加趨向於極值點,起到了一定的正則化作用;而更深的網路代表的是網路更強的表達能力,但是深的網路會引起梯度爆炸或者梯度消失,不知道網路的深度應該怎樣與正則化聯繫起來,歡迎討論。

原論文中還提到了一種新的測試方式,稱作multi-scale testing,數據增強中也使用了multi-scale方法,不多介紹。

總地來說,VGGNet的出現讓我們知道CNN的潛力無窮,並且越深的網路在分類問題上表現出來的性能越好,並不是越大的卷積核就越好,也不是越小的就越好,就VGGNet來看,3x3卷積核是最合理的。

四、GoogLeNet (Inception v1~v4, deeper)

一)、Inception v1

有了VGG的鋪墊,人們開始意識到,為了更好的網路性能,那有一條途徑就是加深網路的深度和寬度,但是太過於複雜,參數過多的模型就會使得模型在不夠複雜的數據上傾向於過擬合,並且過多的參數意味著需要更多的算力,也就是需要更多的時間和更多的錢。

GoogLeNet的核心思想是:將全連接,甚至卷積中的局部連接,全部替換為稀疏連接。

1、生物神經系統中的連接是稀疏的;

2、如果一個數據集的概率分布可以由一個很大、很稀疏的深度神經網路表示時,那麼通過,分析最後一層激活值的相關統計和對輸出高度相關的神經元進行聚類,可以逐層地構建出一個最優網路拓撲結構。也就是說,一個深度稀疏網路可以被逐層簡化,並且因為保留了網路的統計性質,其表達能力也沒有被明顯減弱。

但是由於計算機硬體計算稀疏數據的低效性,現在需要提出的是一種,既能保持網路結構的稀疏性,又能利用密集矩陣計算的高效性的方法。大量研究表明,可以將稀疏矩陣聚類為較為密集的子矩陣來提高計算性能,Inception應運而生。

上圖結構是Inception的naive版本基本單元,為什麼由這種模型stack起來的網路既保持了網路結構的稀疏性,又利用了密集矩陣計算的高效性?

稀疏性是指卷積運算的使用,因為卷積通常對應著一個非常稀疏的矩陣(一個幾乎所有元素都為零的矩陣),怎麼理解卷積的稀疏性呢?在傳統的神經網路中,使用矩陣乘法來建立輸入與輸出之間的連接關係,其中參數矩陣中的每一個單獨的參數都描述了一個輸入單元和輸出單元的交互,我們使用的kernel的尺寸是遠遠小於圖片的尺寸的,在feature map中,一個神經元只受到少數輸入單元的影響,這是不同於密集的全連接的,稱之為卷積的稀疏性。

密集矩陣計算依然是存在的,Inception模塊中的四個分支可以看作是較為稀疏的部分,但是拼接之後又成為一個大的密集矩陣。

這種基本模塊使用了3種不同的卷積核,那麼提取到的應該是3種不同尺度的特徵,既有較為宏觀的特徵又有較為微觀的特徵,增加了特徵的多樣性。池化層在我的理解就是保留較為原始的輸入信息。在模塊的輸出端將提取到的各種特徵在channel維度上進行拼接,得到多尺度的特徵。

但是這種naive的版本在進行5x5卷積的時候依然會消耗大量的算力,舉個例子分析:

如果previous layer輸出的feature map為100x100x128,假設naive版本的5x5卷積核共有256個,需要的參數就為128x5x5x256個。假設,在進行5x5的卷積之前,先進行一次1x1的卷積,那麼參數量可以大大降低。假設1x1的卷積核共有32個,5x5的卷積核依然有256個,那麼需要的參數量為128x1x1x32+32x5x5x256,為前一種方法的0.255倍。注意到,這裡的1x1卷積是被拿來進行channel維度的整合(降維),而在之前VGG中提到的只是為了引入非線性,毫無疑問,這裡不僅降低了計算量,並且增加了非線性,增強了網路的表達能力,是一舉兩得的事情。

改進版的Inception module如下:

GoogLeNet(Inception-V1)的結構圖如下:

可以看到,GoogLeNet使用的是模塊化堆積的方法。

論文中說:模型在分類器之前使用了平均池化來替代全連接層的idea來自於NIN,在最後加入一層全連接層的為了使得模型在其他數據集上進行finetune時更方便。作者們發現將全連接層替換為平均池化層後,top-1準確率(accuracy)上升了0.6%,雖然移除了全連接層,但是dropout依然很重要。

值得注意的是,網路中有三個softmax,這是為了減輕在深層網路反向傳播時梯度消失的影響,也就是說,整個網路的loss是由三個softmax共同組成的,這樣在反向傳播的時候,即使最後一個softmax傳播回來的梯度消失了,還有前兩個softmax傳播回來的梯度進行輔助。在對網路進行測試的時候,這兩個額外的softmax將會被拿掉。這樣不僅僅減輕了梯度消失的影響,而且加速了網路的收斂。

整個Inception-v1的參數設置如圖:

可以看到,隨著網路變深,卷積核的個數也在不斷增加,這是因為越往後,網路提取到的特徵越抽象(例如,人之於眼睛鼻子嘴巴是抽象的),而且每個抽象特徵需要的卷積核尺寸也相應大,所以隨著層數變深,較大卷積核的數量應當隨之提升。

二)、Inception v2 & v3

在具體介紹與v1版本的區別之前我想先直觀地說一下batch normalization,因為在v3版本中使用了BN。這是我自己在ipad上記的筆記:

Batch normalization解決的是一個Internal covariate shift問題,論文中將這個問題定義為在訓練過程中由於網路參數的改變而引起的網路激活分布的改變。筆記中最後一點關於BN應該放在何處的問題,近段時間也有一些爭議,比如這個鏈接里做的對比BN-before or after ReLU?(http://t.cn/RjKgxNM)結果是將BN放在ReLU後面會有更好的效果。求指點!

那麼v2版本到底在哪裡進行了改進呢?

首先,參考了前面提到的VGGNet用兩個串聯的3x3卷積替代一個5x5卷積的方法。

其次,引入非對稱卷積。例如,將3x1的卷積和1x3的卷積串聯起來,與直接進行3x3卷積的結果是等價的。這種卷積方式大大降低了參數量,從nxn降到了2xn,所以當n越大,降低得越多。但是也並不是適用於所有的卷積方式,論文說明,在實踐中在feature map為12x12~20x20時效果較好,也就是在較深層使用時效果好,淺層不太行,並且使用7x1和1x7卷積的串聯可以得到很好的效果。有興趣可以自己查看論文:Rethinking the Inception Architecture for Computer Vision(http://t.cn/RjKevpW)。

文章在不同深度的網路使用了不同類型的inception module,三種模塊如下圖所示:

整個網路的結構如圖所示:

網路在很深的層次才使用了含有非對稱卷積的Inception module,比如在8x8這種解析度最低的feature map才使用了第三種Inception module,其原因是,這些最粗糙的網格,最靠近網路的末端,對於這些深層的網路來說,最關鍵的一點是要產生高維的稀疏表示,所以這些深層更需要的是局部處理(比如1x1的卷積得出的是最稀疏的結果),第三種Inception module是這三種模型中可以得到最稀疏結果的模型。

在ImageNet上的測試結果為:

Inception-v2是最原汁原味的版本,下面的Inception-v2 RMSProp、Inception-v2 Label Smoothing、Inception-v2 Factorized7x7、Inception-v2 BN-auxiliary是經過了一系列改進後的結果,具體操作請參考論文。

"Inception-v3 = Inception-v2 + Factorization + Batch Normalization"

三)、Inception-v4 &Inception-ResNet-v2(建議先看第五部分ResNet):

我們先看Inception-ResNet-v2:

網路的結構如上圖,下面我們看看如何與ResNet結合(主要體現在Inception-resnet-ABC模塊里):

Inception-resnet-A

Inception-resnet-B

Inception-resnet-C

可見,對每個Inception-resnet模塊而言,綜合了之前版本的Inception模塊版本和ResNet的殘差單元。除此之外,Google還優化了一個性能與Inception-ResNet-v2相仿的Inception-v4版本,不多討論,可以自行看論文,對每個Inception模塊的優化情況。

下面是模型在ImageNet數據集上的測試結果:

單模型:

組合模型:

五、ResNet

首先,我想以拙見說一說什麼是殘差:

殘差的定義是,觀測值與估計值之間的差距,顯然殘差網路里的殘差與這個定義不同。

假設我們有一個identity,用x表示。同時我們有一種想要的映射H(x),並且希望可以由兩層weight layer的傳播來得到這種映射。那這樣我們就得到了一個神經網路。但是,如果我們定義殘差為F(x)=H(x)-x,並且希望用兩層的weight layer的傳播來擬合殘差,那麼我們想要得到的理想映射H(x)=F(x)+x。這就是殘差網路的基本理念,網路學習的是去擬合殘差,而不是直接擬合輸入和輸出直接的映射。

引入殘差單元:

接下來放幾張作者在ICML2016上解讀殘差網路的PPT:

也就是說,如果identity是最優的,它就是我們想要的理想映射,那麼我們可以直接將F(x)的參數全部置零;如果identity和H(x)很相近,那麼我們就可以通過學習殘差來修正這種差別。這個箭頭稱作shortcut connection,idea來自於highway network的skip-connection。

殘差網路的設計理念是:保持簡潔+VGG-SYTLE+就是要深

分享一個翻譯版本的論文:中文版殘差網路論文(http://t.cn/RC0XKlr)

我又要放自己的筆記了,這是一篇分析為啥深度殘差網路性能好的論文,並且提出了一種新的殘差單元,Identity Mappings in Deep Residual Networks(http://t.cn/Rj9ARVM):

這裡分析了為什麼深度殘差網路卻沒有因為網路加深而帶來的梯度消失或者題都爆炸問題,因為殘差結構的特殊性,在由loss對輸入求導的時候,導數項會被分解為兩個,而有一個直接對輸入的導數項並不會消失,所以梯度一直存在。

因為之前提到的沒有shorcut connection的網路里,考慮activation的位置沒有什麼意義。但是在有分支的殘差網路里,因為存在著addition,那麼和identity相加的值應該是激活前還是激活後的就值得考慮。這裡比較了各種殘差單元的優劣,也就是說,將identity先進行BN,再激活,再傳入weight layer進行計算的效果是最優的。

ResNet可以逐漸加深,常用的有ResNet-50、ResNet-101、ResNet-152。像ResNet-1001這麼龐大的model一般的GPU難以載入。這些模型的參數如圖:

六、DenseNet

首先介紹什麼是Dense Block:

如圖所示的結構就叫作Dense Block,它包括輸入層在內共有5層,H是BN+ReLU+3x3Conv的操作,並不改變feature map的大小。對於每一層來說,前面所有層的feature map都被直接拿來作為這一層的輸入。growth rate就是除了輸入層之外,每一層feature map的個數。它的目的是,使得block中的任意兩層都能夠直接」溝通「。

其實在Dense Block輸出的地方還有一個bottleneck layer,在bottleneck layer中的操作是一個1x1的卷積,卷積核共有4k個,降低channel維度,也就是減少了模型的參數。

在transition layer中有進一步壓縮的操作稱為compression,減少百分之θ的feature map數量,論文中使用的θ=0.5。

然後介紹DenseNet的模型:

也就是說,DenseNet其實是由若干個Dense Block串聯起來而得到的,在每個Dense Block之間有一個Convolution+Pooling的操作,也就是圖1中的transition layer。transition layer存在的意義是實現池化,作者在論文中承認了pooling的重要性。

分析一下為什麼會從ResNet發展到DenseNet:

借用論文里的話,ResNet直接通過"Summation"操作將特徵加起來,一定程度上阻礙(impede)了網路中的信息流。DenseNet通過連接(concatenate)操作來結合feature map,並且每一層都與其他層有關係,都有」溝通「,這種方式使得信息流最大化。其實DenseNet中的dense connectivity就是一種升級版的shortcut connection,提升了網路的魯棒性並且加快了學習速度。

DenseNet的各種模型結構如圖:

圖中的每個conv代表的都是BN+ReLU+Conv的一連貫操作。

(完)

不要等到演算法出現accuracy不好、

loss很高、模型overfitting時,

才後悔沒有好好掌握基礎數學理論。

走穩機器學習第一步,夯實數學基礎!

「線性代數及矩陣論、概率論與統計、凸優化」

3大數學基礎課程,火熱團購中!

掃碼參團

新人福利

關注 AI 研習社(okweiwu),回復1領取

【超過 1000G 神經網路 / AI / 大數據,教程,論文】

為什麼ResNet和DenseNet可以這麼深?


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

遷移學習的發展和現狀
從事人臉識別研究必讀的N篇文章
從傳統演算法走向神經網路
Yann Lecun CoLR演講全解讀:機器該如何像動物和人類一樣有效學習?
從傳統神經網路的角度解讀Geoffrey Hinton的Capsule模型

TAG:AI研習社 |