2018
年Google AI
研究院提出了一種預(yù)訓(xùn)練模型BERT
仔拟,該模型在11項(xiàng)NLP
任務(wù)中奪得SOTA
結(jié)果,而BERT
取得成功的一個(gè)關(guān)鍵因素是Transformer
的強(qiáng)大作用身诺。Transformer
改進(jìn)了RNN
最被人詬病的訓(xùn)練慢的缺點(diǎn),利用self-attention
機(jī)制實(shí)現(xiàn)快速并行抄囚。并且Transformer
可以增加到非常深的深度霉赡,充分發(fā)掘DNN
模型的特性,提升模型準(zhǔn)確率幔托。由此Transformer
也開(kāi)始走進(jìn)不同領(lǐng)域深度學(xué)習(xí)算法工程師們的視野穴亏。本文從Transformer
的基礎(chǔ)原理和在一些領(lǐng)域的代表性論文來(lái)總結(jié)對(duì)Transformer
在計(jì)算機(jī)視覺(jué)領(lǐng)域中的應(yīng)用。
Transformer 基本原理
Transformer
這一結(jié)構(gòu)的概念本身可以追溯到Google
在2017
年的一篇論文Attention Is All You Need。該論文首次沒(méi)有使用LSTM
等RNN
結(jié)構(gòu)來(lái)構(gòu)建NLP
任務(wù)的神經(jīng)網(wǎng)絡(luò)嗓化,也沒(méi)有像FAIR
一樣通過(guò)CNN
來(lái)實(shí)現(xiàn)自然語(yǔ)言翻譯锅劝,而是僅使用Attention
模塊堆疊就能夠出色的完成相關(guān)的任務(wù)。Google
給這個(gè)多層Attention
堆疊的結(jié)構(gòu)起名為Transformer
蟆湖。由下圖可以看出故爵,一個(gè)標(biāo)準(zhǔn)的Transformer
由一個(gè)encoder
和一個(gè)decoder
組成,encoder
包括一個(gè)自注意力層和一個(gè)前饋神經(jīng)網(wǎng)絡(luò)隅津,decoder
包括一個(gè)自注意力層诬垂、一個(gè)編碼-解碼注意力層和一個(gè)前饋神經(jīng)網(wǎng)絡(luò)。
Transformer
中比較重要的幾個(gè)結(jié)構(gòu)是Scaled Dot-Product Attention
伦仍、 Multi-Head Attention
结窘、 Position-wise Feed-Forward Networks
和 Positional Encoding
。
Scaled Dot-Product Attention
通過(guò)Q
充蓝、K
隧枫、V
對(duì)embedding
后的數(shù)據(jù)進(jìn)行Attention
的計(jì)算,其分別對(duì)應(yīng)的是Query
谓苟,Key
接Value
官脓。
Multi-Head Attention
則是通過(guò)h
個(gè)不同的線性變換對(duì)Q
,K
涝焙,V
進(jìn)行投影卑笨,最后將不同的attention
結(jié)果拼接起來(lái)。
Position-wise feed-forward networks
這層主要是提供非線性變換仑撞。Attention
輸出的維度是[bszseq_len, num_headshead_size]赤兴,第二個(gè)sub-layer
是個(gè)全連接層,之所以是position-wise
是因?yàn)檫^(guò)線性層時(shí)每個(gè)位置i的變換參數(shù)是一樣的隧哮。
Transformer
拋棄了RNN
桶良,而RNN
最大的優(yōu)點(diǎn)就是在時(shí)間序列上對(duì)數(shù)據(jù)的抽象,所以文章中作者提出兩種Positional Encoding
的方法沮翔,將encoding
后的數(shù)據(jù)與embedding
數(shù)據(jù)求和陨帆,加入了相對(duì)位置信息。
一次self-attention
的運(yùn)算可以通過(guò)以下步驟完成:
從每個(gè)編碼器的輸入向量(每個(gè)單詞的詞向量)中生成三個(gè)向量鉴竭。也就是說(shuō)對(duì)于每個(gè)單詞歧譬,我們創(chuàng)造一個(gè)查詢向量
Q
岸浑、一個(gè)鍵向量K
和一個(gè)值向量V
搏存。這三個(gè)向量是通過(guò)詞嵌入與三個(gè)權(quán)重矩陣后相乘創(chuàng)建的。假設(shè)詞向量x
的大小為1x4
矢洲,權(quán)重矩陣Wq
的大小為4x3
璧眠,其相乘后就可以得到大小為1x3
的查詢向量q
。假設(shè)我們?yōu)榈谝粋€(gè)詞
Thinking
計(jì)算自注意力向量,我們需要拿輸入句子中的每個(gè)單詞對(duì)Thinking
打分责静。這些分?jǐn)?shù)決定了在編碼單詞Thinking
的過(guò)程中有多重視句子的其它部分袁滥。這些分?jǐn)?shù)是通過(guò)打分單詞(所有輸入句子的單詞)的鍵向量與Thinking
的查詢向量相點(diǎn)積來(lái)計(jì)算的。所以如果我們是處理位置最靠前的詞的自注意力的話灾螃,第一個(gè)分?jǐn)?shù)是q1
和k1
的點(diǎn)積题翻,第二個(gè)分?jǐn)?shù)是q1
和k2
的點(diǎn)積。將分?jǐn)?shù)除以
8
(8
是論文中使用的鍵向量的維數(shù)64
的平方根腰鬼,這會(huì)讓梯度更穩(wěn)定嵌赠。這里也可以使用其它值,8
只是默認(rèn)值)熄赡,然后通過(guò)softmax
傳遞結(jié)果姜挺。softmax
的作用是使所有單詞的分?jǐn)?shù)歸一化,得到的分?jǐn)?shù)都是正值且和為1
彼硫。這個(gè)softmax
分?jǐn)?shù)決定了每個(gè)單詞對(duì)編碼當(dāng)下位置單詞的貢獻(xiàn)炊豪。顯然,已經(jīng)在這個(gè)位置上的單詞將獲得最高的softmax
分?jǐn)?shù)拧篮,但有時(shí)關(guān)注另一個(gè)與當(dāng)前單詞相關(guān)的單詞也會(huì)有幫助词渤。將每個(gè)值向量乘以
softmax
分?jǐn)?shù),這里的直覺(jué)是希望關(guān)注語(yǔ)義上相關(guān)的單詞串绩,并弱化不相關(guān)的單詞(例如掖肋,讓它們乘以0.001
這樣的小數(shù))。-
對(duì)加權(quán)值向量求和赏参,然后即得到自注意力層在該位置的輸出志笼。自注意力的另一種解釋就是在編碼某個(gè)單詞時(shí),就是將所有單詞的表示(值向量)進(jìn)行加權(quán)求和把篓,而權(quán)重是通過(guò)該詞的表示(鍵向量)與被編碼詞表示(查詢向量)的點(diǎn)積并通過(guò)
softmax
得到纫溃。
Multi-Head Attention
為每個(gè)頭保持獨(dú)立的查詢/鍵/值權(quán)重矩陣,從而產(chǎn)生不同的查詢/鍵/值矩陣韧掩。這些集合中的每一個(gè)都是隨機(jī)初始化的紊浩,在訓(xùn)練之后,每個(gè)集合都被用來(lái)將輸入詞嵌入(或來(lái)自較低編碼器/解碼器的向量)投影到不同的表示子空間中疗锐。它擴(kuò)展了模型專(zhuān)注于不同位置的能力并且給出了注意力層的多個(gè)“表示子空間”坊谁。
為了理解輸入單詞的順序,Transformer
為每個(gè)輸入的詞嵌入添加了一位置個(gè)向量滑臊。這些向量遵循模型學(xué)習(xí)到的特定模式口芍,這有助于確定每個(gè)單詞的位置,或序列中不同單詞之間的距離雇卷。這里的直覺(jué)是鬓椭,將位置向量添加到詞嵌入中使得它們?cè)诮酉聛?lái)的運(yùn)算中颠猴,能夠更好地表達(dá)的詞與詞之間的距離。論文中使用了sin
和cos
的方法進(jìn)行位置編碼小染,其中pos
是位置翘瓮,i
是維度。
視覺(jué)應(yīng)用
雖然Transformer
結(jié)構(gòu)在NLP
領(lǐng)域得到了廣泛的應(yīng)用裤翩,但是在視覺(jué)領(lǐng)域的應(yīng)用仍然有限资盅。在視覺(jué)領(lǐng)域,attention
或者是和CNN
網(wǎng)絡(luò)共同使用或者是代替CNN
中特定的組件踊赠。想要將 Transformer
應(yīng)用到視覺(jué)任務(wù)中律姨,我們首先需要構(gòu)建一些類(lèi)似于VGG
、ResNet
之類(lèi)的backbone
臼疫。
Backbone
VIT
VIT(VISION TRANSFORMER)
是Google
在2020
年提出的一種使用Transformer
進(jìn)行圖像分類(lèi)的backbone
择份。
VIT
在模型結(jié)構(gòu)上保持了和原版Transformer
相近。為將2D
圖像變成對(duì)應(yīng)的1-D
的序列patch embedding
輸入烫堤,對(duì)于一張圖像 荣赶,首先將其切分成為N
個(gè)PxP
的patch
,其中N=WH / P^2
鸽斟,最終獲得N
個(gè)P^2 ? C
大小的矩陣拔创。然后將圖像拉平轉(zhuǎn)化為一維的序列輸入,并通過(guò)MLP
層將其線性映射到一個(gè)固定的維度富蓄,實(shí)現(xiàn)embedding
的效果剩燥。作者指出,圖像塊序列可以來(lái)自于原始圖像立倍,也可以來(lái)自于CNN
的特征圖灭红。對(duì)于CNN
特征圖,甚至可以將區(qū)塊大小設(shè)置為1*1口注。
作者在經(jīng)過(guò)Embedding
后的序列的最前面加上了一個(gè)D
維的class embedding
变擒,類(lèi)似于BERT
中的class token
,在positional encoding
之后一起作為 transformer encoder
的輸入寝志。輸出部分娇斑,VIT
去掉了decoder
的部分,encoder
得到的特征直接送入MLP head
材部,最后通過(guò)softmax
進(jìn)行分類(lèi)處理毫缆。
DeiT
github: facebookresearch/deit: Official DeiT repository
DeiT(Data-efficient Image Transformers)
是facebookresearch
在2021
年提出的一種基于知識(shí)蒸餾來(lái)學(xué)習(xí)的image transformer
。相比VIT
乐导,DeiT
需要更少的數(shù)據(jù)和更少的計(jì)算資源就能生成高性能的圖像分類(lèi)模型苦丁。研究人員僅用一臺(tái) 8-GPU
的服務(wù)器對(duì) DeiT
模型進(jìn)行 3
天訓(xùn)練,該方法就在 ImageNet
基準(zhǔn)測(cè)試中達(dá)到了84.2%
的top-1
準(zhǔn)確率兽叮,并且訓(xùn)練階段未使用任何外部數(shù)據(jù)芬骄,該結(jié)果可以與頂尖的卷積神經(jīng)網(wǎng)絡(luò)媲美。
DeiT
首個(gè)重要的組件是其訓(xùn)練策略鹦聪。研究者在最初用于卷積神經(jīng)網(wǎng)絡(luò)的現(xiàn)有研究基礎(chǔ)上進(jìn)行了調(diào)整與改進(jìn)账阻,并提出了一種基于蒸餾token
的新型蒸餾流程,它的作用與class token
相同泽本,不過(guò)其目的在于復(fù)制教師網(wǎng)絡(luò)估計(jì)的標(biāo)簽淘太。實(shí)驗(yàn)結(jié)果表明,這種特定Transformer
策略大幅度優(yōu)于vanilla
蒸餾方法规丽。
蒸餾流程如下圖所示蒲牧。研究者僅添加了一個(gè)新的蒸餾token
,它通過(guò)自注意力層與class token
和patch token
交互作用赌莺。蒸餾token
的作用與class token
類(lèi)似冰抢,不過(guò)前者的目的是復(fù)制教師網(wǎng)絡(luò)預(yù)測(cè)的(硬)標(biāo)簽,而不是正確標(biāo)簽艘狭。Transformer
的class token
和蒸餾token
輸入均通過(guò)反向傳播學(xué)得挎扰。
和ViT
的class token
類(lèi)似,distillation token
是在圖像塊序列后面加上的token
巢音。然后它經(jīng)過(guò)transformer encoder
之后的輸出用于和teacher model
的輸出計(jì)算loss
遵倦。作者發(fā)現(xiàn)class token
和distillation token
會(huì)收斂于不同的向量,cos
距離為0.06
官撼,隨著層數(shù)的加深梧躺,兩者embedding
的相似度逐漸上升,最終cos
距離為0.93傲绣,說(shuō)明他們希望得到相似但不相同的target
掠哥。為了證明distillation token
的有效是由于knowledge distillation
的作用,而不是只由于多了一個(gè)token
導(dǎo)致的秃诵,作者做了對(duì)比試驗(yàn)龙致,不是在后面加distillation token
,而是再加一個(gè)class token
顷链,發(fā)現(xiàn)他們最終收斂結(jié)果的相似性達(dá)到0.999目代,并且性能弱于前者,證明了加入distillation token
的意義嗤练。
TNT
TNT
是華為諾亞實(shí)驗(yàn)室在2021
年提出的一種基于Transformer
的網(wǎng)絡(luò)架構(gòu)榛了。TNT
通過(guò)內(nèi)外兩個(gè)Transformer
聯(lián)合提取圖像局部和全局特征,通過(guò)堆疊TNT
模塊煞抬,研究者搭建了全新的純Transformer
網(wǎng)絡(luò)架構(gòu)霜大。作者表示它的表現(xiàn)優(yōu)于谷歌的ViT
和Facebook
的DeiT
。
TNT
網(wǎng)絡(luò)主要由若干個(gè)TNT block
堆疊構(gòu)成革答。TNT block
有 2 個(gè)輸入战坤,一個(gè)是pixel embedding
曙强,一個(gè)是patch embedding
。對(duì)應(yīng)地途茫,TNT block
包含 2 個(gè)標(biāo)準(zhǔn)的transformer block
碟嘴。對(duì)于輸入的圖像,TNT
和VIT
一樣將圖像切塊囊卜,構(gòu)成patch
序列娜扇。不過(guò)TNT
不把patch
拉直為向量,而是將patch
看作像素(組)的序列栅组。
具體地說(shuō)雀瓢,TNT
將圖像轉(zhuǎn)化成patch embedding
序列和pixel embedding
序列。圖像首先被均勻切分成若干個(gè)patch
玉掸,每個(gè)patch
通過(guò)im2col
操作轉(zhuǎn)化成像素向量序列刃麸,像素向量通過(guò)pytorch unfold
操作將patch
轉(zhuǎn)化成m
個(gè)像素向量,然后用一個(gè)全連接層將m
個(gè)像素向量映射為m
個(gè)pixel embedding
司浪。而patch embedding
(包括一個(gè) class token
)是一組初始化為零的向量嫌蚤。對(duì)每個(gè)patch embedding
加一個(gè)patch position encoding
,對(duì)每個(gè)pixel embedding
加一個(gè)pixel position encoding
断傲,兩種 Position encoding
在訓(xùn)練過(guò)程中都是可學(xué)習(xí)的參數(shù)脱吱。最終,TNT block 輸出處理過(guò)后的pixel embedding
和patch embedding
认罩,最后通過(guò)一個(gè)MLP
層輸出結(jié)果箱蝠。
ViT G/14
2021
年,Google
原ViT
團(tuán)隊(duì)的幾位成員又嘗試將ViT
模型進(jìn)行擴(kuò)展垦垂,使用到了包含30
億圖像的JFT-3B
數(shù)據(jù)集宦搬,并提出了參數(shù)量高達(dá)20
億參數(shù)的ViT
變體模型ViT G/14
,在ImageNet
圖像數(shù)據(jù)集上實(shí)現(xiàn)了新的SOTA Top-1
準(zhǔn)確率劫拗。論文主要研究了預(yù)訓(xùn)練ViT
模型用于圖像分類(lèi)任務(wù)的遷移性能的擴(kuò)展規(guī)則间校。特別是,研究者試驗(yàn)了從500
萬(wàn)到20
億個(gè)參數(shù)不等的模型页慷、從3000
萬(wàn)到30
億個(gè)訓(xùn)練圖像不等的數(shù)據(jù)集以及從低于 1
個(gè) TPUv3
核每天到超過(guò)10000
個(gè)核每天的計(jì)算預(yù)算憔足。其主要貢獻(xiàn)是描述ViT
模型的性能計(jì)算邊界。
具體任務(wù)
檢測(cè)
github: facebookresearch/detr: End-to-End Object Detection with Transformers
DETR
是facebookresearch
在2020
年提出的一種基于Transformer
的目標(biāo)檢測(cè)模型酒繁。整個(gè)DETR
架構(gòu)很容易理解滓彰,它包含三個(gè)主要組件:CNN
的backbone
、transformer
的編碼器-解碼器和一個(gè)前饋網(wǎng)絡(luò)州袒。通過(guò)卷積backbone
得到的feature map
拉平成一維特征圖揭绑,加上position
信息之后送到基于Transformer
的編碼器。該編碼器的輸出是N
個(gè)固定長(zhǎng)度的embedding feature
郎哭,其中N
是模型假設(shè)的圖像中的對(duì)象數(shù)他匪,論文中N=100
菇存。基于Transformer
的解碼器借助自身和編碼器-解碼器注意機(jī)制將這些特征并行解碼為邊界框坐標(biāo)邦蜜。最后依鸥,前饋神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)邊界框的標(biāo)準(zhǔn)化中心坐標(biāo),高度和寬度畦徘,最后的線性層使用softmax
函數(shù)預(yù)測(cè)類(lèi)別標(biāo)簽毕籽。
DETR
有趣的地方在于抬闯,DETR
給予一組固定的可學(xué)習(xí)的目標(biāo)query
集合井辆,推理目標(biāo)坐標(biāo)和圖片上下文直接輸出最終的預(yù)測(cè)結(jié)果。也就是其一次性預(yù)測(cè)所有的目標(biāo)溶握,而不是先找出所有的候選框杯缺,然后通過(guò)手工設(shè)計(jì)的組件(編碼先驗(yàn)錨框或者NMS處理)來(lái)過(guò)濾出真正的物體。從直覺(jué)上DETR
的方式更接近人的識(shí)別方式睡榆,也可以將DETR
視為一種No Anchor
的方法萍肆。個(gè)人感覺(jué)是通過(guò)position embedding
和query
代替了anchor
。
圖中的object queries
是一組可以學(xué)習(xí)的變量的集合胀屿,從作者的代碼中能夠看出其是一個(gè)大小為100 × 2 × 256
的變量塘揣。這里的100
是個(gè)超參數(shù),表示對(duì)于每張圖片宿崭,預(yù)測(cè)100
個(gè)bboxes
亲铡。設(shè)為100
的原因是數(shù)據(jù)集中有90
個(gè)類(lèi)別,100
剛好合適葡兑。object queries
的意思就是告訴模型要100
個(gè)實(shí)例奖蔓,然后decoder
根據(jù)得到特征的位置和顯著性解碼出100
個(gè)instance
,其中部分是前景部分是背景讹堤,前景的就class loss
+box loss
吆鹤,背景的就當(dāng)背景。
最后N
個(gè)預(yù)測(cè)值與真值是如何對(duì)應(yīng)的呢洲守,文中通過(guò)匈牙利算法來(lái)實(shí)現(xiàn)的二分最大匹配疑务。所謂二分的最大匹配,即保證預(yù)測(cè)值與真值實(shí)現(xiàn)最大的匹配梗醇,保證預(yù)測(cè)的N
個(gè)實(shí)例(包括?)按照位置與真值對(duì)應(yīng)起來(lái)暑始。實(shí)現(xiàn)一一對(duì)應(yīng)之后,便能夠利用分類(lèi)Loss
以及boundingbox Loss
進(jìn)行優(yōu)化婴削。這種一一對(duì)應(yīng)的關(guān)系廊镜,同時(shí)也另一個(gè)好處是,不會(huì)多個(gè)預(yù)測(cè)值對(duì)應(yīng)到同一個(gè)真實(shí)值上唉俗,然后再通過(guò)NMS
進(jìn)行后處理嗤朴。
分割
github: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers
SETR
是在CVPR 2021
上提出的一種基于Transformer
的語(yǔ)義分割模型配椭。整體結(jié)構(gòu)基本如下圖所示,ViT
作為encoder
加上一個(gè)卷積組成的decoder
雹姊,這個(gè)decoder
也是常規(guī)的上采樣加上跨特征融合股缸。根據(jù)最后的實(shí)驗(yàn)結(jié)果,個(gè)人感覺(jué)文章證明了一次卷積特征疊加許多個(gè)transformer
的情況下吱雏,配合巨量數(shù)據(jù)的pretrain
敦姻,也能達(dá)到同類(lèi)卷積分割模型的效果。不過(guò)這個(gè)Transformer
的參數(shù)量和運(yùn)行速度都與現(xiàn)有的語(yǔ)義分割模型相差很大歧杏,基本做不到實(shí)用的地步镰惦。
車(chē)道線檢測(cè)
LSTR
是在WACV 2021
上提出的一種基于Transformer
的車(chē)道線檢測(cè)模型,能夠在1080TI
的顯卡上實(shí)現(xiàn)420 FPS
的檢測(cè)速度犬绒。作者借助于對(duì)車(chē)道線曲線和相機(jī)內(nèi)參的描述旺入,采用多項(xiàng)式參數(shù)模型來(lái)描述車(chē)道線,并配以Bipartite Matching Loss
函數(shù)凯力,實(shí)現(xiàn)端到端訓(xùn)練茵瘾,網(wǎng)絡(luò)的目標(biāo)成為預(yù)測(cè)幾個(gè)參數(shù),這無(wú)需后處理且降低了計(jì)算量咐鹤。
網(wǎng)絡(luò)的backbone
是ResNet18
拗秘,通過(guò)8
倍的下采樣取得特征后送入一個(gè)Transformer
模塊,這一塊基本和vit
類(lèi)似祈惶。使用Transformer
的原因是雕旨,對(duì)于細(xì)長(zhǎng)線條Transformer
能學(xué)習(xí)更豐富的結(jié)構(gòu)和上下文信息。LSTR
預(yù)測(cè)的值并不是圖片上的像素坐標(biāo)行瑞,而是車(chē)道線近似為一條三次曲線后從道路到圖片上的投影方程的參數(shù)奸腺,學(xué)到參數(shù)后通過(guò)y
來(lái)計(jì)算x的
位置。對(duì)于預(yù)測(cè)N
條固定的曲線(N
大于典型數(shù)據(jù)集中車(chē)道線數(shù)量的最大值)血久,預(yù)測(cè)的曲線為H
突照,真實(shí)曲線的像素排列為s
,真實(shí)曲線為L
氧吐。Bipartite matching
求的是預(yù)測(cè)曲線與真實(shí)曲線之間的距離讹蘑,目標(biāo)是使得距離之和最少(其中使用了Hungarian algorithm
)。這種方法求解三次方程速度比較快筑舅,但是對(duì)水平線相當(dāng)?shù)牟挥押谩?/p>
ReID
DMT
是在CVPR 2021
上提出的一種基于Transformer
的車(chē)輛ReID
模型座慰,同時(shí)也是NVIDIA AI CITY Challenge 2021 Track2
的冠軍方案京郑。具體結(jié)構(gòu)沒(méi)什么好說(shuō)的涌矢,把去年的冠軍方案的ResNet101
的backbone
換成了VIT
,loss
和訓(xùn)練策略還是常規(guī)的ReID
思路吨瞎。此外作者還用到了UDA Training
,即用聚類(lèi)的方法給測(cè)試集分配偽標(biāo)簽然后用來(lái)訓(xùn)練蛮粮。
除了Transformer
的backbone
和UDA Training
益缎,在測(cè)試過(guò)程中還用到了Augmentation Test
,Re-Ranking
然想, Weighted Tracklet Features
莺奔,Camera Verification
,Inter-Camera Fusion
和Camera and Orientation Bias
等技巧來(lái)提升測(cè)試結(jié)果变泄。
Reference
圖解Transformer(完整版)_龍心塵-CSDN博客_transformer
Attention Is All You Need
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
Training data-efficient image transformers & distillation through attention
Transformer in Transformer
Scaling Vision Transformers
End-to-End Object Detection with Transformers
Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers
End-to-end Lane Shape Prediction with Transformers
An Empirical Study of Vehicle Re-Identification on the AI City Challenge