ViT論文逐段精讀【論文精讀】

- vit中的預處理
輸入圖片大小為224*224*3(用X表示),每個patch的大小為16*16,所以patch個數(shù)為(224/16)^2=196,每一個圖像塊的維度就是16*16*3=768
Linear Projection線性投射層就是全連接層(用E表示),該維度是768*768,前面的768是不變的,是算出來的16*16*3=768,后面的768是可以變化的
X*E得到的還是196*768(196個token,每個token維度都是768),之后在拼接上1個cls token(1*768),再添加位置信息(是sum而不是concat),所以最后輸入到Transformer Encoder的還是197*768

- transformer block
- Layer Norm(不是Batch Norm)
- Mutil-Head Attention
輸入的序列是197*768,如果只是一個attention,那么q,k,v都是197*768;而vit使用了multi-head attention(12個head,有12個對應(yīng)的k,q,v),所以k,q,v是197*64,最終再將12個head的輸出拼接出來,所以多頭注意力輸出的結(jié)果仍是197*768。
然后經(jīng)過Layer Norm,然后再經(jīng)過MLP將維度相對應(yīng)的方法,一般是放大四倍,比如197*768 -> 197*3072,然后再縮小投射回去變成197*768輸出。

- transformer block總結(jié)
經(jīng)過transformer block之后,輸入和輸出的序列大小仍是197*768,所以可以不停的疊加transformer block,L層的Transformer block就是Transformer Encoder

- 關(guān)于為什么使用cls token而不使用GAP
resnet經(jīng)過一系列池化卷積,得到14*14大小的特征圖,然后使用GAP(globally average-pooling),再展平最后進行分類

transformer的encoder輸入和輸出都是n個元素:1、可以直接在這n個輸出做一個global average pooling,然后得到一個最后的特征;2、也可以再前面添加class token,用class token做輸出,然后做分類。
這兩種方式其實都可以,作者是為了保持和原始的transformer保持一致,使用了class token
- positional embedding的消融實驗
有1d,2d的以及relative相對的位置編碼。其中1d就是1~9這種形式;2d的就是11,12,13...33這種形式,更具有structure信息;相對的就是offset(有點不理解)
但是消融實驗的結(jié)果同樣也是,使用哪種方式效果都差不多,所以文章使用了1d的方式(和原始的transformer保持一致)。

- 第一個公式理解
xp1~xpn都是圖像塊,一共有n個patch。每個patch先去和linear projection全連接層做轉(zhuǎn)換,得到patch embedding,然后在前面拼接class embedding,然后再加上位置編碼信息Epos,得到的z0就是transformer的輸入
- 第二、三公式理解
就是做L個循環(huán),MSA和MLP交替循環(huán)使用,但是會先做LN處理,除此之外還有殘差連接。zl就是transformer block得到的結(jié)果。
- 第三個公式的理解
將class token對應(yīng)的輸出,也就是zl0(上標0代表第0個位置), 當作整體圖像的一個特征,去做最后的分類任務(wù)。

- 分析
- Inductive bias
就是說transformer沒有cnn那么多的先驗知識
- Hybrid Architecture(混合模型)
transformer的全局建模比較強,但是需要很多數(shù)據(jù)訓練;而cnn比較data efficient,不需要很多的訓練數(shù)據(jù),所以提出一個Hybrid Architecture混合的網(wǎng)絡(luò)(比如前面是cnn,后面是transformer,先使用resnet將特征圖縮放到14*14,拉直就是196個元素,后續(xù)操作一樣,也就是對圖片的預處理方式不同)

- 更大resolution情況下的fine-tune
針對vision transformer預訓練模型,在輸入比預訓練更高resolution的圖像時進行微調(diào)會比較好。比如,輸入更高的resolution圖像,保持patch_size和預訓練時相同,則patch的數(shù)量會變多。雖然vit可以處理任意長度序列,但是預訓練的positional embedding可能會沒有用。
所以可以進行fine-tune,比如預訓練時位置信息是1~9,而實際輸入圖像是1~25,則可以使用2d插值(interpolation)。但如果序列變得很長,直接這樣插值會導致最后結(jié)果掉點。所以這里的插值其實是臨時的一個解決方案。

- 數(shù)據(jù)集以及模型的變體
patch size和序列長度是成反比的

- 實驗結(jié)果
下圖中的表是模型已經(jīng)在大規(guī)模數(shù)據(jù)集上做了預訓練了,然后再在表中的數(shù)據(jù)集上進行fine-tune得到的表現(xiàn)。
總結(jié):vitii效果更好,但是好的不是很明顯;vit需要訓練的天數(shù)更短,相對來說很短很短

Figure 3中,灰色BiT代表各種大小的resnet(比如resnet50、resnet152):在中小型數(shù)據(jù)集上,vit效果遠不如resnet,因為vit沒有使用像cnn那種先驗知識(歸納偏置,inductive bias);在ImageNet-21k數(shù)據(jù)集上,resnet和vit效果差不多;當使用特別大數(shù)據(jù)集時,vit效果要好于resnet。
總結(jié):大數(shù)據(jù)集時使用vit效果更好,小數(shù)據(jù)集使用cnn效果更高
Figure 4中
