一.CNN發展縱覽html
咱們先來看一張圖片:算法
1985年,Rumelhart和Hinton等人提出了後向傳播(Back Propagation,BP)算法(也有說1986年的,指的是他們另外一篇paper:Learning representations by back-propagating errors),使得神經網絡的訓練變得簡單可行,這篇文章在Google Scholar上的引用次數達到了19000屢次,目前仍是比Cortes和Vapnic的Support-Vector Networks稍落後一點,不過以Deep Learning最近的發展勁頭來看,超越指日可待。網絡
幾年後,LeCun利用BP算法來訓練多層神經網絡用於識別手寫郵政編碼,這個工做就是CNN的開山之做,多處用到了5*5的卷積核,但在這篇文章中LeCun只是說把5*5的相鄰區域做爲感覺野,並未說起卷積或卷積神經網絡。ide
1998年的LeNet5標註着CNN的真正面世,可是這個模型在後來的一段時間並未能火起來,主要緣由是要求機器性能較好,並且其餘的算法像SVM也能達到相似的效果甚至超過。性能
AlexNet是在2012年被髮表的一個經典之做,並在當年取得了ImageNet最好的成績,也是在那年以後,更多的更深的神經網絡被提出,其官方提供的數據模型,他的top-1偏差率爲37.5%,以及top-5的偏差率爲17%,這是至關好的一個成績。學習
2014年,VGG-Net 在ILSVRC localization and classification 兩個問題上分別取得了第一名和第二名,VGG-Net不一樣於AlexNet的地方是:VGG-Net使用更多的層,一般有16-19層,而AlexNet只有8層。另一個不一樣的地方是:VGG-Net的全部 convolutional layer 使用一樣大小的 convolutional filter,大小爲 3 x 3。優化
同年,GoogLeNet, 在2014年ILSVRC挑戰賽得到冠軍,將Top5 的錯誤率下降到6.67%. 一個22層的深度網絡,論文在http://arxiv.org/pdf/1409.4842v1.pdf,題目爲:Going deeper with convolutions。GoogLeNet這個名字也是挺有意思的,爲了像開山鼻祖的LeNet網絡致敬,他們選擇了這樣的名字。ui
下圖爲GooLeNet的網絡結構圖:編碼
使人感興趣的是,在GoogLeNet出來以前,主流的網絡結構突破大體是網絡更深(即層數增長),網絡更寬(即神經元數目增多),但這樣作存在一些缺點:spa
針對上述缺點,咱們考慮到一味的追求準確率而增長網絡規模有一部分緣由就是特徵提取模塊的設計沒有能很好提取出圖像的特徵,若是能在基本的特徵提取單元上作一些優化,而後用優化後的特徵提取模塊去構建網絡,可能會有利於最後的識別效果。由此,Inception 模型孕育而生。
二.Inception v1模型
通常的卷積層只是一味增長卷積層的深度,可是在單層上卷積核卻只有一種,好比對於VGG,單層卷積核只有3x3大小的,這樣特徵提取的功能可能就比較弱。GoogLenet想的就是能不能增長單層卷積層的寬度,即在單層卷積層上使用不一樣尺度的卷積核,GoogLenet構建了Inception module這個基本單元,基本的Inception module中有1x1卷積核,3x3卷積核,5x5卷積核還有一個3x3下采樣,從而產生了Inception v1模型,以下圖所示,
這樣尺寸不一樣的卷積核就能夠提取不一樣尺寸的特徵,單層的特徵提取能力加強了,可是我在讀的過程當中想到的問題是,對於像VGG這種網絡,我一樣能夠經過卷積-下采樣-卷積這種方式提取不一樣尺寸的信息,因此爲什麼Inception module這種網絡會有很好的效果的,我想到的緣由是卷積-下采樣-卷積雖然可以提取不一樣尺寸的信息,可是因爲是經過下采樣這種方式實現的,因此必會帶來信息的丟失,和Inception module這種方式相比,顯然丟失的信息更多。
上面Inception module結構會存在一個問題,就是前一層的輸出不經任何處理直接輸入到下一層的卷積層中,這樣若是前一層的特徵圖數量不少,有通過5x5這種大尺寸的卷積,帶來的計算量也是很是大。從而產生了Inception v2模型。
三.Inception v2模型
Inception v2的網絡在v1的基礎上,進行了改進,一方面了加入了BN層,減小了Internal Covariate Shift(內部neuron的數據分佈發生變化),使每一層的輸出都規範化到一個N(0, 1)的高斯,另一方面學習VGG用2個3x3的conv替代inception模塊中的5x5,既下降了參數數量,也加速計算;
一個5*5的網絡等於兩個3*3的降級:
因此在修正事後的Inception module在輸出到下一層卷積以前,會對數據進行一次降維,怎麼降維,就是採用1x1卷積覈實現,好比原來有256個輸入特徵圖,先用1x1的卷積覈對特徵圖進行線性組合,使得輸出只有96的特徵圖,這樣不會帶來信息損失,又減少了下一層卷積的計算量,修正後的Inception module以下圖所示:
這種Inception module既能大大提高卷積提取特徵的能力,又不會使計算量提高不少。它的網絡結構以下:
1.避免表示瓶頸,即特徵圖大小應緩慢降低,特別是在網絡靠前的地方;信息流前向傳播過程當中顯然不能通過高度壓縮的層,即表達瓶頸。從input到output,feature map的寬和高基本都會逐漸變小,可是不能一會兒就變得很小。好比你上來就來個kernel = 7, stride = 5 ,這樣顯然不合適。 另外輸出的維度channel,通常來講會逐漸增多(每層的num_output),不然網絡會很難訓練。(特徵維度並不表明信息的多少,只是做爲一種估計的手段)
2.高維表示能夠用網絡代替;高維特徵更易處理。 高維特徵更易區分,會加快訓練。
3. 能夠在低維嵌入上進行空間匯聚而無需擔憂丟失不少信息。 好比在進行3x3卷積以前,能夠對輸入先進行降維而不會產生嚴重的後果。假設信息能夠被簡單壓縮,那麼訓練就會加快。
4.平衡網絡的寬度和深度。
使用大尺寸濾波器卷機分解:
GoogleNet的精度增益主要來自維度下降,這能夠認爲是卷積分解的特例。考慮到網絡臨近的激活高度相關,所以集成以前能夠降維。Inception模塊是全卷積的,每一個權值對應一個乘法運算,進行卷積分解後能夠減小參數數目進行快速訓練,這樣就能夠增長濾波器組的大小提高精度。
將大卷積分解成小卷積:
5×5的卷積可使用兩層3×3卷積代替,如圖4爲原始Inception模塊,圖5爲替換後的模塊,節約的計算時間能夠用來增長濾波器數目。對於一個5x5卷積核卷積的區域,能夠先使用一個3x3對5x5的區域進行卷積,而後再使用一個3x3覈對剛剛的卷積結果再進行一次卷積,最終也是得出一個數據,在效果上和5x5卷積是等效的。這樣就減小了一次卷積計算的次數,原來5x5卷積須要作25次乘加,如今兩次3x3只須要作9+9=18次乘加,若是卷積核更大,減少的計算量也更大。
是基於什麼考慮才作這種分解呢?咱們能夠看到分解致使卷積核的參數變小,這就說明原來5x5卷積覈實際上是有部分參數冗餘的,即咱們其實並不須要25個參數提取特徵,而可能須要18個參數就能夠了,這時由於因爲提取區域像素都是緊鄰的,像素之間的關聯性很強,這都到時5x5卷積核各個參數之間其實也是有很強關聯的,即參數存在冗餘能夠進一步壓縮;進一步想,其實這是一種緊密網絡到稀疏網絡的轉換。上面所說的是大的卷積核分解成小的卷積核,Inception v3中還提出了另外一種分解方式從圖中能夠看出,3x3的卷積,能夠先用一個1x3的卷積,緊接着跟着一個3x1的卷積也是能夠實現相同的輸出的,一樣對於5x5和7x7也是能夠處理的,這樣也能夠明顯下降卷積核參數和計算量。
須要注意的是:3×3的卷積使用3×1卷積和1×3卷積代替,這種結構在前幾層效果不太好,但對特徵圖大小爲12~20的中間層效果明顯。
附加分類器
附加分類器有batch norm層效果更好,得出其扮演規格化的角色。GoogLenet中就作過類似的工做,常規網絡都是在最後一層計算loss,而後進行梯度方向傳播,可是若是網絡層不少,這就致使梯度消失的現象,使用Auxiliary Classifiers,在網絡中間層加上分類器,計算輔助失真和梯度,而後把這個梯度加到常規網絡的梯度上,有效解決了梯度消失的現象,其實這樣作的方式,呼應了ResNet中解決梯度消失的問題得方法,雖然ResNet表面上看起來loss是在最後一層計算的,可是其實本質上最後一層的loss其實在R esNet的子網絡中都有計算,也就至關於GoogLenet中把loss層加上網絡中間層的方式。
在GoogLeNet中,使用了多餘的在底層的分類器,直覺上能夠認爲這樣作可使底層可以在梯度降低中學的比較充分,但在實踐中發現兩條:
覺得多餘的分類器起到的是梯度傳播下去的重要做用,但經過實驗認爲實際上起到的是regularizer的做用,由於在多餘的分類器前添加dropout或者batch normalization後效果更佳。
下降特徵圖大小
池化用來下降特徵圖大小,爲避免表示瓶頸,即更有效的保存圖像信息,應在池化以前增長濾波器數目,之前的網絡都是在卷積層後面加上一個pooling層來下降特徵圖的尺寸,可是這種下降尺寸的方式不可避免地有信息的損失,在《Rethinking Inception》論文中提出了另外一種下降特徵圖尺寸的方式以下圖所示:
右圖是正常的縮小,但計算量很大。左圖先pooling會致使特徵表徵遇到瓶頸,違反上面所說的第一個規則,爲了同時達到不違反規則且下降計算量的做用,將網絡改成下圖
實驗結果與GoogleNet相比有較大提高,以下表所示: