ViT
AN IMAGE IS WORTH 16X16 WORDS:
TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
https://arxiv.org/pdf/2010.11929.pdf
這篇工作Vision Transformer基于NLP領(lǐng)域中大放異彩的Transformer模型來處理視覺領(lǐng)域的任務(wù)。作者將二維的圖像數(shù)據(jù)用一個簡單的方式轉(zhuǎn)換為和Transformer中處理的句子序列差不多的形式瞧挤, 然后使用 Transformer編碼器來提取特征瘩扼。
Multi-head self-Attention 多頭注意力機(jī)制
Transformer的論文叫Attention is all you need, 現(xiàn)在在深度學(xué)習(xí)領(lǐng)域中提到Attention可能大家都會想到Transformer的self-Attention自注意力捣郊,其實注意力機(jī)制剛開始是應(yīng)用于循環(huán)神經(jīng)網(wǎng)絡(luò)中的瞄摊,self-Attention可以看成是一個更通用的版本疹瘦。Attention本來是在Encoder-Decoder框架中關(guān)乎中間的隱藏狀態(tài)的這么一個函數(shù)财骨。 而self-Attention無所謂隱藏狀態(tài)漓滔,只關(guān)注輸入序列中向量之間的依賴關(guān)系氛魁。Transformer給出了一個非常簡潔的公式 暮顺。
看到softmax就知道是在求概率或链,V代表的是數(shù)值惫恼,QK代表一個查字典的操作。但是這樣還是很抽象澳盐,要理解的話得把矩陣拆成向量才行祈纯。這里推薦一篇可視化Transformer的博客。https://jalammar.github.io/illustrated-transformer/
我的理解就是把原向量進(jìn)行三次編碼入蛆,然后在計算attention結(jié)果的時候响蓉,一個編碼只和自己有關(guān),代表該token的特征哨毁,另外兩個用來和序列中其他向量的編碼進(jìn)行匹配枫甲,得到當(dāng)前向量與其他向量之間的關(guān)聯(lián)程度。
卷積在視覺中占主流的原因很重要的原因是局部感受野扼褪,另外卷積的形式一坨一坨的很契合對圖片數(shù)據(jù)的處理言秸。但是拨黔,卷積的感受野是受限的糖权,要多層抽象才能得到一個比較大的感受野初坠。而自注意力我覺得可以理解為在輸入的全局中有選擇的進(jìn)行權(quán)重。這個過程進(jìn)行多次凳枝,就是多頭自注意力機(jī)制。
把圖片當(dāng)作單詞處理
最終的編碼就長成這個樣子:
對應(yīng):
圖片轉(zhuǎn)化為序列數(shù)據(jù)
E
將圖片拆分為多個patch跋核,每個壓扁的通過線性變換E岖瑰, 得到一個固定長度的特征向量,參考NLP中的習(xí)慣稱為token砂代。這個token的長度D文中使用了768蹋订,1024,1280對應(yīng)三個尺寸的模型ViT-Base刻伊,Large以及Huge露戒。
class token
另外每個序列的開頭還會加上一個class token,最終用來分類的是class token 對應(yīng)的特征向量捶箱。這個token的參數(shù)是可學(xué)習(xí)的智什,會和序列中所有其他patch所生成的token一樣,正常進(jìn)行查詢匹配的注意力操作丁屎,我的理解是它起到了一個類似總結(jié)的作用荠锭。代碼中可以看到,最終通過MLP的要么是只取class token的結(jié)果晨川,或者也可以使用對所有token在每個位置取平均值的方法证九。但是論文好像沒有解釋取平均值會怎么樣,有了解的同學(xué)歡迎補(bǔ)充共虑。
#https://github.com/lucidrains/vit-pytorch/blob/4f3dbd003f004569a916f964caaaf7b9a0a28017/vit_pytorch/vit.py
def forward(self, img):
x = self.to_patch_embedding(img)
b, n, _ = x.shape
cls_tokens = repeat(self.cls_token, '() n d -> b n d', b = b)
x = torch.cat((cls_tokens, x), dim=1)
x += self.pos_embedding[:, :(n + 1)]
x = self.dropout(x)
x = self.transformer(x)
x = x.mean(dim = 1) if self.pool == 'mean' else x[:, 0] # (只使用 class token)
x = self.to_latent(x)
return self.mlp_head(x)
- 位置編碼
雖然注意力可以捕捉到token和token之間的依賴關(guān)系愧怜,但是token的位置信息卻無處可尋。也就是說看蚜,無論這些patch如何排序叫搁,得到的結(jié)果都是一樣的。NLP領(lǐng)域中有非常多的解決方案,ViT使用的是可學(xué)習(xí)的位置編碼渴逻,和class token 與 patch的線性變換相加得到最終編碼疾党。也許也可以用拼接,不過原Transformer中沒有提到惨奕,另外Transformer中使用的是固定的編碼雪位。 總之,就是無論哪個序列梨撞,讓序列中同一位置的token附帶上一模一樣的信息就可以了雹洗。ViT附錄D3中有不同位置編碼方式的對比實驗結(jié)果,如果沒有考慮位置信息卧波,那么結(jié)果很差时肿,而使用不同位置編碼的結(jié)果其實差距不大。
不同編碼的對比試驗港粱,編碼方法可以去參看原文
既然已經(jīng)通過上面的處理把圖片的輸入轉(zhuǎn)化為Tranformer處理單詞序列的形式了螃成,那么接下來直接通過多頭注意力機(jī)制多次處理,最終得到的結(jié)果是和圖片中每個patch都相關(guān)的特征查坪。就相當(dāng)于替代卷積層完成了特征提取得到 z_l寸宏。
實驗
不用卷積運(yùn)算偿曙,訓(xùn)練需要的計算資源要少很多氮凝。
ViT 如果用大量數(shù)據(jù)集進(jìn)行預(yù)訓(xùn)練,那么效果會很好望忆。
ViT 模型更大對比同量級state-of-the-art表現(xiàn)更好罩阵。
swinTransformer
https://arxiv.org/pdf/2103.14030.pdf
position bias in self-attention head
不同于ViT中在輸入序列中加上一個絕對的位置編碼,swinTransformer使用的是相對位置偏置吸申,加在attention內(nèi)部的查詢操作里梗劫。論文做了實驗享甸,如果同時使用兩種方法,表現(xiàn)會反而下降梳侨。