日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

计算机视觉算法——Transformer学习笔记

發(fā)布時(shí)間:2025/3/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机视觉算法——Transformer学习笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

算機(jī)視覺(jué)算法——Transformer學(xué)習(xí)筆記

  • 計(jì)算機(jī)視覺(jué)算法——Transformer學(xué)習(xí)筆記
    • 1. Vision Transformer
      • 1.1 網(wǎng)絡(luò)結(jié)構(gòu)
      • 1.2 關(guān)鍵知識(shí)點(diǎn)
        • 1.2.1 Self-Attention
        • 1.2.2 Positional Embedding
        • 1.2.3 Layer Normalization
    • 2. Swin Transformer
      • 2.1 網(wǎng)絡(luò)結(jié)構(gòu)
      • 2.2 關(guān)鍵知識(shí)點(diǎn)
        • 2.2.1 W-MSA和SW-WSA結(jié)構(gòu)
        • 2.2.2 Relative Position Bias

計(jì)算機(jī)視覺(jué)算法——Transformer學(xué)習(xí)筆記

清明假期被封在家里,我就利用這三天時(shí)間學(xué)習(xí)了下著名的Transfomer,參考的主要是Blibli UP主霹靂吧啦Wz的視頻教程,過(guò)程有不懂的我就自己查資料,補(bǔ)充了一些自己的理解觀點(diǎn),目前還沒(méi)有機(jī)會(huì)對(duì)Transformer進(jìn)行實(shí)踐,只是進(jìn)行了簡(jiǎn)單的理論學(xué)習(xí),有問(wèn)題歡迎讀者指出交流。
參考內(nèi)容:
11.1 Vision Transformer(vit)網(wǎng)絡(luò)詳解
Vision Transformer 超詳細(xì)解讀 (原理分析+代碼解讀) (一)
12.1 Swin-Transformer網(wǎng)絡(luò)結(jié)構(gòu)詳解

1. Vision Transformer

Transformer來(lái)源于2017年的一篇論文《Attention Is All You Need》,Transformer的提出最開(kāi)始是針對(duì)NLP領(lǐng)域的,在此之前,NLP領(lǐng)域里使用的主要是RNN、LSTM這樣一些網(wǎng)絡(luò),這些網(wǎng)絡(luò)都存在一些問(wèn)題,一方面是記憶長(zhǎng)度有限,另一方面是無(wú)法并行,而Transeformer理論上記憶長(zhǎng)度是無(wú)限長(zhǎng)的,并且可以做到并行化。

而Vision Transformer是2020年發(fā)表于CVPR的論文《An Image Worth 16x16 Words: Transformers for Image Recognition as Scale》提出的,論文性能對(duì)比如下:

1.1 網(wǎng)絡(luò)結(jié)構(gòu)

Vision Transform的網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示:

  • 首先將輸入圖片切分成16×16×316\times16\times316×16×3大小的Patch,然后將Patch經(jīng)過(guò)Embedding層進(jìn)行編碼,進(jìn)行編碼后每一個(gè)Patch就得到一個(gè)長(zhǎng)度為768×1768\times1768×1的向量,這個(gè)向量稱為T(mén)oken(可以理解為就是一路輸入),在代碼實(shí)現(xiàn)中中,是使用一個(gè)卷積核大小為16×1616\times1616×16,步距為161616的卷積核個(gè)數(shù)為768768768卷積層實(shí)現(xiàn)的,對(duì)于一個(gè)244×244×3244\times244\times3244×244×3的輸入圖像,通過(guò)卷積后就得到14×14×76814\times14\times76814×14×768特征層,然后我們將特征層的HHHWWW方向進(jìn)行展平就獲得一個(gè)196×768196\times768196×768的二維向量,也即196196196個(gè)Token。
  • 在以上基礎(chǔ)上,再加上一個(gè)Class Token,因?yàn)橐陨?span id="ozvdkddzhkzd" class="katex--inline">196196196個(gè)Token輸入Transformer,必然會(huì)有196196196個(gè)Token輸出,我們選取哪一個(gè)作為最后的輸出都不合適,因此作者Append的一路單獨(dú)用于輸出分類結(jié)果的Tocken,因此以上Transforer的輸入就變成一個(gè)197×768197\times768197×768的二維向量。緊接著,會(huì)進(jìn)行Positional Embedding操作,這一步的具體原理可以參考關(guān)鍵知識(shí)點(diǎn)。
  • 將以上加入了Positional Embedding的197×768197\times768197×768的二維向量輸入L個(gè)堆疊的的Transformer Encoder,最后從Class Token獲得輸出并輸入MLP Head并最終得到分類的結(jié)果
  • 其中,Position Encoder主要是由Norm Block、Multi-Head Attention Block和MLP Block構(gòu)成,MLP Block的結(jié)構(gòu)由Linear+GELU+Dropout+Linear+Dropout的結(jié)構(gòu)構(gòu)成,Norm Block和Multi-Head Attention的結(jié)構(gòu)可以參看下面的關(guān)鍵知識(shí)點(diǎn)。
    用于輸出的MLP Head可以為L(zhǎng)inear+Tanh+Linear的結(jié)構(gòu)或者直接為一層Linear,具體結(jié)構(gòu)可以根據(jù)不同數(shù)據(jù)集做適當(dāng)改變。

    論文中一共給出了三種網(wǎng)絡(luò)結(jié)構(gòu):

    其中Layer為T(mén)ransform Encoder重復(fù)堆疊的個(gè)數(shù),Hidden Size為通過(guò)Embedding層后每個(gè)Token的維度,MLP Size是Transformer Encoder中MLP Block第一個(gè)全連接的節(jié)點(diǎn)個(gè)數(shù),Heads代表Mutli-Head Attention的Head數(shù)。

    1.2 關(guān)鍵知識(shí)點(diǎn)

    1.2.1 Self-Attention

    Self-Attention是Transformer中最重要的模塊之一,Self-Attention最核心的公式就是下面這三個(gè):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?)下面我們先對(duì)第一個(gè)公式展開(kāi)來(lái)講,其過(guò)程分為如下圖所示:

    其中圖中最下方的x1x_1x1?x2x_2x2?為輸入向量,在Vision Transformer中就是輸入的圖像Patch,圖中最上方的b1b_1b1?b2b_2b2?為經(jīng)過(guò)Self-Attention編碼后輸出的特征,我將其中的步驟分為五步:

    Step1通過(guò)Embedding層將輸入向量映射到一個(gè)更高的維度上。在Vision Transformer中這里有一層卷積層構(gòu)成,這里我們可以先簡(jiǎn)單將其理解為將向量x1x_1x1?x2x_2x2?映射通過(guò)某個(gè)函數(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中這里是由三個(gè)MLP組成,如果我們忽略偏置的話,我們就可以將抽象為三個(gè)矩陣,WqW_qWq?WkW_kWk?WvW_vWv?三個(gè)矩陣的參數(shù)是可以學(xué)習(xí)的,且針對(duì)不同的aia_iai?參數(shù)是共享的。
    其中,qiq_iqi?是從aia_iai?中提取的用于進(jìn)行匹配的向量,我們稱為querykik_iki?是從aia_iai?中提取的待匹配的向量,我們稱為keyviv_ivi?是從aia_iai?中提取的用于描述信息的向量,我們成為value,在接下來(lái)的步驟中我們將利用不同aia_iai?querykey進(jìn)行點(diǎn)乘獲得權(quán)重,再利用該權(quán)重對(duì)value進(jìn)行加權(quán)平均或者最后的輸出。

    Step3依次遍歷所有的qiq_iqi?kik_iki?o(n2)o(n^2)o(n2)的計(jì)算復(fù)雜度進(jìn)行向量點(diǎn)乘獲得αi\alpha_iαi?αi\alpha_iαi?其實(shí)描述的是不同aia_iai?之間的一種相似性,由于是點(diǎn)乘,這里的αi\alpha_iαi?已經(jīng)是一個(gè)標(biāo)量α1,i=q1?ki/d\alpha_{1, i}=q^{1} \cdot k^{i} / \sqrtozvdkddzhkzd α1,i?=q1?ki/d?α2,i=q2?ki/d\alpha_{2, i}=q^{2} \cdot k^{i} / \sqrtozvdkddzhkzd α2,i?=q2?ki/d?.........其中ddd為向量的長(zhǎng)度。

    Step4αi\alpha_iαi?經(jīng)過(guò)一個(gè)Softmax進(jìn)行歸一化得到βi\beta_iβi?βi\beta_iβi?就是我們對(duì)viv_ivi?進(jìn)行加權(quán)的權(quán)重,因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">qiq_iqi?kik_iki?都是等長(zhǎng)的向量,因此上述Step3和Step4的操作其實(shí)就是qiq_iqi?kik_iki?組成的兩個(gè)矩陣QQQKKK進(jìn)行矩陣乘法:softmax?(QKTdk)\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right)softmax(dk??QKT?)

    Step5βi\beta_iβi?viv_ivi?進(jìn)行加權(quán)平均就得到最后輸出bib_ibi?,因此以上整個(gè)流程可以抽象為我們上述給出的第一個(gè)公式: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這部分操作其實(shí)就是一堆矩陣操作,如下圖所示,因此可以進(jìn)行GPU加速:

    將上述Self-Attention的流程整理清楚后,Multi-Head Self-Attention的計(jì)算過(guò)程如下圖所示:

    上圖展示的是head=2情況,可以看出來(lái),所謂Multi-Head其實(shí)就是將qiq_iqi?qkq_kqk?qvq_vqv?這幾個(gè)向量均分成幾部分,然后分別給計(jì)算后面的權(quán)重和加權(quán)求和結(jié)果,結(jié)構(gòu)非常類似于Group卷積,最后bi1b_{i1}bi1?bi2b_{i2}bi2?是通過(guò)Concatenate的操作輸出的。因此Mutli-Head的計(jì)算公式為: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)勢(shì)在哪兒呢?如下圖所示,綠色的部分是一個(gè)head的query和key,而紅色部分則是另一個(gè)head的query和key,我們可以看出來(lái),紅色head更關(guān)注全局信息,綠色head更關(guān)注局部信息,Multi-Head的存在其實(shí)就是是的網(wǎng)絡(luò)更加充分地利用了輸入的信息:

    了解了Self-Attention的結(jié)構(gòu)后,我們其實(shí)應(yīng)該能夠理解為什么Transformer的效果比傳統(tǒng)的CNN效果要好,使用CNN的時(shí)候一個(gè)卷積核只能獲得其感受野內(nèi)的信息,而感受野的范圍和大小是人為決定的,但是在Transformer中,是通過(guò)Self-Attention中去全局中搜索相關(guān)的信息,就像是感受野是的范圍和大小是通過(guò)學(xué)習(xí)獲得的,因此CNN可以看作是一種簡(jiǎn)化版的Transformer

    1.2.2 Positional Embedding

    從上述Self-Atttention或者M(jìn)utli-Head Self-Attention的結(jié)構(gòu)我們可以發(fā)現(xiàn)一個(gè)問(wèn)題,假如由三個(gè)輸入,我們修改后兩個(gè)輸入的順序,對(duì)于第一個(gè)輸入的結(jié)構(gòu)是完全沒(méi)有影響的,也就是說(shuō)“我和你”和“我你和“可能表征的是同一個(gè)意思,這種問(wèn)題的發(fā)生是因?yàn)镾elf-Attention模塊的輸入中并沒(méi)有位置相關(guān)的信息。解決該問(wèn)題的方法就是Positional Embedding,結(jié)構(gòu)如下圖所示:

    Position Embedding結(jié)構(gòu)其實(shí)就是原始的Embedding層aia_iai?加上一個(gè)Position Embedding的向量eie_iei?向量,然后再送入后面的運(yùn)算過(guò)程,向量eie_iei?通常是人工設(shè)定的一個(gè)值,那么為什么是采用相加這種方式來(lái)表達(dá)位置關(guān)系呢?有解釋如下:
    假設(shè)我們給每一個(gè)位置的xi∈R(d,1)x_{i} \in R(d, 1)xi?R(d,1)并上一個(gè)One-Hot編碼的向量pi∈R(N,1)p_{i} \in R(N, 1)pi?R(N,1),得到一個(gè)新的輸入向量xip∈R(d+N,1)x^{p}_{i} \in R(d+N, 1)xip?R(d+N,1),然后我們乘以一個(gè)變換矩陣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?因此我們可以得到一個(gè)結(jié)論,eie_iei?aia_iai?相加就等于原來(lái)的輸入xix_ixi?和表示位置的編碼pip_ipi?進(jìn)行Concatenate后再經(jīng)過(guò)一個(gè)變換的結(jié)果。在Vision Transformer中通過(guò)下面這樣一張圖來(lái)描述訓(xùn)練得到的不同輸入的Position Embedding向量的差異,越黃表示該輸入該位置的值與該位置作為真值的余弦相似度越大:

    論文中還對(duì)比了加入Positional Embedding和不加入Positional Embedding的結(jié)果上的區(qū)別:
    這個(gè)結(jié)果說(shuō)明,加入那種形式的Positional Embedding并不重要的,關(guān)鍵是要加上。

    1.2.3 Layer Normalization

    我們比較熟悉的Batch Normalization是針對(duì)CNN設(shè)計(jì)的,其作用主要是保證輸入卷積的Feature Map滿足一定的分布規(guī)律,因此Batch Normalization的做法是對(duì)Feature Map的每一個(gè)維度進(jìn)行標(biāo)準(zhǔn)化處理(即對(duì)某一個(gè)維度的所有通道及所有Sample的值進(jìn)行標(biāo)準(zhǔn)化),而在RNN場(chǎng)景,同一Batch中不同F(xiàn)eature的維度可能是不同的,如下圖所示,這就會(huì)導(dǎo)致**在某些維度進(jìn)行標(biāo)準(zhǔn)化處理時(shí),通道數(shù)過(guò)少甚至只有一個(gè)通道,這樣統(tǒng)計(jì)出來(lái)的均值和方差都不能反應(yīng)全局的統(tǒng)計(jì)分布,**因此Batch Normalization效果會(huì)變得非常差。

    針對(duì)這個(gè)問(wèn)題,由學(xué)者就提出了Layer Normalization,其和Batch Normalization的區(qū)別如下圖所示:

    可以看出來(lái),Layer Normalization是針對(duì)每一個(gè)Sample進(jìn)行標(biāo)準(zhǔn)化處理(及某一個(gè)Sample的所有通過(guò)維度和所有通道的值進(jìn)行標(biāo)注化),標(biāo)準(zhǔn)化處理的公式和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β是可學(xué)習(xí)參數(shù),用與恢復(fù)標(biāo)準(zhǔn)化后的特征分布。

    2. Swin Transformer

    Swin Transformer原論文名為《Swin Transformer: Hearchical Vision Tranformer using Shifted Windows》, 為2021年ICCV的Best Paper,Swin Tranformer和Vision Transformer的網(wǎng)絡(luò)結(jié)構(gòu)差別如下圖所示:

    可以看到Swin Transformer具備層次結(jié)構(gòu)的,每一層的特征圖由一個(gè)或多個(gè)Window構(gòu)成,不同層Window的大小不相同,每個(gè)Window經(jīng)過(guò)Self-Attention,Window之間是不進(jìn)行信息交流的;而Vision Transformer不具備層次結(jié)構(gòu)且每一層都是對(duì)整個(gè)特征圖進(jìn)行Self-Attention。算法性能對(duì)比如下:

    值得注意的一點(diǎn)是,Vision Transformer在ImageNet-1K的數(shù)據(jù)集上如果不經(jīng)過(guò)ImageNe-22K的預(yù)訓(xùn)練,其效果其實(shí)是不好的,但是Swin Transfomer卻能夠取得很好的效果。而在FLOPs這個(gè)參數(shù)上,Swin Transformer也要優(yōu)于Vision Transformer。

    2.1 網(wǎng)絡(luò)結(jié)構(gòu)

    Swin Transformer的網(wǎng)絡(luò)構(gòu)架如下圖(a)所示:

  • 圖(a)中每個(gè)Swin Transfomer Block的結(jié)構(gòu)包含圖(b)中兩種不同的結(jié)構(gòu),他們都是成對(duì)出現(xiàn)的,因此我們可以看到每個(gè)Swin Transfomer Block堆疊的都是偶數(shù)倍。
  • Patch Partition和Stage1模塊中的Linear Embedding原理如下圖所示:

    原圖大小為H×W×3{H} \times {W} \times 3H×W×3,我們將原圖拆分為16個(gè)Patch并按照深度方向進(jìn)行拼接就得到H4×W4×48\frac{H}{4} \times \frac{W}{4} \times 484H?×4W?×48大小的輸入,然后再經(jīng)過(guò)Linear Embedding層得到H4×W4×C\frac{H}{4} \times \frac{W}{4} \times C4H?×4W?×C大小的輸入。
  • Patch Merging的主要作用是進(jìn)行下采樣,經(jīng)過(guò)Patch Merging后,特征層高和寬會(huì)變成原來(lái)的一半,通道數(shù)翻倍,該模塊原理如下:
    其中第一步是從不同的Window選擇相同位置的像素組合,然后按照深度方向進(jìn)行Concatenate,再經(jīng)過(guò)Layer Normalization和一個(gè)線性層。
  • 2.2 關(guān)鍵知識(shí)點(diǎn)

    2.2.1 W-MSA和SW-WSA結(jié)構(gòu)

    W-MSA指的的Windows Multi-Head Self-Attention,前文有介紹的Multi-Head Self-Attention是在整個(gè)特征圖進(jìn)行計(jì)算,而W-MSA是將特征圖先均分為若干個(gè)Window,在Window上作用Multi-Head Self-Attention,這樣做的好處是可以減少計(jì)算量,缺點(diǎn)是窗口之間無(wú)法進(jìn)行信息交互,導(dǎo)致感受野變小。這里我們分別來(lái)計(jì)算下Multi-Head Self-Attention和W-MSA的計(jì)算量區(qū)別:

    首先我們知道Self-Attention公式如下:Attention?(Q,K,V)=SoftMax?(QKTd)V\operatorname{Attention}(Q, K, V)=\operatorname{SoftMax}\left(\frac{Q K^{T}}{\sqrtozvdkddzhkzd}\right) V Attention(Q,K,V)=SoftMax(d?QKT?)V我們假設(shè)輸入的輸入的特征矩陣A的大小為hw×Chw\times Chw×C,并且我們忽略SoftMax?\operatorname{SoftMax}SoftMaxd\sqrtozvdkddzhkzdd?的計(jì)算量,那么上述計(jì)算公式可以拆分成如下幾步: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我們知道對(duì)于矩陣乘法Aa×b×Bb×cA^{a\times b}\times B^{b\times c}Aa×b×Bb×c的計(jì)算量為a×b×ca\times b\times ca×b×c那么,上述三步的計(jì)算量總共是(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的計(jì)算量,在此基礎(chǔ)上Multi-Head Self-Attention多了最后一步融合矩陣WoW_oWo?的計(jì)算量,也就是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因此計(jì)算過(guò)量為4hwC2+2(hw)2C4hwC^2+2(hw)^2C4hwC2+2(hw)2C,對(duì)于W-MSA而言,由于輸入被劃分成了多個(gè)Window,我們假設(shè)每個(gè)Window的大小為M×MM\times MM×M,一共有hM×wM\frac{h}{M}\times\frac{w}{M}Mh?×Mw?個(gè)Window,每個(gè)Window都是Mutli-Head Self-Attention的計(jì)算量,因此總共的計(jì)算量為:(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的計(jì)算量要小很多

    SW-WSA的全稱為Shifted Windows Multi-Head Self-Attention,其目的主要是實(shí)現(xiàn)不同窗口間的信息交互,其原理如下圖所示:

    其中window partition和cyclic shift的原理如下圖所示:

    我們以3×33\times33×3的Window為例,從(a)到(b)即網(wǎng)格Shift的過(guò)程,Shift的大小原論文介紹是窗口大小的一半取整,因此3×33\times33×3的Window為Shift大小為1,Shift完成后就得到了圖(c)所示的9個(gè)Window,以最中間的Window為例,它其實(shí)是使用到了(a)中四個(gè)Window的信息,這也就是Window之間信息交互的模式,但是這樣存在一個(gè)問(wèn)題就是9個(gè)Window導(dǎo)致計(jì)算量增大,為了解決這個(gè)問(wèn)題,作者將圖(c)中帶顏色的區(qū)域進(jìn)行移動(dòng)至圖(d)所示,最后再重新劃分4個(gè)Window如圖(e)所示,這樣計(jì)算量和及逆行Shift之前就完全相同。

    那么還有一個(gè)問(wèn)題就是圖(e)這樣的形態(tài)雖然對(duì)計(jì)算量有收益,但是除了左上角的Window之外,其他三個(gè)Window實(shí)際上都是由兩個(gè)甚至四個(gè)子Window組成,他們不應(yīng)在同一個(gè)Multi-Head Self-Attention中計(jì)算,為了解決這個(gè)問(wèn)題,作者使用了masked MSA這樣一個(gè)模塊,實(shí)際操作將某一個(gè)特征的query和整個(gè)Window中的所有特征的key點(diǎn)乘后得到,在不和該特征屬于同一個(gè)子Window的點(diǎn)乘結(jié)果上減100,這樣經(jīng)過(guò)Softmax后,不屬于同一個(gè)子Window的權(quán)重就接近于零,后面輸出也就不會(huì)用到不屬于同一個(gè)子Window中的value,這樣說(shuō)可能會(huì)有些抽象,沒(méi)理解的同學(xué)可以參考Swin-Transformer網(wǎng)絡(luò)結(jié)構(gòu)詳解視頻中的講解。

    在完成以上操作后,最后我們將輸出的特征都恢復(fù)到原來(lái)的位置就完成整個(gè)SW-WSA的流程。可以看到,SW-WSA在不增加計(jì)算量的基礎(chǔ)上,實(shí)現(xiàn)了窗口間的信息交互,這種操作確實(shí)很天才。從下圖實(shí)驗(yàn)結(jié)果我們也可以看出來(lái)使用Shifted Windows確實(shí)可以帶來(lái)較大的收益。

    2.2.2 Relative Position Bias

    Relative Position Bias指的是在Self-Attention的計(jì)算過(guò)程中,在query和key點(diǎn)乘后加入一個(gè)和相對(duì)位置相關(guān)的bias,其本質(zhì)是希望在Attention Map能夠進(jìn)一步有所偏重,因此Self-Attention的公式就變成:Attention?(Q,K,V)=SoftMax?(QKT/d+B)V\operatorname{Attention}(Q, K, V)=\operatorname{SoftMax}\left(Q K^{T} / \sqrtozvdkddzhkzd+B\right) V Attention(Q,K,V)=SoftMax(QKT/d?+B)V下面我們主要來(lái)研究下這個(gè)B∈Rn×nB \in R^{n \times n}BRn×n到底是啥,BBB并不是一個(gè)隨機(jī)初始化的參數(shù),其基本使用過(guò)程如下:

  • 初始化一個(gè)維度(2n?1)2(2n-1)^2(2n?1)2的Tensor作為Bias Table;
  • 構(gòu)建一個(gè)從相對(duì)位置到Bias Table key的映射
  • 前向傳播中使用相對(duì)位置根據(jù)映射查詢Bias Table;
  • 反向傳播中更新Bias Table;
  • 我覺(jué)得這其中最核心的部分就是就是這個(gè)相對(duì)位置到Bias Table的映射關(guān)系了,如下圖所示:

    首先我們將各個(gè)像素的相對(duì)位置進(jìn)行二維編碼(x,y)(x,y)(x,y),其中xxx表示相對(duì)當(dāng)前像素的行偏移,yyy表示相對(duì)像素的列偏移,假設(shè)Window的大小為M×MM\times MM×M,對(duì)(x,y)(x, y)(x,y)進(jìn)行排列組合發(fā)現(xiàn)一共由(2M?1)2(2M-1)^2(2M?1)2種可能,這也就是為什么Bias Table的大小為(2M?1)2(2M-1)^2(2M?1)2,接下來(lái)我們就需要建立一個(gè)二維編碼到一維編碼一一對(duì)應(yīng)映射關(guān)系,關(guān)系的確定一共分為三步,:

  • Step1: 將所有像素的行列編碼都加上M?1M-1M?1
  • Step2: 將所有像素的行編碼相加2M?12M-12M?1
  • Step3: 將所有像素的行列編碼相加就得到最終的一維編碼;
  • 上圖中的表格中的數(shù)字說(shuō)明了這一變化過(guò)程,這一過(guò)程有點(diǎn)二進(jìn)制的味道,我們可以觀察下,4的左邊永遠(yuǎn)是5,4的上面永遠(yuǎn)是7,這也就完成了Relative Position Bias的映射過(guò)程,接下來(lái)就去Bias Table取值更新即可,從下面這張對(duì)比表中我們可以看到,加上Relative Position Bias收益也是非常明顯的:

    總結(jié)

    以上是生活随笔為你收集整理的计算机视觉算法——Transformer学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。