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

Vit
an image is worth 16*16 words:transformers for image recognition at scale
過(guò)去一年在計(jì)算機(jī)視覺(jué)領(lǐng)域影響力最大的工作
- 它挑戰(zhàn)了自從2012年AlexNet提出以來(lái)卷積神經(jīng)網(wǎng)絡(luò)在計(jì)算機(jī)視覺(jué)里絕對(duì)統(tǒng)治的地位
- 結(jié)論:如果在足夠多的數(shù)據(jù)上做預(yù)訓(xùn)練,也可以不需要卷積神經(jīng)網(wǎng)路,直接使用標(biāo)準(zhǔn)的transformer也能夠把視覺(jué)問(wèn)題解決的很好
- 它打破了CV和NLP在模型上的壁壘,開啟了CV的一個(gè)新時(shí)代
paperswithcode
- 可以查詢現(xiàn)在某個(gè)領(lǐng)域或者說(shuō)某個(gè)數(shù)據(jù)集表現(xiàn)最好的一些方法有哪些
- 圖像分類在ImageNet數(shù)據(jù)集上排名靠前的全是基于Vision Transformer

- 對(duì)于目標(biāo)檢測(cè)任務(wù)在COCO數(shù)據(jù)集上,排名靠前都都是基于Swin Transformer(Swin Transformer是ICCV 21的最佳論文,可以把它想象成一個(gè)多尺度的Vit(Vision Transformer))
- 在其他領(lǐng)域(語(yǔ)義分割、實(shí)例分割、視頻、醫(yī)療、遙感),基本上可以說(shuō)Vision Transformer將整個(gè)視覺(jué)領(lǐng)域中所有的任務(wù)都刷了個(gè)遍
另一篇論文
Intriguing Properties of Vision Transformer
Vision Transformer一些有趣的特性
下圖中展示了一些在卷積神經(jīng)網(wǎng)絡(luò)CNN中工作得不太好但是用Vision Transformer都能處理的很好的例子

- a表示的是遮擋,在這么嚴(yán)重的遮擋情況下,不管是卷積神經(jīng)網(wǎng)絡(luò),人眼也很難觀察出圖中所示的是一只鳥
- b表示數(shù)據(jù)分布上有所偏移,這里對(duì)圖片做了一次紋理去除的操作,所以圖片看起來(lái)比較魔幻
- c表示在鳥頭的位置加了一個(gè)對(duì)抗性的patch
- d表示將圖片打散了之后做排列組合
上述例子中,卷積神經(jīng)網(wǎng)絡(luò)很難判斷到底是一個(gè)什么物體,但是對(duì)于所有的這些例子Vision Transformer都能夠處理的很好
1、標(biāo)題 + 作者
一張圖片等價(jià)于很多16*16大小的單詞
- 為什么是16*16的單詞?將圖片看成是很多的patch,假如把圖片分割成很多方格的形式,每一個(gè)方格的大小都是16*16,那么這張圖片就相當(dāng)于是很多16*16的patch組成的整體
使用transformer去做大規(guī)模的圖像識(shí)別
作者團(tuán)隊(duì)來(lái)自于google research和google brain team
2、摘要
雖然說(shuō)transformer已經(jīng)是NLP(自然語(yǔ)言處理)領(lǐng)域的一個(gè)標(biāo)準(zhǔn):BERT模型、GPT3或者是T5模型,但是用transformer來(lái)做CV還是很有限的
在視覺(jué)領(lǐng)域,自注意力要么是跟卷積神經(jīng)網(wǎng)絡(luò)一起使用,要么用來(lái)把某一些卷積神經(jīng)網(wǎng)絡(luò)中的卷積替換成自注意力,但是還是保持整體的結(jié)構(gòu)不變
- 這里的整體結(jié)構(gòu)是指:比如說(shuō)對(duì)于一個(gè)殘差網(wǎng)絡(luò)(Res50),它有4個(gè)stage:res2、res3、res4、res5,上面說(shuō)的整體結(jié)構(gòu)不變指的就是這個(gè)stage是不變的,它只是去取代每一個(gè)stage、每一個(gè)block的操作
這篇文章證明了這種對(duì)于卷積神經(jīng)網(wǎng)絡(luò)的依賴是完全不必要的,一個(gè)純的Vision Transformer直接作用于一系列圖像塊的時(shí)候,也是可以在圖像分類任務(wù)上表現(xiàn)得非常好的,尤其是當(dāng)在大規(guī)模的數(shù)據(jù)上面做預(yù)訓(xùn)練然后遷移到中小型數(shù)據(jù)集上面使用的時(shí)候,Vision Transformer能夠獲得跟最好的卷積神經(jīng)網(wǎng)絡(luò)相媲美的結(jié)果
這里將ImageNet、CIFAR-100、VATB當(dāng)作中小型數(shù)據(jù)集
- 其實(shí)ImageNet對(duì)于很多人來(lái)說(shuō)都已經(jīng)是很大的數(shù)據(jù)集了
Transformer的另外一個(gè)好處:它只需要更少的訓(xùn)練資源,而且表現(xiàn)還特別好
- 作者這里指的少的訓(xùn)練資源是指2500天TPUv3的天數(shù)
- 這里的少只是跟更耗卡的模型去做對(duì)比(類似于一個(gè)小目標(biāo))
3、引言
自注意力機(jī)制的網(wǎng)絡(luò),尤其是Transformer,已經(jīng)是自然語(yǔ)言中的必選模型了,現(xiàn)在比較主流的方式,就是先去一個(gè)大規(guī)模的數(shù)據(jù)集上去做預(yù)訓(xùn)練,然后再在一些特定領(lǐng)域的小數(shù)據(jù)集上面做微調(diào)(這個(gè)是在BERT的文章中提出來(lái)的)
得益于transformer的計(jì)算高效性和可擴(kuò)展性,現(xiàn)在已經(jīng)可以訓(xùn)練超過(guò)1000億參數(shù)的模型了,比如說(shuō)GPT3
隨著模型和數(shù)據(jù)集的增長(zhǎng),目前還沒(méi)有發(fā)現(xiàn)任何性能飽和的現(xiàn)象
- 很多時(shí)候不是一味地?cái)U(kuò)大數(shù)據(jù)集或者說(shuō)擴(kuò)大模型就能夠獲得更好的效果的,尤其是當(dāng)擴(kuò)大模型的時(shí)候很容易碰到過(guò)擬合的問(wèn)題,但是對(duì)于transformer來(lái)說(shuō)目前還沒(méi)有觀測(cè)到這個(gè)瓶頸
- 最近微軟和英偉達(dá)又聯(lián)合推出了一個(gè)超級(jí)大的語(yǔ)言生成模型Megatron-Turing,它已經(jīng)有5300億參數(shù)了,還能在各個(gè)任務(wù)上繼續(xù)大幅度提升性能,沒(méi)有任何性能飽和的現(xiàn)象
回顧transformer
- transformer中最主要的操作就是自注意力操作,自注意力操作就是每個(gè)元素都要跟每個(gè)元素進(jìn)行互動(dòng),兩兩互相的,然后算得一個(gè)attention(自注意力的圖),用這個(gè)自注意力的圖去做加權(quán)平均,最后得到輸出
- 因?yàn)樵谧鲎宰⒁饬Φ臅r(shí)候是兩兩互相的,這個(gè)計(jì)算復(fù)雜度是跟序列的長(zhǎng)度呈平方倍的。
- 目前一般在自然語(yǔ)言處理中,硬件能支持的序列長(zhǎng)度一般也就是幾百或者是上千(比如說(shuō)BERT的序列長(zhǎng)度也就是512)
將transformer運(yùn)用到視覺(jué)領(lǐng)域的難處
首先要解決的是如何把一個(gè)2D的圖片變成一個(gè)1D的序列(或者說(shuō)變成一個(gè)集合)。最直觀的方式就是把每個(gè)像素點(diǎn)當(dāng)成元素,將圖片拉直放進(jìn)transformer里,看起來(lái)比較簡(jiǎn)單,但是實(shí)現(xiàn)起來(lái)復(fù)雜度較高。
- 一般來(lái)說(shuō)在視覺(jué)中訓(xùn)練分類任務(wù)的時(shí)候圖片的輸入大小大概是224*224,如果將圖片中的每一個(gè)像素點(diǎn)都直接當(dāng)成元素來(lái)看待的話,他的序列長(zhǎng)度就是224*224=50176個(gè)像素點(diǎn),也就是序列的長(zhǎng)度,這個(gè)大小就相當(dāng)于是BERT序列長(zhǎng)度的100倍,這還僅僅是分類任務(wù),對(duì)于檢測(cè)和分割,現(xiàn)在很多模型的輸入都已經(jīng)變成600*600或者800*800或者更大,計(jì)算復(fù)雜度更高,所以在視覺(jué)領(lǐng)域,卷積神經(jīng)網(wǎng)絡(luò)還是占主導(dǎo)地位的,比如AlexNet或者是ResNet
所以現(xiàn)在很多工作就是在研究如何將自注意力用到機(jī)器視覺(jué)中:一些工作是說(shuō)把卷積神經(jīng)網(wǎng)絡(luò)和自注意力混到一起用;另外一些工作就是整個(gè)將卷積神經(jīng)網(wǎng)絡(luò)換掉,全部用自注意力。這些方法其實(shí)都是在干一個(gè)事情:因?yàn)樾蛄虚L(zhǎng)度太長(zhǎng),所以導(dǎo)致沒(méi)有辦法將transformer用到視覺(jué)中,所以就想辦法降低序列長(zhǎng)度
Wang et al.,2018:既然用像素點(diǎn)當(dāng)輸入導(dǎo)致序列長(zhǎng)度太長(zhǎng),就可以不用圖片當(dāng)transformer的直接輸入,可以把網(wǎng)絡(luò)中間的特征圖當(dāng)作transformer的輸入
- 假如用殘差網(wǎng)絡(luò)Res50,其實(shí)在它的最后一個(gè)stage,到res4的時(shí)候的featuremap的size其實(shí)就只有14*14了,再把它拉平其實(shí)就只有196個(gè)元素了,即這個(gè)序列元素就只有196了,這就在一個(gè)可以接受的范圍內(nèi)了。所以就通過(guò)用特征圖當(dāng)作transformer輸入的方式來(lái)降低序列的長(zhǎng)度
Wang et al.,2019;Wang et al.,2020a(Stand-Alone Attention&Axial Attention,孤立自注意力和軸自注意力)
- 孤立自注意力:之所以視覺(jué)計(jì)算的復(fù)雜度高是來(lái)源于使用整張圖,所以不使用整張圖,就用一個(gè)local window(局部的小窗口),這里的復(fù)雜度是可以控制的(通過(guò)控制這個(gè)窗口的大小,來(lái)讓計(jì)算復(fù)雜度在可接受的范圍之內(nèi))。這就類似于卷積操作(卷積也是在一個(gè)局部的窗口中操作的)
- 軸自注意力:之所以視覺(jué)計(jì)算的復(fù)雜度高是因?yàn)樾蛄虚L(zhǎng)度N=H*W,是一個(gè)2D的矩陣,將圖片的這個(gè)2D的矩陣想辦法拆成2個(gè)1D的向量,所以先在高度的維度上做一次self-attention(自注意力),然后再在寬度的維度上再去做一次自注意力,相當(dāng)于把一個(gè)在2D矩陣上進(jìn)行的自注意力操作變成了兩個(gè)1D的順序的操作,這樣大幅度降低了計(jì)算的復(fù)雜度
最近的一些模型,這種方式雖然理論上是非常高效的,但事實(shí)上因?yàn)檫@個(gè)自注意力操作都是一些比較特殊的自注意力操作,所以說(shuō)無(wú)法在現(xiàn)在的硬件上進(jìn)行加速,所以就導(dǎo)致很難訓(xùn)練出一個(gè)大模型,所以截止到目前為止,孤立自注意力和軸自注意力的模型都還沒(méi)有做到很大,跟百億、千億級(jí)別的大transformer模型比還是差的很遠(yuǎn),因此在大規(guī)模的圖像識(shí)別上,傳統(tǒng)的殘差網(wǎng)絡(luò)還是效果最好的
所以,自注意力早已經(jīng)在計(jì)算機(jī)視覺(jué)里有所應(yīng)用,而且已經(jīng)有完全用自注意力去取代卷積操作的工作了,所以本文換了一個(gè)角度來(lái)講故事
本文是被transformer在NLP領(lǐng)域的可擴(kuò)展性所啟發(fā),本文想要做的就是直接應(yīng)用一個(gè)標(biāo)準(zhǔn)的transformer直接作用于圖片,盡量做少的修改(不做任何針對(duì)視覺(jué)任務(wù)的特定改變),看看這樣的transformer能不能在視覺(jué)領(lǐng)域中擴(kuò)展得很大很好
但是如果直接使用transformer,還是要解決序列長(zhǎng)度的問(wèn)題
- vision transformer將一張圖片打成了很多的patch,每一個(gè)patch是16*16
- 假如圖片的大小是224*224,則sequence lenth(序列長(zhǎng)度)就是N=224*224=50176,如果換成patch,一個(gè)patch相當(dāng)于一個(gè)元素的話,有效的長(zhǎng)寬就變成了224/16=14,所以最后的序列長(zhǎng)度就變成了N=14*14=196,所以現(xiàn)在圖片就只有196個(gè)元素了,196對(duì)于普通的transformer來(lái)說(shuō)是可以接受的
- 然后將每一個(gè)patch當(dāng)作一個(gè)元素,通過(guò)一個(gè)fc layer(全連接層)就會(huì)得到一個(gè)linear embedding,這些就會(huì)當(dāng)作輸入傳給transformer,這時(shí)候一張圖片就變成了一個(gè)一個(gè)的圖片塊了,可以將這些圖片塊當(dāng)成是NLP中的單詞,一個(gè)句子中有多少單詞就相當(dāng)于是一張圖片中有多少個(gè)patch,這就是題目中所提到的一張圖片等價(jià)于很多16*16的單詞
本文訓(xùn)練vision transformer使用的是有監(jiān)督的訓(xùn)練
- 為什么要突出有監(jiān)督?因?yàn)閷?duì)于NLP來(lái)說(shuō),transformer基本上都是用無(wú)監(jiān)督的方式訓(xùn)練的,要么是用language modeling,要么是用mask language modeling,都是用的無(wú)監(jiān)督的訓(xùn)練方式但是對(duì)于視覺(jué)來(lái)說(shuō),大部分的基線(baseline)網(wǎng)絡(luò)還都是用的有監(jiān)督的訓(xùn)練方式去訓(xùn)練的
到此可以發(fā)現(xiàn),本文確實(shí)是把視覺(jué)當(dāng)成自然語(yǔ)言處理的任務(wù)去做的,尤其是中間的模型就是使用的transformer encoder,跟BERT完全一樣,這篇文章的目的是說(shuō)使用一套簡(jiǎn)潔的框架,transformer也能在視覺(jué)中起到很好的效果
這么簡(jiǎn)單的想法,之前其實(shí)也有人想到過(guò)去做,本文在相關(guān)工作中已經(jīng)做了介紹,跟本文的工作最像的是一篇ICLR 2020的paper
- 這篇論文是從輸入圖片中抽取2*2的圖片patch
- 為什么是2*2?因?yàn)檫@篇論文的作者只在CIFAR-10數(shù)據(jù)集上做了實(shí)驗(yàn),而CIFAR-10這個(gè)數(shù)據(jù)集上的圖片都是32*32的,所以只需要抽取2*2的patch就足夠了,16*16的patch太大了
- 在抽取好patch之后,就在上面做self-attention
從技術(shù)上而言他就是Vision Transformer,但是本文的作者認(rèn)為二者的區(qū)別在于本文的工作證明了如果在大規(guī)模的數(shù)據(jù)集上做預(yù)訓(xùn)練的話(和NLP一樣,在大規(guī)模的語(yǔ)料庫(kù)上做預(yù)訓(xùn)練),那么就能讓一個(gè)標(biāo)準(zhǔn)的Transformer,不用在視覺(jué)上做任何的更改或者特殊的改動(dòng),就能取得比現(xiàn)在最好的卷積神經(jīng)網(wǎng)絡(luò)差不多或者還好的結(jié)果,同時(shí)本文的作者還指出之前的ICLR的這篇論文用的是很小的2*2的patch,所以讓他們的模型只能處理那些小的圖片,而Vision Transformer是能夠處理224*224這種圖片的
所以這篇文章的主要目的就是說(shuō),Transformer在Vision領(lǐng)域能夠擴(kuò)展的有多好,就是在超級(jí)大數(shù)據(jù)集和超級(jí)大模型兩方的加持下,Transformer到底能不能取代卷積神經(jīng)網(wǎng)絡(luò)的地位
一般引言的最后就是將最想說(shuō)的結(jié)論或者最想表示的結(jié)果放出來(lái),這樣讀者不用看完整篇論文就能知道文章的貢獻(xiàn)有多大
本文在引言的最后說(shuō)在中型大小的數(shù)據(jù)集上(比如說(shuō)ImageNet)上訓(xùn)練的時(shí)候,如果不加比較強(qiáng)的約束,Vit的模型其實(shí)跟同等大小的殘差網(wǎng)絡(luò)相比要弱一點(diǎn)
- 作者對(duì)此的解釋是:這個(gè)看起來(lái)不太好的結(jié)果其實(shí)是可以預(yù)期的,因?yàn)閠ransformer跟卷積神經(jīng)網(wǎng)路相比,它缺少了一些卷積神經(jīng)網(wǎng)絡(luò)所帶有的歸納偏置
- 這里的歸納偏置其實(shí)是指一種先驗(yàn)知識(shí)或者說(shuō)是一種提前做好的假設(shè)
對(duì)于卷積神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),常說(shuō)的有兩個(gè)inductive bias(歸納偏置):
- locality:因?yàn)榫矸e神經(jīng)網(wǎng)絡(luò)是以滑動(dòng)窗口的形式一點(diǎn)一點(diǎn)地在圖片上進(jìn)行卷積的,所以假設(shè)圖片上相鄰的區(qū)域會(huì)有相鄰的特征,靠得越近的東西相關(guān)性越強(qiáng)
- translation equivariance(平移等變性或平移同變性):f(g(x))=g(f(x)),就是說(shuō)不論是先做g這個(gè)函數(shù),還是先做f這個(gè)函數(shù),最后的結(jié)果是不變的。這里可以把f理解成卷積,把g理解成平移操作,意思是說(shuō)無(wú)論是先做平移還是先做卷積,最后的結(jié)果都是一樣的(因?yàn)樵诰矸e神經(jīng)網(wǎng)絡(luò)中,卷積核就相當(dāng)于是一個(gè)模板,不論圖片中同樣的物體移動(dòng)到哪里,只要是同樣的輸入進(jìn)來(lái),然后遇到同樣的卷積核,那么輸出永遠(yuǎn)是一樣的)
一旦神經(jīng)網(wǎng)絡(luò)有了這兩個(gè)歸納偏置之后,他就擁有了很多的先驗(yàn)信息,所以只需要相對(duì)較少的數(shù)據(jù)來(lái)學(xué)習(xí)一個(gè)相對(duì)比較好的模型,但是對(duì)于transformer來(lái)說(shuō),它沒(méi)有這些先驗(yàn)信息,所以它對(duì)視覺(jué)的感知全部需要從這些數(shù)據(jù)中自己學(xué)習(xí)
- 為了驗(yàn)證這個(gè)假設(shè),作者在更大的數(shù)據(jù)集(14M-300M)上做了預(yù)訓(xùn)練,這里的14M是ImageNet 22k數(shù)據(jù)集,300M是google自己的JFT 300M數(shù)據(jù)集,然后發(fā)現(xiàn)大規(guī)模的預(yù)訓(xùn)練要比歸納偏置好
Vision Transformer只要在有足夠的數(shù)據(jù)做預(yù)訓(xùn)練的情況下,就能在下游任務(wù)上取得很好的遷移學(xué)習(xí)效果。具體來(lái)說(shuō),就是當(dāng)在ImageNet 21k上或者在JFT 300M上訓(xùn)練,Vit能夠獲得跟現(xiàn)在最好的殘差神經(jīng)網(wǎng)絡(luò)相近或者說(shuō)更好的結(jié)果,如下圖所示

- VTAB也是作者團(tuán)隊(duì)所提出來(lái)的一個(gè)數(shù)據(jù)集,融合了19個(gè)數(shù)據(jù)集,主要是用來(lái)檢測(cè)模型的穩(wěn)健性,從側(cè)面也反映出了Vision Transformer的穩(wěn)健性也是相當(dāng)不錯(cuò)的
總的來(lái)說(shuō),引言寫的簡(jiǎn)潔明了
- 第一段先說(shuō)因?yàn)門ransformer在NLP中擴(kuò)展的很好,越大的數(shù)據(jù)或者越大的模型,最后performance會(huì)一直上升,沒(méi)有飽和的現(xiàn)象,然后提出:如果將Transformer使用到視覺(jué)中,會(huì)不會(huì)產(chǎn)生同樣的效果
- 第二段開始講前人的工作,講清楚了自己的工作和前人工作的區(qū)別:之前的工作要么就是把卷積神經(jīng)網(wǎng)絡(luò)和自注意力結(jié)合起來(lái),要么就是用自注意力去取代卷積神經(jīng)網(wǎng)絡(luò),但是從來(lái)沒(méi)有工作直接將transformer用到視覺(jué)領(lǐng)域中來(lái),而且也都沒(méi)有獲得很好的擴(kuò)展效果
- 第三段講Vision Transformer就是用了一個(gè)標(biāo)準(zhǔn)的Transformer模型,只需要對(duì)圖片進(jìn)行預(yù)處理(把圖片打成塊),然后送到transformer中就可以了,而不需要做其他的改動(dòng),這樣可以徹底地把一個(gè)視覺(jué)問(wèn)題理解成是一個(gè)NLP問(wèn)題,就打破了CV和NLP領(lǐng)域的壁壘
- 最后兩段展示了結(jié)果,只要在足夠多的數(shù)據(jù)做預(yù)訓(xùn)練的情況下,Vision Transformer能夠在很多數(shù)據(jù)集上取得很好的效果
4、結(jié)論
這篇論文的工作是直接拿NLP領(lǐng)域中標(biāo)準(zhǔn)的Transformer來(lái)做計(jì)算機(jī)視覺(jué)的問(wèn)題,跟之前用自注意力的那些工作的區(qū)別在于:
- 除了在剛開始抽圖像塊的時(shí)候,還有位置編碼用了一些圖像特有的歸納偏置
除此之外就再也沒(méi)有引入任何圖像特有的歸納偏置了,這樣的好處就是不需要對(duì)Vision領(lǐng)域有多少了解,可以直接把圖片理解成一個(gè)序列的圖像塊,就跟一個(gè)句子中有很多單詞一樣,然后就可以直接拿NLP中一個(gè)標(biāo)準(zhǔn)的Transformer來(lái)做圖像分類了
當(dāng)這個(gè)簡(jiǎn)單而且擴(kuò)展性很好的策略和大規(guī)模預(yù)訓(xùn)練結(jié)合起來(lái)的時(shí)候效果出奇的好:Vision Transformer在很多圖像分類的benchmark上超過(guò)了之前最好的方法,而且訓(xùn)練起來(lái)還相對(duì)便宜
目前還沒(méi)有解決的問(wèn)題(對(duì)未來(lái)的展望)
如何用transformer來(lái)做cv
第一個(gè)問(wèn)題:Vit不能只做分類,還有檢測(cè)和分割
- DETR:去年目標(biāo)檢測(cè)的一個(gè)力作,相當(dāng)于是改變了整個(gè)目標(biāo)檢測(cè)之前的框架
鑒于Vit和DETR良好的表現(xiàn),所以作者說(shuō)拿Vision Transformer做視覺(jué)的其他問(wèn)題應(yīng)該是沒(méi)有問(wèn)題的
- 事實(shí)上,在Vit出現(xiàn)短短的一個(gè)半月之后,2020年12月檢測(cè)這塊就出來(lái)了一個(gè)叫Vit-FRCNN的工作,就已經(jīng)將Vit用到檢測(cè)上面了
- 圖像分割這一塊也是一樣的,同年12月就有一篇SETR的paper將Vit用到分割里了
- 緊接著3個(gè)月之后Swin Transformer橫空出世,它將多尺度的設(shè)計(jì)融合到了Transformer中,更加適合做視覺(jué)的問(wèn)題了,真正證明了Transformer是能夠當(dāng)成一個(gè)視覺(jué)領(lǐng)域的通用骨干網(wǎng)絡(luò)
另外一個(gè)未來(lái)的工作方向就是說(shuō)要去探索一下自監(jiān)督的預(yù)訓(xùn)練方案,因?yàn)樵贜LP領(lǐng)域,所有的大的transformer全都是用自監(jiān)督的方式訓(xùn)練的,Vit這篇paper也做了一些初始實(shí)驗(yàn),證明了用這種自監(jiān)督的訓(xùn)練方式也是可行的,但是跟有監(jiān)督的訓(xùn)練比起來(lái)還是有不小的差距的
最后作者說(shuō),繼續(xù)將Vision Transformer變得更大,有可能會(huì)帶來(lái)更好的結(jié)果
- 過(guò)了半年,同樣的作者團(tuán)隊(duì)又出了一篇paper叫做Scaling Vision Transformer,就是將Transformer變得很大,提出了一個(gè)Vit-G,將ImageNet圖像分類的準(zhǔn)確率提高到了90以上了
5、相關(guān)工作
transformer在NLP領(lǐng)域的應(yīng)用
- 自從2017年transformer提出做機(jī)器翻譯以后,基本上transformer就是很多NLP任務(wù)中表現(xiàn)最好的方法。
- 現(xiàn)在大規(guī)模的transformer模型一般都是先在一個(gè)大規(guī)模的語(yǔ)料庫(kù)上做預(yù)訓(xùn)練,然后再在目標(biāo)任務(wù)上做一些細(xì)小的微調(diào),這當(dāng)中有兩系列比較出名的工作:BERT和GPT。BERT是用一個(gè)denoising的自監(jiān)督方式(其實(shí)就是完形填空,將一個(gè)句子中某些詞劃掉,再將這些詞預(yù)測(cè)出來(lái));GPT用的是language modeling(已經(jīng)有一個(gè)句子,然后去預(yù)測(cè)下一個(gè)詞是什么,也就是next word prediction,預(yù)測(cè)下一個(gè)詞)做自監(jiān)督。這兩個(gè)人物其實(shí)都是人為定的,語(yǔ)料是固定的,句子也是完整的,只是人為的去劃掉其中的某些部分或者把最后的詞拿掉,然后去做完形填空或者是預(yù)測(cè)下一個(gè)詞,所以這叫自監(jiān)督的訓(xùn)練方式
自注意力在視覺(jué)中的應(yīng)用
- 視覺(jué)中如果想簡(jiǎn)單地在圖片上使用自注意力,最簡(jiǎn)單的方式就是將每一個(gè)像素點(diǎn)當(dāng)成是一個(gè)元素,讓他們兩兩做自注意力就好了,但是這個(gè)是平方復(fù)雜度,所以很難應(yīng)用到真實(shí)的圖片輸入尺寸上。像現(xiàn)在分類任務(wù)的224*224,一個(gè)transformer都很難處理,更不用提人眼看的比較清晰的圖片了,一般是1k或者4k的畫質(zhì),它們的序列長(zhǎng)度都是上百萬(wàn),直接在像素層面使用transformer的話不太現(xiàn)實(shí),所以如果想用transformer就一定得做一些近似
- 復(fù)雜度高是因?yàn)橛昧苏麖垐D,所以序列長(zhǎng)度長(zhǎng),那么可以不用整張圖,就用local neighborhood(一個(gè)小窗口)來(lái)做自注意力,那么序列長(zhǎng)度就大大降低了,最后的計(jì)算復(fù)雜度也就降低了
- 另外也可以使用Sparse Transformer,就是只對(duì)一些稀疏的點(diǎn)去做自注意力,所以只是一個(gè)全局注意力的近似
- 還有一些方法就是將自注意力用到大小不同的block上,或者說(shuō)在極端的情況下使用軸注意力(先在橫軸上做自注意力,然后再在縱軸上做自注意力),序列長(zhǎng)度也是大大減小的
- 這些特制的自注意力結(jié)構(gòu)其實(shí)在計(jì)算機(jī)視覺(jué)上的結(jié)果都不錯(cuò),表現(xiàn)都是沒(méi)問(wèn)題的,但是它們需要很復(fù)雜的工程去加速算子,雖然在CPU或者GPU上跑得很快或者說(shuō)讓訓(xùn)練一個(gè)大模型成為可能
跟本文工作最相似的是一篇ICLR2020的論文,區(qū)別在于Vision Transformer使用了更大的patch更大的數(shù)據(jù)集
在計(jì)算機(jī)視覺(jué)領(lǐng)域還有很多工作是把卷積神經(jīng)網(wǎng)絡(luò)和自注意力結(jié)合起來(lái)的,這類工作相當(dāng)多,而且基本涵蓋了視覺(jué)里的很多任務(wù)(檢測(cè)、分類、視頻、多模態(tài)等)
還有一個(gè)工作和本文的工作很相近,叫image GPT
- GPT是用在NLP中的,是一個(gè)生成性的模型
- image GPT也是一個(gè)生成性模型,也是用無(wú)監(jiān)督的方式去訓(xùn)練的,它和Vit相近的地方在于它也用了transformer
- image GPT最終所能達(dá)到的效果:如果將訓(xùn)練好的模型做微調(diào)或者就把它當(dāng)成一個(gè)特征提取器,它在ImageNet上的最高的分類準(zhǔn)確率也只能到72,Vit最終的結(jié)果已經(jīng)有88.5了,遠(yuǎn)高于72
- 但是這個(gè)結(jié)果也是最近一篇paper叫做MAE爆火的原因。因?yàn)樵贐EiT和MAE這類工作之前生成式網(wǎng)絡(luò)在視覺(jué)領(lǐng)域很多任務(wù)上是沒(méi)有辦法跟判別式網(wǎng)絡(luò)相比的,判別式網(wǎng)絡(luò)往往要比生成式網(wǎng)絡(luò)的結(jié)果高很多,但是MAE做到了,它在ImageNet-1k數(shù)據(jù)集上訓(xùn)練,用一個(gè)生成式的模型,比之前判別式的模型效果好很多,而且不光是在分類任務(wù)上,最近發(fā)現(xiàn)在目標(biāo)檢測(cè)上的遷移學(xué)習(xí)的效果也非常好
Vit其實(shí)還跟另外一系列工作是有關(guān)系的,用比ImageNet更大的數(shù)據(jù)集去做預(yù)訓(xùn)練,這種使用額外數(shù)據(jù)的方式,一般有助于達(dá)到特別好的效果
- 比如2017年介紹JFT 300數(shù)據(jù)集的那篇paper研究了卷積神經(jīng)網(wǎng)絡(luò)的效果是怎么隨著數(shù)據(jù)集的增大而提高的
- 還有一些論文是研究了在更大的數(shù)據(jù)集(比如說(shuō)ImageNet-21k和JFT 300M)上做預(yù)訓(xùn)練的時(shí)候遷移學(xué)習(xí)的效果會(huì)怎樣,就是遷移到ImageNet或者CIFAR-100上的效果如何
這篇論文也是聚焦于ImageNet-21k和JFT 300M,但是訓(xùn)練的并不是一個(gè)殘差網(wǎng)絡(luò),而失去訓(xùn)練transformer
本文的相關(guān)工作寫的非常徹底,而且列舉了很多跟本文工作最相近的,比如說(shuō)ICLR 2020的論文、iGPT還有之前研究大數(shù)據(jù)集的BiT等
寫相關(guān)工作這個(gè)章節(jié)的目的就是讓讀者知道在你的工作之前別人做了哪些工作,你和他們的區(qū)別在哪里。寫清楚之后其實(shí)對(duì)論文本身是非常有利的,并不會(huì)降低論文的創(chuàng)新性,反而讓整個(gè)文章變得更加簡(jiǎn)單易懂
6、ViT模型
在模型的設(shè)計(jì)上是盡可能按照最原始的transformer來(lái)做的,這樣做的好處就是可以直接把NLP中比較成功的Transformer架構(gòu)拿過(guò)來(lái)用,而不用再去對(duì)模型進(jìn)行改動(dòng),而且因?yàn)閠ransformer因?yàn)樵贜LP領(lǐng)域已經(jīng)火了很久了,它有一些寫的非常高效的實(shí)現(xiàn),同樣ViT也可以直接拿來(lái)使用
下圖是模型的總覽圖,模型的總覽圖對(duì)論文來(lái)說(shuō)是非常重要的,畫的好的模型總覽圖能夠讓讀者在不讀論文的情況下,僅僅通過(guò)看圖就能夠知道整篇論文的大致內(nèi)容

- 首先給定一張圖,先將這張圖打成了很多的patch(如上圖左下角所示),這里是將圖打成了九宮格
- 然后再將這些patch變成了一個(gè)序列,每個(gè)patch通過(guò)線性投射層的操作得到一個(gè)特征(就是本文中提到的patch embedding)
- 自注意力是所有元素之間兩兩做交互,所以本身并不存在順序的問(wèn)題,但是對(duì)于圖片來(lái)說(shuō),圖片本身是一個(gè)整體,這個(gè)九宮格是有自己的順序的,如果順序顛倒了就不是原來(lái)的圖片了。所以類似于NLP,給patch embedding加上了一個(gè)position embedding,等價(jià)于加上了一個(gè)位置編碼
- 在加上這個(gè)位置編碼信息之后,整體的token就既包含了圖片塊原本有的圖像信息,又包含了這個(gè)圖片塊的所在位置信息
- 在得到了這個(gè)token之后,接下來(lái)就跟NLP中完全一樣了,直接將它們輸入進(jìn)一個(gè)Transformer encoder,然后Transformer encoder就會(huì)得到很多輸出
- 這么多輸出,應(yīng)該拿哪個(gè)輸出去做分類?這里借鑒了BERT,BERT中有一個(gè)extra learnable embedding,它是一個(gè)特殊字符CLS(分類字符),所以這里也添加了一個(gè)特殊的字符,用*代替,而且它也是有position embedding,它的位置信息永遠(yuǎn)是0,如下圖紅色圓圈所示

- 因?yàn)樗械膖oken都在跟其它token做交互信息,所以作者相信,class embedding能夠從別的序列后面的embedding中學(xué)到有用的信息,從而只需要根據(jù)class embedding的輸出做最后的判斷就可以了
- MLP Head其實(shí)就是一個(gè)通用的分類頭
- 最后用交叉熵函數(shù)進(jìn)行模型的訓(xùn)練
模型中的Transformer encoder是一個(gè)標(biāo)準(zhǔn)的Transformer,具體的結(jié)構(gòu)如下圖右圖所示

- Transformer的輸入是一些patch
- 一個(gè)Transformer block疊加了L次
整體上來(lái)看Vision Transformer的架構(gòu)還是相當(dāng)簡(jiǎn)潔的,它的特殊之處就在于如何把一個(gè)圖片變成一系列的token
具體的模型的前向過(guò)程
- 假如說(shuō)有一個(gè)224*224*3的圖片X,如果使用16*16的patch size大小,就會(huì)得到196個(gè)圖像塊,每一個(gè)圖像塊的維度就是16*16*3=768,到此就把原先224*224*3的圖片變成了196個(gè)patch,每個(gè)patch的維度是768
- 接下來(lái)就要將這些patch輸入一個(gè)線性投射層,這個(gè)線性投射層其實(shí)就是一個(gè)全連接層(在文章中使用E表示),這個(gè)全連接層的維度是768*768,第二個(gè)768就是文章中的D,D是可以變的,如果transformer變得更大了,D也可以相應(yīng)的變得更大,第一個(gè)768是從前面圖像的patch算來(lái)的(16*16*3),它是不變的。
- 經(jīng)過(guò)了線性投射就得到了patch embedding(X*E),它是一個(gè)196*768的矩陣(X是196*768,E是768*768),意思就是現(xiàn)在有196個(gè)token,每個(gè)token向量的維度是768
- 到目前為止就已經(jīng)成功地將一個(gè)vision的問(wèn)題變成了一個(gè)NLP的問(wèn)題了,輸入就是一系列1d的token,而不再是一張2d的圖片了
- 除了圖片本身帶來(lái)的token以外,這里面加了一個(gè)額外的cls token,它是一個(gè)特殊的字符,只有一個(gè)token,它的維度也是768,這樣可以方便和后面圖像的信息直接進(jìn)行拼接。所以最后整體進(jìn)入Transformer的序列的長(zhǎng)度是197*768(196+1:196個(gè)圖像塊對(duì)應(yīng)的token和一個(gè)特殊字符cls token)
- 最后還要加上圖像塊的位置編碼信息,這里是將圖片打成了九宮格,所以位置編碼信息是1到9,但是這只是一個(gè)序號(hào),并不是真正使用的位置編碼,具體的做法是通過(guò)一個(gè)表(表中的每一行就代表了這些1到9的序號(hào),每一行就是一個(gè)向量,向量的維度是768,這個(gè)向量也是可以學(xué)的)得到位置信息,然后將這些位置信息加到所有的token中(注意這里是加,而不是拼接,序號(hào)1到9也只是示意一下,實(shí)際上應(yīng)該是1到196),所以加上位置編碼信息之后,這個(gè)序列還是197*768
- 到此就做完了整個(gè)圖片的預(yù)處理,包括加上特殊的字符cls和位置編碼信息,也就是說(shuō)transformer輸入的embedded patches就是一個(gè)197*768的tensor
- 這個(gè)tensor先過(guò)一個(gè)layer norm,出來(lái)之后還是197*768
- 然后做多頭自注意力,這里就變成了三份:k、q、v,每一個(gè)都是197*768,這里因?yàn)樽龅氖嵌囝^自注意力,所以其實(shí)最后的維度并不是768,假設(shè)現(xiàn)在使用的是VIsion Transformer的base版本,即多頭使用了12個(gè)頭,那么最后的維度就變成了768/12=64,也就是說(shuō)這里的k、q、v變成了197*64,但是有12個(gè)頭,有12個(gè)對(duì)應(yīng)的k、q、v做自注意力操作,最后再將12個(gè)頭的輸出直接拼接起來(lái),這樣64拼接出來(lái)之后又變成了768,所以多頭自注意力出來(lái)的結(jié)果經(jīng)過(guò)拼接還是197*768
- 然后再過(guò)一層layer norm,還是197*768
- 然后再過(guò)一層MLP,這里會(huì)把維度先對(duì)應(yīng)地放大,一般是放大4倍,所以就是197*3072
- 然后再縮小投射回去,再變成197*768,就輸出了

- 以上就是一個(gè)Transformer block的前向傳播的過(guò)程,進(jìn)去之前是197*768,出來(lái)還是197*768,這個(gè)序列的長(zhǎng)度和每個(gè)token對(duì)應(yīng)的維度大小都是一樣的,所以就可以在一個(gè)Transformer block上不停地往上疊加Transformer block,最后有L層Transformer block的模型就構(gòu)成了Transformer encoder
3.1 Vision Transformer

- Transformer從頭到尾都是使用D當(dāng)作向量的長(zhǎng)度的,都是768,這個(gè)維度是不變的
- 對(duì)于位置編碼信息,本文用的是標(biāo)準(zhǔn)的可以學(xué)習(xí)的1d position embedding,它也是BERT使用的位置編碼。作者也嘗試了了別的編碼形式,比如說(shuō)2d aware(它是一個(gè)能處理2d信息的位置編碼),但是最后發(fā)現(xiàn)結(jié)果其實(shí)都差不多,沒(méi)有什么區(qū)別
消融實(shí)驗(yàn)(附錄)
針對(duì)特殊的class token還有位置編碼,作者還做了詳細(xì)的消融實(shí)驗(yàn),因?yàn)閷?duì)于Vision Transformer來(lái)說(shuō),怎么對(duì)圖片進(jìn)行預(yù)處理以及怎樣對(duì)圖片最后的輸出進(jìn)行后處理是很關(guān)鍵的,因?yàn)楫吘怪虚g的模型就是一個(gè)標(biāo)準(zhǔn)的Transformer
1、class token
因?yàn)樵诒疚闹?,想要跟原始的Transformer盡可能地保持一致,所以也使用了class token,因?yàn)閏lass token在NLP的分類任務(wù)中也有用到(也是當(dāng)作一個(gè)全局的對(duì)句子的理解的特征),本文中的class token是將它當(dāng)作一個(gè)圖像的整體特征,拿到這個(gè)token的輸出以后,就在后面接一個(gè)MLP(MLP中是用tanh當(dāng)作非線性的激活函數(shù)來(lái)做分類的預(yù)測(cè))
- 這個(gè)class token的設(shè)計(jì)是完全從NLP借鑒過(guò)來(lái)的,之前在視覺(jué)領(lǐng)域不是這么做的,比如說(shuō)有一個(gè)殘差網(wǎng)絡(luò)Res50,在最后一個(gè)stage出來(lái)的是一個(gè)14*14的feature map,然后在這個(gè)feature map之上其實(shí)是做了一個(gè)叫做gap(global average pooling,全局平均池化)的操作,池化以后的特征其實(shí)就已經(jīng)拉直了,就是一個(gè)向量了,這個(gè)時(shí)候就可以把這個(gè)向量理解成一個(gè)全局的圖片特征,然后再拿這個(gè)特征去做分類
對(duì)于Transformer來(lái)說(shuō),如果有一個(gè)Transformer模型,進(jìn)去有n個(gè)元素,出來(lái)也有n個(gè)元素,為什么不能直接在n個(gè)輸出上做全局平均池化得到一個(gè)最后的特征,而非要在前面加上一個(gè)class token,最后用class token的輸出做分類?
- 通過(guò)實(shí)驗(yàn),作者最后的結(jié)論是:這兩種方式都可以,就是說(shuō)可以通過(guò)全局平均池化得到一個(gè)全局特征然后去做分類,也可以用一個(gè)class token去做。本文所有的實(shí)驗(yàn)都是用class token去做的,主要的目的是跟原始的Transformer盡可能地保持一致(stay as close as possible),作者不想人覺(jué)得某些效果好可能是因?yàn)槟承﹖rick或者某些針對(duì)cv的改動(dòng)而帶來(lái)的,作者就是想證明,一個(gè)標(biāo)準(zhǔn)的Transformer照樣可以做視覺(jué)
兩種方法的效果對(duì)比如下圖所示

- 綠線表示全局平均池化
- 藍(lán)線表示class token
- 可以發(fā)現(xiàn)到最后綠線和藍(lán)線的效果是差不多的,但是作者指出綠線和藍(lán)線所使用的學(xué)習(xí)率是不一樣的,如果直接將藍(lán)線的學(xué)習(xí)率拿過(guò)來(lái)使用得到的效果可能如橙線所示,也就是說(shuō)需要進(jìn)行好好調(diào)參
2、位置編碼
作者也做了很多的消融實(shí)驗(yàn),主要是三種
- 1d:就是NLP中常用的位置編碼,也就是本文從頭到尾都在使用的位置編碼
- 2d:比如1d中是把一個(gè)圖片打成九宮格,用的是1到9的數(shù)來(lái)表示圖像塊,2d就是使用11、12、13、21等來(lái)表示圖像塊,這樣就跟視覺(jué)問(wèn)題更加貼近,因?yàn)樗辛苏w的結(jié)構(gòu)信息。具體的做法就是,原有的1d的位置編碼的維度是d,現(xiàn)在因?yàn)闄M坐標(biāo)、縱坐標(biāo)都需要去表示,橫坐標(biāo)有D/2的維度,縱坐標(biāo)也有D/2的維度,就是說(shuō)分別有一個(gè)D/2的向量去表述橫坐標(biāo)和縱坐標(biāo),最后將這兩個(gè)D/2的向量拼接到一起就又得到了一個(gè)長(zhǎng)度為D的向量,把這個(gè)向量叫做2d的位置編碼
- relative positional embedding(相對(duì)位置編碼):在1d的位置編碼中,兩個(gè)patch之間的距離既可以用絕對(duì)的距離來(lái)表示,又可以用它們之間的相對(duì)距離來(lái)表示(文中所提到的offset),這樣也可以認(rèn)為是一種表示圖像塊之間位置信息的方式
但是這個(gè)消融實(shí)驗(yàn)最后的結(jié)果也是:三種表示方法的效果差不多,如下圖所示

- No Pos表示不加任何的位置編碼,效果不太好,但也不算特別差。transformer根本沒(méi)有感知圖片位置的能力,在沒(méi)有位置編碼的情況下,還能夠達(dá)到61的效果其實(shí)已經(jīng)相當(dāng)不錯(cuò)了
- 對(duì)比以上三種位置編碼的形式發(fā)現(xiàn),所有的performance都是64,沒(méi)有任何區(qū)別
- 對(duì)此作者給出了他認(rèn)為合理的解釋,他所做的Vision Transformer是直接在圖像塊上做的,而不是在原來(lái)的像素塊上做的,因?yàn)閳D像塊很小,14*14,而不是全局的那種224*224,所以在排列組合這種小塊或者想要知道這些小塊之間相對(duì)位置信息的時(shí)候還是相對(duì)比較容易的,所以使用任意的位置編碼都無(wú)所謂
通過(guò)以上的消融實(shí)驗(yàn)可以看出,class token也可以使用全局平均池化替換,最后1d的位置信息編碼方式也可以用2d或者相對(duì)位置編碼去替換,但是為了盡可能對(duì)標(biāo)準(zhǔn)的transformer不做太多改動(dòng),所以本文中的vision transformer還是使用的是class token和1d的位置信息編碼方式
transformer encoder
transformer在現(xiàn)在看來(lái)是一個(gè)比較標(biāo)準(zhǔn)的操作了,作者對(duì)于transformer(或者說(shuō)多頭注意力機(jī)制)的解釋放在附錄中了
作者用整體的公式將整個(gè)過(guò)程總結(jié)了一下,如下圖中的公式所示

- X表示圖像塊的patch,一共有n個(gè)patch
- E表示線性投影的全連接層,得到一些patch embedding
- 得到patch embedding之后,在它前面拼接一個(gè)class embedding(Xclass),因?yàn)樾枰盟鲎詈蟮妮敵?/li>
- 一旦得到所有的tokens,就需要對(duì)這些token進(jìn)行位置編碼,所以將位置編碼信息Epos也加進(jìn)去
- Z0就是整個(gè)transformer的輸入
- 接下來(lái)就是一個(gè)循環(huán),對(duì)于每個(gè)transformer block來(lái)說(shuō),里面都有兩個(gè)操作:一個(gè)是多頭自注意力,一個(gè)是MLP。在做這兩個(gè)操作之前,都要先經(jīng)過(guò)layer norm,每一層出來(lái)的結(jié)果都要再去用一個(gè)殘差連接
- ZL’就是每一個(gè)多頭自注意力出來(lái)的結(jié)果
- ZL就是每一個(gè)transformer block整體做完之后出來(lái)的結(jié)果
- L層循環(huán)結(jié)束之后將ZL(最后一層的輸出)的第一個(gè)位置上的ZL0,也就是class token所對(duì)應(yīng)的輸出當(dāng)作整體圖像的特征,然后去做最后的分類任務(wù)
歸納偏置
vision transformer相比于CNN而言要少很多圖像特有的歸納偏置,比如在CNN中,locality(局部性)和translate equivariance(平移等變性)是在模型的每一層中都有體現(xiàn)的,這個(gè)先驗(yàn)知識(shí)相當(dāng)于貫穿整個(gè)模型的始終
但是對(duì)于ViT來(lái)說(shuō),只有MLP layer是局部而且平移等變性的,但是自注意力層是全局的,這種圖片的2d信息ViT基本上沒(méi)怎么使用(就只有剛開始將圖片切成patch的時(shí)候和加位置編碼的時(shí)候用到了,除此之外,就再也沒(méi)有用任何針對(duì)視覺(jué)問(wèn)題的歸納偏置了)
而且位置編碼其實(shí)也是剛開始隨機(jī)初始化的,并沒(méi)有攜帶任何2d的信息,所有關(guān)于圖像塊之間的距離信息、場(chǎng)景信息等,都需要從頭開始學(xué)習(xí)
這里也是對(duì)后面的結(jié)果做了一個(gè)鋪墊:vision transformer沒(méi)有用太多的歸納偏置,所以說(shuō)在中小數(shù)據(jù)集上做預(yù)訓(xùn)練的時(shí)候效果不如卷積神經(jīng)網(wǎng)絡(luò)是可以理解的
混合模型
既然transformer全局建模的能力比較強(qiáng),卷積神經(jīng)網(wǎng)絡(luò)又比較data efficient(不需要太多的訓(xùn)練數(shù)據(jù)),所以搞出了一個(gè)混合的網(wǎng)絡(luò),前面是卷積神經(jīng)網(wǎng)絡(luò),后面是transformer
作者對(duì)此做了實(shí)驗(yàn):
- 原先是假設(shè)有一個(gè)圖片,將它打成16*16的patch,得到了196個(gè)元素,這196個(gè)元素和全連接層做一次操作,最后得到patch embedding
- 現(xiàn)在不將圖片打成塊了,就按照卷積神經(jīng)網(wǎng)絡(luò)的方式去進(jìn)行處理,將一整張圖輸入一個(gè)CNN,比如說(shuō)Res50,最后出來(lái)一個(gè)14*14的特征圖,這個(gè)特征圖拉直了以后恰好也是196個(gè)元素,然后用新的到的196個(gè)元素去和全連接層做操作得到新的patch embedding
以上就是兩種不同的對(duì)圖片進(jìn)行預(yù)處理的方式
- 一種是將圖片打成patch,然后直接經(jīng)過(guò)全連接層
- 另外一種就是經(jīng)過(guò)一個(gè)CNN
因?yàn)檫@兩種方式得到的序列的長(zhǎng)度都是196,所以后續(xù)的操作都是一樣的,都是直接輸入一個(gè)transformer,最后再做分類
遇到更大尺寸圖片的時(shí)候如何做微調(diào)
之前有工作說(shuō)如果在微調(diào)的時(shí)候,能用比較大的圖像尺寸(不是用224*224,而是用256*256,甚至更大的320*320,就會(huì)得到更好的結(jié)果)就能夠得到更好的效果
vision transformer也想在在更大的尺寸上做微調(diào),但是用一個(gè)預(yù)訓(xùn)練好的vision transformer其實(shí)是不太好去調(diào)整輸入尺寸的。當(dāng)使用更大尺寸的圖片的時(shí)候,如果將patch size保持一致,但是圖片擴(kuò)大了,那么序列長(zhǎng)度就增加了,所以transformer從理論上來(lái)講是可以處理任意長(zhǎng)度的,只要硬件允許,任意長(zhǎng)度都可以。
但是提前預(yù)訓(xùn)練好的位置編碼有可能就沒(méi)用了,因?yàn)樵瓉?lái)的位置編碼是有明確的位置信息的意義在里面的,現(xiàn)在圖片變大了,如果保持patch size不變的話,patch增多了,
- 這個(gè)時(shí)候位置編碼該如何使用?作者發(fā)現(xiàn)其實(shí)做一個(gè)簡(jiǎn)單的2d的插值就可以了(使用torch官方自帶的interpolate函數(shù)就可以完成了)。
- 但是這里的插值也不是想插多長(zhǎng)就插多長(zhǎng),當(dāng)從一個(gè)很短的序列變成一個(gè)很長(zhǎng)的序列時(shí),簡(jiǎn)單的插值操作會(huì)導(dǎo)致最終的效果下降,所以說(shuō)這里的插值只是一種臨時(shí)的解決方案,這也算是vision transformer在微調(diào)的時(shí)候的一個(gè)局限性
- 因?yàn)槭褂昧藞D片的位置信息進(jìn)行插值,所以這塊的尺寸改變和抽圖像塊是vision transformer里唯一用到2d信息的歸納偏置的地方
7、實(shí)驗(yàn)
主要是對(duì)比了殘差網(wǎng)絡(luò)、vit和它們混合模型的表征學(xué)習(xí)能力
為了了解訓(xùn)練好每個(gè)模型到底需要多少數(shù)據(jù),在不同大小的數(shù)據(jù)集上做預(yù)訓(xùn)練,然后在很多的數(shù)據(jù)集上做測(cè)試
當(dāng)考慮到預(yù)訓(xùn)練的時(shí)間代價(jià)(預(yù)訓(xùn)練的時(shí)間長(zhǎng)短)的時(shí)候,vision transformer表現(xiàn)得非常好,能在大多數(shù)數(shù)據(jù)集上取得最好的結(jié)果,同時(shí)需要更少的時(shí)間進(jìn)行訓(xùn)練
最后作者還做了一個(gè)自監(jiān)督的實(shí)驗(yàn),自監(jiān)督實(shí)驗(yàn)的結(jié)果雖然沒(méi)有最好,但是還是可以,還是比較有潛力
- 時(shí)隔一年之后,MAE就證明了自監(jiān)督的方式去訓(xùn)練ViT確實(shí)效果很好
數(shù)據(jù)集的使用方面主要是用了
- ImageNet的數(shù)據(jù)集:ImageNet-1k(最常用的有1000個(gè)類別、1300張圖片)、ImageNet-21k(有21000個(gè)類別、14000張圖片)
- JFT數(shù)據(jù)集:Google自己的數(shù)據(jù)集(有3億張圖片)
下游任務(wù)全部是做的分類,用的也是比較常用的數(shù)據(jù)集
- CIFAR
- Oxford Pets
- Oxford Flowers
模型的變體
一共有三種模型,參數(shù)如下圖所示

- Base
- Large
- Huge
- Layers:transformer block的個(gè)數(shù)
- Hidden size D:向量維度
- MLP size:
- Heads:多頭自注意力中頭的數(shù)量
因?yàn)楸疚闹械哪P?,不光跟transformer本身有關(guān)系,還和輸入有關(guān)系。當(dāng)patch size大小變化的時(shí)候,模型的位置編碼就不一樣,所以patch size也要考慮在模型的命名里面,所以模型的命名方式就是
- vit-l 16:表示用的是一個(gè)vit large的模型,輸入的patch size是16*16
transformer的序列長(zhǎng)度其實(shí)是跟patch size成反比的,因?yàn)閜atch size越小,切成的塊就越多,patch size越大,切成的塊就越少,所以當(dāng)模型用了更小的patch size的時(shí)候計(jì)算起來(lái)就會(huì)更貴,因?yàn)樾蛄虚L(zhǎng)度增加了
結(jié)果如下圖所示,下表是說(shuō)當(dāng)它已經(jīng)在大規(guī)模的數(shù)據(jù)上進(jìn)行過(guò)預(yù)訓(xùn)練之后,在左邊這一列的數(shù)據(jù)集上去做fine-tune(微調(diào))的時(shí)候得到的表現(xiàn)

- 上表對(duì)比了幾個(gè)vit的變體和卷積神經(jīng)網(wǎng)絡(luò)(bit和noisy student)
- 和bit做對(duì)比的原因是因?yàn)閎it確實(shí)是之前卷積神經(jīng)網(wǎng)絡(luò)里做得比較大的,而且也是因?yàn)樗亲髡邎F(tuán)隊(duì)自己本身的工作,所以正好可以拿來(lái)對(duì)比
- 和noisy student做對(duì)比是因?yàn)樗荌mageNet之前表現(xiàn)最好的方法,它所采用的方法是用pseudo-label(偽標(biāo)簽)去進(jìn)行self training,也就是常說(shuō)的用偽標(biāo)簽也取得了很好的效果
- 從上表中可以看出,vit huge用比較小的patch 14*14能取得所有數(shù)據(jù)集上最好的結(jié)果。
但是因?yàn)檫@些數(shù)值都太接近了,僅僅相差零點(diǎn)幾個(gè)點(diǎn)或者一點(diǎn)幾個(gè)點(diǎn),沒(méi)有特別大的差距,所以作者覺(jué)得沒(méi)有展示出vision transformer的威力,所以作者就得從另外一個(gè)角度來(lái)體現(xiàn)vit的優(yōu)點(diǎn):因?yàn)橛?xùn)練起來(lái)更便宜
- 作者所說(shuō)的更便宜是指最大的vit huge這個(gè)模型也只需要訓(xùn)練2500天tpuv3天數(shù),正好bit和noisy student也都是google的工作,也都是用tpuv3訓(xùn)練的,所以剛好可以拿來(lái)比較,bit用了9900天,noisy student用了一萬(wàn)多天,所以從這個(gè)角度上來(lái)說(shuō),vit不僅比之前bit和noisy student要訓(xùn)練的快,而且效果要好,所以通過(guò)這兩點(diǎn)可以得出vit真的是比卷積神經(jīng)網(wǎng)絡(luò)要好的結(jié)論
分析
vision trasformer到底需要多少數(shù)據(jù)才能訓(xùn)練的比較好?
下圖中圖三是整個(gè)vision trasformer論文最重要的take home message,是作者最想讓讀者知道的,這張圖基本上把所有的實(shí)驗(yàn)都快概括了

- 圖三表示當(dāng)時(shí)用不同大小的數(shù)據(jù)集的時(shí)候,比如說(shuō)ImageNet是1.2m,而ImageNet-21k是14m,JFT是300m,當(dāng)數(shù)據(jù)集不斷增大的時(shí)候,resnet和vit到底在ImageNet的fine-tune的時(shí)候效果如何
- 圖三的主要意思是說(shuō),灰色代表bit,也就是各種大小的resnet,最下面表示50,最上面表示152,如下圖所示,他所想要展示的是在中間的灰色區(qū)域就是resnet能達(dá)到的效果范圍,剩下的圓點(diǎn)就是各種大小不一的vision transformer

- 在最小的ImageNet上做預(yù)訓(xùn)練時(shí),vision transformer是完全不如resnet,vision transformer基本上所有的點(diǎn)都在灰色區(qū)域的下面。這說(shuō)明vision transformer在中小型數(shù)據(jù)集上做預(yù)訓(xùn)練的時(shí)候的效果是遠(yuǎn)不如殘差網(wǎng)絡(luò)的,原因就是因?yàn)関ision transformer沒(méi)有使用先驗(yàn)知識(shí)(歸納偏置),所以它需要更大的數(shù)據(jù)去讓網(wǎng)絡(luò)學(xué)得更好
- 在ImageNet-21k上做預(yù)訓(xùn)練的時(shí)候,vision transformer和resnet已經(jīng)是差不多了,vision transformer基本上所有的點(diǎn)都落在灰色區(qū)域內(nèi)
- 只有當(dāng)用特別大的數(shù)據(jù)集JFT-300M時(shí),vision transformer是比bit對(duì)應(yīng)的res152還要高的
總之這個(gè)圖所要表達(dá)的是兩個(gè)信息
- 如果想用vision transformer,那么得至少準(zhǔn)備差不多和ImageNet-21k差不多大小的數(shù)據(jù)集,如果只有很小的數(shù)據(jù)集,還是選擇使用卷積神經(jīng)網(wǎng)絡(luò)比較好
- 當(dāng)已經(jīng)擁有了比ImageNet-21k更大的數(shù)據(jù)集的時(shí)候,用vision transformer就能得到更好的結(jié)果,它的擴(kuò)展性更好一些
其實(shí)整篇論文所講的就是這個(gè)scaling
圖四如下圖右圖所示,因?yàn)樽髡咴趫D三中要用vision transformer跟resnet做比較,所以在訓(xùn)練的時(shí)候用了一些強(qiáng)約束(比如說(shuō)dropout、weight decay、label smoothing),所以就不太好分析vision transformer模型本身的特性,所以在圖四中做了linear few-shot evaluation(在拿到預(yù)訓(xùn)練的模型之后,直接把它當(dāng)成一個(gè)特征提取器,不去fine-tune,而是直接拿這些特征做了一個(gè)just take a regression就可以了),同時(shí)作者選擇了few-shot,圖示中標(biāo)出了5-shot,就是在ImageNet上做linear evaluation的時(shí)候,每一類隨機(jī)選取了5個(gè)sample,所以這個(gè)evaluation做起來(lái)是很快的,作者用這種方式做了大量的消融實(shí)驗(yàn)

- 圖四中橫軸表示預(yù)訓(xùn)練數(shù)據(jù)集的大小,這里就使用了JFT,沒(méi)有用別的數(shù)據(jù)集,但是他取了一些JFT的子集:10M、30M、100M、300M,這樣因?yàn)樗械臄?shù)據(jù)都是從一個(gè)數(shù)據(jù)集里面得來(lái)的,就沒(méi)有那么大的distribution gap,這樣比較起來(lái)模型的效果就更加能體現(xiàn)出模型本身的特質(zhì)
- 圖四中的結(jié)果其實(shí)跟圖三差不多,圖中淺灰色的線是res50,深灰色的線是res152,當(dāng)用很小的預(yù)訓(xùn)練的數(shù)據(jù)集的時(shí)候vision transformer是完全比不過(guò)resnet的
- 本文給出的解釋是因?yàn)槿鄙贇w納偏置和約束方法(weight decay、label smoothing等),所以就導(dǎo)致在10M數(shù)據(jù)集的情況下vision transformer容易過(guò)擬合,導(dǎo)致最后學(xué)到的特征不適合做其他任務(wù),但是隨著預(yù)訓(xùn)練數(shù)據(jù)集的增大,vision transformer的穩(wěn)健性就提升上來(lái)了
- 但是因?yàn)檫@里的提升也不是很明顯,作者也在最后一段寫了如何用vision transformer去做這種小樣本的學(xué)習(xí)是一個(gè)非常有前途的方向
----20000字上限,見專欄下一篇筆記----