筆者主要從事圖像的識別與分類研究,在這裏筆者值探討卷積神經的發展史。php
1985年,Rumelhart和Hinton等人提出了後向傳播(Back Propagation,BP)算法(也有說1986年的,指的是他們另外一篇paper:Learning representations by back-propagating errors),使得神經網絡的訓練變得簡單可行,這篇文章在Google Scholar上的引用次數達到了19000屢次,目前仍是比Cortes和Vapnic的Support-Vector Networks稍落後一點,不過以Deep Learning最近的發展勁頭來看,超越指日可待。html
【注】BP雖然不算卷積神經網絡,但它是神經網絡的老前輩,學習神經網絡不得不知道的一個網絡啊。
Hinton主頁git
1988年,LeCun在BP網絡的基礎上發表了「A theoretical framework for Back-Propagation」幾年後,LeCun利用BP算法來訓練多層神經網絡用於識別手寫郵政編碼,(論文:Handwritten Digit Recognition: Applications of Neural Net Chips and Automatic Learning)這個工做也能夠說是就是CNN的開山之做,多處用到了55的卷積核,但在這篇文章中LeCun只是說把55的相鄰區域做爲感覺野,並未說起卷積或卷積神經網絡。在隨後不少年,LeCun不斷優化,發表了不少關於手寫識別的文章。github
1994年,word-level training of a handwritten word recognizer based on convolutional neural networks發表,這能夠說是最先的卷積神經網絡之一, 而且推進了深度學習領域的發展。自從1988年開始,在許屢次成功的迭代後,這項由Yann LeCun完成的開拓性成果被命名爲LeNet5(參見:Gradient-Based Learning Applied to Document Recognition).web
1998年的LeNet5標註着CNN的真正面世,可是這個模型在後來的一段時間並未能火起來,主要緣由是要求機器性能較好,並且其餘的算法像SVM也能達到相似的效果甚至超過。算法
LeNet5的架構基於這樣的觀點:(尤爲是)圖像的特徵分佈在整張圖像上,以及帶有可學習參數的卷積是一種用少許參數在多個位置上提取類似特徵的有效方法。在那時候,沒有GPU幫助訓練,甚至CPU的速度也很慢。所以,可以保存參數以及計算過程是一個關鍵的進展。這和將每一個像素用做一個大型多層神經網絡的單獨輸入相反。LeNet5闡述了那些像素不該該被使用在第一層,由於圖像具備很強的空間相關性,而使用圖像中獨立的像素做爲不一樣的輸入特徵則利用不到這些相關性。
LeNet5特徵可以總結爲以下幾點:
1)卷積神經網絡使用三個層做爲一個系列: 卷積,池化,非線性;
2)使用卷積提取空間特徵;
3)使用映射到空間均值下采樣(subsample);
4)雙曲線(tanh)或S型(sigmoid)形式的非線性;
5)多層神經網絡(MLP)做爲最後的分類器;
6)層與層之間的稀疏鏈接矩陣避免大的計算成本。服務器
整體看來,這個網絡是最近大量神經網絡架構的起點,而且也給這個領域帶來了許多靈感。
【注】以上說起的文章都可在LeCun的主頁中找到。網絡
從1998年到2010年,神經網絡處於孵化階段,大多數人沒有意識到他們不斷加強的力量,與此同時其餘研究者則進展緩慢。因爲手機相機以及便宜的數字相機的出現,愈來愈多的數據可被利用。而且計算能力也在成長,CPU變得更快,GPU變成了多種用途的計算工具。這些趨勢使得神經網絡有所進展,雖然速度很慢,數據和計算能力使得神經網絡可以完成的任務愈來愈有趣,以後一切變得清晰起來。框架
2010 年的時候,**Dan Claudiu Ciresan 和 Jurgen Schmidhuber **發佈了最先的 GPU 神經網絡的一個實現。這個實現是在一塊 NVIDIA GTX 280 圖形處理器上運行 9 層的神經網絡,包含前向與反向傳播。
2010年Dan Claudiu Ciresan和Jurgen Schmidhuber發表了一個GPU神經網絡(Deep Big Simple Neural Nets Excel on Handwritten Digit Recognition)。論文裏面證實了使用 NVIDIA GTX 280 GPU以後可以處理高達9層的神經網絡。
今後以後,Nvidia公司的股價開始不斷攀升,深度學習也愈來愈爲人們所熟知。
2012年,Alex Krizhevsky發表了AlexNet(參見 ImageNet Classification with Deep Convolutional Neural Networks),它是LeNet的一種更深更寬的版本,並以顯著的優點贏得了困難的ImageNet競賽。
AlexNet是在2012年被髮表的一個經典之做,並在當年取得了ImageNet最好的成績,也是在那年以後,更多的更深的神經網絡被提出,其官方提供的數據模型。
AlexNet 將LeNet的思想擴展到了更大的能學習到更復雜的對象層次的神經網絡上。這項工做的貢獻有:
1)使用修正的非線性單元(ReLU)
2)在訓練的時候使用Dropout技術有選擇的忽視單個神經元,從而避免過擬合
3)覆蓋進行最大池化,避免平均池化的平均化效果。
4)使用GPU NVIDIA GTX580減小訓練時間
在那時, GPU比CPU提供更多數量的核,訓練時間能夠提高10倍。這又反過來容許使用更大的數據集和更大的圖像。
AlexNet的成功掀起了一場小革命。卷積神經網絡如今是深度學習的骨幹。它已經變成了如今可以解決有用任務的大型神經網絡的代名詞。
Alex Krizhevsky主頁及論文下載地址1
Alex Krizhevsky主頁及論文下載地址2
2013 ILSVRC比賽冠軍,結構相對於AlexNet無太大的變化,只是進行了參數的優化。使用Relu激活函數,交叉熵代價函數。
Matthew D. Zeiler論文下載
Rob Fergus主頁
2013年12月, 紐約大學的Yann LeCun實驗室提出了AlexNet的衍生–Overfeat(參見: OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks). 這篇文章也提過了學習邊界框(learning bounding box),並致使以後出現了不少研究同一主題的論文。
2014年,來自牛津大學的VGG網絡(參見: Very Deep Convolutional Networks for Large-Scale Image Recognition)是第一個在各個卷積層使用更小的3*3過濾器(filter),並把他們組合成爲一個卷積序列進行處理的網絡。
這看起來和LeNet的原理相反,即便用大的卷積來得到一張圖像中類似的特徵。和AlexNet的99或1111過濾器不一樣,VGG的過濾器很小,離LeNet竭力所要避免的臭名昭著的11的卷積異常接近–至少在該網絡的第一層是這樣。可是VGG巨大的進展是經過依次採用多個33的卷積,可以模仿出更大的感覺野(receptive field)的效果,例如55或77.這些思想也被用在了最近的更多的網絡架構上。如Inception與ResNet。
VGG網絡使用多個33卷積層去表徵複雜特徵。若是VGG-E的第3,4,5塊(block):256256 和 512512個33過濾器被依次使用屢次,以提取更多複雜特徵以及這些特徵的組合。其效果就等於一個帶有3個卷積層的大型的512*512分類器。這顯然意味着大量的參數和學習能力。可是這些網絡訓練困難,必須劃分到較小的網絡,並逐層累加。這是由於缺乏強大的方式對模型進行正則化,這樣或多或少約束大量因爲大量參數增加的搜索空間。
VGG在許多層中都使用大特徵尺寸,由於推斷(inference)在運行時是至關耗費時間。正如Inception的瓶頸那樣,減小特徵的數量將節省一些計算成本。
VGG-Net 在ILSVRC localization and classification 兩個問題上分別取得了第一名和第二名,VGG-Net不一樣於AlexNet的地方是:VGG-Net使用更多的層,一般有16-19層,而AlexNet只有8層。另一個不一樣的地方是:VGG-Net的全部 convolutional layer 使用一樣大小的 convolutional filter,大小爲 3 x 3。
目前VGG有6個版本。
Andrew Zisserman主頁
Karen Simonyan主頁
網絡中的網絡(NiN,參見論文: Network in Network)的思路簡單又偉大: 使用1*1卷積爲卷積層的特徵提供更組合型的能力。
NiN架構在各個卷積以後使用空間MLP層,以便更好地在其它層以前組合特徵。一樣,你能夠認爲11卷積與LeNet最初的原理相悖,可是事實上他們能夠以一種更好的方式組合卷積特徵,而這時不可能經過簡單的堆疊更多的卷積特徵作到的。這和使用原始像素做爲下一層輸入是有區別的。其中11卷積經常被用於在卷積以後的特徵映射上對特徵進行空間組合,因此它們實際上可使用很是少的參數,並在這些特徵上的全部像素上共享。
MLP的能力是經過將卷積特徵組合到更復雜的組(group)來極大地加強單個卷積特徵的有效性。這個想法以後被用到一些最近的框架上,例如ResNet,Inception及其衍生技術。
NiN也使用了平均池化層做爲最後分類器的一部分,這是另外一種將會變得常見的實踐。這是用過在分類以前對網絡針對多個輸入圖像的響應進行平均完成的。
NIN目前有3個版本。
RCNN(Regions with CNN features)是將CNN方法應用到目標檢測問題上的一個里程碑,由年輕有爲的RBG大神提出,藉助CNN良好的特徵提取和分類性能,經過RegionProposal方法實現目標檢測問題的轉化。
各個論文都可在Ross Girshick主頁找到。
源碼:
R-CNN:
https://github.com/rbgirshick/rcnn
Fast R-CNN:
https://github.com/rbgirshick/fast-rcnn
https://github.com/rbgirshick/caffe-fast-rcnn
Faster R-CNN:
https://github.com/chenyuntc/simple-faster-rcnn-pytorch
https://github.com/YoungGer/Faster-RCNN-Pytorch
https://github.com/rbgirshick/py-faster-rcnn
來自Google的Christian Szegedy 開始追求減小深度學習網絡的計算開銷, 並設計出GoogleLeNet-第一個Inception架構。
在2014年秋季,深度學習模型正在變得在圖像與視頻幀的分類中很是有用。大多數懷疑者已經再也不懷疑深度學習與神經網絡這一次真的回來了。並且相信這種趨勢將一直髮展下去。鑑於這些技術的用處,谷歌這樣的巨頭很是有興趣在他們的服務器上高效且大規模的部署這些架構。
在2014年ILSVRC挑戰賽得到冠軍,將Top5 的錯誤率下降到6.67%. 一個22層的深度網絡,論文題目爲:Going deeper with convolutions。GoogLeNet這個名字也是挺有意思的,爲了像開山鼻祖的LeNet網絡致敬,他們選擇了這樣的名字。
GoogLeNet使用沒有Inception模塊的主幹做爲初始層,以後是與NiN類似的一個平均池化層加softmax分類器。這個分類器比AlexNet與VGG的分類器的運算數量少的多。這也促成了一項很是有效的網絡設計(參見論文: An Analysis of Deep Neural Network Models for Practical Applications)Christian和他的團隊都是很是高產的研究人員。2015年2月,Batch-normalized Inception被引入做爲InceptionV2(參見論文: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift).Batch-normalization 在一層的輸出上計算全部特徵映射的均值和標準差,而且使用這些值規範化它們的響應。這至關於數據增白(whitening),所以使得全部的神經圖(neural maps)在一樣的範圍內有響應,並且是零均值。在下一層不須要從輸入數據中學習offset時,這有助於訓練,還能重點關注如何最好的結合這些特性。
2015年12月, 該團隊發佈Inception模塊和相似架構的一個新版本(參見論文:Rethinking the Inception Architechture for Computer Vision).該論文更好地解釋了原始的GoogLeNet架構,在設計選擇上給出了更過的細節。原始思路以下:
經過謹慎構建網絡,平衡深度與寬度,從而最大化進入網絡的信息流。在每次池化以前,增長特徵映射。每當深度增長時,網絡層的深度或者特徵的數量也系統性的增長。使得每一層深度增長以前,先增長特徵的結合。通常只使用33的卷積,可能狀況下將55和77過濾器分紅多個33。
Inception v4也結合了Inception模塊和ResNet模塊的特性。我認爲該架構不太簡潔。但也充斥着較少透明度的啓發法。很難理解裏面的選擇,對做者而言也難以解釋。考慮到網絡的簡潔性,可被輕易理解並修正,那ResNet可能就更好了。
目前GoogLeNet有4個版本。
論文地址:
[v1] Going Deeper with Convolutions, 6.67% test error
http://arxiv.org/abs/1409.4842
[v2] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, 4.8% test error
http://arxiv.org/abs/1502.03167
[v3] Rethinking the Inception Architecture for Computer Vision, 3.5% test error
http://arxiv.org/abs/1512.00567
[v4] Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning, 3.08% test error
http://arxiv.org/abs/1602.07261
2015年12月又出現了新的變革,這和Inception V3出現的時間同樣。ResNet有着簡單的思路:供給兩個連續卷積層的輸出,並分流(bypassing)輸入進入下一層(參見論文: Deep Residual Learning for Image Recognition)。
這和以前的一些舊思路相似。DanReSNet中,他們分流兩個層並被應用於更大的規模。在兩層後分流是一個關鍵的直覺。由於分流一個層並未給出更多的改進。經過兩層可能認爲是一個小型的分類器,或者一個Network-In-Network。
這是第一個超過100的網絡, 甚至還能訓練出1000層的網絡。
有大量網絡層的ResNet開始使用相似於Inception瓶頸層的網絡層,這種層經過首先由帶有更小輸出的11卷積較少特徵的數量,而後使用一個33的層,再使用1*1層處理更大量的特徵。相似於Inception模塊,這樣可以保證計算量低,同事提供豐富的特徵結合。
ResNet在輸入上使用相對簡單的初始化層: 一個帶有兩個池的7*7卷積層。能夠把這個與更復雜、更少直覺性的InceptionV3 V4坐下對比。ResNet也是用一個池化層加上softmax做爲最後的分類器。
關於ResNet的其餘洞見天天都有發生:
ResNet可被認爲既是平行模塊又是連續模塊,把輸入輸出視爲在許多模塊中並行,同時每一個模塊的輸出又是連續鏈接的。
ResNet也可被視爲並行模塊或連續模塊的多種組合(參見論文: Residual Networks are Exponential Ensembles of Relatively Shallow Networks)。
已經發現ResNet一般在20-30層的網絡塊上以並行的方式運行。而不是連續流過整個網絡長度。
當ResNet像RNN同樣把輸出反饋到輸入時,該網絡可被視爲更好的生物上可信的皮質模型(參見論文: Bridging the Gaps between Residual Learning, Recurrent Neural Networks and Visual Cortex)。
2016年,SqueezeNet(參見論文: SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size)是最近才公佈的,該架構對ResNet與Inception裏面的概念進行了從新的處理。一個更好的架構設計網絡型號要小,並且參數還不須要複雜的壓縮算法。
目前有4個版本。
詳細瞭解ENet可參見論文:ENet: A Deep Neural Network Architecture for Real-time semantic Segmentation. ENet 是一個編碼加解碼的網絡,將分類反向傳播給原始圖像進行分割。這隻使用了神經網絡,沒有其餘算法進行圖像分割。
ENet被設計爲在開始時儘量使用最小數量的資源。正是由於它有着如此小的腳本,編碼器和解碼器網絡共佔有0.7MB 16fp的精度。即便這麼小的型號,ENet在分割準確度上也相似於或高於其餘神經網絡的解決方案。
(參見論文: FractalNet:Ultra-Deep Neural Network without Residuals)使用遞歸架構,它沒有在ImageNet上測試。該架構是ResNet的衍生或者更通用的ResNet。
目前有4個版本。
Xception是google繼Inception後提出的對Inception v3的另外一種改進,主要是採用depthwise separable convolution來替換原來Inception v3中的卷積操做。
目前有3個版本。