卷積神經網絡(CNN)在視覺識別任務上的表現使人稱奇。好的CNN網絡是帶有上百萬參數和許多隱含層的「龐然怪物」。事實上,一個很差的經驗規則是:網絡越深,效果越好。網絡
AlexNet,VGG,Inception和ResNet是最近一些流行的CNN網絡。架構
爲何這些網絡表現如此之好?它們是如何設計出來的?爲何它們設計成那樣的結構?回答這些問題並不簡單,可是這裏咱們試着去探討上面的一些問題。模塊化
網絡結構設計是一個複雜的過程,須要花點時間去學習,甚至更長時間去本身動手實驗。首先,咱們先來討論一個基本問題。函數
1. 爲何CNN模型打敗了傳統的計算機視覺方法?學習
圖像分類指的是給定一個圖片將其分類成預先定義好的幾個類別之一。圖像分類的傳統流程涉及兩個模塊:特徵提取和分類測試
特徵提取指的是從原始像素點中提取更高級的特徵,這些特徵能捕捉到各個類別間的區別。這種特徵提取是使用無監督方式,從像素點中提取信息時沒有用到圖像的類別標籤。優化
經常使用的傳統特徵包括GIST, HOG, SIFT, LBP等。特徵提取以後,使用圖像的這些特徵與其對應的類別標籤訓練一個分類模型。經常使用的分類模型有SVM,LR,隨機森林及決策樹等。編碼
上面流程的一大問題是:特徵提取不能根據圖像和其標籤進行調整。若是選擇的特徵缺少必定的表明性來區分各個類別,模型的準確性就大打折扣,不管你採用什麼樣的分類策略。設計
採用傳統的流程,目前的一個比較好的方法是使用多種特徵提取器,而後組合它們獲得一種更好的特徵。code
可是這須要不少啓發式規則和人力來根據領域不一樣來調整參數使得達到一個很好的準確度,這裏說的是要接近人類水平。
這也就是爲何採用傳統的計算機視覺技術須要花費多年時間才能打造一個好的計算機視覺系統(如OCR,人臉驗證,圖像識別,物體檢測等),這些系統在實際應用中能夠處理各類各樣的數據。
有一次,咱們用了6周時間爲一家公司打造了一個CNN模型,其效果更好,採用傳統的計算機視覺技術要達到這樣的效果要花費一年時間。
傳統流程的另一個問題是:它與人類學習識別物體的過程是徹底不同的。自從出生之初,一個孩子就能夠感知周圍環境,隨着他的成長,他接觸更多的數據,從而學會了識別物體。
這是深度學習背後的哲學,其中並無創建硬編碼的特徵提取器。它將特徵提取和分類兩個模塊集成一個系統,經過識別圖像的特徵來進行提取並基於有標籤數據進行分類。
這樣的集成系統就是多層感知機,即有多層神經元密集鏈接而成的神經網絡。
一個經典的深度網絡包含不少參數,因爲缺少足夠的訓練樣本,基本不可能訓練出一個不過擬合的模型。
可是對於CNN模型,從頭開始訓練一個網絡時你可使用一個很大的數據集如ImageNet。這背後的緣由是CNN模型的兩個特色:神經元間的權重共享和卷積層之間的稀疏鏈接。
這能夠從下圖中看到。在卷積層,某一個層的神經元只是和輸入層中的神經元局部鏈接,並且卷積核的參數是在整個2-D特徵圖上是共享的
2. 爲了理解CNN背後的設計哲學,你可能會問:其目標是什麼?
準確度
若是你在搭建一個智能系統,最重要的固然是要儘量地準確。公平地來講,準確度不只取決於網路,也取決於訓練樣本數量。所以,CNN模型通常在一個標準數據集ImageNet上作對比。
ImageNet項目仍然在繼續改進,目前已經有包含21841類的14,197,122個圖片。自從2010年,每一年都會舉行ImageNet圖像識別競賽,比賽會提供從ImageNet數據集中抽取的屬於1000類的120萬張圖片。
每一個網絡架構都是在這120萬張圖片上測試其在1000類上的準確度。
計算量
大部分的CNN模型都須要很大的內存和計算量,特別是在訓練過程。所以,計算量會成爲一個重要的關注點。一樣地,若是你想部署在移動端,訓練獲得的最終模型大小也須要特別考慮。
你能夠想象到,爲了獲得更好的準確度你須要一個計算更密集的網絡。所以,準確度和計算量須要折中考慮。
除了上面兩個因素,還有其餘須要考慮的因素,如訓練的容易度,模型的泛化能力等。下面按照提出時間介紹一些最流行的CNN架構,能夠看到它們準確度愈來愈高。
3. AlexNet
AlexNet
http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
是一個較早應用在ImageNet上的深度網絡,其準確度相比傳統方法有一個很大的提高。它首先是5個卷積層,而後緊跟着是3個全鏈接層,以下圖所示:
Alex Krizhevs提出的AlexNet採用了ReLU激活函數,而不像傳統神經網絡早期所採用的Tanh或Sigmoid激活函數,ReLU數學表達爲:
f(x)=max(0, x)
ReLU相比Sigmoid的優點是其訓練速度更快,由於Sigmoid的導數在穩定區會很是小,從而權重基本上再也不更新。這就是梯度消失問題。所以AlexNet在卷積層和全鏈接層後面都使用了ReLU。
AlexNet的另一個特色是其經過在每一個全鏈接層後面加上Dropout層減小了模型的過擬合問題。Dropout層以必定的機率隨機地關閉當前層中神經元激活值,以下圖所示:
爲何Dropout有效?
Dropout背後理念和集成模型很類似。在Drpout層,不一樣的神經元組合被關閉,這表明了一種不一樣的結構,全部這些不一樣的結構使用一個的子數據集並行地帶權重訓練,而權重總和爲1。
若是Dropout層有 n 個神經元,那麼會造成2^n個不一樣的子結構。在預測時,至關於集成這些模型並取均值。這種結構化的模型正則化技術有利於避免過擬合。
Dropout有效的另一個視點是:因爲神經元是隨機選擇的,因此能夠減小神經元之間的相互依賴,從而確保提取出相互獨立的重要特徵。
4. VGG16
VGG16
https://arxiv.org/abs/1409.1556
是牛津大學VGG組提出的。VGG16相比AlexNet的一個改進是採用連續的幾個3x3的卷積核代替AlexNet中的較大卷積核(11x11,5x5)。
對於給定的感覺野(與輸出有關的輸入圖片的局部大小),採用堆積的小卷積核是優於採用大的卷積核,由於多層非線性層能夠增長網絡深度來保證學習更復雜的模式,並且代價還比較小(參數更少)。
好比,3個步長爲1的 3x3 卷積核連續做用在一個大小爲7的感覺野,其參數總量爲 3*(9C^2), 若是直接使用7x7卷積核,其參數總量爲 49C^2,這裏 C 指的是輸入和輸出的通道數。
並且3x3卷積核有利於更好地保持圖像性質。VGG網絡的架構以下表所示:
能夠看到VGG-D,其使用了一種塊結構:屢次重複使用同一大小的卷積核來提取更復雜和更具備表達性的特徵。這種塊結構( blocks/modules)在VGG以後被普遍採用。
VGG卷積層以後是3個全鏈接層。網絡的通道數從較小的64開始,而後每通過一個下采樣或者池化層成倍地增長,固然特徵圖大小成倍地減少。最終其在ImageNet上的Top-5準確度爲92.3%。
5. GoogLeNet / Inception
儘管VGG能夠在ImageNet上表現很好,可是將其部署在一個適度大小的GPU上是困難的,由於須要VGG在內存和時間上的計算要求很高。因爲卷積層的通道數過大,VGG並不高效。
好比,一個3x3的卷積核,若是其輸入和輸出的通道數均爲512,那麼須要的計算量爲9x512x512。
在卷積操做中,輸出特徵圖上某一個位置,其是與全部的輸入特徵圖是相連的,這是一種密集鏈接結構。
GoogLeNet
https://arxiv.org/pdf/1409.4842v1.pdf
基於這樣的理念:在深度網路中大部分的激活值是沒必要要的(爲0),或者因爲相關性是冗餘。所以,最高效的深度網路架構應該是激活值之間是稀疏鏈接的,這意味着512個輸出特徵圖是沒有必要與全部的512輸入特徵圖相連。
存在一些技術能夠對網絡進行剪枝來獲得稀疏權重或者鏈接。可是稀疏卷積核的乘法在BLAS和CuBlas中並無優化,這反而形成稀疏鏈接結構比密集結構更慢。
據此,GoogLeNet設計了一種稱爲inception的模塊,這個模塊使用密集結構來近似一個稀疏的CNN,以下圖所示。
前面說過,只有不多一部分神經元是真正有效的,因此一種特定大小的卷積核數量設置得很是小。同時,GoogLeNet使用了不一樣大小的卷積核來抓取不一樣大小的感覺野。
Inception模塊的另一個特色是使用了一中瓶頸層(實際上就是1x1卷積)來下降計算量:
這裏假定Inception模塊的輸入爲192個通道,它使用128個3x3卷積核和32個5x5卷積核。5x5卷積的計算量爲25x32x192,可是隨着網絡變深,網絡的通道數和卷積核數會增長,此時計算量就暴漲了。爲了不這個問題,在使用較大卷積核以前,先去下降輸入的通道數。
因此,Inception模塊中,輸入首先送入只有16個卷積核的1x1層卷積層,而後再送給5x5卷積層。這樣總體計算量會減小爲16x192+25x32x16。這種設計容許網絡可使用更大的通道數。
(譯者注:之因此稱1x1卷積層爲瓶頸層,你能夠想象一下一個1x1卷積層擁有最少的通道數,這在Inception模塊中就像一個瓶子的最窄處)
GoogLeNet的另一個特殊設計是最後的卷積層後使用全局均值池化層替換了全鏈接層,所謂全局池化就是在整個2D特徵圖上取均值。
這大大減小了模型的總參數量。要知道在AlexNet中,全鏈接層參數佔整個網絡總參數的90%。使用一個更深更大的網絡使得GoogLeNet移除全鏈接層以後還不影響準確度。其在ImageNet上的top-5準確度爲93.3%,可是速度還比VGG還快。
6. ResNet
從前面能夠看到,隨着網絡深度增長,網絡的準確度應該同步增長,固然要注意過擬合問題。可是網絡深度增長的一個問題在於這些增長的層是參數更新的信號,由於梯度是從後向前傳播的,增長網絡深度後,比較靠前的層梯度會很小。
這意味着這些層基本上學習停滯了,這就是梯度消失問題。深度網絡的第二個問題在於訓練,當網絡更深時意味着參數空間更大,優化問題變得更難,所以簡單地去增長網絡深度反而出現更高的訓練偏差。
殘差網絡 [ResNet]
https://arxiv.org/abs/1512.03385
設計一種殘差模塊讓咱們能夠訓練更深的網絡
深度網絡的訓練問題稱爲退化問題,殘差單元能夠解決退化問題的背後邏輯在於此:想象一個網絡A,其訓練偏差爲x。
如今經過在A上面堆積更多的層來構建網絡B,這些新增的層什麼也不作,僅僅複製前面A的輸出。這些新增的層稱爲C。
這意味着網絡B應該和A的訓練偏差同樣。那麼,若是訓練網絡B其訓練偏差應該不會差於A。可是實際上倒是更差,惟一的緣由是讓增長的層C學習恆等映射並不容易。
爲了解決這個退化問題,殘差模塊在輸入和輸出之間創建了一個直接鏈接,這樣新增的層C僅僅須要在原來的輸入層基礎上學習新的特徵,即學習殘差,會比較容易。
與GoogLeNet相似,ResNet也最後使用了全局均值池化層。利用殘差模塊,能夠訓練152層的殘差網絡。其準確度比VGG和GoogLeNet要高,可是計算效率也比VGG高。152層的ResNet其top-5準確度爲95.51%。
ResNet主要使用3x3卷積,這點與VGG相似。在VGG基礎上,短路鏈接插入進入造成殘差網絡。以下圖所示:
殘差網絡實驗結果代表:34層的普通網絡比18層網路訓練偏差還打,這就是前面所說的退化問題。可是34層的殘差網絡比18層殘差網絡訓練偏差要好。
7. 總結
隨着愈來愈複雜的架構的提出,一些網絡可能就流行幾年就走下神壇,可是其背後的設計哲學倒是值得學習的。這篇文章對近幾年比較流行的CNN架構的設計原則作了一個總結。
(譯者注:能夠看到,網絡的深度愈來愈大,以保證獲得更好的準確度。網絡結構傾向採用較少的卷積核,如1x1和3x3卷積核,這說明CNN設計要考慮計算效率了。)
一個明顯的趨勢是採用模塊結構,這在GoogLeNet和ResNet中能夠看到,這是一種很好的設計典範,採用模塊化結構能夠減小咱們網絡的設計空間,另一個點是模塊裏面使用瓶頸層能夠下降計算量,這也是一個優點。
這篇文章沒有提到的是最近的一些移動端的輕量級CNN模型,如MobileNet,SqueezeNet,ShuffleNet等,這些網絡大小很是小,並且計算很高效,能夠知足移動端需求,是在準確度和速度之間作了平衡。
閱讀原文