计算机视觉算法——Transformer学习笔记
算機視覺算法——Transformer學習筆記
- 計算機視覺算法——Transformer學習筆記
- 1. Vision Transformer
- 1.1 網(wǎng)絡結構
- 1.2 關鍵知識點
- 1.2.1 Self-Attention
- 1.2.2 Positional Embedding
- 1.2.3 Layer Normalization
- 2. Swin Transformer
- 2.1 網(wǎng)絡結構
- 2.2 關鍵知識點
- 2.2.1 W-MSA和SW-WSA結構
- 2.2.2 Relative Position Bias
計算機視覺算法——Transformer學習筆記
清明假期被封在家里,我就利用這三天時間學習了下著名的Transfomer,參考的主要是Blibli UP主霹靂吧啦Wz的視頻教程,過程有不懂的我就自己查資料,補充了一些自己的理解觀點,目前還沒有機會對Transformer進行實踐,只是進行了簡單的理論學習,有問題歡迎讀者指出交流。
參考內(nèi)容:
11.1 Vision Transformer(vit)網(wǎng)絡詳解
Vision Transformer 超詳細解讀 (原理分析+代碼解讀) (一)
12.1 Swin-Transformer網(wǎng)絡結構詳解
1. Vision Transformer
Transformer來源于2017年的一篇論文《Attention Is All You Need》,Transformer的提出最開始是針對NLP領域的,在此之前,NLP領域里使用的主要是RNN、LSTM這樣一些網(wǎng)絡,這些網(wǎng)絡都存在一些問題,一方面是記憶長度有限,另一方面是無法并行,而Transeformer理論上記憶長度是無限長的,并且可以做到并行化。
而Vision Transformer是2020年發(fā)表于CVPR的論文《An Image Worth 16x16 Words: Transformers for Image Recognition as Scale》提出的,論文性能對比如下:
1.1 網(wǎng)絡結構
Vision Transform的網(wǎng)絡結構如下圖所示:
其中,Position Encoder主要是由Norm Block、Multi-Head Attention Block和MLP Block構成,MLP Block的結構由Linear+GELU+Dropout+Linear+Dropout的結構構成,Norm Block和Multi-Head Attention的結構可以參看下面的關鍵知識點。
用于輸出的MLP Head可以為Linear+Tanh+Linear的結構或者直接為一層Linear,具體結構可以根據(jù)不同數(shù)據(jù)集做適當改變。
論文中一共給出了三種網(wǎng)絡結構:
其中Layer為Transform Encoder重復堆疊的個數(shù),Hidden Size為通過Embedding層后每個Token的維度,MLP Size是Transformer Encoder中MLP Block第一個全連接的節(jié)點個數(shù),Heads代表Mutli-Head Attention的Head數(shù)。
1.2 關鍵知識點
1.2.1 Self-Attention
Self-Attention是Transformer中最重要的模塊之一,Self-Attention最核心的公式就是下面這三個:Attention?(Q,K,V)=softmax?(QKTdk)V\text { Attention }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V ?Attention?(Q,K,V)=softmax(dk??QKT?)VMultiHead?(Q,K,V)=Concat?(head1,…,head?h)WO\left.\operatorname{MultiHead}(Q, K, V)=\operatorname{Concat}( \mathrm{head}_{1}, \ldots, \text { head }_{\mathrm{h}}\right) W^{O} MultiHead(Q,K,V)=Concat(head1?,…,?head?h?)WOwhere?head?=Attention?(QWiQ,KWiK,VWiV)\text { where head }=\text { Attention }\left(Q W_{i}^{Q}, K W_{i}^{K}, V W_{i}^{V}\right) ?where?head?=?Attention?(QWiQ?,KWiK?,VWiV?)下面我們先對第一個公式展開來講,其過程分為如下圖所示:
其中圖中最下方的x1x_1x1?和x2x_2x2?為輸入向量,在Vision Transformer中就是輸入的圖像Patch,圖中最上方的b1b_1b1?和b2b_2b2?為經(jīng)過Self-Attention編碼后輸出的特征,我將其中的步驟分為五步:
Step1:通過Embedding層將輸入向量映射到一個更高的維度上。在Vision Transformer中這里有一層卷積層構成,這里我們可以先簡單將其理解為將向量x1x_1x1?和x2x_2x2?映射通過某個函數(shù)f(x)f(x)f(x)映射到了向量a1a_1a1?和a2a_2a2?。
Step2:將向量向量aia_iai?分別與矩陣WqW_qWq?,WkW_kWk?和WvW_vWv?相乘得到qiq_iqi?,qkq_kqk?和qvq_vqv?。在Vision Transformer中這里是由三個MLP組成,如果我們忽略偏置的話,我們就可以將抽象為三個矩陣,WqW_qWq?,WkW_kWk?和WvW_vWv?三個矩陣的參數(shù)是可以學習的,且針對不同的aia_iai?參數(shù)是共享的。
其中,qiq_iqi?是從aia_iai?中提取的用于進行匹配的向量,我們稱為query。kik_iki?是從aia_iai?中提取的待匹配的向量,我們稱為key。viv_ivi?是從aia_iai?中提取的用于描述信息的向量,我們成為value,在接下來的步驟中我們將利用不同aia_iai?query和key進行點乘獲得權重,再利用該權重對value進行加權平均或者最后的輸出。
Step3:依次遍歷所有的qiq_iqi?和kik_iki?以o(n2)o(n^2)o(n2)的計算復雜度進行向量點乘獲得αi\alpha_iαi?,αi\alpha_iαi?其實描述的是不同aia_iai?之間的一種相似性,由于是點乘,這里的αi\alpha_iαi?已經(jīng)是一個標量α1,i=q1?ki/d\alpha_{1, i}=q^{1} \cdot k^{i} / \sqrtze8trgl8bvbq α1,i?=q1?ki/d?α2,i=q2?ki/d\alpha_{2, i}=q^{2} \cdot k^{i} / \sqrtze8trgl8bvbq α2,i?=q2?ki/d?.........其中ddd為向量的長度。
Step4:將αi\alpha_iαi?經(jīng)過一個Softmax進行歸一化得到βi\beta_iβi?,βi\beta_iβi?就是我們對viv_ivi?進行加權的權重,因為qiq_iqi?和kik_iki?都是等長的向量,因此上述Step3和Step4的操作其實就是qiq_iqi?和kik_iki?組成的兩個矩陣QQQ和KKK進行矩陣乘法:softmax?(QKTdk)\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right)softmax(dk??QKT?)
Step5:βi\beta_iβi?與viv_ivi?進行加權平均就得到最后輸出bib_ibi?,因此以上整個流程可以抽象為我們上述給出的第一個公式:Attention?(Q,K,V)=softmax?(QKTdk)V\text { Attention }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V ?Attention?(Q,K,V)=softmax(dk??QKT?)V這部分操作其實就是一堆矩陣操作,如下圖所示,因此可以進行GPU加速:
將上述Self-Attention的流程整理清楚后,Multi-Head Self-Attention的計算過程如下圖所示:
上圖展示的是head=2情況,可以看出來,所謂Multi-Head其實就是將qiq_iqi?,qkq_kqk?和qvq_vqv?這幾個向量均分成幾部分,然后分別給計算后面的權重和加權求和結果,結構非常類似于Group卷積,最后bi1b_{i1}bi1?和bi2b_{i2}bi2?是通過Concatenate的操作輸出的。因此Mutli-Head的計算公式為:MultiHead?(Q,K,V)=Concat?(head1,…,head?h)WO\left.\operatorname{MultiHead}(Q, K, V)=\operatorname{Concat}( \mathrm{head}_{1}, \ldots, \text { head }_{\mathrm{h}}\right) W^{O} MultiHead(Q,K,V)=Concat(head1?,…,?head?h?)WOwhere?head?=Attention?(QWiQ,KWiK,VWiV)\text { where head }=\text { Attention }\left(Q W_{i}^{Q}, K W_{i}^{K}, V W_{i}^{V}\right) ?where?head?=?Attention?(QWiQ?,KWiK?,VWiV?)Multi-Head的優(yōu)勢在哪兒呢?如下圖所示,綠色的部分是一個head的query和key,而紅色部分則是另一個head的query和key,我們可以看出來,紅色head更關注全局信息,綠色head更關注局部信息,Multi-Head的存在其實就是是的網(wǎng)絡更加充分地利用了輸入的信息:
了解了Self-Attention的結構后,我們其實應該能夠理解為什么Transformer的效果比傳統(tǒng)的CNN效果要好,使用CNN的時候一個卷積核只能獲得其感受野內(nèi)的信息,而感受野的范圍和大小是人為決定的,但是在Transformer中,是通過Self-Attention中去全局中搜索相關的信息,就像是感受野是的范圍和大小是通過學習獲得的,因此CNN可以看作是一種簡化版的Transformer。
1.2.2 Positional Embedding
從上述Self-Atttention或者Mutli-Head Self-Attention的結構我們可以發(fā)現(xiàn)一個問題,假如由三個輸入,我們修改后兩個輸入的順序,對于第一個輸入的結構是完全沒有影響的,也就是說“我和你”和“我你和“可能表征的是同一個意思,這種問題的發(fā)生是因為Self-Attention模塊的輸入中并沒有位置相關的信息。解決該問題的方法就是Positional Embedding,結構如下圖所示:
Position Embedding結構其實就是原始的Embedding層aia_iai?上加上一個Position Embedding的向量eie_iei?向量,然后再送入后面的運算過程,向量eie_iei?通常是人工設定的一個值,那么為什么是采用相加這種方式來表達位置關系呢?有解釋如下:
假設我們給每一個位置的xi∈R(d,1)x_{i} \in R(d, 1)xi?∈R(d,1)并上一個One-Hot編碼的向量pi∈R(N,1)p_{i} \in R(N, 1)pi?∈R(N,1),得到一個新的輸入向量xip∈R(d+N,1)x^{p}_{i} \in R(d+N, 1)xip?∈R(d+N,1),然后我們乘以一個變換矩陣W=[WI,WP]∈R(d,d+N)W=\left[W_{I}, W_{P}\right] \in R(d, d+N)W=[WI?,WP?]∈R(d,d+N),那么有:W?xip=[WI,WP]?[xipi]=WI?xi+WP?pi=ai+eiW \cdot x^{p}_{i}=\left[W_{I}, W_{P}\right] \cdot\left[\begin{array}{c} x_{i} \\ p_{i} \end{array}\right]=W_{I} \cdot x_{i}+W_{P} \cdot p_{i}=a_{i}+e_{i} W?xip?=[WI?,WP?]?[xi?pi??]=WI??xi?+WP??pi?=ai?+ei?因此我們可以得到一個結論,eie_iei?和aia_iai?相加就等于原來的輸入xix_ixi?和表示位置的編碼pip_ipi?進行Concatenate后再經(jīng)過一個變換的結果。在Vision Transformer中通過下面這樣一張圖來描述訓練得到的不同輸入的Position Embedding向量的差異,越黃表示該輸入該位置的值與該位置作為真值的余弦相似度越大:
論文中還對比了加入Positional Embedding和不加入Positional Embedding的結果上的區(qū)別:
這個結果說明,加入那種形式的Positional Embedding并不重要的,關鍵是要加上。
1.2.3 Layer Normalization
我們比較熟悉的Batch Normalization是針對CNN設計的,其作用主要是保證輸入卷積的Feature Map滿足一定的分布規(guī)律,因此Batch Normalization的做法是對Feature Map的每一個維度進行標準化處理(即對某一個維度的所有通道及所有Sample的值進行標準化),而在RNN場景,同一Batch中不同F(xiàn)eature的維度可能是不同的,如下圖所示,這就會導致**在某些維度進行標準化處理時,通道數(shù)過少甚至只有一個通道,這樣統(tǒng)計出來的均值和方差都不能反應全局的統(tǒng)計分布,**因此Batch Normalization效果會變得非常差。
針對這個問題,由學者就提出了Layer Normalization,其和Batch Normalization的區(qū)別如下圖所示:
可以看出來,Layer Normalization是針對每一個Sample進行標準化處理(及某一個Sample的所有通過維度和所有通道的值進行標注化),標準化處理的公式和Batch Normalization是一樣的:y=x?E[x]Var?[x]+??γ+βy=\frac{x-\mathrm{E}[x]}{\sqrt{\operatorname{Var}[x]+\epsilon}} * \gamma+\beta y=Var[x]+??x?E[x]??γ+β其中E[x]\mathrm{E}[x]E[x]為所有值的的期望,Var?[x]\operatorname{Var}[x]Var[x]為所有值的方差,γ\gammaγ和β\betaβ是可學習參數(shù),用與恢復標準化后的特征分布。
2. Swin Transformer
Swin Transformer原論文名為《Swin Transformer: Hearchical Vision Tranformer using Shifted Windows》, 為2021年ICCV的Best Paper,Swin Tranformer和Vision Transformer的網(wǎng)絡結構差別如下圖所示:
可以看到Swin Transformer具備層次結構的,每一層的特征圖由一個或多個Window構成,不同層Window的大小不相同,每個Window經(jīng)過Self-Attention,Window之間是不進行信息交流的;而Vision Transformer不具備層次結構且每一層都是對整個特征圖進行Self-Attention。算法性能對比如下:
值得注意的一點是,Vision Transformer在ImageNet-1K的數(shù)據(jù)集上如果不經(jīng)過ImageNe-22K的預訓練,其效果其實是不好的,但是Swin Transfomer卻能夠取得很好的效果。而在FLOPs這個參數(shù)上,Swin Transformer也要優(yōu)于Vision Transformer。
2.1 網(wǎng)絡結構
Swin Transformer的網(wǎng)絡構架如下圖(a)所示:
原圖大小為H×W×3{H} \times {W} \times 3H×W×3,我們將原圖拆分為16個Patch并按照深度方向進行拼接就得到H4×W4×48\frac{H}{4} \times \frac{W}{4} \times 484H?×4W?×48大小的輸入,然后再經(jīng)過Linear Embedding層得到H4×W4×C\frac{H}{4} \times \frac{W}{4} \times C4H?×4W?×C大小的輸入。
其中第一步是從不同的Window選擇相同位置的像素組合,然后按照深度方向進行Concatenate,再經(jīng)過Layer Normalization和一個線性層。
2.2 關鍵知識點
2.2.1 W-MSA和SW-WSA結構
W-MSA指的的Windows Multi-Head Self-Attention,前文有介紹的Multi-Head Self-Attention是在整個特征圖進行計算,而W-MSA是將特征圖先均分為若干個Window,在Window上作用Multi-Head Self-Attention,這樣做的好處是可以減少計算量,缺點是窗口之間無法進行信息交互,導致感受野變小。這里我們分別來計算下Multi-Head Self-Attention和W-MSA的計算量區(qū)別:
首先我們知道Self-Attention公式如下:Attention?(Q,K,V)=SoftMax?(QKTd)V\operatorname{Attention}(Q, K, V)=\operatorname{SoftMax}\left(\frac{Q K^{T}}{\sqrtze8trgl8bvbq}\right) V Attention(Q,K,V)=SoftMax(d?QKT?)V我們假設輸入的輸入的特征矩陣A的大小為hw×Chw\times Chw×C,并且我們忽略SoftMax?\operatorname{SoftMax}SoftMax和d\sqrtze8trgl8bvbqd?的計算量,那么上述計算公式可以拆分成如下幾步:Ahw×C?WqC×C=Qhw×CA^{h w \times C} \cdot W_{q}^{C \times C}=Q^{h w \times C} Ahw×C?WqC×C?=Qhw×CAhw×C?WkC×C=Khw×CA^{h w \times C} \cdot W_{k}^{C \times C}=K^{h w \times C} Ahw×C?WkC×C?=Khw×CAhw×C?WvC×C=Vhw×CA^{h w \times C} \cdot W_{v}^{C \times C}=V^{h w \times C} Ahw×C?WvC×C?=Vhw×CQhw×C?KT(C×hw)=Xhw×hwQ^{h w \times C} \cdot K^{T(C \times h w)}=X^{h w \times h w} Qhw×C?KT(C×hw)=Xhw×hwXhw×hw?Vhw×C=Bhw×CX^{h w \times h w} \cdot V^{h w \times C}=B^{h w \times C} Xhw×hw?Vhw×C=Bhw×C我們知道對于矩陣乘法Aa×b×Bb×cA^{a\times b}\times B^{b\times c}Aa×b×Bb×c的計算量為a×b×ca\times b\times ca×b×c那么,上述三步的計算量總共是(hw×C×C)×3+hw×C×hw+hw×hw×C=3hwC2+2(hw)2C(hw\times C\times C)\times 3+hw\times C\times hw +hw\times hw\times C=3hwC^2+2(hw)^2C (hw×C×C)×3+hw×C×hw+hw×hw×C=3hwC2+2(hw)2C以上就是Self-Attention的計算量,在此基礎上Multi-Head Self-Attention多了最后一步融合矩陣WoW_oWo?的計算量,也就是Bhw×C?WOC×C=Ohw×CB^{h w \times C} \cdot W_{O}^{C \times C}=O^{h w \times C} Bhw×C?WOC×C?=Ohw×C因此計算過量為4hwC2+2(hw)2C4hwC^2+2(hw)^2C4hwC2+2(hw)2C,對于W-MSA而言,由于輸入被劃分成了多個Window,我們假設每個Window的大小為M×MM\times MM×M,一共有hM×wM\frac{h}{M}\times\frac{w}{M}Mh?×Mw?個Window,每個Window都是Mutli-Head Self-Attention的計算量,因此總共的計算量為:(4(MC)2+2(M)4C)×hM×wM=4hwC2+2M2hwC(4(M C)^{2}+2(M)^{4} C) \times\frac{h}{M}\times\frac{w}{M} = 4 h w C^{2}+2 M^{2} h w C (4(MC)2+2(M)4C)×Mh?×Mw?=4hwC2+2M2hwC綜上所述:Ω(MSA)=4hwC2+2(hw)2C\Omega(\mathrm{MSA})=4 h w C^{2}+2(h w)^{2} C Ω(MSA)=4hwC2+2(hw)2CΩ(W?MSA)=4hwC2+2M2hwC\Omega(\mathrm{W-MSA})=4 h w C^{2}+2 M^{2} h w C Ω(W?MSA)=4hwC2+2M2hwC相較之下,W-MSA的計算量要小很多
SW-WSA的全稱為Shifted Windows Multi-Head Self-Attention,其目的主要是實現(xiàn)不同窗口間的信息交互,其原理如下圖所示:
其中window partition和cyclic shift的原理如下圖所示:
我們以3×33\times33×3的Window為例,從(a)到(b)即網(wǎng)格Shift的過程,Shift的大小原論文介紹是窗口大小的一半取整,因此3×33\times33×3的Window為Shift大小為1,Shift完成后就得到了圖(c)所示的9個Window,以最中間的Window為例,它其實是使用到了(a)中四個Window的信息,這也就是Window之間信息交互的模式,但是這樣存在一個問題就是9個Window導致計算量增大,為了解決這個問題,作者將圖(c)中帶顏色的區(qū)域進行移動至圖(d)所示,最后再重新劃分4個Window如圖(e)所示,這樣計算量和及逆行Shift之前就完全相同。
那么還有一個問題就是圖(e)這樣的形態(tài)雖然對計算量有收益,但是除了左上角的Window之外,其他三個Window實際上都是由兩個甚至四個子Window組成,他們不應在同一個Multi-Head Self-Attention中計算,為了解決這個問題,作者使用了masked MSA這樣一個模塊,實際操作將某一個特征的query和整個Window中的所有特征的key點乘后得到,在不和該特征屬于同一個子Window的點乘結果上減100,這樣經(jīng)過Softmax后,不屬于同一個子Window的權重就接近于零,后面輸出也就不會用到不屬于同一個子Window中的value,這樣說可能會有些抽象,沒理解的同學可以參考Swin-Transformer網(wǎng)絡結構詳解視頻中的講解。
在完成以上操作后,最后我們將輸出的特征都恢復到原來的位置就完成整個SW-WSA的流程。可以看到,SW-WSA在不增加計算量的基礎上,實現(xiàn)了窗口間的信息交互,這種操作確實很天才。從下圖實驗結果我們也可以看出來使用Shifted Windows確實可以帶來較大的收益。
2.2.2 Relative Position Bias
Relative Position Bias指的是在Self-Attention的計算過程中,在query和key點乘后加入一個和相對位置相關的bias,其本質是希望在Attention Map能夠進一步有所偏重,因此Self-Attention的公式就變成:Attention?(Q,K,V)=SoftMax?(QKT/d+B)V\operatorname{Attention}(Q, K, V)=\operatorname{SoftMax}\left(Q K^{T} / \sqrtze8trgl8bvbq+B\right) V Attention(Q,K,V)=SoftMax(QKT/d?+B)V下面我們主要來研究下這個B∈Rn×nB \in R^{n \times n}B∈Rn×n到底是啥,BBB并不是一個隨機初始化的參數(shù),其基本使用過程如下:
我覺得這其中最核心的部分就是就是這個相對位置到Bias Table的映射關系了,如下圖所示:
首先我們將各個像素的相對位置進行二維編碼(x,y)(x,y)(x,y),其中xxx表示相對當前像素的行偏移,yyy表示相對像素的列偏移,假設Window的大小為M×MM\times MM×M,對(x,y)(x, y)(x,y)進行排列組合發(fā)現(xiàn)一共由(2M?1)2(2M-1)^2(2M?1)2種可能,這也就是為什么Bias Table的大小為(2M?1)2(2M-1)^2(2M?1)2,接下來我們就需要建立一個二維編碼到一維編碼一一對應映射關系,關系的確定一共分為三步,:
上圖中的表格中的數(shù)字說明了這一變化過程,這一過程有點二進制的味道,我們可以觀察下,4的左邊永遠是5,4的上面永遠是7,這也就完成了Relative Position Bias的映射過程,接下來就去Bias Table取值更新即可,從下面這張對比表中我們可以看到,加上Relative Position Bias收益也是非常明顯的:
總結
以上是生活随笔為你收集整理的计算机视觉算法——Transformer学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 激光IMU融合——LIO-Mapping
- 下一篇: SLAM算法总结——经典SLAM算法框架