[論文速速讀]Going deeper with convolutions

Posted by John on 2020-07-25
Words 3.9k and Reading Time 14 Minutes
Viewed Times

〖想觀看更多中文論文導讀,至[論文速速讀]系列文章介紹可以看到目前已發布的所有文章!〗

paper: https://arxiv.org/pdf/1409.4842.pdf

GoogLeNet,Google 2015年在CVPR發表的paper,也是ILSVRC 2014的冠軍(Classification & Detection),會這樣取名是為了致敬LeNet,所以特地把google的l給大寫了。

這篇介紹會聚焦在Classification和模型的部分,所以對於Detection會跳過或快速帶過,有興趣可以去看原文。

Abstract

The main hallmark of this architecture is the improved utilization of the computing resources inside the network. This was achieved by a carefully crafted design that allows for increasing the depth and width of the network while keeping the computational budget constant.

ILSVRC 2014的冠軍,恭喜恭喜( ゚∀゚)o彡゚

Google透過提出了Inception的深度神經網路結構,主要改進了網路內計算資源的使用效率,並能在計算資源固定下能夠訓練得更深更廣。

To optimize quality, the architectural decisions were based on the Hebbian principle and the intuition of multi-scale processing

此外還遵循了Hebbian原則和多尺度的處理的想法來設計..

好喔…所以我說…Hebbian原則是蝦咪挖歌??

Introduction

Our GoogLeNet submission to ILSVRC 2014 actually uses 12× fewer parameters than the winning architecture of Krizhevsky et al [9] from two years ago, while being significantly more accurate.

首先,GoogLeNet使用的參數量只有AlexNet的1/12倍,但卻有著更好的準確度。

In this paper, we will focus on an efficient deep neural network architecture for computer vision, codenamed Inception, which derives its name from the Network in network paper by Lin et al [12] in conjunction with the famous “we need to go deeper” internet meme [1].

Inception結構是從Network in Network, NIN這篇論文發展而來,然後名字的由來來自NIN中的meme “we need to go deeper“…棒喔,還cite一個meme

(20200814更新)NIN的文章出來啦! 有興趣的可以看這篇: [論文速速讀]Network In Network

  1. 介紹了CNN的background
  2. 受到靈長類神經模型的啟發,Serre et al,使用了不同大小的Gabor filter來學習不同尺度的特徵,這類似於Inception的做法,但不同的是Inception的所有filter都是可以被學習的
  3. 在NIN這篇論文中,透過了1x1的Conv來增加模型的表達能力和計算複雜度。在Inception中1x1 Conv最主要被用來做dimension reduction以降低記算複雜度,這使得模型可以在不增加計算複雜度的情況下增加寬度(變胖了!)
  4. 這是在講Detection的部分,R-CNN中將檢測任務分成了兩個階段: Region Proposal和Classification。GoogLeNet也用到了類似的方法並加以改良,然後得到了較好的結果。

Motivation and High Level Considerations

其實單看GoogLeNet架構並不難理解,但如果要試著去理解這個設計背後的動機和考量並沒有那麼簡單。這邊就從原文的角度出發來看一下設計背後的思維:

提升神經網路效果最直覺的方法就是增加網路的深度跟寬度,暴力但有效,但這樣有兩個主要的缺點:

  • 在數據不夠大量的時候,模型參數過多往往容易overfitting
    • 你說那為何不給多點數據就好了? 孩子你去跟你老闆這樣講講看啊
    • 在論文中還特地給了一張圖片來告訴你如果對於一些需要精細標記的類別,標記是一件多麼費工的事情
  • 計算資源的問題,模型越大計算資源越大,而得到的效益往往不成正比,如果學到了一堆拉基(例如weight都是0)那根本就是在浪費資源

The fundamental way of solving both issues would be by ultimately moving from fully connected to sparsely connected architectures, even inside the convolutions.

解決上述兩個議題的方式是可以建立一個稀疏的神經網路結構,也就是用稀疏的層取代全連接層以及Conv層(為什麼Conv不是稀疏層後面會說)

根據Arora的研究: 如果可以透過一個大且稀疏的神經網路結構來表示一個dataset的機率分佈,那麼可以透過逐層分析然後將相關性高的元素群聚起來,進而去找到一個最優的網路拓樸結構(optimal network topology),這個研究與著名的Hebbian principle不謀而合,Hebbian principle說到: “neurons that fire together, wire together”

Most current vision oriented machine learning systems utilize sparsity in the spatial domain just by the virtue of employing convolutions. However, convolutions are implemented as collections of dense connections to the patches in the earlier layer.

卷積其實就是在空間域上實現了稀疏性的一種操作,圖片中相鄰的點其實相關性最高,而這些相關性高的點透過卷積給群聚起來了,是不是跟上面的研究很像呢,所以卷積是符合Hebbian principle的。

但卷積的操作本身還是密集連接而不是稀疏連接,因為卷積本質上還是上一層的每個neuron和這一層的每個neuron去逐點計算(早期在LeNet的時候對於卷積有隨機和稀疏連接的設計以打破對稱性(參見[論文速速讀]Gradient Based Learning Applied to Document Recognition中C3的Conv layer),但後來AlexNet又改回一般的全連接卷積,由於這樣能夠更好的優化跟平行計算)。

那重點來了,既然稀疏的神經網路結構無法建立,那要怎麼解決原本的議題呢?

This raises the question whether there is any hope for a next, intermediate step: an architecture that makes use of the extra sparsity, even at filter level, as suggested by the theory, but exploits our current hardware by utilizing computations on dense matrices.

既然無法達到真正完整的稀疏網路結構,那就退而求其次,在filter level上來實踐稀疏性,期望能逼近稀疏網路結構的效果

  • 利用filter level的稀疏能力
  • 但層和層之間還是全連接的,如此仍舊確保了計算上的效率

filter level是什麼意思呢,看了幾篇文章後我覺得深入理解GoogLeNet结构(原创)講的是我比較能夠接受的講法,以下引用該篇文章的解釋:

这个原理应用到inception上就是要在特征维度上进行分解!传统的卷积层的输入数据只和一种尺度(比如3x3)的卷积核进行卷积,输出固定维度(比如256个特征)的数据,所有256个输出特征基本上是均匀分布在3x3尺度范围上,这可以理解成输出了一个稀疏分布的特征集;而inception模块在多个尺度上提取特征(比如1x1,3x3,5x5),输出的256个特征就不再是均匀分布,而是相关性强的特征聚集在一起(比如1x1的的96个特征聚集在一起,3x3的96个特征聚集在一起,5x5的64个特征聚集在一起),这可以理解成多个密集分布的子特征集。这样的特征集中因为相关性较强的特征聚集在了一起,不相关的非关键特征就被弱化,同样是输出256个特征,inception方法输出的特征“冗余”的信息较少。用这样的“纯”的特征集层层传递最后作为反向计算的输入,自然收敛的速度更快。

也就是將特徵透過不同size的kernel來萃取再合併起來,使得高相關性的特徵都能夠被群聚在一起(1x1一群、3x3一群、5x5一群),這也符合了Hebbian principle

最後paper也提到,儘管發現Inception可以提升結果,但究竟是不是因為這樣的架構設計才造成提升的還有待實驗證實。

…歐這一章節好難懂喔,沒看論文前明明覺得概念其實不難,仔細讀論文才知道背後的意涵這麼複雜= =

Architectural Details

The main idea of the Inception architecture is based on finding out how an optimal local sparse structure in a convolutional vision network can be approximated and covered by readily available dense components.

所以Inception架構的目的就是要找出一個局部最佳的稀疏結構,並且這結構可以簡單的透過全連接串起來。

naive version

  • 在CNN淺層的時候會學到一些初階的局部特徵,這些特徵通常都集中在某些的區域且相關性較高,而我們可以透過1x1 Conv將他們涵蓋到下一層
    • 可以想成圖片同個位置上不同channel的相關性較高,而我們可以使用1x1 Conv給涵蓋著
  • 此外,有些稀疏的特徵群也可以被kernel size較大的Conv給涵蓋到,並且kernel size越大涵蓋的範圍也理當越大,所以也加入了3x3 Conv和5x5 Conv
  • 使用1x1, 3x3, 5x5的Conv是為了設計上的方便性,因為在固定stride=1的情況下,我們只要設定pad=0,1,2就可以得到相同size的輸出,輕鬆地解決了patch alignment的問題
  • 並且隨著Inception在模型中越深層,應該會學到越高階的抽象特徵,所以3x3和5x5 Conv的數量會隨著層數越深而提高,而學習局部特徵的1x1 Conv數量則會越來越少
  • 此外發現,Pooling也有助於提升結果,所以再加入Pooling進來

最後naive version架構如下:

這個架構的問題是,即使做到了局部稀疏的架構,但在性能上非常的差,因為同時使用了不同的scale的Conv又使用了Pooling,可想而知最後合併得到的filter數量(或者說dimension)會非常的大,所以有了第二個版本。

Inception module with dimension reductions

很直觀的想法就是在計算量大的地方之前使用1x1 Conv來做降維,由於dimensional embeddings的成功,我們仍然能夠在維度減少的情況下保留大部分的資訊。

However, embeddings represent information in a dense, compressed form and compressed information is harder to model. We would like to keep our representation sparse at most places (as required by the conditions of [2]) and compress the signals only whenever they have to be aggregated en masse.

但是根據Arora的研究,所有的地方都降維也不是明智之舉,作者仍然想要讓整體的網路結構還是應該保持稀疏,所以只在需要被3x3和5x5之前、和max pooling之後使用。

  • 1x1 Conv後面是接著ReLU的,使得能夠有更多的非線性變換
  • 透過1x1 Conv降維使得儘管卷積的操作變多了,但整體的計算量並不會超出太多

最後架構如下:

由於memory考量,作者他們只在GoogLeNet中後半加入Inception,前幾層還是按照CNN的一般建模方式來設計。

直覺上的設計考量

前面的看不懂嗎,那看從這節開始看就好了(?)

在Motivation中提到作者最原始的設計出發點是想要設計一個稀疏的局部最優網路結構,但其實Inception有個大家應該都比較熟悉的、也比較直覺的設計思維:

  1. 多尺度提取特徵: 透過1x1, 3x3, 5x5的Conv進行卷積,使得在下一層能夠從不同尺度上進行特徵提取
  2. 架構要怎麼設計,不如讓模型自己決定: 大家一定想過如果要自己設計一個CNN模型,那要怎麼去設計Conv層和Pooling層的搭配呢? 那不如讓模型自己決定吧! 同時給出不同的卷積和Pooling讓模型自己去訓練,然後模型在更新的過程中就自然的會給予他認為比較好的操作較大的權重

1x1 Conv是如何降低計算量的?

1x1的Conv就是一個kernel(或者稱filter)掃過去,那到底要如何降低計算量?

關鍵在於該kernel的channel(或者說dimension)的數量是可以控制的,所以只要output dimension參數設置的比原本前一層Conv小就可以做降維,反之也可以提升維度。

  • 在這操作中,可以想成1x1 Conv整合了同個位置不同channel之間的訊息

舉個例子:

假設上一層的輸出是(100, 100, 128)

經過一個5x5的Conv(有256個filter, stride=1, padding=2, 如此的設置保持了output size大小不變),我們可以得到的輸出為(100, 100, 256)

在這個例子下,卷積的參數為128 x 5 x 5 x 256 = 819200 (不考慮bias)

不過如果中間先經過了1x1 Conv降維(假設32個filter),在接5x5的Conv,我們的參數量就會是: 128 x 1 x 1 x 32 + 32 x 5 x 5 x 256 = 208896

  • 可以看到參數量少了4倍,而最後的輸出仍然是(100, 100, 256)

那中間經過降維會不會影響模型精度?
其實模型在高維度中很容易找到一個hyperplane去fit我們的data,所以適當的降維其實不太會降低我們的模型結果,可以想成將原本較分散的資訊量都集中在這些維度上了(當然你也不能降維的太誇張啦)

GoogLeNet

慢慢看論文好累啊,我要快速飆車帶過了

最後的架構如下,我把架構圖壓縮倒過來放不然太大了,看的再去paper看原圖ˊ_>ˋ

最後對GoogLeNet稍微整理一下:

  1. 總共27層
  2. 在分類前使用NIN的Gobal Average Pooling(GAP)
    • GAP不需要參數,並且能有更好的representation
    • 實驗結果顯示比用FC layer提升了1%的Acc
  3. 還是有使用dropout的regularization技術
  4. 加入了兩個auxiliary classifiers: 隨著網路變深,可能會產生gradient vanishing的問題。於是想透過中間層來幫助預測,在訓練的過程中會透過給予auxiliary classifiers權重的方式來一起去分類
    • 但是在預測的時候則不會使用

Training Methodology

跳過,覺得比較沒有重要的,有興趣自己看原文

ILSVRC 2014 Classification Challenge Setup and Results

訓練了7個GoogLeNet來做Ensemble,最後結果如下:

有沒有看到熟悉的VGG呀,當年的第二名,也是CNN發展史上非常著名的一個模型呢

沒意外下一篇就是寫他了哈哈哈嗚嗚嗚嗚

ILSVRC 2014 Detection Challenge Setup and Results

GoogLeNet也是當年Detection的冠軍呢,牛逼啊大佬

採用的方式和R-CNN類似,目前對於detection的著墨還不多,所以先不讀這部分,有興趣的可以再去看原文。

結論

GoogLeNet提出了一個隨插隨用的區塊結構: Inception,直覺的想法就是讓模型自己去學最佳的結構(在該層中1x1, 3x3, 5x5 或是pooling誰比較重要就給予比較大的權重)。儘管設計看似很直覺,但在設計的背後考量並不是那麼簡單,要了解背後的設計動機需要花點時間看這篇論文。

然後這篇其實是GoogLeNet v1,之後還有v2 v3 v4的不同改進,有時間再來看看後續的發展。

而這篇文章中大量使用到了1x1 Conv,也使用到了GAP,這些技術都來自CV經典的論文: 2014年ICLR的”Network in Network, NIN”,之後也會閱讀這篇文章。

References


>