〖想觀看更多中文論文導讀,至[論文速速讀]系列文章介紹可以看到目前已發布的所有文章!〗
前言 - ILSVRC系列文的里程碑
在10月底的論文速速讀中終於完成了SENet的中文論文導讀,該篇也是ILSVRC系列的最後一篇了(因為最後一屆舉辦就是2017年)。
這些知名的模型其實在碩士修課的時候就都學過了([DL]淺談CNN在Object Classification上的各種架構),但一直都沒有完整的看過每一篇論文。畢業之後想通過規劃一系列的文章來逼自己看論文,也透過這一系列的論文筆記幫助對深度學習有興趣的朋友。
「為什麼要浪費時間把每篇都看一次? 知道怎麼用不就好了嗎?」
可能有人會這麼想,不過我認為每個模型的發展都有它背後要解決的問題,模型比別人好也有其原因,看完這一系列的文章後希望讀者可以對於要用什麼模型來處理自己的任務比較有概念。
而未來如果需要進一步去設計屬於自己的模型的時候,也期望這系列的文章也能夠讓你更加了解應該要如何設計,例如隨插隨用的Inception block, ResNet block, SE block是什麼…又應該怎麼把這些模塊融入自己的設計模型中,預期能為自己的模型達到什麼樣的效果。
ILSVRC是什麼
簡單來說,ILSVRC就是基於大神李飛飛創立的ImageNet dataset來舉辦的圖像競賽,是機器視覺領域最受追捧也是最具權威的學術競賽之一,代表了影像領域的最高水平。
如果不知道什麼是ILSVRC或ImageNet的朋友,維基給你,先去看個吧: ImageNet
ILSVRC各種模型介紹
下圖引用自另一篇介紹ILSVRC 歷屆的深度學習模型,讓大家對ILSVRC歷屆的模型有個概念:
下面我們將會介紹2012年後的所有模型,包含:
- AlexNet
- ZFNet
- GoogLeNet
- VGG
- ResNet
- SENet
這篇文章是基於看過這些論文後重新整理一次的內容,但仍會有部分和一年前寫的([DL]淺談CNN在Object Classification上的各種架構)有部分相同。
此外,這篇文章我也會附上Pytorch和Tensorflow的model source code(盡量以官方為主,但如果真的找不到我就會附其他github上的資源),大家可以在了解模型的架構也對照一下code是怎麼寫出來的,會使你對模型更加熟悉。
AlexNet
- [論文速速讀]ImageNet Classification with Deep Convolutional Neural Networks
- Pytorch: Pytorch source code
- Tensorflow: hjptriplebee/AlexNet_with_tensorflow
作為ILSVRC第一次嶄露頭角的CNN模型(在此之前的方法還是feature extraction + machine leaning based),AlexNet的特點如下:
- 使用了兩張GPU來training,所以架構上有特別做設計
- 使用ReLU作為activation function,提升了訓練的收斂速度
- 加入dropout技巧防止overfitting
- 使用了Local Response Normalization(LRN)來對ReLU做Normalization
- 5層Conv layer + 3層FC layer架構,Conv的部分使用到了11x11, 7x7, 5x5, 3x3都有
ZFNet
- [論文速速讀]Visualizing and Understanding Convolutional Networks
- Pytorch: arvention/ZFNet-PyTorch
- Tensorflow: amir-saniyan/ZFNet
ZFNet是隔年的冠軍…架構上其實就是AlexNet拿來小改了一下
- 像是將stride縮小(4->2)和kernel size縮小(11->7)
- 相較AlexNet,只用了一張GPU來訓練,節能減碳愛地球
- ZFNet的另一個重點在於開啟了CNN可視化的大門: 透過Deconvnet來觀察模型到底學到了什麼,對於解釋性AI(Explainable AI, XAI)後續的研究打下了非常重要的基礎
GoogLeNet
- [論文速速讀]Going deeper with convolutions
- Pytorch: Pytorch source code
- Tensorflow: PanJinquan/tensorflow_models_learning
ILSVRC 2014的冠軍,特地把Google的”L”大寫是為了要致敬LeNet(CNN的開山始祖,有興趣的可以看[論文速速讀]Gradient Based Learning Applied to Document Recognition)
- 提出了Inception module: 由1x1, 3x3, 5x5 Conv和Maxpool組合起來的一個block
- 提供了多尺度的feature extraction
- 讓模型自己去學哪一種Conv或Pooling比較重要
- (在filter level上來實踐稀疏性,期望能逼近稀疏網路結構的效果: 這其實是他背後設計的真正目的…不過這部分有點難理解,有興趣的可以再去看這篇的論文導讀)
- 1x1 Conv: 在多尺度的Conv後面接上1x1 Conv來做降維,降低模型複雜度
- 走在CNN路上不知道1x1 Conv? 快去看[論文速速讀]Network In Network
- 在分類前使用GAP(Global Average Pooling)取代FC: 節省計算量並有更好的representation能力
- 走在CNN路上不知道GAP? 快去看[論文速速讀]Network In Network
- 在中間層加入2個auxiliary classifiers幫助訓練,但預測的時候不會使用
VGG
- [論文速速讀]Very Deep Convolutional Networks For Large-Scale Image Recognition
- Pytorch: Pytorch source code
- Tensorflow: Tensorflow 2 source code
VGG是2014年的亞軍,但也是非常知名的模型,由於他的設計考量對於後續模型在設計的時候非常重要,並且他的模型到現在也還在被很多人使用。
- 只使用3x3 Conv: 相較於之前的模型使用較大的kernel size,可以使用多次的Conv來達到同樣的感受野(Receptive fields),並且用更少的參數量
- 舉例來說2個3x3的Conv可以和1個5x5的Conv涵蓋一樣的資訊量,但參數量卻比較少(332 < 552)
- 打槍AlexNet的LRN: 說並沒有觀察到效果提升
ResNet
- [論文速速讀]Deep Residual Learning for Image Recognition
- Pytorch: Pytorch source code
- Tensorflow:Tensorflow 2 source code
2015年的冠軍ResNet提出了一個知名的Residual block,改善了模型在深層的時候無法很好訓練的問題,然後他們就很開心的把模型疊到152層了…
- 提出Residual block: 提出的背後其實大有學問,主要是為了解決深層架構會導致退化(degradation)的問題
- 簡單來說的話就是改善了在深層架構無法好好訓練的問題
- 另一種層面來說,Residual block使得模型在深層的時候仍然可以有效的傳遞資訊,也減輕了gradient vanishing / exploding的現象
- 冷知識: 其實他們嘗試過1202層喔,可是沒有比較好…有錢就是任性
SENet
- [論文速速讀]Squeeze-and-Excitation Networks
- Pytorch: moskomule/senet.pytorch
- Tensorflow: taki0112/SENet-Tensorflow
2017年的冠軍SENet,也是最後一屆ILSVRC的冠軍得主,主要是提出SE block讓你可以到處插入別人家的模型,然後可以提升不少的效果。
(題外話,SE block也是我當初作業的題目,那時候老師就說要把某種架構加到object detection model上,後來去查才知道就是SE block…聽說那次作業完有不少人找老師說要退選…)
- 提出SE block: 可以想成是channel-wise的注意力機制。對於分類某一個類別,不同channel萃取到的特徵可能不同,而這些特徵的重要程度也一定不同,所以透過實踐一個注意力機制來給予不同channel不同的權重,概念簡單卻很有效。
結論
到這篇ILSVRC系列文總算結束了,但其實CNN還有一堆很重要的model,例如輕量化的mobilenet, shufflenet,還有EfficientNet等比較新的模型還沒讀過。之後會考慮一下要繼續往後續的模型來研讀,或是以目前的基礎開始朝向object detection了研究邁進。
不論如何,在工作之餘還是會繼續學習的,歡迎持續關注【論文速速讀】系列~