CNN發展史+論文+代碼

一、簡述

最近一直在看深度學習相關的東西,而CNN是深度學習中的核心算法之一,也是2012年以來將人工智能推向風口浪尖的推手。今天我來與大家一起分享一下CNN的發展歷史,看看各路大牛是如何克服難題,並造就了現在CNN網絡結構百花齊放的景象。

1、卷積神經網絡

首先來簡單說一下,什麼是CNN,卷積神經網絡,它是一種人工神經網絡的結構,是從貓的視覺神經結構中得到了靈感,進而模擬其結構設計出來的一種人工神經網絡結構。至於什麼是人工神經網絡,我默認大家都是知道的,在這裏就不解釋了。(要了解CNN,需要先了解什麼是人工神經網絡算法,可以參考我的另一篇文章:《【神經網絡算法入門】詳細推導全連接神經網絡算法及反向傳播算法+Python實現代碼》

這種結構通過卷積核來獲取“感受野”範圍內數據之間的關係特徵。一張圖片裏,相鄰的像素顯然是有更強的相關性,相比於全連接神經網絡,CNN突出了這種相鄰的關係特徵,因而更加準確的獲取了圖片內的有用信息。

具體卷積核是怎麼工作的我找了幾張圖,大家感受一下:

卷積核的工作原理

卷積核工作原理動圖

多通道多卷積核的工作原理

 

多通道卷積的具體計算方法

所以說,CNN的原理就是通過卷積核獲取圖像的空間關係特徵,並使用BP(反向傳播)算法調整卷積核的參數,最終得到一個可以有效獲取圖片內有用信息的模型。

下面我們就從CNN的發展歷史角度,來了解CNN是如何一步一步發展,在這過程中解決了什麼問題。

 

2、比賽

講歷史就必須有一個主線,而我要說的這個歷史主線就是ILSVRC,一個想了解CNN必須要了解的計算機視覺領域最權威的學術競賽。

ILSVRC(ImageNet Large Scale Visual Recognition Challenge)競賽(2010-2017),這個競賽所使用的數據集,是由斯坦福大學李飛飛教授主導,包含了超過1400萬張全尺寸的有標記圖片。ILSVRC比賽會每年從ImageNet數據集中抽出部分樣本用於比賽,以2012年爲例,比賽的訓練集包含1281167張圖片,驗證集包含50000張圖片,測試集爲100000張圖片。競賽的項目主要包括圖像的分類和定位(CLS-LOC)、目標檢測(DET)、視頻目標檢測(VID)和場景分類(Scene)。

我下面講的,主要是在最基本的分類問題上,歷屆表現優異的模型。不過ILSVRC從2017之後就停辦了,另外一個計算機視覺領域的賽事,就成爲了該領域權威的競賽,它就是從2014年開始由微軟舉辦的MS COCO競賽。

MS COCO(Microsoft COCO: Common Objects in Context)競賽(2014-) 物體檢測、全景分割、人體關鍵點、姿態估計(DensePose);2018年開始又新增了,街景檢測、街景全景分割。在這裏就不詳細介紹了,感興趣的可以自己研究研究,如果能在這個比賽中獲得不錯的名次,百萬年薪不是夢! <傳送門>

 

二、CNN發展史

先偷一張圖給大家看看,就是一系列里程碑式的模型,分別在ImageNet數據集圖像分類的準確率表現:

這裏面除了LeNet以外,其他都是在ILSVRC競賽裏表現優異的模型,爲什麼把LeNet放在這裏面呢,我想來作者的想法一是做個對比,另外一個就是對LeNet表示一下尊重,因爲LeNet是其他所有CNN網絡模型的鼻祖,它的作者就是CNN之父、2018年圖靈獎得主、深度學習三主神之一的Yann Lecun揚·萊坎。

下面我們來捋一捋各個模型之間的關係,於是我又偷了一張圖:

2012年AlexNet的發佈使人工智能算法迎來了歷史性的突破,才造就了之後的輿論關注和CNN的研究爆發式的增長。之後一系列著名的CNN模型都是在AlexNet的基礎上演變出來的,它門主要分爲兩個流派,一個是以加深網絡爲主的VGG流派,另一個是以增強卷積模塊功能爲主的NIN流派。之後兩個流派相結合產生了Inception ResNet。

如果說AlexNet是之後所有CNN模型的爸爸,那麼LeNet就是所有這些模型的爺爺。下面我們就從LeNet開始一一介紹各個經典模型都做了哪些工作,解決了什麼問題。

下面的介紹中會提到一些經典的論文,這些論文可以從這裏獲取:

[email protected]:cuiyuan605/deep_learning.git

供大家參考,另外,這裏還包含了以下所述網絡模型的部分實現代碼。

 

1、LeNet(1998)--開山鼻祖

首先是LeNet,它是由CNN之父Lecun在1998年提出,用於解決手寫數字識別任務的,著名的Tensorflow入門學習數據集MNIST,就是那時候做出來的。LeNet對應的論文是《Gradient-Based Learning Applied to Document Recognition》。

LeNet又叫LeNet-5,這個5是指它的網絡結構中有5個表示層,具體結構如下圖所示:

LeNet5包含Input、卷積層1、池化層1、卷積層2、池化層2、全連接層、輸出層。

1998年的LeNet5模型的發佈標註着CNN的真正面世,但是這個模型在後來的一段時間並未能火起來,主要原因是當時的計算力跟不上,而且其他的算法(比如SVM)也能達到類似的效果甚至超過。不過LeNet最大的貢獻是:定義了CNN卷積層、池化層、全連接層的基本結構,是CNN的鼻祖

 LeNet5當時的特性有如下幾點:

(1)每個卷積層包含三個部分:卷積、池化和非線性激活函數

(2)使用卷積提取空間特徵(起初被稱爲感受野,未提“卷積”二字)

(3)降採樣(Subsample)的平均池化層(Average Pooling)

(4)雙曲正切(Tanh)的激活函數

(5)MLP作爲最後的分類器

(6)使用卷積令層與層之間稀疏連接,減少了計算複雜性

不過,一般認爲CNN的開山之作是Lecun 1989發表的另一篇論文《Backpropagation Applied to Handwritten Zip Code Recognition》。這篇論文寫的比較短,通篇沒有找到CNN模型相關的原理解釋說明。當時也沒有提到“卷積”二字,而是被稱爲“感受野”。

但是從它的參考文獻中,我們可以找到一篇重要的文章《1980-Fukushima-Neocognitron A self-organizing neural network model for a mechanism of pattern recognition unaffected by shift in position》。這是日本學者福島邦彥,通過研究貓的視覺神經得到的啓發,闡述了卷積和池化兩個思想(當時還不叫卷積和池化)。

福島邦彥的團隊當時也開發了仿真模型Neocognitron(神經認知機),不過Neocognitron爲什麼沒有發揚光大呢,感覺和CNN相比主要還是差在BP算法上,直到1998年Lecun提出了LeNet-5,把CNN推上了一個小高潮,之後Neocognitron也基本上放棄治療了。

但是,受限於當時計算力的不足,LeNet訓練較慢,且還有一些其他算法(比如SVM)能達到類似或者更好的效果,LeNet並沒有真正的火起來。

1998年到2012年世界在不斷髮生着巨大的變化,CNN也在默默的發展,其中有一篇論文要提一下,就是2006年MIT腦科學研究中心的論文《Notes on Convolutional Neural Networks》,裏面給了詳細的CNN權值更新的公式。

 

2、AlexNet(2012)--王者歸來

AlexNet在2012年ImageNet競賽中以超過第二名10.9個百分點的絕對優勢一舉奪冠,這一突破是具有重大歷史意義,因爲它使計算機視覺模型跨過了從學術demo到商業化產品的門檻,從而將深度學習和CNN的名聲突破學術界,在產業界一鳴驚人。AlexNet的出現可謂是卷積神經網絡的王者歸來。

在這裏我們先八卦一下人工智能大神之間的關係。2018年圖靈獎獲得者是號稱深度學習三巨頭的Yann Lecun(揚·萊坎),Geoffrey Hinton(傑弗裏·欣頓),和Yoshua Bengio(約舒亞·本希奧),我把他們稱作深度學習三主神,就是下面這三位,我們先來一起瞻仰一下:

由於他們早年都在加拿大的大學工作過,是非常親密的朋友和合作者,所以AI領域的人戲稱他們“深度學習加拿大黑手黨”。他們是上世紀七八十年代,深度學習的“寒冬”裏,爲數不多堅持研究神經網絡的“頑固派”,是神經網絡的堅定信仰者,也是他們一手把深度學習帶出了“寒冬”。

其中Hinton年紀較大,1986年完成著名論文《Experiments on Learning by Back Propagation》第一個證明了廣義反向傳播算法可用於訓練多層神經網絡。

Lecun曾在多倫多大學跟隨Hinton做博士後研究,期間完成了LeNet的雛形思想。

Bengio和Lecun年紀相仿,曾一起在AT&T貝爾實驗室的共事,與Lecun一起完成了LeNet。

而AlexNet的作者Alex Krizhevsky,是Hinton的博士生,所以說AlexNet和LeNet可謂是一脈相承的。關係如下所示:

我們言歸正傳,AlexNet爲8層深度的CNN網絡,其中包括5個卷積層和3個全連接層(不包括LRN層和池化層),如下圖所示:

AlexNet的特點和貢獻:

(1)使用ReLU作爲激活函數,由於ReLU是非飽和函數,也就是說它的導數在大於0時,一直是1,因此解決了Sigmoid激活函數在網絡比較深時的梯度消失問題,提高SGD(隨機梯度下降)的收斂速度。

(2)使用Dropout方法避免模型過擬合,該方法通過讓全連接層的神經元(該模型在前兩個全連接層引入Dropout)以一定的概率失去活性(比如0.5),失活的神經元不再參與前向和反向傳播,相當於約有一半的神經元不再起作用。在預測的時候,讓所有神經元的輸出乘Dropout值(比如0.5)。這一機制有效緩解了模型的過擬合。

(3)重疊的最大池化,之前的CNN中普遍使用平均池化,而AlexNet全部使用最大池化,避免平均池化的模糊化效果。並且,池化的步長小於核尺寸,這樣使得池化層的輸出之間會有重疊和覆蓋,提升了特徵的豐富性。

(4)提出LRN(局部響應歸一化)層,對局部神經元的活動創建競爭機制,使得響應較大的值變得相對更大,並抑制其他反饋較小的神經元,增強了模型的泛化能力。

(5)使用GPU加速,加快了模型的訓練速度,同時也意味着可以訓練更大規模的神經網絡模型。

(6)數據增強,隨機從256*256的原始圖像中截取224*224大小的區域(以及水平翻轉的鏡像),相當於增強了(256-224)*(256-224)*2=2048倍的數據量。使用了數據增強後,減輕過擬合,提升泛化能力。避免因爲原始數據量的大小使得參數衆多的CNN陷入過擬閤中。

 

3、ZFNet(2013)--穩步前行

ZFNet是2013ImageNet分類任務的冠軍,其網絡結構沒什麼改進,只是調了調參,性能較Alex提升了不少。ZF-Net只是將AlexNet第一層卷積核由11變成7,步長由4變爲2,第3,4,5卷積層轉變爲384,384,256。這一年的ImageNet還是比較平靜的一屆,其冠軍ZF-Net的名堂也沒其他屆的經典網絡架構響亮。

其論文是《Visualizing and Understanding Convolutional Networks》,網絡結構如下:

 

4、VGG(2014 2rd)--越走越深

VGG-Nets是由牛津大學VGG(Visual Geometry Group)提出,是2014年ImageNet競賽定位任務的第一名和分類任務的第二名的中的基礎網絡。VGG可以看成是加深版本的AlexNet. 都是卷積層+全連接層,在當時看來這是一個非常深的網絡了,因爲層數高達十多層,我們從其論文名字就知道了(《Very Deep Convolutional Networks for Large-Scale Visual Recognition》),當然以現在的目光看來VGG真的稱不上是一個very deep的網絡。

VGGNet探索了CNN的深度及其性能之間的關係,通過反覆堆疊3*3的小型卷積核和2*2的最大池化層,VGGNet成功的構築了16-19層深的CNN。VGGNet有A-E六種結構,從A-E網絡逐步變深,但是參數量並沒有增長很多,如下圖所示,原因爲:參數量主要消耗在最後3個全連接層,而前面的卷積層雖然層數多,但消耗的參數量不大。不過,卷積層的訓練比較耗時,因爲其計算量大。

其中,D和E是常說的VGGNet-16和VGGNet-19。C很有意思,相比於B多了幾個1*1的卷積層,1*1卷積的意義在於增加非線性變換,而輸入的通道數和輸出的通道數不變,沒有發生降維。

VGG的性能:

VGG的特點:

(1)VGGNet擁有5段卷積,每段卷積內有2-3個卷積層,同時每段尾部都會連接一個最大池化層(用來縮小圖片)。

(2)每段內的卷積核數量一樣,越後邊的段內卷積核數量越多,依次爲:64-128-256-512-512。

(3)越深的網絡效果越好。

(4)LRN層作用不大(作者結論)。

(5)1x1的卷積也是很有效的,但是沒有3*3的卷積好,大一些的卷積核可以學習更大的空間特徵。不過1x1的卷積核可以用於增加模型的非線性變化,並可用於升維和降維。

VGG的突出貢獻在於,證明了使用小的卷積核,增加網絡深度可以有效的提高模型效果,而且VGGNet對其他數據集具有很好的泛化能力。到目前爲止,VGGNet依然經常被用來提取圖像特徵。

爲什麼說小的卷積核堆積能夠提高模型效果呢?比如3x3的卷積核堆疊兩層,則“感受野”就會變爲5x5,堆疊三層,“感受野”就會變成7x7,而多層小的卷積核參數更少(3*3*3=27<1*7*7=49),且增加了更多的非線性變化(三層卷積有三次ReLU),這樣增加了模型的表達能力。

 

5、GoogLeNet(2014) Inception V1 V2 V3 V4,Inception-ResNet(2016)--大浪推手

Google Inception Net首次出現在ILSVRC2014的比賽中(和VGGNet同年),以較大的優勢獲得冠軍。那一屆的GoogLeNet通常被稱爲Inception V1,Inception V1的特點是控制了計算量的參數量的同時,獲得了非常好的性能-top5錯誤率6.67%, 這主要歸功於GoogLeNet中引入一個新的網絡結構Inception模塊(該設計靈感來源於《Network in Network》,也就是NIN),所以GoogLeNet又被稱爲Inception V1(後面還有改進版V2、V3、V4)架構中有22層深,V1比VGGNet和AlexNet都深,但是它只有500萬的參數量,計算量也只有15億次浮點運算,在參數量和計算量下降的同時保證了準確率,可以說是非常優秀並且實用的模型。Inception模塊如下所示:

具體Inception V1的結構如下:

這裏只放了一張表,因爲模型示意圖太長放不下。想要看模型圖的可以去看下論文。GoogLeNet的論文爲《Going deeper with convolutions》,在這篇論文裏,我看到了幾個華人的名字(其實NIN也是新加坡國立大學的三個華人發表的),說明大約從這個時候開始,華人科學家開始走到CNN研究的前列。其中有一個名字有點兒熟悉,就是前段時間上了新聞的賈揚清(2019年3月份加入阿里巴巴硅谷研究院),他開發了著名的機器學習框架Caffe,並在Google參與設計和開發了Tensorflow。

GoogLeNet特點:

(1)引入Inception結構,這是一種網中網(Network In Network)的結構,即原來的結點也是一個網絡。

(2)中間層的輔助LOSS單元,GoogLeNet網絡結構中有3個LOSS單元,這樣的網絡設計是爲了幫助網絡的收斂。在中間層加入輔助計算的LOSS單元,目的是計算損失時讓低層的特徵也有很好的區分能力,從而讓網絡更好地被訓練。在論文中,這兩個輔助LOSS單元的計算被乘以0.3,然後和最後的LOSS相加作爲最終的損失函數來訓練網絡。

(3)後面的全連接層全部替換爲簡單的全局平均池化層,在最後參數會變的更少。而在AlexNet中最後3層的全連接層參數差不多佔總參數的90%,使用大網絡在寬度和深度上允許GoogleNet移除全連接層,但並不會影響到結果的精度,在ImageNet中實現93.3%的精度,而且要比VGG還要快。

之後Inception還出了V2 V3 V4,它們分別對應的論文是:

2015年,Inception V2,《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》

2015年,Inception V3,《Rethinking the Inception Architecture for Computer Vision》

2016年,Inception V4,《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》

 

6、ResNet(2015)--里程碑式創新

2015年何愷明推出的ResNet在ISLVRC和COCO上橫掃所有選手,獲得冠軍。ResNet在網絡結構上做了大創新,而不再是簡單的堆積層數,ResNet在卷積神經網絡的新思路,絕對是深度學習發展歷程上里程碑式的事件。它在VGGNet和MSRANet基礎上進一步加深網絡,並通過引入殘差單元來解決網絡過深引起的退化問題。而ResNet的主要創新就是殘差模塊,如下圖所示:

殘差模塊借鑑了Highway Network思想的網絡相當於旁邊專門開個通道使得輸入可以直達輸出,而優化的目標由原來的擬合輸出F(x)變成輸出和輸入的差F(x)-x,其中F(x)是某一層原始的期望映射輸出,x是輸入。

此外,如下圖所示:

左圖是常規殘差模塊,有兩個3×3卷積核組成,但是隨着網絡進一步加深,這種殘差結構在實踐中並不是十分有效。針對這問題,右圖的“瓶頸殘差模塊”(bottleneck residual block)可以有更好的效果,它依次由1×1、3×3、1×1這三個卷積層堆積而成,這裏的1×1的卷積能夠起降維或升維的作用,從而令3×3的卷積可以在相對較低維度的輸入上進行,以達到提高計算效率的目的。

 

7、Trimps-Soushen(公安三所),CUImage(商湯和港中文)(2016)--百花齊放

2016年,深度學習的研究進入一個百花齊放的時期,涌現了各種各樣的網絡模型,中國的公司和研究機構,也開始刷榜機器學習相關競賽。這一年ISLVRC獲勝的隊伍是公安三所的Trimps-Soushen(搜神),以及商湯和香港中文大學的CUImage,不過他們模型的相關資料不是很多,在這裏就不詳細說明了。

不過,在這裏我們來八卦一下國內AI領域的大神,湯曉鷗,作爲大神肯定有很多的頭銜和身份,我在這裏只介紹與本文主題最相關的三重身份,分別是:香港中文大學信息工程系主任,微軟亞洲研究院視覺計算組主任(2005-2007),商湯科技創始人、董事長。

ResNet的作者何愷明,就是湯曉鷗在香港中文大學的博士生。此外,國內計算機視覺方面的另一家巨頭獨角獸,曠世科技的首席科學家孫劍,也是湯曉鷗在微軟亞洲研究院的學生。

此外,國內很多家人工智能企業的骨幹都和湯曉鷗有這千絲萬縷的聯繫,可見其在國內AI領域的影響力。

 

8、SENet、DenseNet(2017)--另尋蹊徑

SENet是2017年最後一屆ILSVRC競賽的圖像分類和定位冠軍。在2017年之前已經有很多工作在空間維度上來提升網絡的性能。那麼很自然想到,網絡是否可以從其他層面來考慮去提升性能,比如考慮特徵通道之間的關係?基於這一點並提出了 Squeeze-and-Excitation Networks(簡稱 SENet)。在SENet結構中,Squeeze 和 Excitation 是兩個非常關鍵的操作,所以以此來命名。動機是希望顯式地建模特徵通道之間的相互依賴關係。另外,作者並不打算引入一個新的空間維度來進行特徵通道間的融合,而是採用了一種全新的「特徵重標定」策略。具體來說,就是通過學習的方式來自動獲取到每個特徵通道的重要程度,然後依照這個重要程度去提升有用的特徵並抑制對當前任務用處不大的特徵。

下圖是提出的 SE 模塊的示意圖:

給定一個輸入x,其特徵通道數爲c_1,通過一系列卷積等一般變換後得到一個特徵通道數爲c_2 的特徵。與傳統的 CNN 不一樣的是,接下來我們通過三個操作來重標定前面得到的特徵。

(1)首先是 Squeeze 操作,我們順着空間維度來進行特徵壓縮,將每個二維的特徵通道變成一個實數,這個實數某種程度上具有全局的感受野,並且輸出的維度和輸入的特徵通道數相匹配。它表徵着在特徵通道上響應的全局分佈,而且使得靠近輸入的層也可以獲得全局的感受野,這一點在很多任務中都是非常有用的。

(2)其次是 Excitation 操作,它是一個類似於循環神經網絡中門的機制。通過參數 w 來爲每個特徵通道生成權重,其中參數 w 被學習用來顯式地建模特徵通道間的相關性。

(3)最後是一個 Reweight 的操作,我們將 Excitation 的輸出的權重看作是經過特徵選擇後的每個特徵通道的重要性,然後通過乘法逐通道加權到先前的特徵上,完成在通道維度上的對原始特徵的重標定。

SENet作者的詳細說明:《專欄 | Momenta詳解ImageNet 2017奪冠架構SENet

實現代碼:https://github.com/hujie-frank/SENet

 

DenseNet雖然沒有參加ILSVRC競賽,但它獲得了計算機視覺頂級會議CVPR 2017最佳論文。自Resnet提出以後,ResNet的變種網絡層出不窮,都各有其特點,網絡性能也有一定的提升。DenseNet提出的網絡模型(Dense Convolutional Network),主要也是和ResNet及Inception網絡做對比,思想上有借鑑,但卻是全新的結構,網絡結構並不複雜,卻非常有效,在CIFAR指標上全面超越ResNet。可以說DenseNet吸收了ResNet最精華的部分,並在此上做了更加創新的工作,使得網絡性能進一步提升。

DenseNet的特點是:密集連接,來緩解梯度消失問題,加強特徵傳播,鼓勵特徵複用,極大的減少了參數量。DenseNet 是一種具有密集連接的卷積神經網絡。在該網絡中,任何兩層之間都有直接的連接,也就是說,網絡每一層的輸入都是前面所有層輸出的並集,而該層所學習的特徵圖也會被直接傳給其後面所有層作爲輸入。

下圖是 DenseNet 的一個dense block示意圖:

一個block裏面的結構如下,與ResNet中的BottleNeck基本一致: BN-ReLU-Conv(1×1)- BN-ReLU-Conv(3×3) ,而一個DenseNet則由多個這種block組成。每個DenseBlock的之間層稱爲Transition Layers,由BN−>Conv(1×1)−>AveragePooling(2×2)組成。

需要明確一點,dense connectivity 僅僅是在一個dense block裏的,不同dense block 之間是沒有dense connectivity的,比如下圖所示:

那麼問題來了,密集連接不會帶來冗餘嗎?不會!密集連接這個詞給人的第一感覺就是極大的增加了網絡的參數量和計算量。但實際上 DenseNet 比其他網絡效率更高,其關鍵就在於網絡每層計算量的減少以及特徵的重複利用。DenseNet則是讓i層的輸入直接影響到之後的所有層,它的輸出爲:xi=Hi([x0,x1,…,xi−1]),其中[x0,x1,...,xi−1]就是將之前的feature map以通道的維度進行合併。並且由於每一層都包含之前所有層的輸出信息,因此其只需要很少的特徵圖就夠了,這也是爲什麼DenseNet的參數量較其他模型大大減少的原因。這種dense connection相當於每一層都直接連接input和loss,因此就可以減輕梯度消失現象,這樣更深網絡不是問題。

天底下沒有免費的午餐,網絡自然也不例外。在同層深度下獲得更好的收斂率,自然是有額外代價的。其代價之一,就是其恐怖如斯的內存佔用。

 

三、參考資料

1、【卷積神經網絡發展歷程】從LeNet、AlexNet到ResNet、SENet: https://blog.csdn.net/u012679707/article/details/80870625

2、CNN網絡架構演進:從LeNet到DenseNet: https://www.cnblogs.com/skyfsm/p/8451834.html

3、ILSVRC競賽詳細介紹(ImageNet Large Scale Visual Recognition Challenge): https://blog.csdn.net/sophia_11/article/details/84570177

4、CNN(卷積神經網絡)最早是哪一年提出,是如何發展的?: https://www.zhihu.com/question/47705441?sort=created

5、圖靈獎頒給熬過寒冬的人: http://tech.hexun.com/2019-03-28/196640717.html

6、剛剛!AI界的“加拿大黑手黨”榮獲 2018 年度圖靈獎:https://baijiahao.baidu.com/s?id=1629174737290254826&wfr=spider&for=pc

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章