Tuesday, March 13, 2018

深入淺出 Deep Learning(四):CNN

深入淺出 Deep Learning(四):CNN

2018/02/26

前言:

一文道盡二十年的 CNN!

Summary:

Deep Learning [1], [2] 最基本的網路是 CNN (LeNet) [3] 與 RNN (LSTM) [4]。經典的 CNN [5] 演進到後來 [6],把這兩者的概念融合,因而設計出極深的網路,達成極高的圖片辨識率。

更仔細的說明,可以參考 [7]-[15]。

-----


Fig. 1a. Evolution of depth, [6].

-----



Fig. 1b. Neocognitron, convolutional structures [7].

-----

Outline

一、LeNet

二、AlexNet
三、ZFNet
四、NIN
五、GoogLeNet
六、VGGNet
七、SqueezeNet

八、LSTM

九、PreVGGNet
十、Highway Networks
十一、ResNet
十二、ResNet v2
十三、ResNet Theory
十四、DenseNet

十五、 Inception v2
十六、 Inception v3
十七、 Inception v4

-----

CNN 的演化,從 AlexNet 到 ResNet,層數不斷加深,對影像的辨識的錯誤率也不斷降低(參考圖1a)。早在 LeNet 之前,就有許多根據人類生理結構的啟發,加以設計的神經網路(參考圖1b)[7],1998 年發表的 LeNet,是第一個實用的網路,並被使用在美國的銀行系統上,作為辨識支票上的阿拉伯數字之用(參考圖1c)[3]。

-----

一、LeNet

1998 發表的 LeNet 的結構如圖1c所示,由卷積層(加激活函數)、池化層、卷積層(加激活函數),再加上最後面的全連接層所構成,能夠辨識 0 ~ 9 的阿拉伯數字 [3], [7]。其後因為類神經網路的運算極為耗時,因此並無太大的發展。



Fig. 1c. LeNet-5 [5].

-----

二、AlexNet

一直到2012的 AlexNet,類神經網路才又取得巨大的成功。

AlexNet 可用於辨識 1000 種以上的物體,圖片大小也由 LeNet 的 28x28 提升到 RGB 的 224x224。

圖2是 AlexNet 的架構,簡單來說,你可以把它視為大型的 LeNet。AlexNet 的表現除了因為加大網路而提升之外,它還使用了不少新的技巧如 Dropout、ReLU、LRN 等。另外它還使用了 GPU 可以加速運算。總之,它取得空前的成功,自此之後,深度學習的發展可說是一日千里。

圖2的架構,中間分兩路進行,主要因應當時 GPU 還不夠快,所以用個兩顆一起跑。比較特別的是,兩顆訓練出來的第一層卷積核,剛好一個負責線條、另一個負責彩度 [8]。


Fig. 2. AlexNet [8].

-----

三、ZFNet

ZFNet 是次年的優勝,它微調了 AlexNet 的參數,取得比 AlexNet 好一點點的成績。另外,它也用了 deconvolution、反卷積的技巧,把中間層的卷積核巧妙地「呈現」在我們眼前。可以看到「繼承式」的架構 [9]。

關於 ZFNet 可以思考的問題是,為何微調這些參數可以讓辨識率提升?也就是,一個好的卷積核,大小應該是?



Fig. 3.  ZFNet [9].

-----

四、NIN

跟 ZFNet 接近的時間,NIN 被設計出來,其所用的 1 x 1 convolution(底下簡稱 conv1),對於後續的網路設計,有著極大的影響力。

我們知道,conv3 與 conv5 這些卷積核,或者叫空間濾波器、平面濾波器等,沿著圖片掃過去,經過點乘的運算,可以把一些基本線條特徵找出來。但 conv1 其實是針對圖片上的某一點,對其不同 channels (feature maps、特徵圖、圖片)上的同一位置作線性組合,你可以想成是千層派壓扁就對了 [10]。

壓扁後,資料量就少很多。因為深層的網路經過每層許多的卷積核運算之後,其資料量實在是太龐大了。


Fig. 4. 1x1 convolution [10].

-----

五、GoogLeNet

繼承著 NIN 的 conv1 巧思。GoogeLeNet 還把稀疏網路「束在一起」, 達成很好的效果 [11]-[13]。

概念上,一個稀疏網路,可以經過 auto encoder 的編碼,變成一個稠密網路,如圖5a [6]。



Fig. 5a. AE [6].

-----

由上面的 AE 推廣到 GoogeLeNet 的 inception a 架構,有 conv1 channel 間、conv3 的小視野、conv5 的較大視野,以及 max-pooling 這四種提取特徵的方式,把它們聚合起來。以便下一層的 conv1 壓縮資料。見圖5b。

如果不經由圖5b的黃色 conv1 壓縮資料,則資料量會龐大到難以運算。比較特別的是,為何 conv1 要放在紅色的 max-pooling 後面,而不像其他兩個放前面。

主要是,max-pooling 提取特徵,而 conv1 是類似平均、會把特徵模糊化,所以先做 max-pooling 再做 conv1。

GoogeLeNet 還有一個特色就是它有兩著輔助的分類器,以不同的權重連到輸出,見圖5c。可以用來避免梯度消失的問題。



Fig. 5b. Inception module [6].



Fig. 5c. GoogLeNet [6].

-----

六、VGGNet

VGGNet 在設計上不如 GoogLeNet 巧妙,但某方面你可以說它「優雅」。以兩個 conv3 組成 conv5,然後反覆加深。

它有幾個問題,第一,到 D 的十六層與 E 的十九層,表現就到極限,無法再加深了。第二,它實在太「龐大」了。

此外,它有「證明」AlexNet 的 LRN「沒有用」。但這個「證明」算是有點草率。LRN 後來大家都不大討論了!



Fig. 6. VGGNet [6].

-----

七、SqueezeNet

SqeezeNet 簡單說就是以一些 NIN 的 conv1 與 VGGNet 的 conv3,反覆組成網路,達到 AlexNet 的辨識率,但參數量少很多,以便於在嵌入式裝置上跑的動 [14]。



Fig. 7. SqeezeNet [14].

-----

八、LSTM

以上是一些經典的 CNN 模型。這邊介紹深度學習另一個重要的網路 RNN。LSTM 是進階的 RNN,解決了 RNN 容易有梯度消失或梯度爆炸的問題 [4]。

為何 CNN 會穿插 RNN 呢?某方面來說,RNN 等於是很「深」的網路。LSTM 線性結構的部分,後來被推廣應用在 CNN 上,使得 VGGNet 無法持續加深的問題,獲得解決。


Fig. 1.1b. LSTM, [4].

-----

九、PreVGGNet

在進入更深的 CNN 之前,先來回顧一篇比較不被注意的論文 [1]。

這篇論文並沒有特定的名稱,我將它命名為 PreVGGNet 的原因是因為 AlexNet 跟 VGGNet 都引用它,他算是在 LeNet 之後,首度使用 GPU 來運算的網路(?)。

它嘗試了加寬網路,但沒有提升辨識率。後來 VGGNet 加深網路,並且在較大的圖片集上比賽,獲得巨大的成功。

這篇論文可以提供一個問題,為何加寬無效。VGGNet 提供另一個問題,為何加深有效,但到十六層就很難再繼續加深。LSTM 則提供一個解決之道:線性結構。



Fig. 9. Full connected parts, Net-1 to Net-3 [7].

-----

十、Highway Networks

LSTM 同一位作者把線性結構的概念加到 CNN,因此讓 CNN 「概念」上可無限加深 [4]。



Fig. 10. Highway networks [4].

-----

十一、ResNet

稍後在 ResNet 應用了線性的概念:殘差單元,取得極大的成功,網路可以加到 152 層 [6]。

ResNet 套用了 VGGNet 的架構,但加上殘差單元,網路因此可以更深。

數學的證明比較難,筆者也還沒完全看懂,此處只介紹有這個來自 LSTM 概念的結構讓網路可以加深。



Fig. 10a. ResNet block [6].





Fig. 10b. VGGNet and ResNet [6].  

-----

十二、ResNet v2

「ResNet v2 和 ResNet v1 的主要區別在於,作者通過研究 ResNet 殘差學習單元的傳播公式,發現前饋和反饋信號可以直接傳輸,因此 skip connection 的非線性激活函數(如ReLU)替換為 Identity Mappings()。同時,ResNet v2 在每一層中都使用了 Batch Normalization。這樣處理之後,新的殘差學習單元將比以前更容易訓練且泛化性更強。」[6]

ResNet v2  的改進是把 ReLU 換成 identity mapping,此外加了 inception v2 的 batch normalization 以加速收斂(速度到原來十倍)。




Fig. 12. Batch normalization [15].

-----

十三、ResNet Theory

講到這裡,本文反覆提出的問題,為何網路加寬無效、加深有效?為何 VGG 加深到十六就很難繼續下去?為何 ResNet 可以「無限制」加深?

這些問題,有專家仔細證明 [1], [6]。有興趣的讀者,可以自行閱讀。



Fig. 3.1. The cell state runs straight down the entire chain, with only some minor linear interactions [4].

-----

十四、DenseNet

直通的概念,除了在鄰近的層可以直通,稍遠的層也可以使用。LSTM 的線性結構繼續推廣,有更強的 DenseNet [4]。



Fig. 4.2. DenseNet [4].

-----

十五、 Inception v2

所以,從 NIN - GoogLeNet(inception v1)與 VGG - ResNet 這兩條分開的路線,紛紛學習對方的方法。

Inception v2 學習了 VGGNet,用兩個 conv3 取代一個 conv5 [6]。



Fig. 15. Inception v2 [6].

-----

十六、 Inception v3

Inception v3 繼承了 Inception v2,此外,它把 nxn 又拆成 nx1 與 1xn [6]。





Fig. 16. Inception v3 [6]。

-----

十七、 Inception v4

最後,Inception v4 結合了 Inception v3 與 ResNet v2 [6]。




Fig. 17. Evolution of CNNs [3].

-----

結論:

LeNet 是基礎的 CNN。RNN 可以視為很「深」的 CNN。AlexNet 加大 LeNet。VGGNet 優化卷積核成為 conv3 + conv3 並加深網路。然後 GoogLeNet 用 conv1 壓縮資料。ResNet 用 LSTM/Highway Networks 加深網路。Inception 又把 nxn 繼續拆開。

以上便是 CNN/RNN 演進的簡單歷史陳述!

-----

References

[1] PyTorch(六):Seminar
http://hemingwang.blogspot.tw/2018/01/pytorchseminar.html

[2] 深入淺出 Deep Learning(一):Introduction
http://hemingwang.blogspot.tw/2018/01/aideep-learning-in-120-mins.html

[3] 深入淺出 Deep Learning(二):LeNet & BP
http://hemingwang.blogspot.tw/2018/02/deep-learninglenet-bp.html 

[4] 深入淺出 Deep Learning(三):RNN (LSTM)
http://hemingwang.blogspot.tw/2018/02/airnnlstmin-120-mins.html
 
[5] CNNs Architectures  LeNet, AlexNet, VGG, GoogLeNet, ResNet and more …
https://medium.com/@siddharthdas_32104/cnns-architectures-lenet-alexnet-vgg-googlenet-resnet-and-more-666091488df5

[6] 深度學習之四大經典CNN技術淺析 硬創公開課 香港矽谷
https://www.hksilicon.com/articles/1280725

[7] AI從頭學(一三):LeNet - F6
http://hemingwang.blogspot.tw/2017/03/ailenet-f6.html

[8] PyTorch (七)Seminar Example:AlexNet
http://hemingwang.blogspot.tw/2018/01/pytorch-seminaralexnet.html

[9] AI從頭學(二七):ZFNet
http://hemingwang.blogspot.tw/2017/05/aikernel-visualizing.html

[10] AI從頭學(二八):Network in Network
http://hemingwang.blogspot.tw/2017/06/ainetwork-in-network.html

[11] AI從頭學(二九):GoogLeNet
http://hemingwang.blogspot.tw/2017/06/aigooglenet.html

[12] AI從頭學(三0):Conv1
http://hemingwang.blogspot.tw/2017/06/aiconv1.html

[13] AI從頭學(三一):Inception
http://hemingwang.blogspot.tw/2017/08/aiinception.html
 
[14] 縱覽輕量化卷積神經網絡:SqueezeNet、MobileNet、ShuffleNet、Xception - 幫趣
http://bangqu.com/lW5dJ7.html

[15] Lesson 2 Using Batch normalization after non linearity or before non linearity - Part 1 (2017) - Deep Learning Course Forums
http://forums.fast.ai/t/lesson-2-using-batch-normalization-after-non-linearity-or-before-non-linearity/4817 

No comments: