ViT:拉開Trasnformer在圖像領域正式挑戰CNN的序幕 | ICLR 2021

論文直接將純Trasnformer應用於圖像識別,是Trasnformer在圖像領域正式挑戰CNN的開山之作。這種簡單的可擴展結構在與大型數據集的預訓練相結合時,效果出奇的好。在許多圖像分類數據集上都符合或超過了SOTA,同時預訓練的成本也相對較低

來源:曉飛的算法工程筆記 公衆號

論文: An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

Introduction


  基於自注意力的架構,尤其是Transformers,已成爲NLP任務的首選模型。通常的用法是先在大型文本語料庫上進行預訓練,然後在較小的特定任務數據集上fine-tuning。得益於Transformers的計算效率和可擴展性,訓練超過100B參數的模型成爲了可能。而且隨着模型和數據集的繼續增長,模型仍然沒有性能飽和的跡象。
  在計算機視覺中,卷積網絡仍然占主導地位。受NLP的啓發,多項工作嘗試將CNN的結構與self-attention進行結合(比如DETR:Facebook提出基於Transformer的目標檢測新範式 | ECCV 2020 Oral),其中一些則嘗試完全替換卷積(比如實戰級Stand-Alone Self-Attention in CV,快加入到你的trick包吧 | NeurIPS 2019)。 完全替換卷積的模型雖然理論上有效,但由於使用了特殊的注意力結構,尚未能在現代硬件加速器上有效地使用。因此,在大規模圖像識別中,經典的ResNet類型仍然是最主流的。
  爲此,論文打算不繞彎子,直接將標準Transformer應用於圖像。先將圖像拆分爲圖像塊,塊等同於NLP中的token,然後將圖像塊映射爲embedding序列作爲Transformer的輸入,最後以有監督的方式訓練模型進行圖像分類。
  但論文通過實驗發現,不加強正則化策略在ImageNet等中型數據集上進行訓練時,這些模型的準確率比同等大小的ResNet低幾個百分點。這個結果是意料之中的,因爲Transformers缺乏CNN固有的歸納偏置能力,例如平移不變性和局部性。在數據量不足的情況下,訓練難以很好地泛化。但如果模型在更大的數據集(14M-300M圖像)上訓練時,情況則發生了反轉,大規模訓練要好於歸納偏置。爲此,論文將在規模足夠的數據集上預訓練的Vision Transformer(ViT)遷移到數據較少的任務,得到很不錯的結果。
  在公開的ImageNet-21k數據集或內部的JFT-300M數據集上進行預訓練後,ViT在多個圖像識別任務上接近或超過了SOTA。其中,最好的模型在ImageNet上達到88.55%,在ImageNet-ReaL上達到90.72%,在CIFAR-100上達到94.55%,在包含19個視覺任務的VTAB標準上達到77.63%。

Method


  在模型設計中,論文儘可能地遵循原生的Transformer結構。這樣做的好處在於原生的Transformer結構已經被高效地實現,可以開箱即用的。

Vision Transformer(ViT)

  模型的整體結構如圖1所示,計算流程如公式1-4所示,主要有以下幾個要點:

  1. 輸入處理:標準Transformer接收一維embedding序列作爲輸入,爲了處理二維圖像,先將圖像\(x\in R^{H\times W\times C}\)重排爲二維塊序列\(x_p\in R^{N\times (P^2\times C)}\),其中\((H, W)\)爲原圖像的分辨率,\(C\)是通道數,\((P, P)\)是每個圖像塊的分辨率,\(N=HW/P^2\)是生成的塊數量,也是Transformer的有效輸入序列長度。Transformer所有層使用向量的維度均爲\(D\),需要先使用可訓練的公式1將二維圖像塊線性映射到\(D\)維,映射的輸出稱爲圖像塊embedding。
  2. class token:類似於BERT在輸入序列開頭插入[class]token,論文同樣在圖像塊embedding序列中預先添加一個可學習的class token(\(z^0_0=x_{class}\)),並將其在Transformer encoder中的對應輸出(\(z^0_L\))經公式4轉換爲圖像特徵\(y\)。在預訓練和fine-tuning期間,分類head都接到\(z^0_L\)上。分類head在預訓練時由僅有單隱藏層的MLP實現,而在fine-tuning時由單線性層實現。
  3. position embedding:添加position embedding到圖像塊embedding中可以增加位置信息,用合併的embedding序列用作encoder的輸入。論文使用標準的可學習1D position embedding,使用更復雜的2D-aware position embedding並沒有帶來的顯着性能提升。
  4. Transformer encoder:Transformer encoder是主要的特徵提取模塊,由multiheaded self-attention模塊和MLP模塊組成,每個模塊前面都添加Layernorm(LN)層以及應用殘差連接。MLP包含兩個具有GELU非線性激活的全連接層,這是point-wise的,不是對整個token輸出。self-attention的介紹可以看看附錄A或公衆號的實戰級Stand-Alone Self-Attention in CV,快加入到你的trick包吧 | NeurIPS 2019)文章。

Inductive bias

  論文注意到,在Vision Transformer中,圖像特定的歸納偏置比CNN要少得多。在CNN中,局部特性、二維鄰域結構信息(位置信息)和平移不變性貫徹了模型的每一層。而在ViT中,自注意力層是全局的,只有MLP層是局部和平移不變的。
  ViT使用的二維鄰域結構信息非常少,只有在模型開頭將圖像切割成圖像塊序列時以及在fine-tuning時根據圖像的分辨率調整對應的position embedding有涉及。此外,初始的position embedding僅有圖像塊的一維順序信息,不包含二維空間信息,所有圖像塊間的空間關係必須從頭開始學習。

Hybrid Architecture

  作爲圖像塊的替代方案,輸入序列可以由CNN的特徵圖映射產生,構成混合模型中。將公式1中映射得到圖像塊embedding \(E\)替換爲從CNN提取的特徵圖中映射得到的特徵塊embedding,然後跟前面一樣添加插入[class] token和position embedding進行後續計算。
  有一種特殊情況,特徵塊爲\(1\times 1\)的空間大小。這意味着輸入embedding序列通過簡單地將特徵圖按空間維度展開,然後映射到Transformer維度得到。

Fine-Tuning and Higher Resolution

  通常,ViT需要先在大型數據集上預訓練,然後在(較小的)下游任務fine-tuning。爲此,在fine-tuning時需要將預訓練的預測頭替換爲零初始化的\(D\times K\)前向層,\(K\)爲下游任務的類數量。
  根據已有的研究,fine-tuning時使用比預訓練高的分辨率通常可以有更好的效果。但使用更高分辨率的圖像時,如果保持圖像塊大小相同,產生的embedding序列會更長。雖然Vision Transformer可以處理任意長度的序列,但預訓練得到的position embedding將會失去意義。因此,論文提出根據原始圖像中的位置對預訓練的position embedding進行2D插值,然後進行fine-tuning訓練。
  值得注意的是,這種分辨率相關的調整以及模型開頭的圖像塊的提取是Vision Transformer中少有的手動引入圖像二維結構相關的歸納偏置的點。

Experiment


  論文設計了三種不同大小的ViT,結構參數如上。

  分類性能對比,不同模型、不同預訓練數據集在不同分類訓練集上的表現。

  將VTAB任務拆分與SOTA模型進行對比,其中VIVI是在ImageNet和Youtube數據集上訓練的ResNet類模型。

  預訓練數據集與遷移數據集上的性能關係對比,預訓練數據集小更適合使用ResNet類模型。

  預訓練數據集與few-shot性能對比,直接取輸出特徵進行邏輯迴歸。

  預訓練消耗與遷移後性能的對比。

  可視化ViT:

  • 公式1的前28個線性映射參數的權值主成分分析,主成分差異代表提取的特徵較豐富。
  • position embedding之間的相關性,約近的一般相關性越高。
  • 每層的self-attention中每個head的平均注意力距離(類似於卷積的感受域大小),越靠前的關注的距離更遠,往後則越近。

Conclusion


  論文直接將純Trasnformer應用於圖像識別,是Trasnformer在圖像領域正式挑戰CNN的開山之作。這種簡單的可擴展結構在與大型數據集的預訓練相結合時,效果出奇的好。在許多圖像分類數據集上都符合或超過了SOTA,同時預訓練的成本也相對較低。



如果本文對你有幫助,麻煩點個贊或在看唄~
更多內容請關注 微信公衆號【曉飛的算法工程筆記】

work-life balance.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章