【計算機(jī)視覺】Vision Transformer (ViT)詳細(xì)解析
1. 介紹
論文地址:An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale
code地址:github.com/google-research/vision_transformer
Transformer 最早提出是針對NLP領(lǐng)域的,并且在NLP領(lǐng)域引起了強(qiáng)烈的轟動。
- 提出ViT模型的這篇文章題名為 《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》,發(fā)表于2020年10月份;
- 雖然相較于一些Transformer的視覺任務(wù)應(yīng)用模型 (如DETR) 提出要晚了一些,但作為一個純Transformer結(jié)構(gòu)的視覺分類網(wǎng)絡(luò),其工作還是有較大的開創(chuàng)性意義的。
- 關(guān)于Transformer的部分理論之前的博文中有講 Transformer 結(jié)構(gòu)細(xì)節(jié)理論解析。
- 這篇文章實驗中,給出的最佳 vit 模型(先在Google的JFT數(shù)據(jù)集上進(jìn)行了預(yù)訓(xùn)練)然后在ImageNet1K(finetune)上能夠達(dá)到88.55%的準(zhǔn)確率,說明Transformer在CV領(lǐng)域確實是有效的,而且效果還挺驚人。
2. VIT 模型
ViT的核心流程包括:
- 圖像分塊處理 (make patches)
- 圖像塊嵌入 (patch embedding)與位置編碼、
- Transformer編碼器
- MLP分類處理等4個主要部分。
下面分別從這四個流程部分來闡述ViT的基本設(shè)計。
2.1 圖像分塊處理 (make patches)
第一步可以看作是一個圖像預(yù)處理步驟。
- 在CNN中,直接對圖像進(jìn)行二維卷積處理即可,不需要特殊的預(yù)處理流程。
- 但Transformer結(jié)構(gòu)不能直接處理圖像,在此之前需要對其進(jìn)行分塊處理。(序列化)
假設(shè)一個圖像 I ∈ H × W × C I∈H×W×C I∈H×W×C,
- 現(xiàn)在將其分成大小為 P × P × C 的 p a t c h e s P×P×C 的patches P×P×C的patches,那么就會有 N = H W P 2 N= \frac{HW}{P^2} N=P2HW? 個patches,全部patches的維度就可以寫為 N × P × P × C N×P×P×C N×P×P×C。
- 然后將每個patch進(jìn)行展平,相應(yīng)的數(shù)據(jù)維度就可以寫為 N × ( P 2 × C ) N×(P^2×C) N×(P2×C),也就是shape變成了( N , P 2 × C N, P^2×C N,P2×C)。
這里 N N N 可以理解為輸入到Transformer的序列長度, C C C 為輸入圖像的通道數(shù), P P P 為圖像patch的大小。(這樣也就符合了transformer的輸入)
2.2 圖像塊嵌入與位置編碼
2.2.1 圖像塊嵌入 (patch embedding)
2.1 中的圖像分塊僅僅是一道預(yù)處理流程,要將 N × ( P 2 × C ) N×(P^2×C) N×(P2×C) 的向量維度,轉(zhuǎn)化為N×D大小的二維輸入,還需要做一個圖像塊嵌入的操作。
- 類似NLP中的詞嵌入,塊嵌入也是一種將高維向量轉(zhuǎn)化為低維向量的方式。
所謂圖像塊嵌入,其實就是對每一個展平后的 patch 向量做一個線性變換,即全連接層,降維后的維度為D。
上式中的
E
E
E 即為塊嵌入的全連接層,其輸入大小為
P
2
×
C
P^2×C
P2×C(一維),輸出大小為D(也是一維)。
- 值得注意的是,上式中給長度為 N N N 的向量還追加了一個分類向量,用于Transformer訓(xùn)練過程中的類別信息學(xué)習(xí)。
- 假設(shè)將圖像分為 9個patch,即 N=9,輸入到Transformer編碼器中就有9個向量,但對于這9個向量而言,該取哪一個向量做分類預(yù)測呢?取哪一個都不合適。
- 一個合理的做法就是人為添加一個類別向量,該向量是可學(xué)習(xí)的嵌入向量,與其他9個patch嵌入向量一起輸入到Transformer編碼器中,最后取第一個向量作為類別預(yù)測結(jié)果。
- 所以,這個追加的向量可以理解為其他9個圖像patch尋找的類別信息。
2.2.2 位置編碼 (position encoding)
為了保持輸入圖像patch之間的空間位置信息,還需要對圖像塊嵌入中添加一個位置編碼向量,如上式中的 E p o s E_{pos} Epos? 所示。
- ViT的位置編碼沒有使用更新的2D位置嵌入方法,而是直接用的一維可學(xué)習(xí)的位置嵌入變量,
- 原因是論文作者發(fā)現(xiàn)實際使用時2D并沒有展現(xiàn)出比1D更好的效果。
2.3 Transformer Encoder(編碼器)
Vit中所使用的Transformer 編碼器結(jié)構(gòu)和原文《Attention is all you need》中的一致,理論細(xì)節(jié)可以參考Transformer 詳解。
- 主要還是使用了多頭注意力機(jī)制;
- 另外,不像nlp領(lǐng)域中的翻譯任務(wù),vit 沒有利用解碼器的結(jié)構(gòu)。
Transformer Encoder 其實就是重復(fù)堆疊 Encoder Block L次,下圖是繪制的Encoder Block,主要由以下幾部分組成:
- Layer Norm,這種Normalization方法主要是針對NLP領(lǐng)域提出的,這里是對每個token進(jìn)行Norm處理,之前也有講過Layer Norm不懂的可以參考LRN,BN,LN, IN, GN, FRN, WN, BRN, CBN, CmBN 詳解
- Multi-Head Attention,這個結(jié)構(gòu)之前在講Transformer中很詳細(xì)的講過,不在贅述,不了解的可以參考 Transformer 詳解。
- Dropout/DropPath,在原論文的代碼中是直接使用的Dropout層,在但rwightman實現(xiàn)的代碼中使用的是DropPath(stochastic depth),可能后者會更好一點。
- MLP Block,如右圖所示,就是全連接+GELU激活函數(shù)+Dropout組成也非常簡單,需要注意的是第一個全連接層會把輸入節(jié)點個數(shù)翻4倍[197, 768] -> [197, 3072],第二個全連接層會還原回原節(jié)點個數(shù)[197, 3072] -> [197, 768]。
2.4 MLP Head(全連接頭)
上面通過Transformer Encoder 后輸出的shape和輸入的shape是保持不變的,以ViT-B/16為例,輸入的是[197, 768]輸出的還是[197, 768]。
- 注意,在Transformer Encoder后其實還有一個Layer Norm沒有畫出來,后面有細(xì)畫的 ViT 的模型可以看到詳細(xì)結(jié)構(gòu)。
- 這里我們只是需要分類的信息,所以我們只需要提取出[class]token生成的對應(yīng)結(jié)果就行,即[197, 768]中抽取出 [class]token(也就是添加的分類向量) 對應(yīng)的[1, 768]。
- 接著我們通過MLP Head得到我們最終的分類結(jié)果。MLP Head原論文中說在訓(xùn)練ImageNet21K時是由Linear+tanh激活函數(shù)+Linear組成。
- 但是遷移到ImageNet1K上或者你自己的數(shù)據(jù)上時,只用一個Linear即可。
2.5 全過程維度變化
為了更加清晰的展示ViT模型結(jié)構(gòu)和訓(xùn)練過程中的向量變化,下圖給出了ViT的向量維度變化圖(圖來自于極市平臺)。
3. ViT 模型結(jié)構(gòu)細(xì)節(jié)圖
3.1 ViT-B/16
為了方便大家理解,太陽花的小綠豆 根據(jù)源代碼畫了張更詳細(xì)的圖 (以ViT-B/16為例):
3.2 ViT–Hybrid 模型
在論文4.1章節(jié)的Model Variants中有比較詳細(xì)的講到 Hybrid混合模型,
- 就是將傳統(tǒng)CNN特征提取和Transformer進(jìn)行結(jié)合。
下圖 太陽花的小綠豆 繪制的是以ResNet50作為特征提取器的混合模型,但這里的Resnet與之前講的Resnet有些不同。
- 首先這里的R50的卷積層采用的StdConv2d不是傳統(tǒng)的Conv2d,然后將所有的BatchNorm層替換成GroupNorm層。
- 在原Resnet50網(wǎng)絡(luò)中,stage1重復(fù)堆疊3次,stage2重復(fù)堆疊4次,stage3重復(fù)堆疊6次,stage4重復(fù)堆疊3次,但在這里的R50中,把stage4中的3個Block移至stage3中,所以stage3中共重復(fù)堆疊9次。
通過R50 Backbone進(jìn)行特征提取后,得到的特征矩陣shape是[14, 14, 1024],接著再輸入Patch Embedding層,注意Patch Embedding中卷積層Conv2d的kernel_size和stride都變成了1,只是用來調(diào)整channel。后面的部分和前面ViT中講的完全一樣,就不在贅述。
4. 實驗
4.1 ViT 訓(xùn)練
1)ViT的基本訓(xùn)練策略是:
- 在大數(shù)據(jù)集上先做預(yù)訓(xùn)練,
- 然后在小數(shù)據(jù)集上做遷移使用。
2)ViT做預(yù)訓(xùn)練使用到的大數(shù)據(jù)集包括:
- ILSVRC-2012 ImageNet dataset:1000 classes
- ImageNet-21k:21k classes
- JFT:18k High Resolution Images
其中JFT是一個谷歌的內(nèi)部大規(guī)模圖像數(shù)據(jù)集,約有300M圖像18291個類別標(biāo)注。
3)ViT預(yù)訓(xùn)練遷移到的數(shù)據(jù)集包括:
- CIFAR-10/100
- Oxford-IIIT Pets
- Oxford Flowers-102
- VTAB
- ImageNet
4)論文共設(shè)計了Base、Large和Huge三款不同大小的ViT模型,分別表示基礎(chǔ)模型、大模型和超大模型,三款模型的各參數(shù)如下表所示。在源碼中除了有Patch Size為16x16的外還有32x32的。
- 其中的 Layers就是Transformer Encoder中重復(fù)堆疊Encoder Block的次數(shù),
- Hidden Size就是對應(yīng)通過Embedding層后每個token的dim(向量的長度),
- MLP size是Transformer Encoder中MLP Block第一個全連接的節(jié)點個數(shù)(是Hidden Size的四倍),
- Heads代表Transformer中Multi-Head Attention的heads數(shù)。
注:若為ViT-B/16 就表示patch size為16的 ViT-Base模型。
4.2 ViT 實驗 1—預(yù)訓(xùn)練數(shù)據(jù)集 和 大模型
ViT最核心的實驗就是將前述的訓(xùn)練方法進(jìn)行實現(xiàn),
- 即在大規(guī)模數(shù)據(jù)集上預(yù)訓(xùn)練后遷移到小數(shù)據(jù)集上看模型效果。
為了比對CNN模型,
- 論文特地用了Big Transfer (BiT),該模型使用大的ResNet進(jìn)行監(jiān)督遷移學(xué)習(xí),是2020 ECCV上提出的一個大CNN模型。
- 另外一個比對CNN模型是2020年CVPR上的Noisy Student模型,是一個半監(jiān)督的大型CNN模型。
ViT、BiT 和 Nosiy Student 模型經(jīng)三大數(shù)據(jù)集預(yù)訓(xùn)練后在各小數(shù)據(jù)集上的準(zhǔn)確率如下表所示。
從表中可以看到,ViT經(jīng)過大數(shù)據(jù)集的預(yù)訓(xùn)練后,
- 在各小數(shù)據(jù)集上的遷移后準(zhǔn)確率超過了一些SOTA CNN模型的結(jié)果。
- 但要取得這種超越CNN的性能效果,需要大的預(yù)訓(xùn)練數(shù)據(jù)集和大模型的結(jié)合。
問題:所以接下來的問題就是 ViT 對預(yù)訓(xùn)練數(shù)據(jù)集規(guī)模到底有怎樣的要求?
論文針對此問題做了一個對比實驗。分別在ImageNet、ImageNet-21k和JFT-300M進(jìn)行預(yù)訓(xùn)練,三個數(shù)據(jù)集規(guī)模分別為小數(shù)據(jù)集、中等規(guī)模數(shù)據(jù)集和超大數(shù)據(jù)集,預(yù)訓(xùn)練效果如下圖所示。
從圖中可以看到,
- 在最小的數(shù)據(jù)集ImageNet上進(jìn)行預(yù)訓(xùn)練時,盡管作者加了大量的正則化操作,ViT-Large模型性能不如ViT-base模型,更遠(yuǎn)不如BiT的性能。
- 在中等規(guī)模的ImageNet-21k數(shù)據(jù)集上,大家的表現(xiàn)都差不多,
- 只有到了JFT-30M這樣的超大數(shù)據(jù)集上,ViT模型才能發(fā)揮出它的優(yōu)勢和效果。
總之,大的預(yù)訓(xùn)練數(shù)據(jù)集加上大模型,是ViT取得SOTA性能的關(guān)鍵因素。
4.3 ViT 實驗 2—Hybrid 和 純 ViT
下表是論文用來對比ViT,Resnet(和剛剛講的一樣,使用的卷積層和Norm層都進(jìn)行了修改)以及Hybrid模型的效果。通過對比發(fā)現(xiàn),在訓(xùn)練epoch較少時Hybrid優(yōu)于ViT,但當(dāng)epoch增大后ViT優(yōu)于Hybrid。文章來源:http://www.zghlxwxcb.cn/news/detail-766273.html
參考
【1】https://blog.csdn.net/weixin_37737254/article/details/117639395
【2】https://blog.csdn.net/qq_37541097/article/details/118242600文章來源地址http://www.zghlxwxcb.cn/news/detail-766273.html
到了這里,關(guān)于【計算機(jī)視覺】Vision Transformer (ViT)詳細(xì)解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!