|
大家好,百面計算機視覺正式進入Transformer的階段,歡迎各位follow我的git與關(guān)注我。 本篇文章,主要是來自ChaucerG的成果,歡迎各位想在cv領(lǐng)域有突破的小伙伴們follow哦。 git地址(求star,找工作/實習(xí)必備):https://github.com/zonechen1994/CV_Interview 淺談Transformer的原理與運用Transformer為什么可以這么6?![]()
Self-Attention是個什么東西?2.1 Self-Attention簡要示意![]() 注:Q、 K、 V的shape是相同的, A便是得到的Pairwise Attention Matrix;然后對A進行SoftMax操作得到A’ Matrix進而與Value矩陣點乘得到實際的注意力輸出。 2.2 Self-Attention原理Self-Attention在Transformer中起著基礎(chǔ)性的作用。如下圖,它將query和一組key和value對映射到輸出。 ![]() 更具體地說,對于輸入序列,如單詞或圖像塊的嵌入,,其中,Self-Attention計算一個輸出序列,其中。每個輸出元素是作為輸入元素的加權(quán)和計算的: ![]() 每個權(quán)重系數(shù)使用softmax計算: ![]() 其中是使用一個scaled dot-product attention來計算的: ![]() 這里,投影是參數(shù)矩陣,每層都是唯一的。 MultiHead Self-Attention(MHSA)不是計算一次Self-Attention,而是并行運行多次Self-Attention,即使用H個Attention Head。Attention Head的輸出被簡單地連接起來并線性地轉(zhuǎn)換成設(shè)計的維度。 為什么Self-Attention在CV領(lǐng)域也可以有效?![]() 卷積具有2個功能:
特征聚合和特征變換是可以解耦的,特征變換可以通過線性映射和非線性變換來實現(xiàn),而Self-Attention機制可以通過全局視野替代卷積用來特征聚集。 Position Embedding是什么?有什么用?其實大家應(yīng)該了解到Transformer中還有一個位置嵌入向量Position Embedding Vector,在NLP中它是為了解釋輸入序列中單詞順序而存在的,維度和Embedding的維度一致。這個向量決定了當(dāng)前詞的位置,或者說是在一個句子中不同的詞之間的距離。如果在CV領(lǐng)域那么就代表圖像Patch的位置以及Patch之間的相互關(guān)系。 為什么位置嵌入是cat操作而不是直接的相加add操作?![]() 為什么用LayerNorm?![]() 這個問題我們可以進去討論交流ViT在做什么事情呢?![]() ![]() Transformer用于目標(biāo)檢測![]() 先用CNN提取特征,然后把最后特征圖的每個點看成word,這樣特征圖就變成了a sequence words, 而檢測的輸出恰好是a set objects, 所以transformer正好適合這個任務(wù)。 Transformer用于語義分割![]() 用ViT作為的圖像的Encoder,然后加一個CNN的Decoder來完成語義圖的預(yù)測。 Transformer模型的局限和解決方案ViT作者這么說的——'that transformers do not generalize well when trained on insufficient amounts of data.', 這意思我們沒得玩嘍?。?! ![]()
注意:Class Token的目標(biāo)是跟真實的label一致, 而Distillation Token是要跟teacher model預(yù)測的label一致。 DeiTDeiT的訓(xùn)練![]() 訓(xùn)練過程中Backbone自然還是ViT, 同時class token和distillation token是朝著不同的方向收斂的(因為loss約束不同) , 最終的預(yù)測結(jié)果相似但不相同。因為目標(biāo)是生產(chǎn)相似但不相同的目標(biāo)。作者也做實驗驗證了這個問題, 感興趣的可以看DeiT論文原文。 DeiT的測試![]() 只使用distillation token進行測試,性能是要強于只使用class token進行測試的。 ![]() DeiT還有一個問題沒解決?DeiT依然把圖片轉(zhuǎn)化成patch并進行Flatten操作之后輸入ViT模型,而這種轉(zhuǎn)化成patch的方法沒有進行patch內(nèi)部信息的挖掘。 Transformer之所以有效,是因為它能處理長度為N的輸入序列中這N個輸入之間的關(guān)系(relationship),而對于每個輸入的內(nèi)部信息的relationship,它是無能為力的,因為ViT,DeiT,IPT,SETR,ViTFRCNN這類模型把每個patch展平為了一個向量,破壞了每個patch的內(nèi)部信息。 TNT解決了ViT的局限嗎?![]() ![]() 每個TNT Block包含2個Transformer Block: Outer block:建模patch embedding之間的 global relationship。 Inner block:建模pixel embedding之間的local structure information。 CNN是不是一個局部的Self-Attention?使用self-attention去處理一張圖片的時候,1的那個pixel產(chǎn)生query,其他的各個pixel產(chǎn)生key。在做inner-product的時候,考慮的不是一個小的范圍,而是一整張圖片。但是在做CNN的時候是只考慮感受野紅框里面的信息,而不是圖片的全局信息。所以CNN可以看作是一種簡化版本的selfattention。那么一個自然而然的問題是:可否把CNN融入Transformer中,使得Transformer也具有CNN的這些適合圖片的property呢? ![]() CNN+Transformer是不是一個好的解決方案呢?CvT模型![]() CvT具有CNN的一些優(yōu)良的特征:局部感受野,共享卷積權(quán)重,空間下采樣。CvT具有Self-attention的一些優(yōu)良的特征:動態(tài)的注意力機制,全局信息的融合。 2個變化:
1 Convolutional Token Embedding在每個stage中會進行下面的操作:輸入的2D token map會先進入Convolutional Token Embedding這個層,相當(dāng)于在2D reshaped token map上做一次卷積操作。這個層的輸入是個Reshape成2D的token。再通過一個LN。 卷積的目的是保證在每個階段都減小token的數(shù)量,也就是減小特征尺度;在每個stage都擴大token width,也就是擴大特征維度。這樣實現(xiàn)的效果就和CNN差不多,都是隨著層數(shù)的加深而逐漸減小特征尺度和逐漸增加特征維度。 ![]() 2 Convolutional Projection采用的是卷積變換。具體來講,token首先reshape成2D的token map,再分別通過3個Depthwise-separable Convolution(kernel =sxs )變成query,key和value值。最后再把這些query,key和value值通過Flatten操作得到真正的query,key和value值。 ![]() 3 Squeezed convolutional projection在計算query時, 采用的Depthwise-separable Convolution的stride值為1。在計算key和value時, 采用的Depthwise-separable Convolution的stride值為2。如下圖所示。按照這種方式, token的數(shù)量對于key和value來說可以減少4倍,性能只有很少的下降。 ![]() 4 CvT的位置編碼哪里去了?答:不需要位置編碼 問:為什么CvT不需要位置編碼? 答:因為CvT的Convolutional Projection操作,采用的是卷積變換,也就是說,CvT把傳統(tǒng)Transformer的Linear Projection操作給換成了卷積操作。具體的方法上面也介紹了,就是先reshape成2D的,再做卷積,最后再reshape成sequence的形式。那么最重要的是Convolutional Projection可以學(xué)習(xí)到隱式位置信息,所以就不用再像ViT, DeiT一樣使用顯式的位置編碼了。 可以參見下面的論文: 《Attention Augmented Convolutional Networks》 《Self-Attention with Relative Position Representations》 《Do We Really Need Explicit Position Encodings for Vision Transformers?》 LeViT開啟輕量化Transformer模型時代![]() LeViT以ViT的架構(gòu)和DeiT的訓(xùn)練方法為基礎(chǔ), 合并了對卷積架構(gòu)有用的組件。如果不考慮classification embedding的作用, ViT就是一個處理激活映射的Layer的堆疊。 特點:
為什么在transformer組的輸入上應(yīng)用一個小卷積可以提高精度?【進群交流可知】 ![]() ![]() 在LeViT stage之間,一個縮小的注意塊減少了激活映射的大小:在Q轉(zhuǎn)換之前應(yīng)用一個subsample, 然后傳播到soft activation的輸出。這將一個大小為(C,H,W)的輸入張量映射到一個大小為(C,H/2,W/2)的輸出張量。由于尺度的變化這個注意塊的使用沒有殘差連接。同時為了防止信息丟失,這里將注意力頭的數(shù)量設(shè)為C/D。 |
|
|
來自: InfoRich > 《transformer》