ViT (Vision Transformer) 概述與優勢: 對比CNN與Swin等hierarchical方法
ViT (Vision Transformer) 概述與優勢: 對比CNN與Swin等hierarchical方法
今日在GPT (General Pretrained Transformer) 的助攻下,基於attention的Transformer早已是深度學習的主流模型之一。不過在電腦視覺領域,即使ViT (Vision Transformer) 與Swin Transformer相繼展現驚人成果,至今 (2023年) 以CNN (Convolutional Neural Network) 為基礎的架構仍然是非常主流。
先撇除長期以來CNN累積下來的許多軟硬體整合優勢,其實最純粹的ViT追求的是極佳的任務兼容性與規模 (scale) 變化,這一定程度與CNN歸納偏置 (inductive bias) 延伸出來的hierarchical有一定程度的衝突。 雖然時至今日仍然很難斷定hierarchical是否能被純粹的ViT取代,但透過與hierarchical方法的比較,更可以理解ViT背後真正的價值,以及什麼時候適合採用這類型的架構。
Tip
文章難度:★★★★☆
閱讀建議: 本篇文章為ViT (Vision Transformer)的效益深度剖析,文章分為三個部分:第一個部分從基本的modeling CV tasks開始,簡單介紹CNN、ViT與Swin Transformer。第二部分會透過object detection與human pose estimation兩個下游任務來討論ViT的價值 ,並且著重在ViT與hierarchical方法的比較上 。第三部分則是利用第二部分的一些數據,討論一些ViT的重要行為特徵。因為這個題目其實蠻大的,這篇文章長度會比較長一些,有許多跟本篇重點無關的部分,都會比較概念式的帶過,建議遇到不清楚的地方,可以搭配其他文章或原論文獲得更完整的理解。
推薦背景知識:CNN, inductive bias, attention, Transformer, Vision Transformer (ViT), Swin Transformer, computer vision, classification, object detection, human pose estimation, DETR, ViTDet, ViTPose.
Modeling Computer Vision Tasks
目前在電腦視覺領域,各種視覺任務,不論是high level或low level vision, 主流的網路架構大致可以分為兩個類型:
- 以CNN為主的架構:以各種特化、優化convolution為主的架構,可能增加一些全域特徵混和 (如squeeze-and-excitation [1]) 設計,或加入部分混合的attention機制 (如non-local [2])。
- 以Transformer為主的架構: 以Transformer或其變體為基礎的架構,如純粹的ViT (Vision Transformer) [3],或加入類似CNN hierarchical架構的Swin Transformer [4] 與MViT (Multiscale Vision Transformers) [5] 等。
自1998年LeNet [7] 發表以來,CNN (Convolution Neural Network) 在CV任務上長期都是霸主一方。事實上,convolution本來就是在傳統CV領域是很常用到的一種計算,因此CNN也繼承了CV領域過往常用的重要歸納偏置 (inductive bias)-locality (局部觀察能力) 以及 shift equivalent (特徵不因在圖片何處改變)。
Inductive bias是學習演算法中,對模型預測方向做的假設之集合。
在2021年,Tranformer發展出了在CV領域的通用版本,也就是Vision Transformer (ViT)。ViT實際作法很單純:把整張影像分成多個2D patch,每個patch的解析度為P×P
,攤平可以形成一個sequence,丟給linear projection layer得到embedding,就可以直接丟給Transformer了。
具體來說,假設輸入影像的 shape為
(H, W, C)
,那麼攤平後就是(HW/P², CP²)
的序列資料了。
ViT與CNN的最大差別是-ViT在核心設計上已然捨棄CNN的inductive bias。在最單純的架構下,不論在哪個stage都可以獲得全域的觀察能力,也因此預設不具備locality與shift equivariant這樣的inductive bias。
ViT在實驗後認為大規模dataset的訓練可以超越inductive bias。
然而,ViT的出現並沒有立即對CV領域的應用產生立即的改變,其中一個主要的原因是缺乏下游任務 (downstream task) 的驗證。原始的ViT論文僅僅是提供一個簡單的Transformer for CV思考方向,除了classification以外並沒有向下深究。
**以CV領域來說,通常基本的測試都是進行image classification的評量,然後再進入下游任務的評量。**常見的包含物件偵測 (object detection)、切割 (segmentation) ,或是更領域特化的如姿態估測 (pose estimation)。
事實上在Transformer應用於CV領域的前期,除了ViT直接用pure Transformer架構,其餘方法大多是先用CNN backbone先抽取特徵後,再交給Tranformer做全域特徵的融合。
即使如此,ViT架構本身還是存在許多優勢,這也反映在2022年後越來越多的下游任務直接採用ViT,並且在調整後performance能夠與SOTA同級或甚至超越。
另一方面,有些學者仍然對於CNN的inductive biases存在一些信仰,於是就嘗試把CNN的inductive biases組合到Transformer架構中。莫約相距半年,這個方向的佼佼者Swin Transformer就發表於2021年的ICCV上。
實際上也還存在另外一派對CNN更有愛的學者,這些人透過研究Transformer特徵或是其他方法,試圖再次強化CNN (如ConvNeXt [7]),然後證明CNN架構仍然優於或是至少不弱於Transformer。
不過這又是另一個大主題了,這篇文章不會針對這點展開。
不同於ViT一開始就把圖片切成16×16的patches,再用Transformer直接全域地抽取特徵。Swin Transformer的想法是要像CNN一樣具備hierarchical,讓淺層聚焦於鄰近資訊,深層才是全域資訊。
**實作上Swin透過多層級地patch劃分,在不同stage逐步地merging patch達成hierarchical結構。**這個merging的概念其實一定程度相似於CNN中的convolution with stride或是pooling。
另外,在Swin中每個不重合的window之間其實缺乏特徵交流,因此Swin Transformer Block其實還有設計一種shifted window partition来增加不同window之間的特徵交流。
**受惠於hierarchical設計,Swin很自然地可以直接應用於大部分的CV任務,並使用multi-scale predict head或features fusion的既有技巧。**因此,除了Swin論文本身就在detection與segmentation上就已經直接突破先前SOTA,隨後許多下游任務的SOTA都出現了採用Swin的架構。
要討論CNN與各類Transformer的差異,恐怕不是三言兩語可以結論的。因此**在這篇文章中,會把重點集中在架構是hierarchical與否來看,並依照不同方法、論文的結果,推論hierarchical實際的價值。**換句話說,CNN會歸類於hierarchical,ViT則是hierarchical,而Swin雖然基於Transformer,但仍然偏向hierarchical類別。
為了全面、但不過於冗長地討論,以下挑選兩個類別稍微有差距的high level downstream task (object detection與human pose estimation) 來討論採用hierarchical架構與否的一些行為差異。
- Object detection: CV基本任務之一,對比classification,還需要對於位置資訊需要有確切的理解。
- Human pose estimation (HPE) : CV常見任務之一,對比detection,除了對位置的精度要求越高,更需要理解人體的semantic資訊。
Detection
**Object detection的基本目標就是在2D座標上把物體的4DoF標出來 (通常可以解釋為左上角與右下角共四個的座標值)。**不論是什麼流派的object detection,在實作時通常都會預測遠大於可能物件的數目,再用一些技法去把多餘的預測消除。比如說常見的dense detection是在輸出的mesh grid上預測大量的bounding box,再用NMS (Non-Maximum Suppression) 這類的方法去消除或結合大量的預測。
以CNN為基礎的知名架構不勝枚舉,如Faster-RCNN [8]、RetinaNet [9]、YOLO [10]等。
DETR [11]是Transformer用於detection的知名設計。在架構上,影像會先透過傳統的CNN (比如說ResNet) 抽出feature map,再將CNN抽出的feature map送到以Transformer組成的auto-encoder網路中,直接輸出一組N個set prediction,每個set包含box center、scale與object class。
實際上DETR論文的重點並不只是採用Transformer,而是將object detection視為set prediction問題,是在方法上與一般dense prediction不同的設計。因此後續也有採用DETR方法,但將CNN backbone換成ViT或Swin的論文。
簡單來看,現在的主流detection SOTAs在方法上可以分為以mesh grid dense prediction與以DETR為基礎兩個方向。在backbone上則是不同論文有不同的設計,有些使用了優化過的CNN,有些是ViT,有些則是hierarchical Transformer。當然各自都會再搭配一些特殊技法,不過特殊技法部分超出了這次討論的範圍,不會花太多地方著墨。
整體上從backbone層面來看,到現在其實還是很難明確地指出究竟在object detection最好的backbone是CNN、ViT還是hierarchical Transformer,畢竟在各家論文中的數據時常是各有長短的。比如說,Swin與MViT在論文中確實都有超越CNN與ViT的實驗數據。但後續上,ViTDet [13] 卻也在論文中公平地比較,並說明簡單的ViT在大規模模型上其實是更有效果的。而基於CNN優化的作品如RepVGG、YOLOv6與YOLOv7,其實在數據上CNN也並沒有真的落後。
不過雖然沒有辦法斷言最強,重要的其實還是可以從中得到一些insights。比如說,從YOLOv7 [12]的數據上來看,雖然論文數據中表現最好的是Swin,但是考慮到運算效率與硬體加速,或許目前還是CNN在performance與latency上取到了最好的平衡。
另一方面,在允許大運算量時,非hierarchical架構的ViT在拓展 (scaling) 優勢就得以顯現,因此表現很有可能是最佳的。在ViTDet [13]或其他論文 [14]中可以找到這樣的佐證。
Human Pose Estimation (HPE)
人體姿態估測 (HPE) 是相較detection更加複雜的任務,任務細類也蠻多的,包含追蹤keypoint或是mesh,或是追蹤2D或是3D等。隨之而來的方法也是很多變。為了避免失焦,以下討論基於top down approach的single frame 2D human keypoint estimation為主。這種方法通常前面會搭配一個detector,先把bounding box找出來,再交給另一個專門的網路預測pose。
基本上,**在HPE的網路會採用上下採樣與特徵融合比較激進的設計。**因為過往我們認為HPE這樣的任務,對於semantic與local details都要有相當好的理解是非常關鍵的。因此,目前CNN-based的HPE SOTA網路HRNet [15]就是採用這樣的設計。
發表於2021年ICCV的TokenPose [16]是混合使用CNN與Transformer中,較常被其他論文引用的方法之一。TokenPose原始設計需要使用CNN抽取特徵後,再放到Transformer中預測每個keypoint的實際位置。
與DETR一樣,TokenPose真正的重點其實也只不是導入Transformer,而是把關節點資訊當成一種query token的思維。因此在數據上TokenPose也沒有特別tune出比CNN SOTA (HRNet-W48) 強太多的表現,而是將重點放在新的預測方法 (token as keypoint) 與運算速度 (使用更小的CNN backbone) 上。不過實際上對比DETR,相較TokenPose方法並沒有那麼的流行。
事實上,TokenPose其中一個架構 (TokenPose-T) 其實就是Pure Transformer,不過因為是壓得很小的架構,因此與HRNet比較當然無法直接比較。
發表於2022年NeurIPS的ViTPose [17]則是繼承了ViT的經典思路,盡量簡化下游任務所需的客製化架構。ViPose直接把圖片交給ViT抽特徵後,將所有patch再結合為一張feature map,再使用原本HPE常用的predict head (如預測heatmap) 直接預測。
如此簡單粗暴的方法,初步猜測上會認為應該差不多與SOTA達到與fair的水平。然而實際上是再COCO val上展現了蠻顯著的超越。
實際上更令人驚訝的是再困難的情況下,如OCHuman這種很人數密集,並且有大幅遮蔽現象的dataset,直接ViT的能力明顯超越先前所有CNN或是CNN backbone+Transformer的方法。這很或許可以解釋為脫離CNN inductive bias的ViT對於人體姿態理解是有機會更好的。
Warp Up
這篇文章把這麼多東西一起討論確實有點繁雜,但其實為了稍微全面點,這也是有點必要。最後,以下會就幾個ViT有趣的特徵,搭配前述論文數據做一些討論。
在這些ViT的應用上,很有趣的其中之一是關於feature map的resizing。在過往,在任何detection或是pose estimation上,CNN不同stage特徵的融合是可以提高表現的重點。因為CNN解析度較低 (較深) 的特徵通常代表了較多sementic資訊,而解析度較高 (較淺) 的特徵通常代表較多的細節資訊。因此,在detection上有各種不同的FPN設計,在HPE上也有各種更積極的特徵混合設計 (甚至還有像HRFormer [18]這種在Transformer上做高低解析度混和的設計)。
不過從ViTDet、ViTPose與的結果來看,雖然Transformer沒有CNN的inductive bias,但透過大量數據或是有效的self-supervised training (如MAE) 還是可以理解locality與shift equevilen,甚至連CNN長年較難處理的object scale都能夠有一定程度的處理。
換句話說,
ViT抽出來的特徵在resize成任何解析度後,失真的程度都是比較低的。
這其實是許多CNN設計想要盡量逼近的結果 (如2020年的SpineNet [19]) 。
在ViTPose++ [20]中提供一張可以清楚看到latency與performance的圖表。
從張表格可以看到大部分速度慢的網路都是Transformer-based的方法,而pure CNN的SOTA HRNet-W48速度則是落在約中間的位置。雖然有一部分是確實Transformer單體運算目前效率可能不如CNN,但更重要的原因是ViT比較不需要像hierarchical方法要考慮到架構面或是receptive field這類的設計細節,因此
ViT可以很容易地疊加,也相較沒有飽和現象。
當然像是HRNet或是Hourglass這種理論上也可以無窮的堆下去,但CNN一直堆疊導致飽和的情況是比較明顯的。目前看起來,堆Transformer導致飽和的上限是比較高的 (看看那些GPT堆成什麼樣子) 。
在與hierarchical Transformer的比較上也可以看到類似的結果。以ViTDet的數據來看,在較低運算量的情況Swin與MVit (hierarchical Transformer) 表現是比較好的。但當運算量拉大後,ViT的優勢是非常顯著的。
ViT在設計、訓練上也展現了很不錯的彈性,其中最令人覺得雀躍的是pretraining的簡化。過往CV用的網路通常在正式訓練下游任務前,都會先在某些大量的dataset進行pretraining,其中最常見的就是先在ImageNet (~1400萬張圖片) 上先訓練classification。這個pretraining通常會對下游任務有一定程度的幫助,特別是下游任務資料量較少時。
但這個pretraining因為資料量不小,其實也是有點耗工。但Transformer系列可以說從NLP時期就是pretraining的專家,而ViT也有發展出類似的self-supervised training技巧,也就是MAE (Masked Auto-Encoder) ** [22]。在ViTPose的數據中,我們可以看到即使只使用很少量的ImageNet資料,或甚至完全不使用,直接用下游任務的資料,就可以在ViT上完成預訓練。**
當然MAE理論上也可以用於CNN或Swin這類hierarchical架構,不過在ViTDet論文中有針對這點討論,並且認為MAE用在純粹的ViT效果是比hierarchical Transformer好。
總而言之,具我個人所找到的論文數據、公開的Github或HuggingFace project來測試的結果,CNN、ViT與hierarchical Transformer其實表現真的是很接近,而且有些task dependent。
以object detection來說,目前在一般的運算量下感覺真的是很接近。在極大運算能力的情況,可能是ViT稍好於Swin與CNN。而在小運算量的情況,目前CNN,或更明確地說,採用repermeterization、quantization與sparse computing的RepVGG與MobileOne可能是相較更有效率的選項。
以human pose estimation來說,基本上結果也是與object detection相似,但普遍來說ViT系列的表現會更加突出。這可能是因為HPE相比detection是更加複雜的任務,也更吃重全面的理解力,而這正是ViT擅長之處。
但因為**這邊得比拚可以說還沒有正確答案,任何變化都是有可能的。**因此先在這邊立個安全FLAG。
說實話,這個這篇文章討論的題目有點太廣了。為了更正確地討論ViT的價值,實在是不能挑兩個以上的重要down stream task展開。但各自領域的內容又非常繁雜,真的很難在一篇文章中詳細展開。因此這篇文章在整理的時候將各領域限縮到小範圍,也盡量不要展開即使關鍵但相較與主題較不相關的討論。
好了~這篇文章就先到這邊。老話一句,Deep Learning領域每年都會有大量高質量的論文產出,說真的要跟緊不是一件容易的事。所以我的觀點可能也會存在瑕疵,若有發現什麼錯誤或值得討論的地方,歡迎回覆文章補充或來信一起討論 :)
Supplementary
原始在NLP領域的Transformer包含了Encoder與Decoder兩塊,而在CV領域不一定會使用原本NLP完整的Transformer,很常是使用單獨的Transformer Encoder的部分。
Transformer Encoder的輸入是一個序列的特徵,考慮batch維度的話,就是batch_size×seq_len×feat_dim。其中主要包含了三個元件:
- Multi-head attention (MHA) : 即原始的attention機制,但使用多個attention head (每個attention head可以想像成convolution的channel或是ResNeXt的cardinality)。因為輸入都是來自norm layer的輸出,因此也是Multi-head self-attention (MHSA)。
- MLP: 通常實作上就是堆兩個dense (fully-connected) layer。
- Norm: 即feature normalization,通常使用layer normalization (LN)。
實際上,在輸入是大解析度時,直接跑multi-head attention對記憶體比較不友善,因此有些設計會會跑window-based multi-head attention (W-MHA)。這個設計的細節可以參考Swin Transformer論文的圖利。
Attention的大方向很簡單,就是一個利用一個網路預測的權重組和多個latent feature。在Transformer的論文中完整地解釋attention (論文中的scaled dot-product attention)。概念上非常接近hash table,使用三組input (Q for query、K for key、V for value),分別通過不同的參數乘法後,使用query尋找對應的key,再利用key取value。
直覺看起來,Q、K、V三者的輸入應該會來自不同地方。不過所謂的self-attention就是指Q、K、V三者的輸入都是一樣的,顧名思義-自我關注。而multi-head指的則是Q、K、V會許多attention head,再組合再一起,概念上與ResNeXt [5]的cardinality相似。
在Transformer將RNN自encoding與decoding移除後,整個self-attention layer都是position in-variance的,這衍生了一個新的問題:單字的位置self-attention layer是完全看不到的。而positional encoding的加入,將單字間的位置資訊encode後,放到input embedding裡才通過self-attention layer,讓模型可以有機會理解文字的位置與順序。
在DETR的數據中,可以發現兩個數據上的重點:DETR大物件偵測能力顯著優於純CNN方法,但小物件偵測能力卻遜於純CNN方法。
當然,這部分數據其實並不能說是完全代表了純CNN跟DETR的能力差距,因為DETR只有拿CNN backbone的最後一個stage輸出。在FPN的使用上,本來就是會顯著提升小物件準確度,但也有機會讓大物件的準確度下降。事實上,後續也有許多論文將ViT以類似multi-scale feature輸出做預測。
Reference
- Squeeze-and-Excitation Networks[CVPR 2018]
- Non-local neural networks[CVPR 2018]
- An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale[ICLR 2021]
- Hierarchical Vision Transformer using Shifted Windows[ICCV 2021]
- Multiscale Vision Transformers[ICCV 2021]
- Gradient-based learning applied to document recognition[Proceedings of the IEEE 1998]
- A ConvNet for the 2020s[CVPR 2022]
- Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks[NeurIPS 2015]
- Focal Loss for Dense Object Detection[ICCV 2017]
- You Only Look Once: Unified, Real-Time Object Detection[CVPR 2016]
- End-to-End Object Detection with Transformers[ECCV 2020]
- YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[CVPR 2023]
- Exploring Plain Vision Transformer Backbones for Object Detection[ECCV 2022]
- DETRs with Collaborative Hybrid Assignments Training[arXiv 2022]
- Deep High-Resolution Representation Learning for Human Pose Estimation[CVPR 2019]
- TokenPose: Learning Keypoint Tokens for Human Pose Estimation[ICCV 2021]
- ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation[NeurIPS 2022]
- HRFormer: High-Resolution Transformer for Dense Prediction[NeurIPS 2021]
- SpineNet: Learning Scale-Permuted Backbone for Recognition and Localization[CVPR 2020]
- ViTPose++: Vision Transformer Foundation Model for Generic Body Pose Estimation[arXiv 2022]
- Masked Autoencoders Are Scalable Vision Learners[CVPR 2022]