解決 NLP 任務的 Transformer 為什么可以應用于計算機視覺?
幾乎所有的自然語言處理任務,從語言建模和masked詞預測到翻譯和問答,在2017年Transformer架構首次亮相后都經歷了革命性的變化。Transformer在計算機視覺任務中也表現出色,只用了2-3年的時間。在這篇文章中,我們探索了兩種基礎架構,它們使Transformer能夠闖入計算機視覺的世界。
一、視覺Transformer
1. 主要思想
視覺Transformer的意圖是將標準變換器架構泛化,以處理和從圖像輸入中學習。關于架構的一個主要思想是作者足夠透明地強調了:
“受到NLP中Transformer擴展成功的啟發,我們嘗試直接將標準Transformer應用于圖像,盡可能少地進行修改?!?/p>
2. 操作
可以非常字面地理解“盡可能少的修改”,因為他們幾乎完全沒有修改。他們實際修改的是輸入結構:
- 在NLP中,Transformer編碼器采用代表輸入句子/段落的獨熱向量序列(或等價的標記索引),并返回可用于進一步任務(例如,分類)的上下文embedding向量序列。
- 為了泛化到計算機視覺,視覺Transformer采用代表輸入圖像的patch向量序列,并返回可用于進一步任務(例如,分類)的上下文embedding向量序列。
特別是,假設輸入圖像的維度為(n,n,3),要將其作為輸入傳遞給Transformer,視覺Transformer的操作如下:
- 將其劃分為k2個patch,k為某個值(例如,k=3),如圖中所示。
- 現在每個patch將為(n/k,n/k,3),下一步是將每個patch展平為向量。
patch向量將是維度為3*(n/k)(n/k)的向量。例如,如果圖像是(900,900,3),我們使用k=3,那么patch向量將具有維度300300*3,代表展平patch中的像素值。在論文中,作者使用k=16。因此,論文的名稱為“一幅圖像值16x16個詞:大規模圖像識別的Transformer”,而不是提供代表單詞的獨熱向量,他們代表代表圖像patch的像素向量。
其余的操作與原始Transformer編碼器保持不變:
- 這些patch向量通過一個可訓練的embedding層傳遞
- 向每個向量添加位置embedding,以保持圖像中的空間信息
- 輸出是num_patches編碼器表示(每個補丁一個),可用于對補丁或圖像級別進行分類
- 更常見的(如在論文中),在表示前添加CLS標記,相應的用于對整個圖像進行預測(類似于BERT)
Transformer解碼器呢?
記住它就像Transformer編碼器;不同之處在于它使用masked自注意而不是自注意(但相同的輸入簽名保持不變)。無論如何,你應該很少使用僅解碼器的Transformer架構,因為簡單地預測下一個patch可能不是非常感興趣的任務。
3. 混合架構
作者還提到,可以以CNN特征圖而不是圖像本身作為輸入來形成混合架構(CNN將輸出傳遞給視覺Transformer)。在這種情況下,我們將輸入視為通用的(n,n,p)特征圖,patch向量將具有維度(n/k)*(n/k)*p。
4. 結構的喪失
你可能會想到這種架構不應該這么好,因為它將圖像視為線性結構,而它并不是。作者試圖通過提到來描繪這是有意為之:
The two-dimensional neighborhood structure is used very sparingly…position embeddings at initialization time carry no information about the 2D positions of the patches and all spatial relations between the patches have to be learned from scratch
我們將看到Transformer能夠學習這一點,這在其實驗中的好表現中得到了證明,更重要的是,下一篇論文中的架構。
5. 結果
結果的主要結論是,視覺Transformer在小數據集上往往不能超越基于CNN的模型,但在大數據集上接近或超越基于CNN的模型,無論如何都需要顯著減少計算量:
在這里我們可以看到,對于JFT-300M數據集(擁有3億張圖像),在該數據集上預訓練的ViT模型超越了基于ResNet的基線,同時大大減少了預訓練所需的計算資源。可以看到,他們使用的較大的視覺Transformer(ViT-Huge,有632M參數和k=16)使用了ResNet模型所用計算量的約25%,并且仍然超越了它。性能甚至在使用僅<6.8%計算量的ViT-Large時并沒有降低那么多。
與此同時,其他人也暴露了結果,當在僅有130萬圖像的ImageNet-1K上訓練時,ResNet的表現明顯更好。
6. 通過Masking進行自監督學習
作者對自監督的 masked patch 預測進行了初步探索,模仿BERT中使用的masked語言建模任務(即 masked patch并嘗試預測它們)。
“We employ the masked patch prediction objective for preliminary self-supervision experiments. To do so we corrupt 50% of patch embeddings by either replacing their embeddings with a learnable [mask] embedding (80%), a random other patch embedding (10%) or just keeping them as is (10%).”
通過自監督預訓練,他們較小的ViT-Base/16模型在ImageNet上達到了79.9%的準確率,比從頭開始訓練有2%的顯著提高。但仍然比有監督預訓練落后4%。
二、Masked 自編碼視覺Transformer
1. 主要思想
正如我們從視覺Transformer論文中看到的,通過masked輸入圖像中的patch進行預訓練所獲得的收益并不像在普通的NLP中那樣顯著,那里masked預訓練可以在一些微調任務中取得最先進的結果。
這篇論文提出了一種涉及編碼器和解碼器的視覺Transformer架構,當使用masked進行預訓練時,與基礎視覺Transformer模型相比,可以獲得顯著的改進(與以有監督方式訓練基礎尺寸視覺Transformer相比,改進高達6%)。
這是一些示例(輸入,輸出,真實標簽)。從某種意義上說,它是一個自編碼器,因為它試圖在填充缺失patch的同時重建輸入。
2. 架構
他們的編碼器只是我們前面解釋的普通視覺Transformer編碼器。在訓練和推理中,它只采用“觀察到”的patch。與此同時,他們的解碼器也是普通的視覺Transformer編碼器,但它采用:
- 缺失patch的masked標記向量
- 已知patch的編碼器輸出向量
所以對于圖像[[A, B, X], [C, X, X], [X, D, E]],其中X表示缺失的patch,解碼器將采用補丁向量序列[Enc(A), Enc(B), Vec(X), Vec(X), Vec(X), Enc(D), Enc(E)]。Enc返回給定patch向量的編碼器輸出向量,X是表示缺失標記的向量。
解碼器中的最后一層是一個線性層,它將上下文embedding(由解碼器中的視覺Transformer編碼器產生)映射到與patch大小相等長度的向量。損失函數是均方誤差,它計算原始patch向量和這一層預測的向量之間的差異的平方。在損失函數中,我們只關注由于masked標記而進行的解碼器預測,并忽略對應于存在的預測(即,Dec(A),Dec(B),Dec(C)等)。
3. 最后評論和示例
作者建議在圖像中masked大約75%的patch,這可能令人驚訝;BERT只會masked大約15%的單詞。他們這樣解釋:
“Images,are natural signals with heavy spatial redundancy — e.g., a missing patch can be recovered from neighboring patches with little high-level understanding of parts, objects, and scenes. To overcome this difference and encourage learning useful features, we mask a very high portion of random patches.”