【论文解读】A Survey on Visual Transformer及引文理解
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都使用原編碼器模塊??傊?#xff0c;它可以被視為一種不同于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 detection.?DETR?是這類工作的先驅,其將目標檢測視為集合預測問題,去掉了目標檢測種很多手工的組件像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解決所有下游任務。
高效的部署與運行。
可解釋性。
總結
以上是生活随笔為你收集整理的【论文解读】A Survey on Visual Transformer及引文理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win11无法使用以太网怎么办 Win1
- 下一篇: 火狐浏览器中文乱码怎么办 Firefox