在2021年理解Convolution Neural Network: CNN的基礎與未來展望

在2021年理解Convolution Neural Network: CNN的基礎與未來展望

Deep learning在電腦視覺 (Computer Vision, CV)上最常被使用的架構是 Convolution Neural Network (CNN)。 CNN以參數來做 convolution的概念可以說是Yann LeCun於 1998年發表的 LeNet 中提出的,憑藉著優異的歸納偏置 (inductive bias) 至今已稱霸二十餘年。

但 CNN也並不是沒遇到對手過,目前最大的對手,莫過於 2016年後自然語言處理 (Natural Language Processing, NLP)領域常用、以 attention為基礎的 Transformer 。雖然過去幾年 Transformer都無法撼動 CNN,但在 2021年透過 Google提出的ViT 與 MSRA提出的Swin Transformer 讓人另 Transformer印象深刻-畢竟表現都刷超過了以 CNN為基礎的架構。

因此,在 2021年後一些時間或許會不斷面臨要使用 CNN還是 Transformer的疑惑。這篇文章作為一篇混和基礎與展望的 CNN介紹文,將從零開始介紹 CNN的崛起原因、運作原理與參數設定等等,並在最後以 2021年底的知識背景,給予 CNN一些未來可能發展的展望

Cover made with Canva .

Tip

文章難度:★☆☆☆☆

閱讀建議: 本篇文章前段介紹從 MLP到 CNN的原因,並接續著介紹 CNN完整的運作原理與主流框架 (Tensorflow & Pytorch) 的 API參數。最後,以 2021年的知識背景簡單討論了 CNN與 Attention在 CV領域的應用情況。整篇文章前

推薦背景知識:Deep learning, convolution neural network, computer vision, natural language processing, attention, Transformer, image classification.

在類神經網路中,網路就代表了 function F(x)=y。

即考量輸入 tensorx,通過類神經網路網路後得到預測 tensory。

在類神經網路的架構中,最為基礎的架構是Multi-Layer Perception (MLP),也就是由所謂的 dense或 fully-connected (FC) layer組成,每一個 neuron都完全與前一層的所有 neural連接。

Multi-Layer Perception. (資料來源)

假設今天要討論的是一個影像辨識的問題,比如說將輸入分類成貓、狗、鳥或是魚。首先,得先對影像有個基礎的共識-一張 2D影像就是一張維度為 (height, width, channel) 的 tensor。

Image的資料表示方法。

那麼如果要用MLP (multi-layer perceptron) 來實現影像分類器,就只要把這張 tensor攤平,然後丟進 MLP、通過 softmax,最後利用 cross entropy之類的損失函數來訓練就可以達到基本的分類功能。

使用MLP對影像進行分類。

使用以 FC組成的 MLP其實本身沒有什麼問題, MLP本來就可以代表一個近似無窮強大的 function。但最大的問題在於,模型其實並不是越強大越好,或者說,最好的模型或許不一定是最自由的模型。

因為類神經網路的優化過程通常是 non-convex optimization,所以在網路設計上如果可以依照任務有一些適量的引導,會是很有幫助的事情。引導的方法之一就是加上歸納偏置 (Inductive bias)

歸納偏置指的是學習演算法中,對學習器的預測方向做的一些假設之集合。

參考以下這張有兩隻斑馬的圖片。對於 FC來說,因為每一個 pixel最終都被攤平,所以FC的每個 tensor都考慮了整張影像,以至於在這張圖中他並無法直接共享兩隻斑馬之間的特徵(比如說下圖 A與 B兩個框)。

換句話說,對於影像相關的網路,合理的期待可能是:

  1. 可以擁有觀察局部的能力,而非總是看整張圖片。
  2. 特徵的抽取時,可以保留一部分或全部的特徵不因在圖片何處改變。
Fully-Connected無法了解影像局部的等價。

Convolution

而**「觀察局部」以及「特徵不因在圖片何處改變」就是原始 convolution neural network的特色**。實際上先不管 CNN, convolution本身就是一種矩陣的運算方法。對於某兩個維度 (這邊可以簡單地想像為影像的寬與高兩個維度),用稱為 kernel的矩陣在這兩個維度上平移進行重複的運算。

想像輸入的影像 (或者說tensor) 為 5×5,而 kernel為 3×3。

Convolution的運算範例。

通常 convoltuion的操作會從左上角開始,首先 kernel對其輸入 tensor左上 3×3的位置,然後與對應的位置相乘後相加。

Convolution的運算範例。

接下來 kernel會依序先向右、再向下的逐步平移。每次的運算都會重複使用 kernel裡的數值,但隨著滑到不同 input tensor的位置,輸出也會有所不同。

Convolution的運算範例。

最後 kernel掃過整張 tensor,完成操作。

Convolution的運算範例。

以這個例子來說,可以稍微精準一些地來描述他們的維度:輸入的 tensor維度為5×5×1,而 kernel則是3×3×1×1,因此輸出為3×3×1。

以這個例子來說,通過 convolution後,output tensor的兩個維度會內縮。有些時候其實並不希望 output tensor有這樣的變化,這時可以先將input tensor向外長大一些,補上一些數值 (比如說補 0),來避免向內縮的狀態。這就是所謂的 padding。

Convolution的padding。

另一方面,有的時候反而會希望可以降低 output tensor的解析度 (即在掃過兩個維度的大小),這時候會調整的就是 convolution的步長 (stride)。在前面的例子中的 convolution一次都是滑動一個 pixel,這其實就是stride=1的設定。藉由調大 convolution的 stride,就可以降低 output tensor的解析度,也同時減少了運算量。

Convolution的stride。

當然,這樣的 convolution是具有推廣性的。比如說,如果輸入是一張 RGB影像 (32×32×3),可以用3×3×3×16的 kernel掃過,得到32×32×16的輸出 tensor。

同理,也可以推廣到更多維度。比如說往前增加 batch的維度 `(BZ)。那輸入就會是(BZ, H, W, C_1),用(K×K×C_1×C_2)的 kernel掃過後,得到的輸出就會是(BZ, H, W, C_2)。

對比一下主流 deep learning框架的 API。通常都會看到這些數值的調整:

  • 輸入維度 (C_1): Pytorch的in_channels, Tensorflow則會自動抓。
  • 輸出維度 (C_2): Pytorch的out_channels, Tensorflow的filters。
  • kernel大小 (K): Pytorch與 Tensorflow都是kernel_size。
  • Padding: Pytorch與 Tensorflow都是padding,也都支援zero、reflect等不同模式。
  • Stride: Pytorch與 Tensorflow都是stride,不過 Tensorflow在設定上可以對兩個維度有不同的stride。
Pytorch的 Conv2d。 (資料來源)
Tensorflow (或Keras) 的 Conv2d。(資料來源)

這邊還有一個比較特別的設定是dilation,描述了 convolution kernel「擴張」的程度,通常用來提升 convolution的 receptive field。一般來說dilation`大於 1的 convolution會被稱為 dilated convolution或是 atrous convolution,中文則是常譯為空洞卷積。

Dilated / Atrous convolution的行為. (資料來源)

CNN的價值

以今天來看, convolution neural network其實是一個有點年份的傢伙。 convolution是傳統電腦視覺或矩陣操作中就已經存在的方法,而將這個方法以類神經網路的參數套用到影像上,則可以說是 Yann LeCun於 1998年發表的LeNet [1] 中。在這二十來年中, CNN的卓越能力是有目共睹的。

而後繼基於 CNN的研究與方法,更是不勝枚舉。**從中世代常聽到的 AlexNet、 VGG、 GoogleNet、到新生代的 ResNet [5]、 MobileNet [6]、 SENet [7]、 EfficientNet [8] 都是延續著 CNN一脈相承的原理。**甚至也有許多推廣到不同維度的 CNN,比如說在時序上使用的 ID CNN與在三維空間中使用的 3D CNN。

CNN能夠有這樣的地位,大致上可以說是CNN在連續座標上構築的 inductive bias真的非常有效。然而,挑戰者並不是不存在的,CNN 目前最大的挑戰者是在 NLP領域大放光彩的Transformer [2] (Attention)。

以 attention為基礎的 Transformer從 2017年提出後,主導了 NLP領域大部分的 modeling architecture,但仍然無法撼動 CNN在 CV領域的地位。2021年透過 Google提出的 ViT [3] 與 MSRA提出的 Swin Transformer [4] 讓人不敢輕視這個對手-畢竟表現都刷超過了以 CNN為基礎的架構。甚至提出 Swin Transformer的胡翰都大膽地借用了物理學中力場學說變化的過程,來隱喻 Transformer終將融合或取代 CNN。

MSRA的胡翰利用力學來隱喻CV與NLP的未來。(資料來源)

但至少在現在 (寫這篇文章的時候), CNN還是具有其優勢,包含發展過程中累積的龐大資源,以及許多在硬體上的運算優化等等。不過以目前發展的趨勢來看,大概不出兩三年就可以看到真正的勝負了。

個人傾向相信最終會是兩者的結合,畢竟CNN的美好之一在於預設了 locality,這是以往 Transformer不具有的特徵。但同時convolution的運算與 locality也限制了 CNN的能力,而這是 Transformer的強項。因此, Swin Transformer這樣的出現,雖然仍然帶有一些未完成之事,但著實令人興奮。

後續 Facebook團隊已提出新的架構,叫做ConvNeXt [9],一種完全基於 convolution,但具備 Transformer的特性。這部分之後在寫文章補充。

好了~這篇文章就先到這邊。老話一句,Deep Learning領域每年都會有大量高質量的論文產出,說真的要跟緊不是一件容易的事。所以我的觀點可能也會存在瑕疵,若有發現什麼錯誤或值得討論的地方,歡迎回覆文章或來信一起討論 :)

Supplementary

ResNet論文 出來前,當時的網路相較於現在,都是非常淺的設計。這個原因在於當時較深的網路比較容易訓練不起來,使得更深的網路有時反而帶來更差的效果。而 ResNet提出的 residual learning簡單地使得深層網路更容易訓練,也開啟了各種超深網路的時代。

ResNet的網路設計其實很 naive,就是簡單地增加一條路線做單純的加法 (如下圖左),而這樣組合起來的 convolution layer,論文稱為一個 (building) block,方法簡單卻使的深層網路訓練變得容易許多。而在疊更深的網路時,ResNet設計了 bottleneck (building) block,降低 3x3 convolution的寬度,大幅減少了所需的運算量。

Basic residual block and bottleneck block. (資料來源)

MobileNet最核心的精神是使用 depth-wise separable convolution作為主要的計算單元。一般的 convolution是在一個 3D的 kernel中同時考慮的space與channel之間的關聯,進行一個大的矩陣乘法。Seperable convolution是先考慮space的關聯 (depth-wise convolution),再考慮channel間關聯(pointwise convolution),這樣將一個大的矩陣乘法變成兩個小的矩陣乘法,行為與原本convolution相似卻大幅的降低運算量。

一般convolution與depthwise seperable convolution的差異 (資料來源)

在這樣的情況下,attention出現了。**Attention的大方向很簡單,就是一個權重,利用權重組和多個latent feature。**在sequence-to-sequence的情況下,對於decoder的每個不同的step都會透過attention計算一個新的context vector,來自encoder在每個單字輸入後context vector的組合。

Attention的基本概念 (圖片來源)

Attention雖然讓context vector變得更合理,但事實上這個context vector在字詞與字詞間的聯繫依然是比較薄弱的,也就是在attention前,產生context vector的過程。而這就是Transformer的發起點。

Transformer [3] 移除語言處理常見的RNN,將encoding與decoding的過程也都使用了attention取代,因為attention的所有輸入都是一樣的,所以稱為self-attention。Self-attention的加入,讓模型可以直接考慮輸入與輸出文字自己本身的字詞間關聯,鯲不容易因為語句或文本過長導致效果變差。

Transformer架構圖 (圖片來源)

2020年 Google團隊提出的Vision Transformer (ViT) 可以說是第一個有效真正 end-to-end將 Transformer搬到 vision任務,並且完全不使用任何 CNN的方法。

ViT的實際作法很單純,把整張影像分成多個 2D patch,每個 patch的解析度為 P×P,攤平可以形成一個 sequence,丟給 linear projection layer得到 embedding,就可以直接丟給 Transformer了。具體來說,假設輸入影像的 shape為(H, W, C),那麼攤平後就是(HW/P², CP²)的序列資料了。

Vision Transformer的架構圖。(資料來源)

Reference

  1. Gradient-based learning applied to document recognition[Stanford 1998]
  2. Attention Is All You Need[NIPS 2017]
  3. An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale[ICLR 2021]
  4. Swin Transformer: Hierarchical Vision Transformer using Shifted Windows[ICCV 2021]
  5. Deep Residual Learning for Image Recognition[CVPR 2016]
  6. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications.[arXiv 2017]
  7. Squeeze-and-Excitation Networks[CVPR 2018]
  8. EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks[ICML 2019]
  9. A ConvNet for the 2020s[arXiv 2022]
comments powered by Disqus