[深度概念]·華山論劍-卷積神經網絡發展史

經典網絡

經典網絡包括 LeNet、AlexNet 以及 VGG 等。網絡

LeNet:1998,Gradient based learning applied to document recognitionapp

用於手寫數字識別,能夠看到,卷積神經網絡的基本框架已經有了,卷積、激活、池化和全鏈接,這幾個基本組件都完備了。框架

可是,在 1998 年之後,深度學習並無太多的突破。一直沉寂到 2012 年,AlexNet 橫空出世,將深度學習從新帶入你們視線,並開啓了深度學習的黃金時代。ide

爲何是 2012 年?一是數據,以前並無大規模的數據進行充分的訓練,應用於更普遍的任務,如今有 ImageNet;二是計算,以前的硬件條件限制了,沒法進行大規模的訓練,而如今有了性能強大的 GPU 的加成;三就是 AlexNet 自己很優秀,給後來的網絡奠基了一個很好的基礎,讓你們忽然發現,原來還能夠這樣玩!函數

AlexNet:2012,ImageNet Classification with Deep Convolutional Neural Networks性能

ImageNet Top5 錯誤率:16.4%,而兩年前非深度學習的方法的最好錯誤率是28.2%學習

AlexNet 整體結構和 LeNet 類似,可是有極大改進:spa

由五層卷積和三層全鏈接組成,輸入圖像爲三通道 224x224 大小,網絡規模遠大於 LeNet使用了 ReLU 激活函數使用了 Dropout,能夠做爲正則項防止過擬合,提高模型魯棒性一些很好的訓練技巧,包括數據增廣、學習率策略、weight decay 等設計

AlexNet 使用 3GB 顯存的 GTX 580 顯卡(好古老),一塊顯卡不夠用,因此如上圖所示將模型分爲兩部分放到了兩塊顯卡上並行運算。雖然這僅僅是單塊顯卡資源有限時的作法,可是後面的許多網絡都進一步發揚了這種對卷積進行分組的思想(雖然動機不一樣)。3d

VGG:2014,Very deep convolutional networks for large-scale image recognition

在 AlexNet 以後,另外一個提高很大的網絡是 VGG,ImageNet 上 Top5 錯誤率減少到 7.3%。

主要改進就是:深,更深!網絡層數由 AlexNet 的 8 層增至 16 和 19 層,更深的網絡意味着更強大的網絡能力,也意味着須要更強大的計算力,還好,硬件發展也很快,顯卡運算力也在快速增加,助推深度學習的快速發展。

同時只使用 3x3 的卷積核,由於兩個 3x3 的感覺野至關於一個 5x5,同時參數量更少,以後的網絡都基本遵循這個範式。

GoogLeNet 和 ResNet

一層一層卷積堆疊,VGG 是集大成者,可是以後很難再進一步,繼續簡單增長網絡層數會遇到問題,更深的網絡更難訓練同時參數量也在不斷增加。

Inception v1(GoogLeNet):2015,Going deeper with convolutions

ImageNet Top5 錯誤率 6.7%

GoogLeNet 則從另外一個維度來增長網絡能力,每單元有許多層並行計算,讓網絡更寬了,基本單元以下:

網絡整體結構以下所示,包含多個上面的 Inception 模塊,並添加了兩個輔助分類分支補充梯度更好訓練:

經過網絡的水平排布,能夠用較淺的網絡獲得很好的模型能力,並進行多特徵融合,同時更容易訓練,另外,爲了減小計算量,使用了 1x1 卷積來先對特徵通道進行降維。堆疊 Inception 模塊而來就叫 Inception 網絡,而 GoogLeNet 就是一個精心設計的性能良好的 Inception 網絡(Inception v1)的實例,即GoogLeNet 是 Inception v1 網絡的一種。

可是,網絡太深沒法很好訓練的問題仍是沒有解決,直到 ResNet 提出了 residual connection。

ResNet:2016,Deep residual learning for image recognition

ImageNet Top5 錯誤率 3.57%

ResNet 經過引入 shortcut 直連來解決這個問題:

經過引入直連,原來須要學習徹底的重構映射,從頭建立輸出,並不容易,而引入直連以後,只須要學習輸出和原來輸入的差值便可,絕對量變相對量,容易不少,因此叫殘差網絡。而且,經過引入殘差,identity 恆等映射,至關於一個梯度高速通道,能夠容易地訓練避免梯度消失的問題,因此能夠獲得很深的網絡,網絡層數由 GoogLeNet 的 22 層到了ResNet的 152 層。

ResNet-34 的網絡結構以下所示:

若是說 LeNet、AlexNet、VGG 奠基了經典神經網絡的基礎,Inception 和ResNet 則展現了神經網絡的新範式,在這兩個範式的基礎上,發展創新並相互借鑑,有了 Inception 流派的 Inception v2 到 v四、Inception-ResNet v1 和 v2,以及 ResNet 流派的 ResNeXt、DenseNet 和 Xception等。

Inception 流派

Inception 流派,核心就是 Inception 模塊,出現了各類變種,包括 Inception v2 到 v4 以及 Inception-ResNet v1 和 v2 等。

Inception v2(BN-Inception):2015,Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

ImageNet Top5 錯誤率:4.8%

(PS:按照 Inception 系列四篇論文中的第三篇論文的劃分,相似於 Inception v3 的一個網絡稱之爲 v2,可是按照第四篇論文的劃分,BN-Inception 稱之爲v2,這裏採用第四篇論文的劃分,Inception v2 指 BN-Inception)

主要是增長了 Batch Normalization,以前神經網絡很依賴於良好的初始化,而且網絡太深會梯度彌散,這兩個問題都是由於網絡中間的激活的分佈不理想,那既然咱們想要一個理想的分佈,就手動把它轉換爲理想的分佈好了。因此在每一層輸出後面加上了歸一化變換,減去每一個訓練 batch 的每一個特徵的均值再除以標準差,獲得 0 均值 1 標準差的輸出分佈,這樣,就能夠很好地訓練了,梯度也不容易彌散。

Inception v3:2015,Rethinking the Inception Architecture for Computer Vision

ImageNet Top5 錯誤率:3.5%

卷積進一步分解,5x5 用兩個 3x3 卷積替換,7x7 用三個 3x3 卷積替換,一個 3x3 卷積核能夠進一步用 1x3 的卷積核和 3x1 的卷積核組合來替換,進一步減小計算量:

整體地網絡結構以下所示:

Inception v四、Inception-ResNet v1 和 v2:2016,Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

ImageNet Top5 錯誤率:3.08%

Inception v1 到 v3,能夠看到很明顯的人工設計的痕跡,不一樣卷積核的和網絡結構的安排,很特殊,並不知道爲何要這樣安排,實驗肯定的。做者稱因爲之前受硬件軟件的限制,有太多的歷史包袱,而如今有了 TensorFlow(論文裏怒打一波廣告),網絡能夠按照理想的設計來實現了,因而很規範地設計了一個 Inception v4 網絡,相似於 Inception v3,可是沒有不少特殊的不一致的設計。

同時,ResNet 的成功,也說明了 residual connection 的有效性,因此爲Inception 模塊引入了 residual connection,獲得 Inception-ResNet v1 和Inception-ResNet-v2,前者規模較小,和 Inception v3 至關,後者規模較大,和 Inception v4 規模至關。residual 結構地 Inception 模塊以下所示:

ResNet 流派

ResNet 流派是另外一個主流分支,包括 WRN、DenseNet、ResNeXt 以及 Xception 等。

DenseNet:2016,Densely Connected Convolutional Networks

DenseNet 將 residual connection 發揮到極致,每一層輸出都直連到後面的全部層,能夠更好地複用特徵,每一層都比較淺,融合了來自前面全部層的全部特徵,而且很容易訓練。缺點是顯存佔用更大而且反向傳播計算更復雜一點。網絡結構以下所示:

ResNeXt:2017,Aggregated Residual Transformations for Deep Neural Networks

ImageNet Top5 錯誤率:3.03%

Inception 借鑑 ResNet 獲得 Inception-ResNet,而 ResNet 借鑑 Inception 獲得了 ResNeXt,對於每個 ResNet 的每個基本單元,橫向擴展,將輸入分爲幾組,使用相同的變換,進行卷積:

上面左邊是 ResNet,右邊是 ResNeXt,經過在通道上對輸入進行拆分,進行分組卷積,每一個卷積核不用擴展到全部通道,能夠獲得更多更輕量的卷積核,而且,卷積核之間減小了耦合,用相同的計算量,能夠獲得更高的精度。

Xception:2016,Xception: Deep Learning with Depthwise Separable Convolutions

Xception 則把分組卷積的思想發揮到了極致,每個通道單獨分爲一組。利用了 depthwise separable convolution,以下圖所示,J 個輸入通道,每一個通道用一個單獨的空間卷積核卷積(好比 3x3),J 個卷積核獲得 J 個輸出通道,而後再用 K 個卷積覈對上一步獲得的 J 個輸出通道進行 1x1 的普通卷積,獲得 K 個最終的輸出:

Xception 基於一個假設,水平和豎直方向的空間卷積(好比第一步的 3x3 卷積)和深度方向的通道卷積(好比第二步的 1x1 卷積)能夠徹底獨立進行,這樣減小了不一樣操做間的耦合,能夠有效利用計算力。實驗證實,相同的計算量,精度有明顯的提高。(不過如今對於分組卷積的底層支持還不夠好,實際速度並無理論計算的那麼好,須要底層庫進行更好的支持)

移動端

除了主流的 ResNet 流派和 Inception 流派不斷追求更高的準確率,移動端的應用也是一大方向,好比 SqueezeNet、MobileNet v1 和 v二、ShuffleNet 等。

MobileNet v1:2017,MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

和 Xception 相似,經過 depthwise separable convolution 來減小計算量,設計了一個適用於移動端的,取得性能和效率間很好平衡的一個網絡。

MobileNet v2:2018,Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation

使用了 ReLU6(即對 ReLU 輸出的結果進行 Clip,使得輸出的最大值爲 6)適配移動設備更好量化,而後提出了一種新的 Inverted Residuals and Linear Bottleneck,即 ResNet 基本結構中間使用了 depthwise 卷積,一個通道一個卷積核,減小計算量,中間的通道數比兩頭還多(ResNet 像漏斗,MobileNet v2 像柳葉),而且全去掉了最後輸出的 ReLU。具體的基本結構以下圖右側所示:

ShuffleNet:2017,ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

Xception 已經作得很好了,可是 1x1 那裏太耗時間了成了計算的瓶頸,那就分組啦較少計算量,可是分組了,組和組之間信息隔離了,那就重排 shuffle 一下,強行讓信息流動。具體的網絡結構如上圖左側所示。channel shuffle 就是對通道進行重排,將每組卷積的輸出分配到下一次卷積的不一樣的組去:

上圖的 a 是沒有 shuffle,效果不好,b 和 c 則是等價的有 shuffle 的。ShuffleNet 能夠達到和 AlexNet 相同的精度,而且實際速度快 13 倍(理論上快 18 倍)。

SENet

除了上面介紹的久經考驗的網絡之外,還有各類各樣的新的網絡,好比 NASNet、SENet、MSDNet 等等。其中,SENet 的 Squeeze-Excitation 模塊在普通的卷積(單層卷積或複合卷積)由輸入 X 獲得輸出 U 之後,對 U 的每一個通道進行全局平均池化獲得通道描述子(Squeeze),再利用兩層 FC 獲得每一個通道的權重值,對 U 按通道進行從新加權獲得最終輸出(Excitation),這個過程稱之爲 feature recalibration,經過引入 attention 從新加權,能夠獲得抑制無效特徵,提高有效特徵的權重,並很容易地和現有網絡結合,提高現有網絡性能,而計算量不會增長太多。

SE module 是一個很通用的模塊,能夠很好地和現有網絡集成,提高現有效果。

總結

最後,一個 ImageNet 上的 Top5 準確率總結表以下圖,能夠看到,ImageNet 上的分類錯誤率逐年下降,而且已經低於人類的錯誤率(5.1%)。

有這麼多網絡,具體的使用中到底選哪一個呢?我的的使用參考建議是:

普通網絡:推薦 ResNet-50 或 Xception 或 Inception v3

大網絡高精度:推薦 ResNeXt-101(64x4d)或 Inception-ResNet v2

移動端小網絡:推薦 ShuffleNet 或 MobileNet v2

還能夠額外添加 SENet 模塊到現有網絡,基本都能進一步提升精度,計算量略有增長。另外也能夠嘗試一下 NASNet。

相關文章
相關標籤/搜索