<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          視覺Transformer最新綜述

          共 9393字,需瀏覽 19分鐘

           ·

          2021-02-11 03:58

          來源 | PaperWeekly ? ? 作者|張一帆
          學(xué)校|華南理工大學(xué)本科生
          研究方向|CV,Causality

          本文是對論文 A Survey on Visual Transformer 的閱讀,以及自己對相關(guān)引文的理解。

          論文標(biāo)題:

          A Survey on Visual Transformer


          論文鏈接:

          https://arxiv.org/pdf/2012.12556.pdf


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

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


          Formulation of Transformer

          Transformer 由一個 encoder,一個 decoder 模塊組成。每個 encoder 是一個 self-attention 層加一個全連接層,每個 decoder 由兩種 attention 層加一個全連接層組成,在對句子進(jìn)行處理前,首先要將每個單詞轉(zhuǎn)化為 維的 embedding。
          1.1 Self-Attention Layer
          自注意力機(jī)制先將一個 embedding 轉(zhuǎn)化為三個向量,query,key 和 value (),三者的維度都與原始 embedding 一致。所有的 embedding 放在一起組成三個大矩陣 ,然后注意力機(jī)制計(jì)算過程如下
          • 計(jì)算不同輸入向量的得分?
          • 為了梯度的穩(wěn)定性進(jìn)行歸一化?
          • 將得分轉(zhuǎn)化為概率?
          • 最后得到加權(quán)的矩陣?

          這整個過程可以被統(tǒng)一為一個簡單的函數(shù):

          直觀來看,第 1 步計(jì)算兩個不同向量之間的分?jǐn)?shù),這個分?jǐn)?shù)用來確定我們在當(dāng)前位置編碼單詞時對其他單詞的注意程度。步驟 2 標(biāo)準(zhǔn)化得分,使其具有更穩(wěn)定的梯度,以便更好地訓(xùn)練;步驟 3 將得分轉(zhuǎn)換為概率。最后,將每個值向量乘以概率的總和,概率越大的向量將被下面幾層更多地關(guān)注。

          encoder-decoder attention layer 其實(shí)和自注意力機(jī)制非常類似,不同之處在于,key,value 矩陣 是從 encoder 那里繼承來的, 是從上一層繼承來的。
          到目前為止,我們所描述的模型中缺少的一件事是解釋輸入序列中單詞順序的方法。因此一般都會顯式的將位置信息進(jìn)行編碼然后加入原始的詞向量中,如下圖所示:

          數(shù)學(xué)定義為:

          開始看到這兩個式子,會覺得很莫名其妙,這個 sin,cos,10000 都是從哪冒出來的?這里的 pos 表示 token 在 sequence 中的位置,例如第一個 token 就是 0。,或者準(zhǔn)確意義上是 表示了 Positional Encoding 的維度,。所以當(dāng) pos 為 1 時,對應(yīng)的 Positional Encoding 可以寫成:
          1.2 Multi-Head Attention
          在 single-head 的模型中,我們最終得到的 embedding 融合了其他各個位置,但是他很有可能被單詞本身 dominate(自身對自身的 attention 一般很大),而且我們不能確保隨機(jī)初始化后不斷學(xué)習(xí)得到 這些矩陣帶來的 attention 一定對。因此 multi-head 可以看作是一種 ensemble,我們現(xiàn)在有多組矩陣 ,他們將同一個輸入 embedding 映射到不同的表達(dá)空間以此來提高模型的表達(dá)能力。
          不過此時 query,key,value 的維度不再與原始 embedding 一致,而是變?yōu)?,因此每個 head 經(jīng)過 self-attention 將 word 映射為 維的embedding,將這些 embedding 連接在一起就變?yōu)樵季S度,數(shù)學(xué)定義如下:

          這里 , 表示

          這就是基本的 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到前面已經(jīng)翻譯過的輸出的詞語,因?yàn)榉g過程我們當(dāng)前還并不知道下一個輸出詞語,這是我們之后才會推測到的。

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

          總結(jié)一下,k 和 v 的來源總是相同的,q 在 encoder 及第一級 decoder 中與 k,v 來源相同,在 encoder-decoder attention layer 中與 k,v 來源不同。
          1.3 Other Parts in Transformer
          Residual in the encoder and decoder:在上面的結(jié)構(gòu)圖中可以看到,每個 encoder,decoder 模塊都是會有一個殘差連接+ layerNorm 的,具體而言就是:

          Feed-forward neural network:這個模塊不是簡單的 FCN,而是兩層 FCN 加一個非線性的激活函數(shù),即
          Final layer in decoder:解碼器的最后一層旨在將向量轉(zhuǎn)為一個字。這是通過一個線性層和一個 softmax 層來實(shí)現(xiàn)的。線性層將向量投影到一個 維的 logit 向量中,其中 是詞匯表中的單詞數(shù)。然后,使用 softmax 層將 logits 向量轉(zhuǎn)換為概率。

          大多數(shù)用于計(jì)算機(jī)視覺任務(wù)的 Transformer 都使用原編碼器模塊。總之,它可以被視為一種不同于 CNN 和遞歸神經(jīng)網(wǎng)絡(luò) RNN 的新型特征選擇器。與只關(guān)注局部特征的 CNN 相比,transformer 能夠捕捉到長距離特征,這意味著 transformer 可以很容易地獲得全局信息。

          與 RNN 的隱態(tài)計(jì)算順序相比較,Transformer 的自注意層和全連接層的輸出可并行計(jì)算,且速度快。因此,進(jìn)一步研究 Transformer 在自然語言處理和計(jì)算機(jī)視覺領(lǐng)域的應(yīng)用具有重要意義。


          Revisiting Transformers for NLP

          Transformers 出現(xiàn)后,克服了RNN訓(xùn)練速度慢的缺陷,使得大規(guī)模預(yù)訓(xùn)練模型成為可能。BETR 及其變種(SpanBERT,RoBERTa)等都是基于 transformer 的模型。在 BERT 的預(yù)訓(xùn)練階段,對 BookCorpus 和英語維基百科數(shù)據(jù)集進(jìn)行了兩個任務(wù)

          • Mask 一部分 token 讓模型來預(yù)測。

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

          Generative Pre-Trained Transformer(GPT2,GPT3)是另一種基于 Transformer 解碼器架構(gòu)的預(yù)訓(xùn)練模型,它使用了帶掩碼的自我注意機(jī)制。

          GPT 和 Bert 系列最重要的區(qū)別在于與訓(xùn)練的方式,GPT 是單向 Transformer?模型,這種單向的性質(zhì)使其在文本生成方面具有強(qiáng)大的能力,今年 Google 使用“鈔”能力造出的 GPT3 更是在各種任務(wù)都有非常優(yōu)越的表現(xiàn),而且不再需要 fine-tune。

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

          還有一些多模態(tài)的 transformer 和這篇文章比較相關(guān),可以簡單了解一下。VideoBERT 使用基于 CNN 的 module 將圖像轉(zhuǎn)化為 token,然后使用 transformer 的 encoder 來為下游任務(wù)學(xué)習(xí)一個 video-text representation。

          VisualBERT 和 VL-BERT 提出了 single-stream unified transformer,用于捕獲視覺元素和圖像-文本關(guān)系,用于像視覺問題回答(VQA)和視覺常識推理(VCR)的下游任務(wù)。此外,Speech bert 探索了用 transformer 編碼器編碼音頻和文本 pair 的可能性,以處理自動文本任務(wù),如語音問題回答(SQA)。

          Visual Transformer
          這一部分是文章的中心。
          3.1 Image Classification

          圖像作為一種高維、噪聲大、冗余度高的形態(tài),被認(rèn)為是生成建模的難點(diǎn),這也是為什么過了好幾年,transformer 才應(yīng)用到視覺領(lǐng)域。比較初始的應(yīng)用是在 Visual Transformer 一文中,作者使用 CNN 提取 low-level 的特征,然后將這些特征輸 入Visual Transformer [1](VT)。

          在 VT 中,作者設(shè)計(jì)了一個 tokenizer 將各個 pixel 分成少量的 visual tokens,每個 token 代表了圖像中的某些語義信息。然后使用 transformer 來建模 token 之間的關(guān)系。最后輸出的 tokens 直接被用來做分類或者處理一下恢復(fù)成特征圖用于實(shí)例分割。

          與這項(xiàng)工作不同的是,最近出現(xiàn)的 iGPT , ViT 和 DeiT 都是只使用 transformer 的文章。

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

          • 得到 Token 的方式

          • 訓(xùn)練的方式

          • 評估 representation 的方式

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

          3.1.1 iGPT

          論文標(biāo)題:Generative Pretraining from Pixels

          論文鏈接:https://cdn.openai.com/papers/Generative_Pretraining_from_Pixels_V2.pdf

          代碼鏈接:https://github.com/openai/image-gpt
          Token:iGPT 使用一種比較暴力的方式得到 token:原始圖像()進(jìn)行預(yù)處理,將其調(diào)整為低分辨率,并將其重塑為一維序列(從左到右,從上到小)。
          對于 RGB 數(shù)據(jù),我們的字典大小為 (文中采取了比較有趣的手段減小字典),每個像素相當(dāng)于一個 word,即對每個 pixel,我們采用nn.Embedding(num_vocab, embed_dim)提取每個像素 embedding。至此圖片數(shù)據(jù)已經(jīng)完全轉(zhuǎn)化為了 transformer 的輸入形式 。其中 seq_len 取決于 down sample 保留了多少 pixel。
          Pretrain:iGPT 有兩種預(yù)訓(xùn)練方式:1)像自編碼器一樣進(jìn)行逐像素預(yù)測;2)像 Bert 一樣 mask 一部分 pixel 然后預(yù)測。其實(shí)第一種方式的實(shí)現(xiàn)與 bert 也很類似,就是預(yù)測第 個 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:兩種評估方式:1)fine-tune:增加了一個小的分類頭,用于優(yōu)化分類目標(biāo)并 adapt 所有權(quán)重;2)Linear-probe:將 pretraining 的模型視作特征提取器,增加一個分類頭,只訓(xùn)練這個分類頭。第二種方式的直覺在于“一個好的特征應(yīng)該能夠區(qū)分不同的類”,除此之外,fine-tune 效果好有可能是因?yàn)榧軜?gòu)很適合下游任務(wù),但是 linear-probe 只取決于特征質(zhì)量。

          主要過程的代碼如下,數(shù)字只是為了示例,下面假設(shè)字典長度為 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計(jì)算損失
          loss?=?self.criterion(logits.view(-1,?logits.size(-1)),?x.view(-1))

          3.1.2 ViT

          論文標(biāo)題:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

          論文鏈接:https://arxiv.org/abs/2010.11929

          代碼鏈接:https://github.com/google-research/vision_transformer


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

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

          Pretrain:傳統(tǒng)情況下 ViT 也是要預(yù)訓(xùn)練的,不同于 iGPT,這不是一個生成式的模型,只采用了 transformer 的 encoder,因此直接在 imagenet 做分類任務(wù)進(jìn)行 pretrain。文章顯示數(shù)據(jù)集小的時候效果一般,數(shù)據(jù)集大的時候因?yàn)?data bias 已經(jīng)被消除了很多,此時效果非常好。

          Evaluation:分類任務(wù)的評價(jià)不再多說。

          總結(jié)一下就是如下公式:
          3.2 High-level Vision

          3.2.1 Generic Object Detection

          基于 transformer 的目標(biāo)檢測可以分為兩類,也即下圖的 (a)(b):

          Transformer-based set prediction for detection. DETR [2]?是這類工作的先驅(qū),其將目標(biāo)檢測視為集合預(yù)測問題,去掉了目標(biāo)檢測種很多手工的組件像 NMS,anchor generation 等。

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

          Train:如何將 object detection 轉(zhuǎn)化為 set prediction 然后進(jìn)行訓(xùn)練,這是一個非常有意思的問題。作者使用了 object queries,這實(shí)際上是另一組可學(xué)習(xí)的 positional embedding,其功能類似于 anchor。之后每個 query 進(jìn)過 decoder 后算一個 bbox 和 class prob。

          Evaluation:目標(biāo)檢測傳統(tǒng)的評估方式。

          DETR 也大方地承認(rèn)了他的缺點(diǎn):訓(xùn)練周期長,對小物體檢測效果差。

          Transformer-based backbone for detection.與 DETR 不同,ViT-FRCNN [3] 將 ViT 與傳統(tǒng)的檢測框架融合,直接使用 transformer 的 encoder 作為 backbone 提取特征,與 ViT 處理圖像的方式一致,但是輸出的 patch feature 重新調(diào)整為一個圖像的特征圖送入傳統(tǒng)檢測模型。

          總結(jié)一下,目前 transformer 已經(jīng)在很多視覺應(yīng)用中展現(xiàn)出了強(qiáng)大的實(shí)力。使用 transformer 最重要的兩個問題是如何得到輸入的 embedding(妥善處理position embedding),模型的訓(xùn)練與評估。

          目前還有很多非常有價(jià)值的課題值得我們探索,例如,對于最終的性能,像 CNN 或 PointNet 這樣的特征提取模塊是必要的嗎?如何讓 visual transformer 受益于像 BERT 或 GPT-3 在 NLP 社區(qū)做的大規(guī)模的預(yù)訓(xùn)練數(shù)據(jù)。是否有可能預(yù)先訓(xùn)練單個 transformer 模型,并通過幾次微調(diào)來針對不同的下游任務(wù)進(jìn)行微調(diào)(人民幣玩家們加油)?
          3.3 Low-level Vision
          這里所謂的 low-level,其實(shí)就是輸出并不是標(biāo)簽這種形式,而是超分,或者生成模型,直接輸出圖片。這一類應(yīng)用的大體框架如下,transformer 編碼器將圖像作為像素序列或小塊,以該序列作為輸入語句,transformer 解碼器就能成功地生成所需的圖像。在未來的工作中,為不同的圖像處理任務(wù)設(shè)計(jì)合適的體系結(jié)構(gòu)將是一個有意義的方向。

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


          對于圖像條件生成,如超分和圖像修復(fù),使用編碼器-解碼器架構(gòu),其中編碼器的輸入是低分辨率的圖像或損壞的圖像。對于無條件和 class-conditional 生成(即噪聲到圖像),只使用解碼器輸入噪聲向量。

          由于解碼器的輸入是原生成的像素,在生成高分辨率圖像時會帶來較大的計(jì)算成本,因此提出了一種局部自注意方案,只使用最接近的生成像素作為解碼器的輸入。結(jié)果表明,該圖像轉(zhuǎn)換器在圖像生成和翻譯任務(wù)上與基于 cnn 的模型具有競爭性能,表明了基于轉(zhuǎn)換器的模型在低層次視覺任務(wù)上的有效性。

          到這里用于圖像的 transformer 基本算是搞完了,還有一些基于視頻的,多模態(tài)的,self-attention 在 CV 中的應(yīng)用都不是我關(guān)注的重點(diǎn)。最后再看一看目前存在的問題以及未來可能的發(fā)展方向


          Conclusions and Discussions

          4.1 Challenges

          目前來看,大多數(shù)應(yīng)用都保留了 transformer 在 NLP 任務(wù)中的原始形態(tài),這一形態(tài)不一定適合 images,因此是否會有改進(jìn)版本,更加適合視覺任務(wù)的 transformer 尚且未知。除此之外,transformer 需要的數(shù)據(jù)量太大,缺少像 CNN 一樣的 inductive biases,我們也很難解釋他為什么 work,在本就是黑盒的DL領(lǐng)域又套了一層黑盒。

          最后也是大多數(shù)非人民幣玩家關(guān)注的點(diǎn)在于,基本的 ViT 模型需要 180 億次浮點(diǎn)運(yùn)算來處理一個圖像。相比之下,輕量級的 CNN 模型 GhostNet 只需約 6 億次 FLOPs 就能達(dá)到類似的性能,這個運(yùn)算消耗實(shí)在太過昂貴。
          4.2 Future Prospects
          • 像 NLP 一樣的大一統(tǒng)模型,一個 transformer 解決所有下游任務(wù)。
          • 高效的部署與運(yùn)行。
          • 可解釋性。


          參考文獻(xiàn)

          [1] https://arxiv.org/abs/2006.03677
          [2] https://arxiv.org/abs/2005.12872
          [3] https://arxiv.org/abs/2012.09958


          推薦閱讀


          GPU底層優(yōu)化 | 如何讓Transformer在GPU上跑得更快?


          如何看待Transformer在CV上的應(yīng)用前景,未來有可能替代CNN嗎?


          瀏覽 67
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大鸡巴免费 | 欧美日韩爽 | 福利在线久草 | 操逼首页 | 我好想看中国一级操逼片片 |