A Survey on Visual Transformer及引文理解

點擊上方AI算法與圖像處理”,選擇加"星標"或“置頂


   
   
   

重磅乾貨,第一時間送達

來源:smarter


A Survey on Visual Transformer閱讀,以及自己對相關引文的理解。

Transformer 作爲NLP領域的大殺器,目前已經在CV領域逐漸展露鋒芒,大有替代CNN的趨勢,在圖像分類,視頻處理,low/high level的視覺任務都有相應的transformer刷榜。這篇文章在介紹這些工作的同時,討論了他們的challenges和今後可能的研究方向。

上圖基本上就是本文的主要內容了,作者首先對attention,transformer做一個簡單介紹,然後介紹transformer在NLP中的應用,最後將其在CV中的應用分爲四類加以介紹。這四類分別爲classification, high-level vision, low-level vision 和 video processing.Classification顧名思義就是分類任務,High-level vision作者定義爲:“對圖像中所見內容的解釋和使用”,包括目標檢測、分割等。Low-level vision定義爲“爲圖像提取描述信息”,典型應用包括超分,圖像去噪,風格遷移等。

2. Formulation of Transformer


Transformer 由一個encoder,一個decoder模塊組成。每個encoder是一個self-attention層加一個全連接層,每個decoder由兩種attention層加一個全連接層組成,在對句子進行處理前,首先要將每個單詞轉化爲  維的embedding。

2.1 Self-Attention Layer

自注意力機制先將一個embedding轉化爲三個向量,query,key和value(),三者的維度都與原始embedding一致。所有的embedding放在一起組成三個大矩陣 ,然後注意力機制計算過程如下

  • 計算不同輸入向量的得分 

  • 爲了梯度的穩定性進行歸一化 

  • 將得分轉化爲概率 

  • 最後得到加權的矩陣 

這整個過程可以被統一爲一個簡單的函數  直觀來看,第1步計算兩個不同向量之間的分數,這個分數用來確定我們在當前位置編碼單詞時對其他單詞的注意程度。步驟2標準化得分,使其具有更穩定的梯度,以便更好地訓練;步驟3將得分轉換爲概率。最後,將每個值向量乘以概率的總和,概率越大的向量將被下面幾層更多地關注

encoder-decoder attention layer其實和自注意力機制非常類似,不同之處在於,key,value矩陣  是從encoder那裏繼承來的, 是從上一層繼承來的。

到目前爲止,我們所描述的模型中缺少的一件事是解釋輸入序列中單詞順序的方法。因此一般都會顯式的將位置信息進行編碼然後加入原始的詞向量中,如下圖所示

數學定義爲

開始看到這兩個式子,會覺得很莫名其妙,這個sin,cos,10000都是從哪冒出來的?這裏的pos表示token在sequence中的位置,例如第一個token就是0。 ,或者準確意義上是  和  表示了Positional Encoding的維度, 。所以當pos爲1時,對應的Positional Encoding可以寫成:

2.2. Multi-Head Attention

在single-head的模型中,我們最終得到的embedding融合了其他各個位置,但是他很有可能被單詞本身dominate(自身對自身的attention一般很大),而且我們不能確保隨機初始化後不斷學習得到這些矩陣帶來的attention一定對。因此multi-head可以看作是一種ensemble,我們現在有多組矩陣,他們將同一個輸入embedding映射到不同的表達空間以此來提高模型的表達能力。不過此時query,key,value的維度不再與原始embedding一致,而是變爲,因此每個head經過self-attention將word映射爲維的embedding,將這些embedding連接在一起就變爲原始維度,數學定義如下

這裏表示

這就是基本的Multihead Attention單元,對於encoder來說就是利用這些基本單元疊加,其中key, query, value均來自前一層encoder的輸出,即encoder的每個位置都可以注意到之前一層encoder的所有位置。

對於decoder來講,我們注意到有兩個與encoder不同的地方,一個是第一級的Masked Multi-head,另一個是第二級的Multi-Head Attention不僅接受來自前一級的輸出,還要接收encoder的輸出,下面分別解釋一下是什麼原理。

第一級decoder的key, query, value均來自前一層decoder的輸出,但加入了Mask操作,即我們只能attend到前面已經翻譯過的輸出的詞語,因爲翻譯過程我們當前還並不知道下一個輸出詞語,這是我們之後纔會推測到的。

而第二級decoder也被稱作encoder-decoder attention layer,即它的query來自於之前一級的decoder層的輸出,但其key和value來自於encoder的輸出,這使得decoder的每一個位置都可以attend到輸入序列的每一個位置。

總結一下,k和v的來源總是相同的,q在encoder及第一級decoder中與k,v來源相同,在encoder-decoder attention layer中與k,v來源不同。

2.3. Other Parts in Transformer

Residual in the encoder and decoder. 在上面的結構圖中可以看到,每個encoder,decoder模塊都是會有一個殘差連接+layerNorm的,具體而言就是

Feed-forward neural network. 這個模塊不是簡單的FCN,而是兩層FCN加一個非線性的激活函數,即

Final layer in decoder. 解碼器的最後一層旨在將向量轉爲一個字。這是通過一個線性層和一個softmax層來實現的。線性層將向量投影到一個維的logit向量中,其中是詞彙表中的單詞數。然後,使用softmax層將logits向量轉換爲概率。

大多數用於計算機視覺任務的Transformer都使用原編碼器模塊。總之,它可以被視爲一種不同於CNN和遞歸神經網絡RNN的新型特徵選擇器。與只關注局部特徵的CNN相比,transformer能夠捕捉到長距離特徵,這意味着transformer可以很容易地獲得全局信息。與RNN的隱態計算順序相比較,Transformer的自注意層和全連接層的輸出可並行計算,且速度快。因此,進一步研究Transformer在自然語言處理和計算機視覺領域的應用具有重要意義。

3. Revisiting Transformers for NLP

Transformers出現後,克服了RNN訓練速度慢的缺陷,使得大規模預訓練模型成爲可能。BETR及其變種(SpanBERT,RoBERTa)等都是基於transformer的模型。在BERT的預訓練階段,對BookCorpus和英語維基百科數據集進行了兩個任務

  • Mask一部分token讓模型來預測。

  • 輸入兩個句子讓模型預測第二個句子是否是文檔中的原始句子。在預訓練之後,BERT可以添加一個輸出層在下游任務進行fine-tune。在執行序列級任務(如情感分析)時,BERT使用第一個token的表示進行分類;而對於token級別的任務(例如,名稱實體識別),所有token都被送入softmax層進行分類。

Generative Pre-Trained Transformer (GPT2,GPT3)是另一種基於Transformer解碼器架構的預訓練模型,它使用了帶掩碼的自我注意機制。GPT和Bert系列最重要的區別在於與訓練的方式,GPT是單向Transformer模型,這種單向的性質使其在文本生成方面具有強大的能力,今年Google使用“鈔”能力造出的GPT3更是在各種任務都有非常優越的表現,而且不再需要fine-tune。

當然還有其他的一些PTM模型,但這並不是改文章的主題,因此作者只是列出來以供參考。

還有一些多模態的transformer和這篇文章比較相關,可以簡單瞭解一下。VideoBERT使用基於CNN的module將圖像轉化爲token,然後使用transformer的encoder來爲下游任務學習一個video-text representation。VisualBERT和VL-BERT提出了single-stream unified transformer,用於捕獲視覺元素和圖像-文本關係,用於像視覺問題回答(VQA)和視覺常識推理(VCR)的下游任務。此外,Speech bert探索了用transformer編碼器編碼音頻和文本pair的可能性,以處理自動文本任務,如語音問題回答(SQA)。

4. Visual Transformer

這一部分是文章的中心

4.1. Image Classification

圖像作爲一種高維、噪聲大、冗餘度高的形態,被認爲是生成建模的難點,這也是爲什麼過了好幾年,transformer才應用到視覺領域。比較初始的應用是在Visual Transformer一文中,作者使用CNN提取low-level的特徵,然後將這些特徵輸入Visual Transformer(VT)。在VT中,作者設計了一個tokenizer將各個pixel分成少量的visual tokens,每個token代表了圖像中的某些語義信息。然後使用transformer來建模token之間的關係。最後輸出的tokens直接被用來做分類或者處理一下恢復成特徵圖用於實例分割。


與這項工作不同的是,最近出現的iGPT , ViT 和 DeiT 都是隻使用transformer的文章。

在CV中使用transformer,目前來看主要的兩個問題,以及下列文章的核心區別在於

  • 得到Token的方式。

  • 訓練的方式。

  • 評估representation的方式。

只要得到token,我們就能像NLP一樣使用transformer;有訓練目標我們就能train我們的model;有評估方式我們才知道自己的model好還是壞。接下來的幾篇文章我也會從這幾個方面進行講解。

4.1.1 iGPT

Token:iGPT使用一種比較暴力的方式得到token:原始圖像()進行預處理,將其調整爲低分辨率,並將其重塑爲一維序列(從左到右,從上到小)。對於RGB數據,我們的字典大小爲(文中採取了比較有趣的手段減小字典),每個像素相當於一個word,即對每個pixel,我們採用nn.Embedding(num_vocab, embed_dim)提取每個像素embedding。至此圖片數據已經完全轉化爲了transformer的輸入形式。其中seq_len取決於down sample保留了多少pixel。

Pretrain: iGPT有兩種預訓練方式:(i) 像自編碼器一樣進行逐像素預測。(ii)像Bert一樣mask一部分pixel然後預測。其實第一種方式的實現與bert也很類似,就是預測第個pixel的時候,mask掉之後的所有pixel。

attn_mask = torch.full(
(len(x), len(x)), -float("Inf"), device=x.device, dtype=x.dtype
)
attn_mask = torch.triu(attn_mask, diagonal=1)#[784, 784]
#attn_mask = [[0,-inf,-inf...,-inf],
# [0,0,-inf,...,-inf],
# [0,0,0,...,-inf],
# [0,0,0,...,0]]

Evaluation:兩種評估方式,(i) fine-tune:增加了一個小的分類頭,用於優化分類目標並adapt所有權重。(ii)Linear-probe:將pretraining的模型視作特徵提取器,增加一個分類頭,只訓練這個分類頭。第二種方式的直覺在於“一個好的特徵應該能夠區分不同的類”,除此之外,fine-tune效果好有可能是因爲架構很適合下游任務,但是linear-probe只取決於特徵質量。

主要過程的代碼如下,數字只是爲了示例,下面假設字典長度爲16(pixel一共16種)

# x:原始圖像處理後得到的序列 [32*32, 64],64爲batchsize,32是下采樣後的長款
length, batch = x.shape
# 將每個pixel作爲token求embedding,128爲embedding的維度
h = self.token_embeddings(x) # [32*32, 64, 128]
# 添加位置編碼
h = h + self.position_embeddings(positions).expand_as(h)
# transformer
for layer in self.layers:
h = layer(h)
# 自迴歸編碼需要輸出logits,映射回字典長度
logits = self.head(h) # [32*32,64,16]
# 16類的cross_entropy,對每個pixel計算損失
loss = self.criterion(logits.view(-1, logits.size(-1)), x.view(-1))

4.1.2 ViT

上文我們提到過,BERT在執行序列級的任務時使用第一個token作爲特徵得到分類結果。比如下面這句,他會在第一個位置加上CLS token,([CLS]谷歌和[MASK][MASK]都是不存在的。[SEP]同時,[MASK]也是不存在的。[SEP])最後使用該CLS token得到的結果進行分類。那麼我們是不是也可以參照這種方式直接進行分類呢?答案是肯定。

Token:一個圖像將被處理爲一個patch 序列. (H,W)是原始分辨率,(P,P)是每個patch的分辨率,是序列長度。由於transformer在所有層中使用恆定寬度,一個可訓練的線性投影將每個映射到D維向量,其輸出稱爲patch embeddings。

Pretrain:傳統情況下ViT也是要預訓練的,不同於iGPT,這不是一個生成式的模型,只採用了transformer的encoder,因此直接在imagenet做分類任務進行pretrain。文章顯示數據集小的時候效果一般,數據集大的時候因爲data bias已經被消除了很多,此時效果非常好。

Evaluation:分類任務的評價不再多說。

總結一下就是如下公式

4.2. High-level Vision

4.2.1 Generic Object Detection

基於transformer的目標檢測可以分爲兩類,也即下圖的(a)(b)


Transformer-based set prediction for detectionDETR 是這類工作的先驅,其將目標檢測視爲集合預測問題,去掉了目標檢測種很多手工的組件像NMS,anchor generation等。

Token:CNN將圖像downsample爲,然後將的空間維度壓縮爲一維,造成一個序列。這個token的獲取方式挺有意思,空間維度塌縮。當然也要加上位置編碼

Train:如何將object detection轉化爲set prediction然後進行訓練,這是一個非常有意思的問題。作者使用了object queries,這實際上是另一組可學習的positional embedding,其功能類似於anchor。之後每個query進過decoder後算一個bbox和class prob。

Evaluation:目標檢測傳統的評估方式。


DETR也大方地承認了他的缺點:訓練週期長,對小物體檢測效果差。

Transformer-based backbone for detection.與DETR不同,ViT-FRCNN將ViT與傳統的檢測框架融合,直接使用transformer的encoder作爲backbone提取特徵,與ViT處理圖像的方式一致,但是輸出的patch feature重新調整爲一個圖像的特徵圖送入傳統檢測模型。

總結一下,目前transformer已經在很多視覺應用中展現出了強大的實力。使用transformer最重要的兩個問題是如何得到輸入的embedding(妥善處理position embedding),模型的訓練與評估。目前還有很多非常有價值的課題值得我們探索,例如,對於最終的性能,像CNN或PointNet這樣的特徵提取模塊是必要的嗎?如何讓visual transformer受益於像BERT或GPT-3在NLP社區做的大規模的預訓練數據。是否有可能預先訓練單個transformer模型,並通過幾次微調來針對不同的下游任務進行微調(人民幣玩家們加油)?

4.3. Low-level Vision

這裏所謂的low-level,其實就是輸出並不是標籤這種形式,而是超分,或者生成模型,直接輸出圖片。這一類應用的大體框架如下,transformer編碼器將圖像作爲像素序列或小塊,以該序列作爲輸入語句,transformer解碼器就能成功地生成所需的圖像。在未來的工作中,爲不同的圖像處理任務設計合適的體系結構將是一個有意義的方向。

Image transformer一文最先使用完整的transformer做圖像生成的工作。他將每個值爲的像素編碼成一個維向量,作爲編碼器的輸入。特殊之處在於decoder,每個輸出像素是經過計算輸入像素以及已經生成像素之間的attention得到的。

對於圖像條件生成,如超分和圖像修復,使用編碼器-解碼器架構,其中編碼器的輸入是低分辨率的圖像或損壞的圖像。對於無條件和class-conditional生成(即噪聲到圖像),只使用解碼器輸入噪聲向量。由於解碼器的輸入是原生成的像素,在生成高分辨率圖像時會帶來較大的計算成本,因此提出了一種局部自注意方案,只使用最接近的生成像素作爲解碼器的輸入。結果表明,該圖像轉換器在圖像生成和翻譯任務上與基於cnn的模型具有競爭性能,表明了基於轉換器的模型在低層次視覺任務上的有效性。

到這裏用於圖像的transformer基本算是搞完了,還有一些基於視頻的,多模態的,self-attention在CV中的應用都不是我關注的重點。最後再看一看目前存在的問題以及未來可能的發展方向

5. Conclusions and Discussions

5.1. Challenges

目前來看,大多數應用都保留了transformer在NLP任務中的原始形態,這一形態不一定適合images,因此是否會有改進版本,更加適合視覺任務的transformer尚且未知。除此之外,transformer需要的數據量太大,缺少像CNN一樣的inductive biases,我們也很難解釋他爲什麼work,在本就是黑盒的DL領域又套了一層黑盒。最後也是大多數非人民幣玩家關注的點在於,基本的ViT模型需要180億次浮點運算來處理一個圖像。相比之下,輕量級的CNN模型GhostNet只需約6億次FLOPs就能達到類似的性能,這個運算消耗實在太過昂貴。

5.2. Future Prospects

  • 像NLP一樣的大一統模型,一個transformer解決所有下游任務。

  • 高效的部署與運行。

  • 可解釋性。

   
      
      
      
個人微信(如果沒有備註不拉羣!
請註明: 地區+學校/企業+研究方向+暱稱



下載1:何愷明頂會分享


AI算法與圖像處理」公衆號後臺回覆:何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經典工作的總結分析


下載2:終身受益的編程指南:Google編程風格指南


AI算法與圖像處理」公衆號後臺回覆:c++,即可下載。歷經十年考驗,最權威的編程規範!



 
    
    
    
下載3 CVPR2020

AI算法與圖像處公衆號後臺回覆: CVPR2020 即可下載1467篇CVPR 2020論文


覺得不錯就點亮在看吧

本文分享自微信公衆號 - AI算法與圖像處理(AI_study)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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