<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Vision Transformer 必讀系列之圖像分類綜述(二): Attention-based

          共 43858字,需瀏覽 88分鐘

           ·

          2022-03-16 08:15

          編輯丨GiantPandaCV


          1. Transformer


          論文題目:Attention is All You Need論文地址:https://arxiv.org/abs/1706.03762
          Transformer 結(jié)構(gòu)是 Google 在 2017 年為解決機(jī)器翻譯任務(wù)(例如英文翻譯為中文)而提出,從題目中可以看出主要是靠 Attention 注意力機(jī)制,其最大特點(diǎn)是拋棄了傳統(tǒng)的 CNN 和 RNN,整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)完全是由 Attention 機(jī)制組成。為此需要先解釋何為注意力機(jī)制,然后再分析模型結(jié)構(gòu)。

          1.1 Attention 注意力機(jī)制


          人生來就有注意力機(jī)制,看任何畫面,我們會(huì)自動(dòng)聚焦到特定位置特定物體上。此處的 Attention 機(jī)制也是同一個(gè)含義,對(duì)于需要的任何模態(tài),不管是圖像、文本、點(diǎn)云還是其他,我們都希望網(wǎng)絡(luò)通過訓(xùn)練能夠自動(dòng)聚焦到有意義的位置,例如圖像分類和檢測(cè)任務(wù),網(wǎng)絡(luò)通過訓(xùn)練能夠自動(dòng)聚焦到待分類物體和待檢測(cè)物體上。注意力機(jī)制不是啥新鮮概念,視覺算法中早已廣泛應(yīng)用,典型的如 SENet。
          8cd0cf45224833dcd6e9a60c344796fe.webp
          利用 Squeeze-and-Excitation 模塊計(jì)算注意力權(quán)重概率分布,然后作用于特征圖上實(shí)現(xiàn)對(duì)每個(gè)通道重加權(quán)功能。
          可以舉一個(gè)更簡(jiǎn)單的例子,假設(shè)有一個(gè)訓(xùn)練好的分類網(wǎng)絡(luò),輸入一張圖片,訓(xùn)練好的分類網(wǎng)絡(luò)權(quán)重 W 和圖片 X 進(jìn)行注意力計(jì)算,從 X 中提取能夠有助于分類的特征,該特征最終可以作為類別分類依據(jù)。W 和 X 都是矩陣,要想利用 W 矩陣來達(dá)到重加權(quán) X 目的,等價(jià)于計(jì)算 W 和 X 的相似度(點(diǎn)乘),然后將該相似度變換為權(quán)重概率分布,再次作用于 X 上就可以。
          以一個(gè)簡(jiǎn)單貓狗二分類例子說明。網(wǎng)絡(luò)最終輸出是 2x1 的向量,第一個(gè)數(shù)大則表示貓類別,否則為狗類別,假設(shè)網(wǎng)絡(luò)已經(jīng)訓(xùn)練好了,其 W 為 shape 為 2x1 的向量,值為 [[0.1, 0.5]],X 表示輸入圖片 shape 也是 2x1,其值為 [[0.1, 0.8]],可以看出其類別是狗,采用如下的計(jì)算步驟即可正確分類:
          • W 和 X 的轉(zhuǎn)置相乘,即計(jì)算 W 中每個(gè)值和 X 中每個(gè)值的相似度,得到 2x2 矩陣,值為 [[0.01,0.08], [0.05,0.4]]。

          • 第二個(gè)維度進(jìn)行 Softmax,將其轉(zhuǎn)化為概率權(quán)重圖即為 [[0.4825, 0.5175], [0.4134, 0.5866]]。

          • 將上述概率權(quán)重乘以 X,得到 shape 為 2x1 輸出,值為 [[0.4622, 0.5106]]。

          • 此時(shí)由于第二個(gè)值大,所以正確分類為狗。


          X 是含有狗的圖片矩陣,能夠正確分類的前提是訓(xùn)練好的 W 矩陣中第二個(gè)數(shù)大于第一個(gè)數(shù)??梢院?jiǎn)單理解上述過程是計(jì)算 W 和 X 的相似度,如果兩個(gè)向量相似(都是第二個(gè)比第一個(gè)數(shù)大),那么就分類為狗,否則就分類為貓


          import torch
          W = torch.tensor([[0.1, 0.5]]).view([1, -1, 1])X = torch.tensor([[0.1, 0.8]]).view([1, -1, 1])# 1 計(jì)算兩個(gè)向量相似度attn_output_weights = torch.bmm(W, X.transpose(1, 2))# 2 轉(zhuǎn)換為概率分布attn_output_weights = torch.softmax(attn_output_weights, dim=-1)# 3 注意力加權(quán)cls = torch.bmm(attn_output_weights, X)[0]print(cls)

          上述計(jì)算過程可以用如下公式表示:
          4dfc0b1f4a223402e833da963429bda3.webp
          對(duì)應(yīng)到上面例子,Q 就是訓(xùn)練好的 W 矩陣,K 是圖片輸入,V 和 K 相等,其通用解釋為利用 Q 查詢矩陣和 K 矩陣進(jìn)行相似度計(jì)算,然后轉(zhuǎn)換為概率分布,此時(shí)概率值大的位置表示兩者相似度大的部分,然后將概率分布乘上 V 值矩陣,從而用注意力權(quán)重分布加權(quán)了 V 矩陣,也就改變了 V 矩陣本身的分布。如果注意力機(jī)制訓(xùn)練的很好,那么提取的 V 應(yīng)該就是我們想要的信息。分母 d_k 的平方根是為了避免梯度消失,當(dāng)向量值非常大的時(shí)候,Softmax 函數(shù)會(huì)將幾乎全部的概率分布都分配給了最大值對(duì)應(yīng)的位置,也就是說所謂的銳化,通過除以分母可以有效避免梯度消失問題,穩(wěn)定訓(xùn)練過程。
          上述公式就是論文中提出的最重要的 Scaled Dot-Product Attention 計(jì)算公式,先利用點(diǎn)乘計(jì)算 QK 矩陣的相似度,除以分母 d_k 平方根進(jìn)行 Scaled 操作,然后 Softmax 操作將其轉(zhuǎn)換為概率乘以 V 實(shí)現(xiàn) Attention 功能。
          需要注意:為了讓上面公式不會(huì)報(bào)錯(cuò),其 Shape 關(guān)系必須為 Q - (N, M),K - (P, M),V - (P, G), 一般來說 K 和 V Shape 相同,但是 Q Shape 不一定和 K 相同。通過靈活地改變這些維度就可以控制注意力層的計(jì)算復(fù)雜度,后續(xù)大部分改進(jìn)算法都有利用這一點(diǎn)。

          1.2 Transformer 結(jié)構(gòu)分析


          Transformer 是為了解決機(jī)器翻譯任務(wù)而提出。機(jī)器翻譯是一個(gè)歷史悠久的問題,可以理解為序列轉(zhuǎn)序列問題,也就是我們常說的 seq2seq 結(jié)構(gòu),解決這類問題一般是采用 encoder-decoder 結(jié)構(gòu),Transformer 也沿用了這種結(jié)構(gòu)。翻譯任務(wù)一個(gè)常規(guī)的解決方案如下所示:
          a1e8ec0d82970ad7edd8122e7e6fa85c.webp
          對(duì)應(yīng)到 Transformer 中的一個(gè)更具體的結(jié)構(gòu)為:
          1a5edce3898fa86e2d8813fe418ddff0.webp
          主要包括編碼器和解碼器組件,編碼器包括自注意力模塊(QKV 來自同一個(gè)輸入)和前向網(wǎng)絡(luò),解碼器和編碼器類似,只不過內(nèi)部多了編碼器和解碼器交互的交叉注意力模塊。
          通常來說,標(biāo)準(zhǔn)的 Transformer 包括 6 個(gè)編碼器和 6 個(gè)解碼器串行。
          1. 編碼器內(nèi)部接收源翻譯輸入序列,通過自注意力模塊提取必備特征,通過前向網(wǎng)絡(luò)對(duì)特征進(jìn)行進(jìn)一步抽象。

          2. 解碼器端輸入包括兩個(gè)部分,一個(gè)是目標(biāo)翻譯序列經(jīng)過自注意力模塊提取的特征,一個(gè)是編碼器提取的全局特征,這兩個(gè)輸入特征向量會(huì)進(jìn)行交叉注意力計(jì)算,抽取有利于目標(biāo)序列分類的特征,然后通過前向網(wǎng)絡(luò)對(duì)特征進(jìn)行進(jìn)一步抽象。

          3. 堆疊多個(gè)編碼器和解碼器,下一個(gè)編解碼器接收來自上一個(gè)編解碼的輸出,構(gòu)成串行結(jié)構(gòu)不斷抽取,最后利用解碼器輸出進(jìn)行分類即可。


          Transformer 完整結(jié)構(gòu)如下所示:
          e6001d91c014dddddab7822cb4e72286.webp
          編碼器基本組件包括:源句子詞嵌入模塊 Input Embedding、位置編碼模塊 Positional Encoding、多頭自注意力模塊 Muti-Head Attention、前向網(wǎng)絡(luò)模塊 Feed Forward 以及必要的 Norm、Dropout 和殘差模塊。
          解碼器基本組件類似包括:目標(biāo)句子詞嵌入模塊 ?Output Embedding、位置編碼模塊 Positional Encoding、帶 mask 的自注意力模塊 Masked Muti-Head Attention、交叉互注意力模塊 ?Muti-Head Attention、前向網(wǎng)絡(luò)模塊 ?Feed Forward 、分類頭模塊 Linear+Softmax 以及必要的 Norm、Dropout 和殘差模塊。
          由于本文重點(diǎn)是分析視覺方面的 Transformer,故沒有必要對(duì)機(jī)器翻譯過程進(jìn)行深入解析,讀者只需要理解每個(gè)模塊的作用即可,而且視覺分類 Transformer 任務(wù)和 NLP 機(jī)器翻譯任務(wù)不一樣,實(shí)際上也不需要解碼器模塊,相比 NLP 任務(wù)會(huì)簡(jiǎn)單很多。

          1.2.1 編碼器基本組件


          (1) 源句子詞嵌入模塊 Input Embedding
          機(jī)器翻譯是句子輸入,句子輸出,每個(gè)句子由單詞構(gòu)成,將句子編碼成程序可以理解的向量過程就叫做詞嵌入過程,也就是常說的 Word2Vec,對(duì)應(yīng)到圖像中稱為 Token 化過程即如何將圖像轉(zhuǎn)換為更具語義的 Token,Token 概念會(huì)在 ViT 中詳細(xì)描述。
          (2) 多頭自注意力模塊 Muti-Head Attention
          4cb087ecf2f43d090f987f1191a6751e.webp
          在 1.1 小節(jié)已經(jīng)詳細(xì)說明了注意力計(jì)算過程。左邊是最簡(jiǎn)單的 Scaled Dot-Product Attention,單純看上圖你可以發(fā)現(xiàn)沒有任何可學(xué)習(xí)參數(shù),那么其存在的意義是啥?實(shí)際上可學(xué)習(xí)參數(shù)在 QKV 映射矩陣中,在自注意力模塊中會(huì)對(duì)輸入的向量分別乘上可學(xué)習(xí)映射矩陣 W_Q、W_K 和 W_V,得到真正的 Q、K 和 V 輸入,然后再進(jìn)行 Scaled Dot-Product Attention 計(jì)算。
          為了增加注意力特征提取的豐富性,不會(huì)陷入某種局部特性中,一般會(huì)在注意力層基礎(chǔ)上(單頭注意力層)引入多個(gè)投影頭,將 QKV 特征維度平均切分為多個(gè)部分(一般分成 8 部分),每個(gè)部分單獨(dú)進(jìn)行自注意力計(jì)算,計(jì)算結(jié)果進(jìn)行拼接 。在特征維度平均切分,然后單獨(dú)投影、計(jì)算,最后拼接可以迫使提取的注意力特征更加豐富。也就是上面的多頭注意力模塊 Multi-Head Attention。
          (3) 前向網(wǎng)絡(luò)模塊 Feed Forward
          前向網(wǎng)絡(luò)模塊主要是目的是對(duì)特征進(jìn)行變換,其單獨(dú)作用于每個(gè)序列(只對(duì)最后一個(gè)特征維度進(jìn)行變換)。由于沒有結(jié)構(gòu)圖,故直接貼相關(guān)代碼,包括兩個(gè) Position-wise FC 層、激活層、Dropout層和 LayerNorm 層。


          class PositionwiseFeedForward(nn.Module):    ''' A two-feed-forward-layer module '''
          def __init__(self, d_in, d_hid, dropout=0.1): super().__init__() # 兩個(gè) fc 層,對(duì)最后的維度進(jìn)行變換 self.w_1 = nn.Linear(d_in, d_hid) # position-wise self.w_2 = nn.Linear(d_hid, d_in) # position-wise self.layer_norm = nn.LayerNorm(d_in, eps=1e-6) self.dropout = nn.Dropout(dropout)
          def forward(self, x): residual = x
          x = self.w_2(F.relu(self.w_1(x))) x = self.dropout(x) x += residual
          x = self.layer_norm(x)
          return x


          (4) Norm、Dropout 和殘差模塊
          在每個(gè)注意力層后面和前向網(wǎng)絡(luò)后都會(huì)接入 Dropout 、殘差模塊和 ?Layer Norm 模塊。這些必要的措施對(duì)整個(gè)算法的性能提升非常關(guān)鍵。至于為啥用 Layer Norm 而不是 Batch Norm ,原因是機(jī)器翻譯任務(wù)輸入的句子不一定是同樣長(zhǎng)的,組成 Batch 訓(xùn)練時(shí)候會(huì)存在大量 Padding 操作,如果在 Batch 這個(gè)維度進(jìn)行 Norm 會(huì)出現(xiàn)大量無效統(tǒng)計(jì),導(dǎo)致 Norm 值不穩(wěn)定,而 ?Layer Norm 是對(duì)每個(gè)序列單獨(dú)計(jì)算,不考慮 Batch 影響,這樣比較符合不定長(zhǎng)序列任務(wù)學(xué)習(xí)任務(wù)。當(dāng)然如果換成圖像分類任務(wù),則可以考慮使用 BN 層,后續(xù)有算法是直接采用 BN 的。
          (5) 位置編碼 Positional Encoding
          考慮一個(gè)分類任務(wù),輸入一段句子判斷是疑問句還是非疑問句?現(xiàn)在有兩條語句分別是:
          • 不準(zhǔn)在地鐵上吃東西

          • 在地鐵上吃東西準(zhǔn)不


          自注意力層的計(jì)算不會(huì)考慮字符間的順序,因?yàn)槊總€(gè)字符都是單獨(dú)和全局向量算相似度,也就是說上面兩個(gè)句子輸入進(jìn)行注意力計(jì)算,輸出的向量值是相同的,只不過相對(duì)位置有變化。如果我們對(duì)輸出向量求和后值大于 0 還是小于 0 作為分類依據(jù),那么上面兩個(gè)句子輸出相加值是完全相同的,那就始終無法區(qū)分到底是疑問句還是非疑問句,這就是我們常說的 Transformer 具有位置不變性。要解決這個(gè)問題,只需要讓模型知道輸入語句是有先后順序的,位置編碼可以解決這個(gè)問題。
          加入位置信息的方式非常多,最簡(jiǎn)單的可以是直接將輸入序列中的每個(gè)詞按照絕對(duì)坐標(biāo) 0,1,2 編碼成相同長(zhǎng)度的向量,然后和詞向量相加即可。作者實(shí)際上提出了兩種方式:
          • 網(wǎng)絡(luò)自動(dòng)學(xué)習(xí),直接全 0 初始化向量,然后和詞向量相加,通過網(wǎng)絡(luò)學(xué)習(xí)來學(xué)習(xí)位置信息。

          • 自己定義規(guī)則,規(guī)則自己定,只要能夠區(qū)分輸入詞順序即可,常用的是 sincos 編碼。


          實(shí)際訓(xùn)練選擇哪一種位置編碼方式發(fā)現(xiàn)效果一致,但是不管哪一種位置編碼方式都應(yīng)該充分考慮在測(cè)試時(shí)候序列不定長(zhǎng)問題,可能會(huì)出現(xiàn)測(cè)試時(shí)候非常長(zhǎng)的訓(xùn)練沒有見過的長(zhǎng)度序列,后面會(huì)詳細(xì)說明

          1.2.2 解碼器基本組件


          其大部分組件都和編碼器相同,唯一不同的是自注意力模塊帶有 mask,還額外引入了一個(gè)交叉注意力模塊以及分類頭模塊。
          (1) 帶 mask 的自注意力模塊
          注意這個(gè)模塊的輸入是目標(biāo)序列轉(zhuǎn)化為詞向量后進(jìn)行自注意力計(jì)算。機(jī)器翻譯是一個(gè) seq2seq 任務(wù),其真正預(yù)測(cè)是:最開始輸入開始解碼 token 代表解碼開始,解碼出第一個(gè)詞后,將前面已經(jīng)解碼出的詞再次輸入到解碼器中,按照順序一個(gè)詞一個(gè)詞解碼,最后輸出解碼結(jié)束 token,表示翻譯結(jié)束。
          也就是當(dāng)解碼時(shí),在解碼當(dāng)前詞的時(shí)候?qū)嶋H上不知道下一個(gè)詞是啥,但在訓(xùn)練時(shí),是將整個(gè)目標(biāo)序列一起輸入,然而注意力計(jì)算是全局的,每個(gè)目標(biāo)單詞都會(huì)和整個(gè)目標(biāo)句子計(jì)算自注意力,這種訓(xùn)練和測(cè)試階段的不一致性無法直接用于預(yù)測(cè)。為此我們需要在訓(xùn)練過程中計(jì)算當(dāng)前詞自注意力時(shí)候手動(dòng)屏蔽掉后面的詞,讓模型不知道后面詞。具體實(shí)現(xiàn)就是輸入一個(gè) mask 來覆蓋掉后面的詞。
          由于這種特性是只存在于 NLP 領(lǐng)域,圖片中不存在,故不再進(jìn)行更深入分析。
          (2) 交叉注意力
          交叉注意力模塊和自注意力模塊相同,只不過其 QKV 來源不同,Q 來自解碼器,KV 來自編碼器,交叉注意力模塊會(huì)利用 Q 來提取編碼器提取的特征 KV,然后進(jìn)行分類。
          (3) 分類頭
          分類頭就是普通的線性映射,轉(zhuǎn)換輸出維度為分類個(gè)數(shù),然后采用 CE Loss 進(jìn)行訓(xùn)練即可。

          1.3 總結(jié)


          Transformer 結(jié)構(gòu)內(nèi)部存在多個(gè)組件,但是最核心的還是注意力模塊,在原始論文中作者也引入了大量的可視化分析來證明注意力模塊的作用,有興趣的建議閱讀原文??赡茏髡咦约阂矝]有想到這篇論文會(huì)在視覺領(lǐng)域引起另一個(gè)全新的風(fēng)尚,開辟出一條新的看起來前途一片光明的道路。
          afc0efdf60f8edefc7b7e23550593021.webp

          圖片來自 A Survey of Visual Transformers

          網(wǎng)址:https://arxiv.org/abs/2111.06091


          2. Vision Transformer


          論文題目:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale論文地址:https://arxiv.org/abs/2010.11929
          ViT 是第一篇成功將 Transformer 引入到視覺領(lǐng)域且成功的嘗試,開辟了視覺 Transformer 先河。其結(jié)構(gòu)圖如下所示:
          238322256cba4a564ba4f41b3aa88ee1.webp
          其做法非常簡(jiǎn)單,簡(jiǎn)要概況為:
          • 將圖片分成無重疊的固定大小 Patch (例如 16x16),然后將每個(gè) Patch 拉成一維向量, n 個(gè) Patch 相當(dāng)于 NLP 中的輸入序列長(zhǎng)度(假設(shè)輸入圖片是 224x224,每個(gè) patch 大小是 16x16,則 n 是 196),而一維向量長(zhǎng)度等價(jià)于詞向量編碼長(zhǎng)度(假設(shè)圖片通道是 3, 則每個(gè)序列的向量長(zhǎng)度是 768)。

          • 考慮到一維向量維度較大,需要將拉伸后的 Patch 序列經(jīng)過線性投影 (nn.Linear) 壓縮維度,同時(shí)也起到特征變換功能,這兩個(gè)步驟可以稱為圖片 Token 化過程 (Patch Embedding)。

          • 為了方便后續(xù)分類,作者還額外引入一個(gè)可學(xué)習(xí)的 Class Token,該 Token 插入到圖片 token 化后所得序列的開始位置。

          • 將上述序列加上可學(xué)習(xí)的位置編碼輸入到 N 個(gè)串行的 Transformer 編碼器中進(jìn)行全局注意力計(jì)算和特征提取,其中內(nèi)部的多頭自注意模塊用于進(jìn)行 Patch 間或者序列間特征提取,而后面的 Feed Forward (Linear+ GELU+Dropout+ Linear+ Dropout) 模塊對(duì)每個(gè) Patch 或者序列進(jìn)行特征變換。

          • 將最后一個(gè) Transformer 編碼器輸出序列的第 0 位置( Class Token 位置對(duì)應(yīng)輸出)提取出來,然后后面接 MLP 分類后,然后正常分類即可。


          可以看出,圖片分類無需 Transformer 解碼器,且編碼器幾乎沒有做任何改動(dòng),針對(duì)圖像分類任務(wù),只需單獨(dú)引入一個(gè) Image to Token 操作和 Class Token 的概念即可。
          如何理解 Token?個(gè)人覺得任何包括圖片更加高級(jí)的語義向量都可以叫做 Token,這個(gè)概念在 NLP 中應(yīng)用非常廣泛,表征離散化后的高級(jí)單詞語義,在圖像中則可以認(rèn)為是將圖像轉(zhuǎn)化為離散的含更高級(jí)語義的向量。
          ViT 證明純 Transformer 也可以取得非常好的效果,相比 CNN 在數(shù)據(jù)量越大的情況下優(yōu)勢(shì)更加明顯,但是 ViT 也存在如下問題:
          • 不采用超大的 JFT-300M 數(shù)據(jù)集進(jìn)行預(yù)訓(xùn)練,則效果無法和 CNN 媲美,原因應(yīng)該是 Transformer 天然的全局注意力計(jì)算,沒有 CNN 這種 Inductive Bias 能力,需要大數(shù)據(jù)才能發(fā)揮其最大潛力。

          • ViT 無法直接適用于不同尺寸圖片輸入,因?yàn)?Patch 大小是固定的,當(dāng)圖片大小改變,此時(shí)序列長(zhǎng)度就會(huì)改變,位置編碼就無法直接適用了,ViT 解決辦法是通過插值,這種做法一般會(huì)造成性能損失,需要通過 Finetune 模型來解決,有點(diǎn)麻煩。

          • 因?yàn)槠渲蓖草敵鼋Y(jié)構(gòu),無法直接應(yīng)用于下游密集任務(wù)。


          后面的文章對(duì)上述缺點(diǎn)采用了各種各樣的改進(jìn),并提出了越來越先進(jìn)的處理手段,推動(dòng)了視覺 Transformer 的巨大進(jìn)步。


          3. 全局概述


          由于內(nèi)容非常多,為了更容易理解,我在拆解模塊的基礎(chǔ)上對(duì)每個(gè)模塊進(jìn)行分析,而不是對(duì)某篇文章進(jìn)行概括。綜述部分的分析流程按照結(jié)構(gòu)圖順序描述,我將近期圖像分類 Vision Transformer 發(fā)展按照 ViT 中是否包括自注意層模塊來劃分,包括:
          1. Attention-based, 這類算法是目前主流研究改進(jìn)方向,包括了 Transformer 中最核心的自注意力模塊。

          2. MLP-based, 這類算法不需要核心的自注意力模塊,而是簡(jiǎn)單的通過 MLP 代替,也可以取得類似效果。

          3. ConvMixer-based,這類算既不需要自注意力模塊,也不是單純依靠 MLP,而是內(nèi)部混合了部分 Conv 算子來實(shí)現(xiàn)類似功能。

          4. General architecture analysis,在這三類算法基礎(chǔ)上也有很多學(xué)者在探討整個(gè) Transformer 架構(gòu),其站在一個(gè)更高的維度分析問題,不局限于是否包括自注意力模塊,屬于整體性分析。


          在上述三個(gè)方向中,Attention-based 是目前改進(jìn)最多,最熱門的,也是本綜述的核心。本文按照 3 個(gè)分類順序依次分析,最后進(jìn)行通用架構(gòu)分析。通過 General architecture analysis 部分可以深化Attention-based、MLP-based 和 ConvMixer-based 三者的聯(lián)系和區(qū)別。本文僅僅涉及 Attention-based 部分。

          3.1 Attention-based


          Attention-based 表示這類算法必然包括注意力模塊,我們將按照廣度優(yōu)先順序進(jìn)行一次分析。
          55397869b831f3c26cb24c1d92f555e4.webp
          繼 ViT 后,我們將其發(fā)展分成兩條線路:訓(xùn)練策略和模型改進(jìn)。
          其中訓(xùn)練策略表示目前主流對(duì) ViT 模型的訓(xùn)練改進(jìn)方式,而模型改進(jìn)則是對(duì)各個(gè)部件進(jìn)行改進(jìn)。
          • 訓(xùn)練策略包括兩篇論文:DeiT 和 Token Labeling。兩者提出的出發(fā)點(diǎn)一致,都是為了克服 ViT 需要 JFT-300M 大數(shù)據(jù)集進(jìn)行預(yù)訓(xùn)練的缺點(diǎn)。DeiT 是通過引入蒸餾學(xué)習(xí)解決,而 Token Labeling 通過引入顯著圖然后施加密集監(jiān)督解決。后續(xù)發(fā)展中大部分算法都是參考了 DeiT 的訓(xùn)練策略和超參設(shè)置,具有非常大的參考價(jià)值。


          • 模型改進(jìn)方面,我將其分成了 6 個(gè)組件以及其他方面的改進(jìn),6 個(gè)組件包括:

          1. Token 模塊,即如何將 image 轉(zhuǎn) token 以及 token 如何傳遞給下一個(gè)模塊

          2. 位置編碼模塊

          3. 注意力模塊,這里一般都是自注意力模塊

          4. Fead Forward (FFN) 模塊

          5. Norm 模塊位置

          6. 分類預(yù)測(cè)頭模塊


          下面按照訓(xùn)練策略和模型改進(jìn)順序分析。

          3.1.1 訓(xùn)練策略


          訓(xùn)練策略解決 ViT 需要大數(shù)據(jù)先預(yù)訓(xùn)練問題以及超參有待優(yōu)化問題。

          3.1.1.1 DeiT


          如果說 ViT 開創(chuàng)了 Transformer 在視覺任務(wù)上面的先河,那么 DeiT 的出現(xiàn)則解決了 ViT 中最重要的問題:如果不采用超大的 JFT-300M 數(shù)據(jù)集進(jìn)行預(yù)訓(xùn)練,則效果無法和 CNN 媲美。在單個(gè)節(jié)點(diǎn) 8 張 V100 且無需額外數(shù)據(jù)的情況下,用不到 3 天的時(shí)間訓(xùn)練所提的 ViT(86M 參數(shù)),在 ImageNet 上單尺度測(cè)試達(dá)到了 83.1% 的 top-1 準(zhǔn)確率。
          DeiT 核心是引入蒸餾手段加上更強(qiáng)的 Aug 和更優(yōu)異的超參設(shè)置。其蒸餾的核心做法如下所示:
          a95caf40abc1027dde69d9323d0dafb0.webp
          ViT 的 Class Token 是加到圖片輸入序列的前面,那么蒸餾 Token 可以插到輸入序列的后面,當(dāng)然插入到哪個(gè)位置其實(shí)無所謂,你也可以插入到 Class Token 后面,經(jīng)過 Transformer 編碼器輸出的序列相比 ViT 也會(huì)多一個(gè),然后額外的一個(gè)輸出 Token 經(jīng)過線性層輸出相同類別通道,最后進(jìn)行蒸餾學(xué)習(xí)。
          對(duì)于蒸餾學(xué)習(xí)來說,做法通常有兩個(gè):
          • Soft 蒸餾,即學(xué)生模型和教師模型預(yù)測(cè)的 Softmax 概率分布值計(jì)算 KL Loss。

          • Hard 蒸餾,即教師模型預(yù)測(cè)的 Softmax 概率分布值中,值最大對(duì)應(yīng)的類別作為標(biāo)簽,然后和學(xué)生模型預(yù)測(cè)的 Softmax 概率分布值計(jì)算 CE Loss。


          蒸餾學(xué)習(xí)中,通常教師模型會(huì)選擇一個(gè)比學(xué)生模型性能更強(qiáng)的且已經(jīng)提前訓(xùn)練好的模型,教師模型不需要訓(xùn)練,通過蒸餾 loss 將教師模型知識(shí)以一種歸納偏置的方式轉(zhuǎn)移給學(xué)生模型,從而達(dá)到提升學(xué)生模型性能的目的。因?yàn)橐肓祟~外的蒸餾 Token,而且該 Token 訓(xùn)練任務(wù)也是分類,所以實(shí)際上 DeiT 在推理時(shí),是將 Class Token 和 Distillation Token 的預(yù)測(cè)向量求平均,再轉(zhuǎn)換為概率分布。
          為了證明 Distillation Token 的有效性,而不是只由于多了一個(gè) Token 或者說多了一個(gè)可學(xué)習(xí)參數(shù)導(dǎo)致的,作者還做了對(duì)比試驗(yàn),不加 Distillation Token,而是再加一個(gè) Class Token,相當(dāng)于有兩個(gè)分類頭,兩個(gè) Token 獨(dú)立且隨機(jī)初始化,實(shí)驗(yàn)發(fā)現(xiàn)他們最終收斂后兩個(gè)分類 Token 的相似度達(dá)到 0.999,并且性能更弱,這樣證明了加入 Distillation Token 的意義。
          通過大量實(shí)驗(yàn),作者總結(jié)了如下結(jié)論:
          • 蒸餾做法確實(shí)有效,且 Hard 蒸餾方式效果會(huì)更好,泛化性能也不錯(cuò)。

          • 使用 RegNet 作為教師網(wǎng)絡(luò)可以取得更好的性能表現(xiàn),也就是說相比 Transformer,采用卷積類型的教師網(wǎng)絡(luò)效果會(huì)更好。


          除了上述蒸餾策略,還需要特別注意 DeiT 引入了非常多的 Aug 并且提供了一套更加優(yōu)異的超參,這套參數(shù)也是后續(xù)大部分分類模型直接使用的訓(xùn)練參數(shù),非常值得學(xué)習(xí),如下所示:
          b9cc339a3a046c15a6322d3735242575.webp
          總而言之, DeiT 算法非常優(yōu)異,實(shí)驗(yàn)也非常多(建議去閱讀下),最大貢獻(xiàn)是通過蒸餾策略省掉了 ViT 需要 JFT-300M 數(shù)據(jù)集進(jìn)行預(yù)訓(xùn)練這個(gè)步驟,并且提供了一套非常魯棒且實(shí)用的超參配置,深深地影響了后續(xù)的大部分圖像分類視覺 ?Transformer 模型。

          3.1.1.2 Token Labeling


          DeiT 不是唯一一個(gè)解決 ViT 需要大數(shù)據(jù)量問題的算法,典型的還有 Token Labeling,其在 ViT 的 Class Token 監(jiān)督學(xué)習(xí)基礎(chǔ)上,還對(duì)編碼器輸出的每個(gè)序列進(jìn)行額外監(jiān)督,相當(dāng)于將圖片分類任務(wù)轉(zhuǎn)化為了多個(gè)輸出 Token 識(shí)別問題,并為每個(gè)輸入 Patch 的預(yù)測(cè) Token 分配由算法自動(dòng)生成的基于特定位置的監(jiān)督信號(hào),簡(jiǎn)要圖如下所示:
          2ff971c33cbaec561e7fcf4667f34ab5.webp
          從上圖明顯可以看出,相比 ViT 額外多了輸出 Token 的監(jiān)督過程,這些監(jiān)督可以當(dāng)做中間監(jiān)督,監(jiān)督信息是通過 EfficientNet 或者 NFNet ( F6 86.3% Top-1 accuracy) 這類高性能網(wǎng)絡(luò)對(duì)訓(xùn)練圖片提前生成的顯著圖,每個(gè)顯著圖維度是和類別一樣長(zhǎng)的 C 維,輔助 Loss 和分類一樣也是 CE Loss。當(dāng)然最終實(shí)驗(yàn)結(jié)果表明性能比 DeiT 更優(yōu)異,而且由于這種密集監(jiān)督任務(wù),對(duì)于下游密集預(yù)測(cè)任務(wù)泛化性也更好。
          在此基礎(chǔ)上 DeiT 已經(jīng)證明通過對(duì) ViT 引入更多的強(qiáng) Aug 可以提升性能,例如引入 CutMix,但是本文的做法無法直接簡(jiǎn)單增加 CutMix,為此作者還專門設(shè)計(jì)了一個(gè) MixToken,大概做法是在 Pathc Embedding 后,對(duì) Token 進(jìn)行了相應(yīng)的 CutMix 操作。性能表如下所示:
          af1469a1dfdb88a757835f8a6a138813.webp
          LV-ViT 即為本文所提模型。相比 DeiT,作者認(rèn)為本文做法更加優(yōu)異,體現(xiàn)在:
          • 不需要額外的教師模型,是一個(gè)更加廉價(jià)的做法。

          • 相比于單向量監(jiān)督,以密集的形式監(jiān)督可以幫助訓(xùn)練模型輕松發(fā)現(xiàn)目標(biāo)物體,提高識(shí)別準(zhǔn)確率,實(shí)驗(yàn)也證明了對(duì)下游密集預(yù)測(cè)任務(wù)(例如語義分割)更友好。


          下表是對(duì)訓(xùn)練技術(shù)的詳細(xì)分析:
          a87a697410cfb6bf1de391e87b55519c.webp
          簡(jiǎn)而言之,Token Labeling 的核心做法是通過引入額外的顯著圖來監(jiān)督每個(gè) patch 輸出的預(yù)測(cè) token,雖然不需要教師模型,但是依然需要利用更優(yōu)異的模型對(duì)所有訓(xùn)練圖片生成顯著圖。

          3.1.2 模型改進(jìn)


          在 DeiT 提出后,后續(xù)基于它提出了大量的改進(jìn)模型,涉及到 ViT 的方方面面。前面說過 ViT 模型主要涉及到的模塊包括:
          1. Token 模塊,即如何將 image 轉(zhuǎn) token 以及 token 如何傳遞給下一個(gè)模塊

          2. 位置編碼模塊

          3. 注意力模塊,這里一般都是自注意力模塊

          4. Fead Forward (FFN) 模塊

          5. Norm 模塊位置

          6. 分類預(yù)測(cè)模塊


          3.1.2.1 Token 模塊


          Token 模塊包括兩個(gè)部分:
          1. Image to Token 模塊即如何將圖片轉(zhuǎn)化為 Token,一般來說分成有重疊和無重疊的 Patch Embedding 模塊

          2. Token to Token 模塊即如何在多個(gè) Transformer 編碼器間傳遞 Token,通常也可以分成固定窗口 Token 化過程和動(dòng)態(tài)窗口 Token 化過程兩個(gè)


          下面是完整結(jié)構(gòu)圖:
          51217ddac832ef64409d29ff7e114e54.webp

          3.1.2.1.1 Image to Token 模塊

          首先需要明確:Patch Embedding 通常包括圖片窗口切分和線性嵌入兩個(gè)模塊,本小結(jié)主要是說圖片窗口切分方式,而具體實(shí)現(xiàn)不重要,常用的 2 種實(shí)現(xiàn)包括 nn.Conv 和 nn.Unfold,只要設(shè)置其 kernel 和 stride 值相同,則為非重疊 Patch Embedding,如果 stride 小于 kernel 則為重疊 ?Patch Embedding。
          (1) ?非重疊 Patch Embedding
          ViT 和目前主流模型例如 PVT 和 Swin Transformer 等都是采用了非重疊 Patch Embedding,其簡(jiǎn)要代碼為:

          # 非重疊只需要設(shè)置Conv kernel_size 和 stride 相同即可_conv_cfg = dict(    type='Conv2d', kernel_size=16, stride=16, padding=0, dilation=1)_conv_cfg.update(conv_cfg)self.projection = build_conv_layer(_conv_cfg, in_channels, embed_dims)

          x = self.projection(x).flatten(2).transpose(1, 2)

          通過設(shè)置 16x16 的 kernel 和 stride 可以將圖片在空間維度進(jìn)行切割,每個(gè) patch 長(zhǎng)度為 16x16x3,然后將每個(gè) Patch 重排拉伸為一維向量后,經(jīng)過線性層維度變換,輸出 shape 為 (B, Num_Seq, Dim)。
          在 TNT 中作者提出了一種更精細(xì)的非重疊 Patch Embedding 模塊,如下圖所示:
          f4d65967c3cbf1280db28ce6c447a939.webp
          他的基本觀點(diǎn)是自然圖像的復(fù)雜度相較于自然文本更高,細(xì)節(jié)和顏色信息更豐富,而 ViT 的非重疊 Patch Embedding 做法過于粗糙,因?yàn)楹罄m(xù)自注意力計(jì)算都是在不同 Patch 間,這會(huì)導(dǎo)致 Patch 內(nèi)部的局部自注意力信息沒有充分提取,而這些信息在圖像中也是包含了不同的尺度和位置的物體特征,是非常關(guān)鍵的。故我們不僅要考慮 Patch 間自注意力,還要考慮 Patch 內(nèi)自注意力,為此作者在 外層 Transformer 中又嵌入了一個(gè)內(nèi)層 Transformer,相應(yīng)的非重疊 Patch Embedding 也分成兩步:整圖的非重疊 Patch Embedding 過程和 Patch 內(nèi)部更細(xì)粒度的非重疊 Patch Embedding 過程。
          通過上圖大概可以看出其具體做法,內(nèi)部相當(dāng)于有兩個(gè) Transformer,第一個(gè) Transformer (Outer Transformer )和 ViT 完全一樣,處理句子 Sentences 信息即圖片 Patch 級(jí)別信息,第二個(gè) Transformer (Inner Transformer,也需要額外加上 Inner Transformer 所需要的位置編碼) 處理更細(xì)粒度的 Words 信息即圖片 Patch 內(nèi)再切分為 Patch,為了能夠?qū)蓚€(gè)分支信息融合,內(nèi)部會(huì)將 Inner Transformer 信息和 Outer Transformer ?相加。將上述 Transformer block 嵌入到 PVT 模型中驗(yàn)證了其對(duì)下游任務(wù)的適用性,通過進(jìn)一步的可視化分析側(cè)面驗(yàn)證了分類任務(wù)上 TNT 相比 DeiT 的優(yōu)異性。
          db429bfa1249315072738cfedb82ccf9.webp
          (2) ?重疊 Patch Embedding
          在常規(guī)的 CNN 網(wǎng)絡(luò)中一般都是采用重疊計(jì)算方式,為此是否采用重疊 ?Patch Embedding 會(huì)得到更好的性能?
          直接將非重疊 ?Patch Embedding 通過修改 Unfold 或者 Conv 參數(shù)來實(shí)現(xiàn)重疊 ?Patch Embedding 功能的典型算法包括 T2T-ViT ?和 PVTv2,這兩個(gè)算法的出發(fā)點(diǎn)都是非重疊 Patch Embedding 可以加強(qiáng)圖片 Patch 之間的連續(xù)性,不至于出現(xiàn)信息斷層,性能應(yīng)該會(huì)比重疊 Patch Embedding 高。PVTv2 內(nèi)部采用 Conv 實(shí)現(xiàn),而 T2T ViT 是通過 Unfold 方式實(shí)現(xiàn)(論文中稱為 soft split)。
          f6db2e5cad6358d237520a5706d8907e.webp
          前面說過 CNN 網(wǎng)絡(luò)中一般都是采用重疊計(jì)算方式,那么是否可以用 ResNet Stem 替換非重疊 ?Patch Embedding過程,性能是否會(huì)更好?
          在 Early Convolutions Help Transformers See Better 論文中,作者進(jìn)行了深度分析,雖然作者只是簡(jiǎn)單的將圖片 Token 化的 Patch Embedding 替換為 ResNet Conv Stem,但是作者是從優(yōu)化穩(wěn)定性角度入手,通過大量的實(shí)驗(yàn)驗(yàn)證上述做法的有效性。作者指出 Patch Embedding 之所以不穩(wěn)定,是因?yàn)樵撃K是用一個(gè)大型卷積核以及步長(zhǎng)等于卷積核的卷積層來實(shí)現(xiàn)的,往往這個(gè)卷積核大小為 16*16,這樣的卷積核參數(shù)量很大,而且隨機(jī)性很高,從某種程度上造成了 Transformer 的不穩(wěn)定,如果用多個(gè)小的卷積來代替則可以有效緩解。結(jié)構(gòu)如下所示:
          b8a9a525c560bf0d572f191767676427.webp
          考慮了和 ViT 公平對(duì)比,新引入的 Conv Stem 計(jì)算量約等于一個(gè) transformer block,故后續(xù)僅僅需要 L-1 個(gè) transformer block。作者通過大量分析實(shí)驗(yàn)得到一些經(jīng)驗(yàn)性看法:
          (a) ViT 這類算法對(duì) lr 和 wd 超參的選擇非常敏感,而替換 Stem 后會(huì)魯棒很多。
          (b) ViT 這類算法收斂比較慢,而本算法會(huì)快很多,例如都在 100 epoch 處本文性能遠(yuǎn)優(yōu)于 ViT。
          70f840af0b7af258a46587d4bacf0e41.webp
          ViT_p 即為 Patch Embedding 模式,ViT_c 即為 Conv Stem 模式,可以看出在不同 flops 下模型收斂速度都是 ViT_c 快于 ViT_p,雖然到 400 epoch 時(shí)候性能都非常接近。
          (c) ViT 這類算法只能采用 AdamW 訓(xùn)練,而本文更加通用,采用 SGD 后性能沒有顯著下降。
          眾所周知,ViT 類模型都只能用 AdamW 訓(xùn)練,其占據(jù)顯存是 SGD 的 3 倍,所以一般在 CNN 網(wǎng)絡(luò)中都是用過 SGD 模型,性能通常不錯(cuò),而通過替換 ?Patch Embedding ?后也可以用 SGD 訓(xùn)練了。
          0074a834c5d0d1c71c0032e5662d7703.webp
          (d) 僅僅采用 ImageNet 訓(xùn)練 ViT 性能難以超越 CNN,而本文可以進(jìn)一步提升 ViT 性能。
          與上述論文持相同觀點(diǎn)的也包括 ?ResT 、Token Learner、CSWin Transformer 等算法,他們都采用了完全相同的做法。更進(jìn)一步在 PS-ViT 中為了能夠方便后續(xù)的漸進(jìn)采樣模塊穩(wěn)定提取更好的特征點(diǎn),作者在 Image to Token 模塊中不僅僅引入了 ResNet 的 Conv Stem 模塊,還在后面再使用了 ResNet 第一個(gè) stage 的前兩個(gè)殘差 block,在 Token to Token 模塊中會(huì)詳細(xì)說明 PS-ViT。
          在 CeiT 中作者出發(fā)點(diǎn)是 CNN 中的諸多特性已經(jīng)被證明是很成功的,純粹的 Transformer 需要大量的數(shù)據(jù)、額外的監(jiān)督才能達(dá)到和 CNN 相同的精度,出現(xiàn)這種問題的原因可能是 NLP 中的 Transformer ?直接搬到圖像任務(wù)中可能不是最合適的,應(yīng)該考慮部分引入 CNN 來增強(qiáng) Transformer。具體來說,在圖片轉(zhuǎn) Token 方案中提出 Image-to-Tokens (I2T) 模塊,不再是從圖片中直接進(jìn)行 Patch Emeding ,而是對(duì) CNN 和 Pool 層所提取的底層特征進(jìn)行 Patch Embedding,借助圖像特征會(huì)比直接使用圖片像素更好。
          60b2b86449dd497c0bece533c367dca9.webp
          上圖的上半部分是 ViT 的 Patch Embedding 過程,下圖是 CeiT 所提出的做法,核心就是引入卷積操作提取底層特征,然后在底層特征上進(jìn)行 Patch Embedding 操作。
          既然采用 Conv Stem 可以解決很多問題,那么理論上經(jīng)過精心設(shè)計(jì)的 Conv 結(jié)構(gòu)也必然是有效的,例如 ViTAE 中就采用了空洞卷積做法,本質(zhì)上是希望能夠利用卷積提供多尺度上下文信息,這有助于后續(xù)模塊信息提取,如下圖所示:
          7b92404e243a033efe1a6f1fa2295f8c.webp
          對(duì)圖片或者特征圖應(yīng)用多個(gè)不同空洞率的卷積提取信息后,進(jìn)行拼接和 GeLU 激活函數(shù)后,直接拉伸為一維向量,從而轉(zhuǎn)換為序列,并且由于空洞卷積可以實(shí)現(xiàn)下采樣功能,故也可以有效地減少后續(xù)注意力模塊計(jì)算量。
          3.1.2.1.2 Token to Token 模塊


          大部分模型的 Token to Token 方案和 Image to Token 做法相同,但是也有些算法進(jìn)行了相應(yīng)改造。經(jīng)過整理,我們將其分成兩種做法:
          1. 固定窗口 Token 化

          2. 動(dòng)態(tài)窗口 Token 化


          固定窗口是指 Token 化過程是固定或者預(yù)定義的規(guī)則,典型的重疊和非重疊 ?Patch Embedding ?就是固定窗口,因?yàn)槠浯翱趧澐侄际翘崆坝喓玫囊?guī)則,不會(huì)隨著輸入圖片的不同而不同,而動(dòng)態(tài)窗口是指窗口劃分和輸入圖片語義相關(guān),不同圖片不一樣,是一個(gè)動(dòng)態(tài)過程。
          (1) 固定窗口 Token 化
          這個(gè)做法通常和 Image to Token 模塊完全一樣,也可以分成非重疊 ?Patch Embedding ?和重疊 ?Patch Embedding,大部分算法都屬于這一類,例如 PVT、Swin Transformer 等。
          (2) 動(dòng)態(tài)窗口 Token 化
          動(dòng)態(tài)窗口 Token 化過程典型代表是 PS-ViT 和 TokenLearner。
          前面說過,Vision Transformer with Progressive Sampling (PS-ViT) 中為了方便后續(xù)的漸進(jìn)采樣模塊能夠穩(wěn)定提取更好的特征點(diǎn),在 Image to Token 模塊中不僅僅引入了 ResNet 的 Conv Stem 模塊,還在后面再使用了 ResNet 第一個(gè) stage 的前兩個(gè)殘差 block。在特征圖 F 后,作者在 Token to Token 環(huán)節(jié)引入了一個(gè)漸進(jìn)式采樣模塊,其出發(fā)點(diǎn)是 ViT 采用固定窗口劃分機(jī)制,然后對(duì)每個(gè)窗口進(jìn)行 Token 化,這種做法首先不夠靈活,而且因?yàn)閳D片本身就是密集像素,冗余度非常高,采用固定劃分方法對(duì)于分類來說可能就某幾個(gè)窗口內(nèi)的 Token 實(shí)際上才是有意義的,假設(shè)物體居中那么物體四周的 Token 可能是沒有作用的,只會(huì)增加無效計(jì)算而已?;诖俗髡咴O(shè)計(jì)一個(gè)自適應(yīng)采樣的 Token 機(jī)制,不再是固定的窗口采樣,而是先初始化固定采樣點(diǎn),如下圖紅色點(diǎn)所示,然后通過 refine 機(jī)制不斷調(diào)整這些采樣點(diǎn)位置,最終得到的采樣點(diǎn)所對(duì)應(yīng)的 Token 就是最有代表力的。其完整分類網(wǎng)絡(luò)結(jié)構(gòu)圖如下所示:
          2be80aed2380693b5c450831fab6373d.webp
          得到特征圖 F 后,經(jīng)過漸進(jìn)采樣模塊,不斷 refine 采樣點(diǎn),最終輸出和采樣點(diǎn)個(gè)數(shù)個(gè)序列,將該序列作為 ViT 模型的輸入即可。簡(jiǎn)單來看漸進(jìn)采樣模塊起到了 Token to Token 作用。其中的漸進(jìn)采樣模塊結(jié)構(gòu)圖如下所示:
          74fe541ede88fcd4d602e36982c76151.webp
          詳細(xì)計(jì)算過程如下:
          1. 首先圖片經(jīng)過 ResNet Conv Stem + ResNet 第一個(gè) stage 的前兩個(gè)殘差塊進(jìn)行特征提取,得到 F。

          2. 在特征圖或者原圖上先設(shè)置初始均勻固定間隔采樣點(diǎn) pt,上圖是 9 個(gè)采樣點(diǎn),表示最終序列長(zhǎng)度是 9。

          3. 利用 pt 值對(duì) F 進(jìn)行采樣,提取對(duì)應(yīng)位置的特征向量,加上位置編碼輸入到編碼器中,輸出 T_t。

          4. 將 T_t 經(jīng)過一個(gè) FC 層生成 offset,將該 offset 和初始位置 pt 相加就可以得到 refine 后的 p_t+1。

          5. 將 3-4 步驟重復(fù) N 次,下一個(gè)采樣模塊的輸入包括 refine 后的 pt、特征圖 F 和上一個(gè)采樣模塊的輸出 T,三者相加。

          6. 經(jīng)過 N 次 refine 后,將該 token 序列拼接上 class token,然后再經(jīng)過 M 個(gè)編碼器模塊。

          7. 最后對(duì) class token 對(duì)應(yīng)位置輸出 token 進(jìn)行分類訓(xùn)練即可。


          可以發(fā)現(xiàn),和 ViT 的主要差異就在于其采樣點(diǎn)不是固定的均勻間隔,而是基于語義圖自適應(yīng),從而能夠在減少計(jì)算量的前提下進(jìn)一步提升性能。PS-ViT 在 top-1 精度方面比普通 ViT 高 3.8%,參數(shù)減少約 4 倍,F(xiàn)LOP 減少約 10 倍,性能比較優(yōu)異。
          基于類似出發(fā)點(diǎn),TokenLearner 提出可以基于空間注意力自適應(yīng)地學(xué)習(xí)出更具有代表性的 token,從而可以將 ViT 的 1024 個(gè) token 縮減到 8-16 個(gè) token,計(jì)算量減少了一倍,性能依然可以保持一致,這也側(cè)面說明了 ViT 所采樣的固定窗口 token 有大量冗余,徒增計(jì)算量而已。其核心示意圖如下所示:
          fd06999cda811bf745ca6dd81e48749b.webp
          假設(shè)想僅僅采樣出 8 個(gè) token,首先采用 Conv Stem 提取圖片特征,然后分別輸入到 8 個(gè)空間注意力分支中,空間注意力分支首先會(huì)應(yīng)用一系列卷積生成空間 attention 圖,然后逐點(diǎn)和輸入特征相乘進(jìn)行特征加權(quán),最后通過空間全局 pool 層生成 1x1xC 的 Token,這樣就將 HXWXC 的特征圖轉(zhuǎn)換為了 8 個(gè)通道為 C 的 Token。
          為了進(jìn)一步提高信息,作者還額外提出一個(gè) TokenFuser 模塊,加強(qiáng) Token 和 Token 之間的聯(lián)系以及恢復(fù)空間結(jié)構(gòu),整個(gè)分類網(wǎng)絡(luò)的結(jié)構(gòu)如下所示:(a) 為不包括 TokenFuser 的改進(jìn) ViT 結(jié)構(gòu),(b) 為包括 TokenFuser 的改進(jìn) ViT 結(jié)構(gòu)。
          34a1e017a4a08038cfe08b0aa0f070bc.webp
          從上述結(jié)構(gòu)可以發(fā)現(xiàn), TokenLearner 模塊起到了自適應(yīng)提取更具語義信息的 Token,并且還能夠極大地減少計(jì)算量,而 TokenFuser 可以起到加強(qiáng) Token 和 Token 之間的聯(lián)系以及恢復(fù)空間結(jié)構(gòu)的功能,TokenLearner+Transformer+ TokenFuser 構(gòu)成 Bottleneck 結(jié)構(gòu)。其中 TokenFuser 示意圖如下所示:
          4bf06bebe1f3aa8cf237a4079ace5f42.webp
          其接收兩個(gè)輸入,一個(gè)是 TokenLearner 前的保持了空間信息的 1024 個(gè) token 特征,一個(gè)是 TokenLearner 后經(jīng)過自適應(yīng)采樣的 8 個(gè) token 特征,然后以注意力模式兩者進(jìn)行乘加操作,融合特征以及恢復(fù)空間結(jié)構(gòu)。
          作者的分類實(shí)驗(yàn)依然采用了 JFT-300M 數(shù)據(jù)集進(jìn)行預(yù)訓(xùn)練,然后在 ImageNet 1k上面微調(diào),也就是說和最原始的 ViT 進(jìn)行比較。
          16910b488238679a63ac6a18910c2646.webp
          TokenFuser 也進(jìn)行了相應(yīng)的對(duì)比實(shí)驗(yàn)。
          e4e92ebc126c5d2d554e6c0df71f4ee4.webp
          at 6 表示 TokenLearner 插入到第 6 個(gè) Transformer Encoder 后。


          3.1.2.2 位置編碼模塊


          位置編碼模塊是為 Transformer 模塊提供 Patch 和 Patch 之間的相對(duì)關(guān)系,非常關(guān)鍵。在通用任務(wù)的 Transformer 模型中認(rèn)為一個(gè)好的位置編碼應(yīng)該要滿足以下特性:
          • 不同位置的位置編碼向量應(yīng)該是唯一的

          • 不能因?yàn)椴煌恢梦恢镁幋a的值大小導(dǎo)致網(wǎng)絡(luò)學(xué)習(xí)有傾向性

          • 必須是確定性的

          • 最好能夠泛化到任意長(zhǎng)度的序列輸入


          ViT 位置編碼模塊滿足前 3 條特性,但是最后一條不滿足,當(dāng)輸入圖片改變時(shí)候需要微調(diào),比較麻煩?;诖艘渤霈F(xiàn)了不少的算法改進(jìn),結(jié)構(gòu)圖如下所示:
          94584d4f5cd99468b8647d457167a76a.webp
          按照是否顯式的設(shè)置位置編碼向量,可以分成:
          1. 顯式位置編碼,其中可以分成絕對(duì)位置編碼和相對(duì)位置編碼。

          2. 隱式位置編碼,即不再直接設(shè)置絕對(duì)和相對(duì)位置編碼,而是基于圖片語義利用模型自動(dòng)生成能夠區(qū)分位置信息的編碼向量。


          隱式位置編碼對(duì)于圖片長(zhǎng)度改變場(chǎng)景更加有效,因?yàn)槠涫亲赃m應(yīng)圖片語義而生成。
          3.1.2.2.1 顯式位置編碼


          顯式位置編碼,可以分成絕對(duì)位置編碼和相對(duì)位置編碼。
          (1) 絕對(duì)位置編碼
          絕對(duì)位置編碼表示在 Patch 的每個(gè)位置都加上一個(gè)不同的編碼向量,其又可以分成固定位置編碼即無需學(xué)習(xí)直接基于特定規(guī)則生成,常用的是 Attention is all you need 中采用的 sincos 編碼,這種編碼方式可以支持任意長(zhǎng)度序列輸入。還有一種是可學(xué)習(xí)絕對(duì)位置編碼,即初始化設(shè)置為全 0 可學(xué)習(xí)參數(shù),然后加到序列上一起通過網(wǎng)絡(luò)訓(xùn)練學(xué)習(xí),典型的例如 ViT、PVT 等等。
          (2) 相對(duì)位置編碼
          相對(duì)位置編碼考慮為相鄰 Patch 位置編碼,其實(shí)現(xiàn)一般是設(shè)置為可學(xué)習(xí),例如 Swin Transformer 中采用的可學(xué)習(xí)相對(duì)位置編碼,其做法是在 QK 矩陣計(jì)完相似度后,引入一個(gè)額外的可學(xué)習(xí) bias 矩陣,其公式為:
          df9dc132bd11fedd42b5d9455c19e5b6.webp
          Swin Transformer 這種做法依然無法解決圖片尺寸改變時(shí)候?qū)ο鄬?duì)位置編碼插值帶來的性能下降的問題。在 Swin Transformer v2 中作者做了相關(guān)實(shí)驗(yàn),在直接使用了在 256 * 256 分辨率大小,8 * 8 windows 大小下訓(xùn)練好的 Swin-Transformer 模型權(quán)重,載入到不同尺度的大模型下,在不同數(shù)據(jù)集上進(jìn)行了測(cè)試,性能如下所示 (Parameterized position bias 這行):
          bb5c5e4325f4a8f50ba2e98cfb11d7b1.webp
          每個(gè)表格中的兩列表示沒有 fintune 和有 fintune,可以看出如果直接對(duì)相對(duì)位置編碼插值而不進(jìn)行 fintune,性能下降比較嚴(yán)重。故在 Swin Transformer v2 中引入了對(duì)數(shù)空間連續(xù)相對(duì)位置編碼 log-spaced continuous position bias,其主要目的是可以更有效地從低分辨權(quán)重遷移到高分辨率下游任務(wù)。
          相比于直接應(yīng)用可學(xué)習(xí)的相對(duì)位置編碼,v2 中先引入了 Continuous relative position bias (CPB),
          765082de649e7acb08d2d33881f5660b.webp
          B 矩陣來自一個(gè)小型的網(wǎng)絡(luò),用來預(yù)測(cè)相對(duì)位置,該模塊的輸入依然是 Patch 間的相對(duì)位置,這個(gè)小型網(wǎng)絡(luò)可以是一個(gè) 2 層 MLP,然后接中間采用激活函數(shù)連接。
          其性能如上表的 Linear-Spaced CPB 所示,可以發(fā)現(xiàn)相比原先的相對(duì)位置編碼性能有所提升,但是當(dāng)模型尺度繼續(xù)增加,圖片尺寸繼續(xù)擴(kuò)大后性能依然會(huì)下降比較多,原因是預(yù)測(cè)目標(biāo)空間是一個(gè)線性的空間。當(dāng) Windows 尺寸增大的時(shí)候,比如當(dāng)載入的是 8*8 大小 windows 下訓(xùn)練好的模型權(quán)重,要在 16*16 大小的 windows 下進(jìn)行 fine-tune,此時(shí)預(yù)測(cè)相對(duì)位置范圍就會(huì)從 [-7,7] 增大到 [-15,15],整個(gè)預(yù)測(cè)范圍的擴(kuò)大了不少,這可能會(huì)出現(xiàn)網(wǎng)絡(luò)不適應(yīng)性。為此作者將預(yù)測(cè)的相對(duì)位置坐標(biāo)從 linear space 改進(jìn)到 log space 下,這樣擴(kuò)大范圍就縮小了不少, 可以提供更加平滑的預(yù)測(cè)范圍,這會(huì)增加穩(wěn)定性,提升泛化能力,性能表如上的 Log-Spaced CPB 所示。
          在 Swin Transformer 中相對(duì)位置編碼矩陣 shape 和 QK矩陣計(jì)算后的矩陣一樣大,其計(jì)算復(fù)雜度是 O(HW),當(dāng)圖片很大或者再引入 T 時(shí)間軸,那么計(jì)算量非常大, 故在 Improved MViT ,作者進(jìn)行了分解設(shè)計(jì),分成 H 軸相對(duì)位置編碼,W 軸相對(duì)位置編碼,然后相加,從而將復(fù)雜度降低為 O(H+W)。
          9134541fa757f045f9cbc58641e09faf.webp6f91f152eaf077676cdfd415643dfd93.webp
          關(guān)于絕對(duì)位置編碼和相對(duì)位置編碼到底哪個(gè)是最好的,目前還沒有定論,在不同的論文實(shí)驗(yàn)中有不同的結(jié)論,暫時(shí)來看難分勝負(fù)。但是從上面可以分析來看,在 ViT 中不管是絕對(duì)位置編碼和相對(duì)位置編碼,當(dāng)圖片大小改變時(shí)候都需要對(duì)編碼向量進(jìn)行插值,性能都有不同程度的下降 ( Swin Transformer v2 在一定程度上解決了)。
          3.1.2.2.2 隱式位置編碼


          當(dāng)圖片尺寸改變時(shí)候,隱式位置編碼可以很好避免顯式位置編碼需要對(duì)對(duì)編碼向量進(jìn)行插值的弊端。其核心做法都是基于圖片語義自適應(yīng)生成位置編碼
          在論文 How much position information do convolutional neural networks encode? 中已經(jīng)證明 CNN 不僅可以編碼位置信息,而且越深的層所包含的位置信息越多,而位置信息是通過 zero-padding 透露的。既然 Conv 自帶位置信息,那么可以利用這個(gè)特性來隱式的編碼位置向量。大部分算法都直接借鑒了這一結(jié)論來增強(qiáng)位置編碼,典型代表有 CPVT、PVTv2 和 CSwin Transformer 等。
          CPVT 指出基于之前 CNN 分類經(jīng)驗(yàn),分類網(wǎng)絡(luò)通常需要平移不變性,但是絕對(duì)位置編碼會(huì)在一定程度打破這個(gè)特性,因?yàn)槊總€(gè)位置都會(huì)加上一個(gè)獨(dú)一無二的位置編碼??雌饋硭坪跸鄬?duì)位置編碼可以避免這個(gè)問題,其天然就可以適應(yīng)不同長(zhǎng)度輸入,但是由于相對(duì)位置編碼在圖像分類任務(wù)中無法提供任何絕對(duì)位置信息(實(shí)際上相對(duì)位置編碼也需要插值),而絕對(duì)位置信息被證明非常重要。以 DeiT-Tiny 模型為例,作者通過簡(jiǎn)單的對(duì)比實(shí)驗(yàn)讓用戶直觀的感受不同位置編碼的效果:
          51ee4d69191d4920454a15c976593dcb.webp
          2D PRE 是指 2D 相對(duì)位置編碼,Top-1@224 表示測(cè)試時(shí)候采用 224 圖片大小,這個(gè)尺度和訓(xùn)練保持一致,Top-1@384 表示測(cè)試時(shí)候采用 384 圖片大小,由于圖片大小不一致,故需要對(duì)位置編碼進(jìn)行插值。從上表可以得出:
          • 位置編碼還是很重要,不使用位置編碼性能很差。

          • 2D 相對(duì)位置編碼性能比其他兩個(gè)差,可學(xué)習(xí)位置編碼和 sin-cos 策略效果非常接近,相對(duì)來說可學(xué)習(xí)絕對(duì)位置編碼效果更好一些(和其他論文結(jié)論不一致)。

          • 在需要對(duì)位置編碼進(jìn)行插值時(shí)候,性能都有下降。


          基于上述描述,作者認(rèn)為在視覺任務(wù)中一個(gè)好的位置編碼應(yīng)滿足如下條件:
          • 模型應(yīng)該具有 permutation-variant 和 translation-equivariance 特性,即對(duì)位置敏感但同時(shí)具有平移不變性。

          • 能夠自然地處理變長(zhǎng)的圖片序列。

          • 能夠一定程度上編碼絕對(duì)位置信息。


          基于這三個(gè)原則,CPVT 引入了一個(gè)帶有 zero-padding 的卷積 ( kernel size k ≥ 3) 來隱式地編碼位置信息,并提出了 Positional Encoding Generator (PEG) 模塊,如下所示:
          7a0bcdf9c81ab6d14b620e052dc7b5c0.webp
          將輸入序列 reshape 成圖像空間維度,然后通過一個(gè) kernel size 為 k ≥ 3, (k?1)/2 zero paddings 的 2D 卷積操作,最后再 reshape 成 token 序列。這個(gè) PEG 模塊因?yàn)橐肓司矸e,在計(jì)算位置編碼時(shí)候會(huì)考慮鄰近的 token,當(dāng)圖片尺度改變時(shí)候,這個(gè)特性可以避免性能下降問題。算法的整體結(jié)構(gòu)圖如下所示:
          61b74c8a9c2f8570a2f3f5d8416f8e0e.webp
          基于 CPVT 的做法,PVTv2 將 zero-padding 卷積思想引入到 FFN 模塊中。
          b7fb30025a6d846e0fa159120b48b2f9.webp
          通過在常規(guī) FFN 模塊中引入 zero-padding 的逐深度卷積來引入隱式的位置編碼信息(稱為 Convolutional Feed-Forward)。
          同樣的,在 CSWin Transformer 中作者也引入了 3x3 DW 卷積來增強(qiáng)位置信息,結(jié)構(gòu)圖如下所示:
          886cc8c245b2f8c8a09e82cb9518f946.webp
          APE 是 ViT 中的絕對(duì)位置編碼,CPE 是 CPVT 中的條件位置編碼,其做法是和輸入序列 X 相加,而 RPE 是 Swin Transformer 中所采用的相對(duì)位置編碼,其是加到 QK 矩陣計(jì)算后輸出中,而本文所提的 Locally-Enhanced Positional Encoding (LePE),是在自注意力計(jì)算完成后額外加上 DW 卷積值,計(jì)算量比 RPE 小。
          0659081695e42b6438eca3c21cc764fa.webp
          LePE 做法對(duì)于下游密集預(yù)測(cè)任務(wù)中圖片尺寸變化情況比較友好,性能下降比較少。
          除了上述分析的諸多加法隱式位置編碼改進(jìn), ResT 提出了另一個(gè)非常相似的,但是是乘法的改進(jìn)策略,結(jié)構(gòu)圖如下所示:
          e0b21e62611374469c7a8a1a0131ae63.webp
          對(duì) Patch Embedding 后的序列應(yīng)用先恢復(fù)空間結(jié)構(gòu),然后應(yīng)用一個(gè) 3×3 depth-wise padding 1的卷積來提供位置注意力信息,然后通過 sigmoid 操作變成注意力權(quán)重和原始輸入相乘。代碼如下所示:
          class PA(nn.Module):    def __init__(self, dim):        super().__init__()        self.pa_conv = nn.Conv2d(dim, dim, kernel_size=3, padding=1, groups=dim)        self.sigmoid = nn.Sigmoid()
          def forward(self, x): # x 是已經(jīng)恢復(fù)了空間結(jié)構(gòu)的 patch embedding return x * self.sigmoid(self.pa_conv(x))

          作者還指出,這個(gè)Pixel Attention (PA) 模塊可以替換為任意空間注意力模塊,性能優(yōu)異,明顯比位置編碼更加靈活好用。

          3.1.2.3 自注意力模塊


          Transformer 的最核心模塊是自注意力模塊,也就是我們常說的多頭注意力模塊,如下圖所示:
          4cb087ecf2f43d090f987f1191a6751e.webp
          注意力機(jī)制的最大優(yōu)勢(shì)是沒有任何先驗(yàn)偏置,只要輸入足夠的數(shù)據(jù)就可以利用全局注意力學(xué)到泛化性能不錯(cuò)的特征。當(dāng)數(shù)據(jù)量足夠大的時(shí)候,注意力機(jī)制是 Transformer 模型的最大優(yōu)勢(shì),但是一旦數(shù)據(jù)量不夠就會(huì)變成逆勢(shì),后續(xù)很多算法改進(jìn)方向都是希望能夠引入部分先驗(yàn)偏置輔助模塊,在減少對(duì)數(shù)據(jù)量的依賴情況下加快收斂,并進(jìn)一步提升性能。同時(shí)注意力機(jī)制還有一個(gè)比較大的缺點(diǎn):因?yàn)槠淙肿⒁饬τ?jì)算,當(dāng)輸入高分辨率圖時(shí)候計(jì)算量非常巨大,這也是目前一大改進(jìn)方向。
          簡(jiǎn)單總結(jié),可以將目前自注意力模塊分成 2 個(gè)大方向:
          1. 僅僅包括全局注意力,例如 ViT、PVT 等。

          2. 引入額外的局部注意力,例如 Swin Transformer。


          如果整個(gè) Transformer 模型不含局部注意力模塊,那么其主要改進(jìn)方向就是如何減少空間全局注意力的計(jì)算量,而引入額外的局部注意力自然可以很好解決空間全局注意力計(jì)算量過大的問題,但是如果僅僅包括局部注意力,則會(huì)導(dǎo)致性能下降嚴(yán)重,因?yàn)榫植孔⒁饬]有考慮窗口間的信息交互,因此引入額外的局部注意力的意思是在引入局部注意力基礎(chǔ)上,還需要存在窗口間交互模塊,這個(gè)模塊可以是全局注意力模塊,也可以是任何可以實(shí)現(xiàn)這個(gè)功能的模塊。其結(jié)構(gòu)圖如下所示:
          398a4d7cda71d102417f31553d207128.webp

          3.1.2.3.1 僅包括全局注意力


          標(biāo)準(zhǔn)的多頭注意力就是典型的空間全局注意力模塊,當(dāng)輸入圖片比較大的時(shí)候,會(huì)導(dǎo)致序列個(gè)數(shù)非常多,此時(shí)注意力計(jì)算就會(huì)消耗大量計(jì)算量和顯存。以常規(guī)的 COCO 目標(biāo)檢測(cè)下游任務(wù)為例,輸入圖片大小一般是 800x1333,此時(shí) Transformer 中的自注意力模塊計(jì)算量和內(nèi)存占用會(huì)難以承受。其改進(jìn)方向可以歸納為兩類:減少全局注意力計(jì)算量以及采用廣義線性注意力計(jì)算方式。
          (1) 減少全局注意力計(jì)算量
          全局注意力計(jì)算量主要是在 QK 矩陣和 Softmax 后和 V 相乘部分,想減少這部分計(jì)算量,那自然可以采用如下策略:
          1. 降低 KV 維度,QK 計(jì)算量和 Softmax 后和 V 相乘部分計(jì)算量自然會(huì)減少。

          2. 減低 QKV 維度,主要如果 Q 長(zhǎng)度下降了,那么代表序列輸出長(zhǎng)度改變了,在減少計(jì)算量的同時(shí)也實(shí)現(xiàn)了下采樣功能。


          (a) 降低 KV 維度
          降低 KV 維度做法的典型代碼是 PVT,其設(shè)計(jì)了空間 Reduction 注意力層 (SRA) ,如下所示:
          1b11a428a701e1109d2af54a0572ce14.webp
          其做法比較簡(jiǎn)單,核心就是通過 Spatial Reduction 模塊縮減 KV 的輸入序列長(zhǎng)度,KV 是空間圖片轉(zhuǎn)化為 Token 后的序列,可以考慮先還原出空間結(jié)構(gòu),然后通過卷積縮減維度,再次轉(zhuǎn)化為序列結(jié)構(gòu),最后再算注意力。假設(shè) QKV shape 是完全相同,其詳細(xì)計(jì)算過程如下:
          • 在暫時(shí)不考慮 batch 的情況下,KV 的 shape 是 (H'W', C),既然叫做空間維度縮減,那么肯定是作用在空間維度上,故首先利用 reshape 函數(shù)恢復(fù)空間維度變成 (H', W', C)。

          • 然后在這個(gè) shape 下應(yīng)用 kernel_size 和 stride 為指定縮放率例如 8 的二維卷積,實(shí)現(xiàn)空間維度縮減,變成 (H/R, W/R, C), R 是縮放倍數(shù)。

          • 然后再次反向 reshape 變成 (HW/(R平方), C),此時(shí)第一維(序列長(zhǎng)度)就縮減了 R 平方倍數(shù)。

          • 然后采用標(biāo)準(zhǔn)的多頭注意力層進(jìn)行注意力加權(quán)計(jì)算,輸出維度依然是 (H'W', C)。


          而在 Twins 中提出了所謂的 GSA,其實(shí)就是 PVT 中的空間縮減模塊。
          同時(shí)基于最新進(jìn)展,在 PVTV2 算法中甚至可以將 PVTv1 的 Spatial Attention 直接換成無任何學(xué)習(xí)參數(shù)的 Average Pooling 模塊,也就是所謂的 Linear SRA,如下所示:
          4af4df7b9749b61e1de5dc99abc3c49a.webp
          同樣參考 PVT 設(shè)計(jì),在 P2T ?也提出一種改進(jìn)版本的金字塔 Pool 結(jié)構(gòu),如下所示:
          0612c8b2d03bf5e1b7affdcc5595e9f6.webp
          (b) 即為改進(jìn)的 Spatial Attention 結(jié)構(gòu),對(duì) KV 值應(yīng)用不同大小的 kernel 進(jìn)行池化操作,最后 cat 拼接到一起,輸入到 MHSA 中進(jìn)行計(jì)算,通過控制 pool 的 kernel 就可以改變 KV 的輸出序列長(zhǎng)度,從而減少計(jì)算量,同時(shí)金字塔池化結(jié)構(gòu)可以進(jìn)一步提升性能(不過由于其 FFN 中引入了 DW 卷積,也有一定性能提升)。
          從降低 KV 空間維度角度出發(fā),ResT 算法中也提出了一個(gè)內(nèi)存高效的注意力模塊 E-MSA,相比 PVT 做法更近一步,不僅僅縮減 KV 空間維度,還同時(shí)加強(qiáng)各個(gè) head 之間的信息交互,如下所示:
          b7d21f5e1a5d49357a737377c9733f66.webp
          其出發(fā)點(diǎn)有兩個(gè):
          • 當(dāng)序列比較長(zhǎng)或者維度比較高的時(shí)候,全局注意力計(jì)算量過大。

          • 當(dāng)多頭注意力計(jì)算時(shí),各個(gè)頭是按照 D 維度切分,然后獨(dú)立計(jì)算最后拼接輸出,各個(gè)頭之間沒有交互,當(dāng) X 維度較少時(shí),性能可能不太行。


          基于上述兩點(diǎn),作者引入 DWConv 縮放 KV 的空間維度來減少全局注意力計(jì)算量,然后在 QK 點(diǎn)乘后引入 1x1 Conv 模塊進(jìn)行多頭信息交互。其詳細(xì)做法如下:
          1. 假設(shè)輸入序列 X Shape 是 nxd,n 表示序列長(zhǎng)度,d 表示每個(gè)序列的嵌入向量維度。

          2. 假設(shè)想將特征圖下采樣 sxs 倍,可以將 X 輸入到 kernel 為 (s+1,s+1),stride 為 (s, s), padding 為 (s//2, s//2) 的 DW 卷積和 LN 層中,假設(shè)輸出變成 (h'w', d)。

          3. 將其經(jīng)過線性映射,然后在 d 維度切分成 k 個(gè)部分,分別用于 k 個(gè)頭中。

          4. QK 計(jì)算點(diǎn)積和 Scale 后,Shape 變成 (k, n, n'),然后對(duì)該輸出采用 1x1 卷積在頭的 k 維度進(jìn)行多個(gè)head 之間的信息聚合。

          5. 后續(xù)是標(biāo)準(zhǔn)的注意力計(jì)算方式。


          其核心代碼如下所示:
          class Attention(nn.Module):    def __init__(self,                 dim=32,                 num_heads=8,                 qkv_bias=False,                 attn_drop=0.,                 proj_drop=0.,                 sr_ratio=2):        super().__init__()        self.num_heads = num_heads        head_dim = dim // num_heads        self.scale = head_dim ** -0.5
          # (sr_ratio+1)x (sr_ratio+1) 的 DW 卷積 self.sr = nn.Conv2d(dim, dim, kernel_size=sr_ratio + 1, stride=sr_ratio, padding=sr_ratio // 2, groups=dim) self.sr_norm = nn.LayerNorm(dim)
          # 1x1 卷積 self.transform_conv = nn.Conv2d(self.num_heads, self.num_heads, kernel_size=1, stride=1) self.transform_norm = nn.InstanceNorm2d(self.num_heads)
          def forward(self, x, H, W): B, N, C = x.shape q = self.q(x).reshape(B, N, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3) # 1 空間下采樣 x_ = x.permute(0, 2, 1).reshape(B, C, H, W) x_ = self.sr(x_).reshape(B, C, -1).permute(0, 2, 1) x_ = self.sr_norm(x_) kv = self.kv(x_).reshape(B, -1, 2, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) k, v = kv[0], kv[1] # 2 輸出維度為 (B,num_head, N, N') attn = (q @ k.transpose(-2, -1)) * self.scale
          # 3 在 num_head 維度進(jìn)行信息聚合,加強(qiáng) head 之間的聯(lián)系 attn = self.transform_conv(attn) attn = attn.softmax(dim=-1) attn = self.transform_norm(attn)
          # 4 子注意力模塊標(biāo)準(zhǔn)操作 attn = self.attn_drop(attn) x = (attn @ v).transpose(1, 2).reshape(B, N, C) x = self.proj(x) x = self.proj_drop(x) return x


          (b) 降低 QKV 維度
          Multiscale Vision Transformers (MViT) 也考慮引入 Pool 算子來減少全局注意力計(jì)算量。MViT 主要為了視頻識(shí)別而設(shè)計(jì),因?yàn)橐曨l任務(wù)本身就會(huì)消耗太多的顯存和內(nèi)存,如果不進(jìn)行針對(duì)性設(shè)計(jì),則難以實(shí)際應(yīng)用。正如其名字所言,其主要是想?yún)⒖?CNN 中的多尺度特性(淺層空間分辨率大通道數(shù)少,深層空間分辨率小通道數(shù)多)設(shè)計(jì)出適合 Transformer 的多尺度 ViT。自注意力模塊如下所示:
          1e86a8de35f729452bfa4dc224c421bb.webp
          相比 Transformer 自注意力模塊,其主要改變是多了 Pool 模塊,該模塊的主要作用是通過控制其 Stride 參數(shù)來縮放輸入的序列個(gè)數(shù),而序列個(gè)數(shù)對(duì)應(yīng)的是圖片空間尺度 THW。以圖像分類任務(wù)為例,
          • 任意維度的序列 X 輸入,首先和 3 個(gè)獨(dú)立的線性層得到 QKV,維度都是 (HW, D)。

          • 將QKV 恢復(fù)空間維度,變成 (H, W, D),然后經(jīng)過獨(dú)立的 3 個(gè) Pool 模塊,通過控制 stride 參數(shù)可以改變輸出序列長(zhǎng)度,變成 (H', W', D),設(shè)置 3 個(gè) Pool 模塊不同的 Stride 值可以實(shí)現(xiàn)不同大小的輸出。

          • 將輸入都拉伸為序列格式,然后采用自注意力計(jì)算方式輸出 (H'W‘, D)。

          • 為了保證輸出序列長(zhǎng)度改變而無法直接應(yīng)用殘差連接,需要在 X 側(cè)同時(shí)引入一個(gè) Pool 模塊將序列長(zhǎng)度和維度變成一致。


          由于 MViT 出色的性能,作者將該思想推廣到更多的下游任務(wù)中(例如目標(biāo)檢測(cè)),提出了改進(jìn)版本的 Imporved MViT,其重新設(shè)計(jì)的結(jié)構(gòu)圖如下所示:
          1e48e36307e3f0d1a0d89b25a852fb42.webp
          Imporved MViT 在不同的下游任務(wù)提升顯著。
          (2) 廣義線性注意力計(jì)算方式
          基于 NLP 中 Transformer 進(jìn)展,我們可以考慮將其引入到 ViT 中,典型的包括 Performer,其可以通過分解獲得一個(gè)線性時(shí)間注意力機(jī)制,并重新排列矩陣乘法,以對(duì)常規(guī)注意力機(jī)制的結(jié)果進(jìn)行近似,而不需要顯示構(gòu)建大小呈平方增長(zhǎng)的注意力矩陣。在 T2T-ViT 算法中則直接使用了高效的 Performer。
          在 NLP 領(lǐng)域類似的近似計(jì)算方式也有很多,由于本文主要關(guān)注 ViT 方面的改進(jìn),故這部分不在展開分析。
          3.1.2.3.2 引入額外局部注意力


          引入額外局部注意力的典型代表是 Swin Transformer,但是卷積模塊工作方式也可以等價(jià)為局部注意力計(jì)算方式,所以從目前發(fā)展來看,主要可以分成 3 個(gè)大類:
          • 局部窗口計(jì)算模式,例如 Swin Transformer 這種局部窗口內(nèi)計(jì)算。

          • 引入卷積局部歸納偏置增強(qiáng),這種做法通常是引入或多或少的卷積來明確提供局部注意力功能。

          • 稀疏注意力。


          結(jié)構(gòu)圖如下所示:
          f7ffe0babfdca24ae1021781d0660ecb.webp
          需要特別注意的是:
          1. 引入局部窗口注意力后依然要提供跨窗口信息交互模塊,不可能只存在局部注意力模塊,因?yàn)檫@樣就沒有局部窗口間的信息交互,性能會(huì)出現(xiàn)不同程度的下降,也不符合 Transformer 設(shè)計(jì)思想( Patch 內(nèi)和 Patch 間信息交互)

          2. 局部窗口計(jì)算模式和引入卷積局部歸納偏置增強(qiáng)的劃分依據(jù)是其核心出發(fā)點(diǎn)和作用來劃分,而不是從是否包括 Conv 模塊來區(qū)分。


          (1) 局部窗口計(jì)算模式
          局部注意力的典型算法是 Swin Transformer,其將自注意力計(jì)算過程限制在每個(gè)提前劃分的窗口內(nèi)部,稱為窗口注意力 Window based Self-Attention (W-MSA),相比全局計(jì)算自注意力,明顯可以減少計(jì)算量,但是這種做法沒法讓不同窗口進(jìn)行交互,此時(shí)就退化成了 CNN,所以作者又提出移位窗口注意力模塊 Shifted window based ?Self-Attention (SW-MSA),示意圖如下所示,具體是將窗口進(jìn)行右下移位,此時(shí)窗口數(shù)和窗口的空間切分方式就不一樣了,然后將 W-MSA 和 SW-MSA 在不同 stage 之間交替使用,即可實(shí)現(xiàn)窗口內(nèi)局部注意力計(jì)算和跨窗口的局部注意力計(jì)算,同時(shí)其要求 stage 個(gè)數(shù)必須是偶數(shù)。
          4263e8f5996466c4a095f29e506621af.webp
          大概流程為:
          1. 假設(shè)第 L 層的輸入序列 Shape 是 (N, C),而 N 實(shí)際上是 (H, W) 拉伸而來。

          2. 將上述序列還原為圖片維度即(H, W, C), 假設(shè)指定每個(gè)窗口大小是 7x7,則可以將上述圖片劃分為 HW/49 個(gè)塊,然后對(duì)每個(gè)塊單獨(dú)進(jìn)行自注意力計(jì)算(具體實(shí)現(xiàn)上可以矩陣并行),這樣就將整個(gè)圖像的全局自注意力計(jì)算限制在了窗口內(nèi)部即 W-MSA 過程。

          3. 為了加強(qiáng)窗口間的信息交流,在 L+1 層需要將 W-MSA 換成 SW-MSA,具體是將 L 層的輸出序列進(jìn)行 shift 移位操作,如上圖所示,從 4 個(gè)窗口就變成了 9 個(gè)窗口,此時(shí)移位后的窗口包含了原本相鄰窗口的元素,有點(diǎn)像窗口重組了,如果在這 9 個(gè)窗口內(nèi)再次計(jì)算 W-MSA 其輸出就已經(jīng)包括了 L 層窗口間的交互信息了。


          上述只是原理概述,實(shí)際上為了保證上述操作非常高效,作者對(duì)代碼進(jìn)行了非常多的優(yōu)化,相對(duì)來說是比較復(fù)雜的。值得注意的是 ?Swin Transformer 相比其他算法(例如 PVT )非常高效,因?yàn)檎麄€(gè)算法中始終不存在全局注意力計(jì)算模塊( SW-MSA 起到類似功能),當(dāng)圖片分辨率非常高的時(shí)候,也依然是線性復(fù)雜度的,這是其突出優(yōu)點(diǎn)。憑借其局部窗口注意力機(jī)制,刷新了很多下游任務(wù)的 SOTA,影響非常深遠(yuǎn)。
          在 Swin Transformer v2 中探討了模型尺度和輸入圖片增大時(shí)候,整個(gè)架構(gòu)的適應(yīng)性和性能。在大模型實(shí)驗(yàn)中作者觀察到某些 block 或者 head 中的 attention map 會(huì)被某些特征主導(dǎo),產(chǎn)生這個(gè)的原因是原始 self-attention 中對(duì)于兩兩特征之間的相似度衡量是用的內(nèi)積,可能會(huì)出現(xiàn)某些特征 pair 內(nèi)積過大。為了改善這個(gè)問題,作者將內(nèi)積相似度替換為了余弦相似度,因?yàn)橛嘞液瘮?shù)本身的取值范圍本身就相當(dāng)于是被歸一化后的結(jié)果,可以改善因?yàn)樾┨卣?pair 內(nèi)積過大,主導(dǎo)了 attention 的情況,結(jié)構(gòu)圖如下所示:
          9187e5f4df9500acfdce1b6a8cf78244.webp
          Swin Transformer 算法在解決圖片尺度增加帶來的巨大計(jì)算量問題上有不錯(cuò)的解決方案,但是 SW-MSA 這個(gè)結(jié)構(gòu)被后續(xù)諸多文章吐槽,主要包括:
          1. 為了能夠高效計(jì)算,SW-MSA 實(shí)現(xiàn)過于復(fù)雜。

          2. SW-MSA 對(duì) CPU 設(shè)備不友好,難以部署。

          3. 或許有更簡(jiǎn)單更優(yōu)雅的跨窗口交互機(jī)制。


          基于這三個(gè)問題,后續(xù)學(xué)者提出了大量的針對(duì)性改進(jìn),可以歸納為兩個(gè)方向:
          1. 拋棄 SW-MSA,依然需要全局注意力計(jì)算模塊,意思是不再需要 ?SW-MSA,跨窗口交互功能由全局注意力計(jì)算模塊代替,當(dāng)然這個(gè)全局注意力模塊是帶有減少計(jì)算量功能的。

          2. 拋棄 SW-MSA,跨窗口信息交互由特定模塊提供,這個(gè)特定模塊就是改進(jìn)論文所提出的模塊。


          (a) 拋棄 SW-MSA,依然需要全局注意力計(jì)算模塊
          Imporved MViT 在改進(jìn)的 Pool Attention 基礎(chǔ)上,參考 Swin Transformer 在不同 stage 間混合局部注意力 W-MSA ?和 SW-MSA 設(shè)計(jì),提出 HSwin 結(jié)構(gòu),在 4 個(gè) stage 中的最后三個(gè) stage 的最后一個(gè) block 用全局注意力 Pool Attention 模塊(具體間 3.1.2.3.1 小節(jié)),其余 stage 的 block 使用 ?W-MSA ,實(shí)驗(yàn)表明這種設(shè)計(jì)比 ?Swin Transformer ?性能更強(qiáng),也更簡(jiǎn)單。
          同樣 Twins 也借鑒了 W-MSA 做法,只不過由于其位置編碼是隱式生成,故不再需要相對(duì)位置編碼,而且 SW-MSA 這種 Shift 算子不好部署,所以作者的做法是在每個(gè) Encoder 中分別嵌入 Locally-grouped self-attention (LSA) 模塊即不帶相對(duì)位置編碼的 W-MSA ?以及 GSA 模塊GSA 就是 PVT 中使用的帶空間縮減的全局自注意力模塊,通過 LSA 計(jì)算局部窗口內(nèi)的注意力,然后通過全局自注意力模塊 GSA 計(jì)算窗口間的注意力,結(jié)構(gòu)圖如下所示:
          3c00d2af9a277f6fb82bf608c17b88b7.webp
          (b) 拋棄 SW-MSA,跨窗口信息交互由特定模塊提供
          參考 CNN 網(wǎng)絡(luò)設(shè)計(jì)思想,可以設(shè)計(jì)跨窗口信息交互模塊,典型的論文包括 MSG-T 、Glance-and-Gaze Transformer 和 Shuffle Transformer。
          MSG-Transformer 基于 W-MSA,通過引入一個(gè) MSG Token 來加強(qiáng)局部窗口之間的信息交互即在每個(gè)窗口內(nèi)額外引入一個(gè) ?MSG Token,該 Token 主要作用就是進(jìn)行窗口間信息傳遞,所設(shè)計(jì)的模塊優(yōu)點(diǎn)包括對(duì) CPU 設(shè)備友好,推理速度比 SWin 快,性能也更好一些。結(jié)構(gòu)圖如下所示:
          5c2047a4eb745b2c46062b72d8949b23.webp
          1. 假設(shè)將圖片或者輸入序列劃分為 4x4 個(gè)窗口,在每個(gè)窗口內(nèi)部再劃分為 2x2 個(gè) shuffle 區(qū)域。

          2. 在每個(gè)窗口中會(huì)額外拼接一個(gè)可學(xué)習(xí)的 MSG Token (三角形),故一共需要拼接 2x2 個(gè)可學(xué)習(xí)的 MSG Token。

          3. 將拼接后的所有 token 經(jīng)過 layer norm、Swin Transformer 中的 W-MSA 和殘差連接后,同一個(gè)窗口內(nèi)的 token 會(huì)進(jìn)行注意力計(jì)算,從而進(jìn)行窗口內(nèi)信息融合。

          4. 單獨(dú)對(duì) 2x2 個(gè) MSG Token 進(jìn)行 shuffle 操作,交互 2x2 個(gè) token 信息。

          5. 然后對(duì)輸出再次進(jìn)行 ?layer norm、Channel MLP 和殘差連接后輸出即可。


          在第 3 步的 W-MSA 計(jì)算中,可以認(rèn)為同一個(gè)窗口內(nèi)會(huì)進(jìn)行信息流通,從而 2x2 個(gè) MSG Token 都已經(jīng)融合了對(duì)應(yīng)窗口內(nèi)的信息,然后經(jīng)過第 4 步驟 MSG Token 交換后就實(shí)現(xiàn)了局部窗口間信息的交互。MSG Token 信息交互模塊完成了 Swin Transformer 中 SW-MSA ,相比 SW-MSA 算子,不管是計(jì)算復(fù)雜度還是實(shí)現(xiàn)難度都非常小。Shuffle 計(jì)算過程和 ShuffleNet 做法完全一樣,如下所示:
          d0ce0dabc72a6b3f4fd618aaca662973.webp
          將 Swin Transformer 中的 block 全部換成 MSG-Transformer block ,通過實(shí)驗(yàn)驗(yàn)證了本結(jié)構(gòu)的優(yōu)異性。
          db4701ea3cba05b7435eecd6cd5eb526.webp
          Shuffle Transformer?也是從效率角度對(duì) Swin Transformer 的 SW-MSA 進(jìn)行改進(jìn),正如其名字,其是通過 Shuffle 操作來加強(qiáng)窗口間信息交流,而不再需要 SW-MSA,由于其做法和 ShuffleNet 一致就不再詳細(xì)說明,核心思想如下所示 (c):
          47110c7f438321bdf79dbbfa06e044db.webp
          將 Swin Transformer 中的 ?SW-MSA ?全部換成 Shuffle W-MSA,在此基礎(chǔ)上還引入了額外的 NWC 模塊,其是一個(gè) DW Conv,其 kernel size 和 window size 一樣,用于增強(qiáng)鄰近窗口信息交互,Shuffle Transformer 的 block 結(jié)構(gòu)如下所示:
          17e50ef41238c2e795652db599f5a1ad.webp
          在 ImageNet 數(shù)據(jù)集上,同等條件上 Shuffle Transformer相比 Swin 有明顯提升,在 COCO 數(shù)據(jù)集上,基于 Mask R-CNN,Shuffle Transformer 和 Swin 性能不相上下。
          dbaa96a5ee3d11fe2a11f603e8edee3c.webp
          因?yàn)??Swin Transformer 不存在 NWC 模塊,作者也進(jìn)行了相應(yīng)的對(duì)比實(shí)驗(yàn):
          459f6f4d1d5b1b9088c7fbf8b4a1b953.webp
          這也進(jìn)一步驗(yàn)證了引入適當(dāng)?shù)?CNN 局部算子可以在幾乎不增加計(jì)算量的前提下顯著提升性能。
          MSG-Transformer 和 Shuffle Transformer 都是通過直接替換 SW-MSA 模塊來實(shí)現(xiàn)的,Glance-and-Gaze Transformer (GG-Transformer) ?則認(rèn)為沒有必要分成兩個(gè)獨(dú)立的模塊,只需要通過同一個(gè)模塊的兩個(gè)分支融合就可以同時(shí)實(shí)現(xiàn) W-MSA 和 SW-MSA 功能。結(jié)構(gòu)圖如下所示:
          3e7396dbdf6328b6c32feffffc0c75a1.webp
          其提出一種新的局部窗口注意力計(jì)算機(jī)制,相比常規(guī)的近鄰劃分窗口,其采用了自適應(yīng)空洞率窗口劃分方式,上圖是假設(shè)空洞率是 2 即每隔 1 個(gè)位置,這樣就可以將圖片劃分為 4 個(gè)窗口,由于其采樣劃分方式會(huì)橫跨多個(gè)像素位置,相比 Swin Transofrmer 劃分方式具有更大的感受野,不斷 stage 堆疊就可以實(shí)現(xiàn)全局感受野。在 Glance 分支中采用 MSA 局部窗口計(jì)算方法計(jì)算局部注意力,同時(shí)為了增強(qiáng)窗口之間的交互,其將 V 值還原為原先劃分模式,然后應(yīng)用 depth-wise conv 來提取局部信息,再通過自適應(yīng)空洞劃分操作的逆操作還原,再加上 Attention 后的特征。
          Glance 分支用于在劃分窗口內(nèi)單獨(dú)計(jì)算窗口內(nèi)的局部注意力,由于其自適應(yīng)空洞率窗口劃分方式,使其能夠具備全局注意力提取能力,而 Gaze分支用于在劃分的窗口間進(jìn)行信息融合,具備窗口間局部特征提取能力。將 Swin Transformer 中的 block 全部換成 GG-Transformer block ,通過實(shí)驗(yàn)驗(yàn)證了其性能優(yōu)于 Swin Transformer 。
          在改進(jìn) Swin Transformer 的窗口注意力計(jì)算方式這方面,CSWin Transformer 相比其余改進(jìn)更加獨(dú)特,其提出了十字架形狀的局部窗口劃分方式,如下圖所示:
          f1619e0260240d848001b51d747b35dd.webp
          假設(shè)一共將圖片劃分成了 9 個(gè)窗口,本文所提注意力的計(jì)算只會(huì)涉及到上下左右中 5 個(gè)窗口,同時(shí)為了進(jìn)一步減少計(jì)算量,又分成 ?horizontal stripes self-attention 和 vertical stripes self-attention,每個(gè)自注意力模塊都只涉及到其中 3 個(gè)窗口,這種計(jì)算方式同時(shí)兼顧了局部窗口計(jì)算和跨窗口計(jì)算,一步到位。所謂 horizontal stripes self-attention 是指沿著 H 維度將 Tokens 分成水平條狀 windows,假設(shè)一共包括 k 個(gè)頭,則前 k/2 個(gè)頭用于計(jì)算 horizontal stripes self-attention,后面 k/2 個(gè)頭用于計(jì)算 ?vertical stripes self-attention。兩組self-attention是并行的,計(jì)算完成后將 Tokens 的特征 concat 在一起,這樣就構(gòu)成了CSW self-attention,最終效果就是在十字形窗口內(nèi)做 Attention,可以看到 CSW self-attention 的感受野要比常規(guī)的 Window Attention 的感受野更大??梢酝ㄟ^控制每個(gè)條紋的寬度來控制自注意力模塊的復(fù)雜度,默認(rèn) 4 個(gè) stage 的條紋寬度分別設(shè)為 1, 2, 7, 7(圖片空間維度比較大的時(shí)候采用較小的條紋寬度,減少計(jì)算量)。
          (2) 引入卷積的局部歸納偏置能力
          上述都是屬于 Swin Transformer 改進(jìn),在引入卷積局部歸納偏置增強(qiáng)方面,典型算法為 ViTAE 和 ELSA,ViTAE 結(jié)構(gòu)圖如下所示:
          f9cfa12e27e08a2f603e014cf8b63697.webp
          其包括兩個(gè)核心模塊:reduction cell (RC) 和 normal cell (NC)。RC 用于對(duì)輸入圖像進(jìn)行下采樣并將其嵌入到具有豐富多尺度上下文的 token 中,而 NC 旨在對(duì) token 序列中的局部性和全局依賴性進(jìn)行聯(lián)合建模,可以看到,這兩種類型的結(jié)構(gòu)共享一個(gè)簡(jiǎn)單的基本結(jié)構(gòu)。
          對(duì)于 RC 模塊,分成兩個(gè)分支,第一條分支首先將特征圖輸入到不同空洞率并行的卷積中,提取多尺度特征的同時(shí)也減少分辨率,輸出特征圖拼接+ GeLU 激活,然后輸入到注意力模塊中,第二條分支是純粹的 Conv 局部特征提取,用于加強(qiáng)局部歸納偏置,兩個(gè)分支內(nèi)容相加,然后輸入到 FFN 模塊中。
          對(duì)于 NC 模塊,類似分成兩個(gè)分支,第一條是注意力分支,第二條是 Conv 局部特征提取,用于加強(qiáng)局部歸納偏置,兩個(gè)分支內(nèi)容相加,然后輸入到 FFN 模塊中。基于上述模塊,構(gòu)建了兩個(gè)典型網(wǎng)絡(luò),如下所示:
          c9dc2e46853d2704f2acfa55686d8ad6.webp
          至于為何要如此設(shè)置以及各個(gè)模塊的前后位置,作者進(jìn)行了大量的實(shí)驗(yàn)研究:
          85b492b4474594b187e6bd88e7c8b752.webp
          ELSA: Enhanced Local Self-Attention for Vision Transformer?基于一個(gè)現(xiàn)狀:Swin Transformer 中所提的局部自注意力(LSA)的性能與卷積不相上下,甚至不如動(dòng)態(tài)過濾器。如果是這樣,那么 LSA 的重要性就值得懷疑了。最近也有很多學(xué)者發(fā)現(xiàn)了個(gè)奇怪的現(xiàn)象,例如 Demystifying Local Vision Transformer: Sparse Connectivity, Weight Sharing, and Dynamic Weight 中深入分析了注意力和 Conv 的關(guān)系,特別是 DW Conv,但是大部分都沒有深入探討 LSA 性能如此平庸的具體原因,本文從這個(gè)方面入手,并提出了針對(duì)性改進(jìn)。
          奇怪現(xiàn)象
          fcffcb278289f5f9f7f4f0f1b0be39fb.webp
          作者以 Swin Tiny 版本為例,將其中的局部窗口注意力模塊 LSA 替換為 DW Conv、decoupled dynamic filter (DDF),從上圖可以看出 DWConv 和 DDF 性能都比 LSA 強(qiáng)的,特別是 DW Conv,在參數(shù)量和 FLOPs 更小的情況下性能會(huì)比 Swin Transformer 高。
          原因分析
          作者試圖從 2 個(gè)角度來統(tǒng)一分析 LSA、DWConv 和 DDF,分別是通道數(shù)設(shè)置和空間處理方式 spatial processing。
          通道數(shù)設(shè)置 channel setting 可以用于統(tǒng)一建模 ?LSA、DWConv 在通道數(shù)上的差異。DWConv 是逐通道(深度)上計(jì)算 Conv,也就是說在不同的通道上應(yīng)用了不同的濾波器參數(shù),而 DDF 和 LSA 是將通道數(shù)分組,然后在同一個(gè)組內(nèi)采用相同的濾波器參數(shù),LSA 的通道數(shù)分組實(shí)際上就是常說的多頭機(jī)制即DwConv 可以視作一種特殊的多頭策略。如果將 DWConv 的通道數(shù)設(shè)置為 LSA 的頭個(gè)數(shù),那么通道數(shù)設(shè)置原則上就是相同效果了。對(duì)比結(jié)果如下所示:
          822a059c9680829626f15b21b6c8cb12.webp
          從上述曲線可以看出:
          • 在相同通道配置下(例如1x、2x,這里是特指4 個(gè) stage 中 head 個(gè)數(shù),典型的 1x 是 3, 6, 12, 24),DwConv 版本仍與 LSA 版本具有相似性能。

          • 從上述 1x, 2x 結(jié)果可以看出,通常來說 DWConv 的通道數(shù)肯定比 LSA 的 Head 個(gè)數(shù)多,這可能是 DWConv 性能比 LSA 高的原因,但是當(dāng)設(shè)置為相同的 Head 個(gè)數(shù)時(shí),DWConv 性能甚至比 LSA 類型更好一些。,這說明通道配置并非導(dǎo)致前述現(xiàn)象的主要原因。

          • 當(dāng) Head 個(gè)數(shù)配置大于 1x 時(shí),LSA 性能反而下降,但是 DWConv 性能確實(shí)能夠提升,這說明兩個(gè)問題:(1) LSA 中直接提升頭數(shù)并不能改善通道容量與性能,但是 DWConv 可以;(2) LSA 中需要一種新的策略以進(jìn)一步提升通道容量和性能。


          空間處理方式 spatial processing 是指如何得到濾波器或者注意力圖并對(duì)空域進(jìn)行信息聚合。DwConv采用靜態(tài)的濾波器即一旦訓(xùn)練完成,不管輸入啥圖片都是采用固定 kernel,而其他兩者則采用動(dòng)態(tài)濾波器。為了方便統(tǒng)一建模分析,作者采用統(tǒng)一的表示式來說明,如下所示:
          d70163335a13870b69efd9fb2dba5213.webp
          Conv 和 DwConv 計(jì)算公式為:
          3972badb456618bbcf90aeb3b96f8b74.webp
          當(dāng)僅僅使用?rbj-i?相對(duì)位偏置,Norm 設(shè)置為恒等變換,?Θ?表示滑動(dòng)窗口,計(jì)算方式則可以表示 Conv 和 DwConv,j-i 表示相對(duì)偏移。
          Dynamic filters 計(jì)算公式為:
          69e6ccff5191089b160679efce1e2d58.webp
          W 是 1x1 卷積,當(dāng)僅僅使用?qirkj-i?( rkj-i?表示 k 的相對(duì)位置嵌入向量 ), ?Norm 設(shè)置為恒等變換則可以表示 Dynamic filters,注意 Dynamic filters 有非常多種做法,以上寫的是其中一種。
          LSA 計(jì)算公式為:
          377c5dc352a34a1b0cd728222c4fcf0c.webp
          我們可以很容易地將公式 1 退化為 LSA 模式, Ω 表示非重疊局部窗口計(jì)算方式。
          自從可以將 DwConv 、Dynamic filters 和 LSA 統(tǒng)一起來,并且將其分成三個(gè)核心不同部分:參數(shù)形式 parameterization, 規(guī)范化方式 normalization 和濾波器應(yīng)用方式 filter application。
          參數(shù)形式 parameterization
          bd6df5a78b7ad28896e6173301e3dd38.webp
          從上表可以看出:
          • 動(dòng)態(tài)濾波器的參數(shù)策略要比標(biāo)準(zhǔn) LSA 策略具有更優(yōu)的性能(Net2 vs Net1)

          • 動(dòng)態(tài)濾波器變種策略 (Net6) 具有與 SwinT 相當(dāng)?shù)男阅?/span>

          • LSA 參數(shù)策略與動(dòng)態(tài)濾波器參數(shù)策略的組合 (Net7) 可以進(jìn)一步提升模型性能


          規(guī)范化方式 Normalization
          ae505774439b51c02d59f5fd46a83318.webp
          • 當(dāng)采用 Net7 的參數(shù)形式組合 Identity 時(shí),模型訓(xùn)練崩潰

          • 相比 FilterNorm,Softmax 規(guī)范化具有更優(yōu)的性能

          • 規(guī)范化方式并非 LSA 平庸的原因


          濾波器應(yīng)用方式 filter application
          6e06a9841fd3b532c761795b1363a174.webp
          當(dāng)將濾波器采用滑動(dòng)窗口形式時(shí),Net6 與 Net7 均得到了顯著性能提升 。這意味著:近鄰處理方式是空域處理的關(guān)鍵。
          基于上述實(shí)驗(yàn),使 LSA 變平庸的因素可以分為兩個(gè)因素:
          • 相對(duì)位置嵌入是影響性能的一個(gè)關(guān)鍵因素。

          • 另外一個(gè)關(guān)鍵因素是濾波器使用方式,即滑動(dòng)窗口 vs 非重疊窗口。


          DwConv 能夠與 LSA 性能相媲美的原因在于:它采用了滑動(dòng)窗口處理機(jī)制。當(dāng)其采用非重疊窗口機(jī)制時(shí),性能明顯弱于 LSA(見 Table1 中的 Net4)。
          動(dòng)態(tài)濾波器性能優(yōu)于 LSA 的原因在于相對(duì)位置嵌入與近鄰濾波器使用方式。兩者的集成 (Net7) 取得了最佳的性能。
          對(duì)比非重疊局部窗口與滑動(dòng)窗口,局部重疊的峰值性能要弱于滑動(dòng)窗口。局部窗口的一個(gè)缺點(diǎn)在于:窗口間缺乏信息交互,限制了其性能;而滑動(dòng)窗口的缺陷在于低吞吐量。那么,如何避免點(diǎn)乘同時(shí)保持高性能就成了新的挑戰(zhàn)
          基于上述分析,作者提出一種增強(qiáng)的局部自注意力模塊 ELSA,性能可以超越了 SwinT 中的 LSA 與動(dòng)態(tài)濾波器。
          c71c58cd8cf52f120afd3b136932d2ec.webp
          將該模塊替換掉 Swin Transformer 中的前三個(gè) stage 中的 LSA 模塊即可。ELSA 的關(guān)鍵模塊為Hadamard 注意力與 Ghost 頭模塊,表達(dá)式如下所示:
          a1d47ba09d414a4409a61cdbbd6d2403.webp
          相比 Dot product,Hadamard product ( Pytorch 中的 A*B )可以有效地提取高階信息,而 ghost 模塊是受啟發(fā)于 GhostNet,可以在有限的容量下提取更豐富的通道特征。作者在分類、目標(biāo)檢測(cè)和語義分割任務(wù)上都進(jìn)行了驗(yàn)證。
          ELSA 的解決辦法看起來過于復(fù)雜,整個(gè)分析過程也感覺有點(diǎn)復(fù)雜,可能會(huì)存在更簡(jiǎn)單的改進(jìn)策略。
          (3) 稀疏注意力(局部緊密相關(guān)和遠(yuǎn)程稀疏)
          和 Performer 一樣,NLP 領(lǐng)域內(nèi)也有很多對(duì)自注意力模塊的改進(jìn)中是引入局部注意力的,典型的例如 Sparse Transformers,其出發(fā)點(diǎn)是實(shí)際場(chǎng)景中或許用不到真正的全局注意力,只要提供稍微等價(jià)的全局效果就行,不一定真的理論上達(dá)到全局。基于此可以實(shí)現(xiàn)局部緊密相關(guān)和遠(yuǎn)程稀疏的 Sparse Transformers,后續(xù)改進(jìn)版本也非常多,例如 LongFormer。同樣的,本文對(duì) NLP 領(lǐng)域發(fā)展不展開描述。

          3.1.2.4 FFN 模塊


          FFN 模塊比較簡(jiǎn)單,主要是進(jìn)行特征變換,ViT 中代碼如下所示:
          class FeedForward(nn.Module):    def __init__(self, dim, hidden_dim, dropout = 0.):        super().__init__()        self.net = nn.Sequential(            nn.Linear(dim, hidden_dim),            nn.GELU(),            nn.Dropout(dropout),            nn.Linear(hidden_dim, dim),            nn.Dropout(dropout)        )    def forward(self, x):        return self.net(x)


          FFN 的改進(jìn)方向和前面類似,也是希望引入 CNN 局部特征提取能力,加速收斂、提升性能,主要可以歸納為如下所示:
          9568a34b2b27f510abff1c9be1318c2c.webp
          在引入 Conv 增強(qiáng)局部信息特征信息提取方面,也有不少論文進(jìn)行了嘗試。
          LocalViT 中在其他模塊都不改動(dòng)情況下,僅僅在 FFN 中引入 1x1 卷積和帶 padding 的 3x3 DW 卷積來增強(qiáng)局部特征提取能力,實(shí)驗(yàn)結(jié)果能夠帶來不少的性能提升,如下所示:
          c288f29510f9ca982ef7b05122b74aa7.webp
          (a) 是簡(jiǎn)單的卷積 forward 模塊,(b) 是反轉(zhuǎn)殘差塊,(c) 是本文所提結(jié)構(gòu),僅僅需要通過替換 FFN 中間的 MLP 層為卷積層。同樣采用類似做法的有 PVTv2 和 ?HRFormer 等等。
          CeiT 中也提出了非常類似的結(jié)構(gòu),其出發(fā)點(diǎn)也是希望引入 CNN 來加強(qiáng)局部特征能力,結(jié)構(gòu)如下所示:
          99ad7cc27c3ad93c78ff2e13a0386463.webp
          主要包括線性投影、恢復(fù)空間結(jié)構(gòu)、3x3 DW 卷積、flatten 和線性投影。
          在 3.1.2.2 位置編碼模塊中說過, PVTv2 在 FFN 中引入了零填充的逐深度通道卷積來自動(dòng)感知位置信息,從而可以省掉位置編碼。從 FFN 角度來看,除了有省掉位置編碼的好處外, 還能夠加強(qiáng)局部特征提取能力,相比 LocalViT 和 CeiT ,直接拋棄位置編碼的做法更加徹底,更加合理。

          3.1.2.5 Norm 位置改動(dòng)


          Norm 通常是 Layer Norm,按照該模型放在自注意力和 FFN 模塊的前面還是后面,可以分成 pre norm 和 post norm 方式,如下所示:
          1eaef21d6806b6eb6f6ce24c5aca2df3.webp
          絕大部分模型例如 ViT、Swin Transformer 等都是 pre norm 方式,如下所示:
          class Transformer(nn.Module):    def __init__(self, dim, depth, heads, dim_head, mlp_dim, dropout = 0.):        super().__init__()        self.layers = nn.ModuleList([])        for _ in range(depth):            self.layers.append(nn.ModuleList([                PreNorm(dim, Attention(dim, heads = heads, dim_head = dim_head, dropout = dropout)),                PreNorm(dim, FeedForward(dim, mlp_dim, dropout = dropout))            ]))    def forward(self, x):        for attn, ff in self.layers:            x = attn(x) + x            x = ff(x) + x


          但是 Swin Transformer v2 卻改成了 post norm。Swin Transformer V2 主要探討如何 scale up 視覺模型,并最終在 4 個(gè)數(shù)據(jù)集上重新刷到了新的 SOTA。將視覺 Transformer 的模型參數(shù)調(diào)大,作者認(rèn)為會(huì)面臨以下幾個(gè)挑戰(zhàn):
          • 增大視覺模型時(shí)候可能會(huì)帶來很大的訓(xùn)練不穩(wěn)定性

          • 在很多需要高分辨率的下游任務(wù)上,還沒有很好地探索出對(duì)低分辨率下訓(xùn)練好的模型遷移到更大scale 模型上的方法

          • GPU 內(nèi)存代價(jià)太大


          作者發(fā)現(xiàn),將 Swin Transformer 模型從 small size 增大到 large size 后,網(wǎng)絡(luò)深層的激活值會(huì)變得很大,與淺層特征的激活值有很大的 gap,如下圖所示,可以看出來隨著模型 scale 的增大,這個(gè)現(xiàn)象會(huì)變得很嚴(yán)重。
          b97fdb74baee99758f1a0e71d582e28c.webp
          作者發(fā)現(xiàn)使用 post-norm 操作后,上面所觀察到的問題可以得到很明顯的改善,并且為了更進(jìn)一步穩(wěn)定 largest Swin V2 的訓(xùn)練,在每 6 個(gè) transformer block 后還額外加了一層 layer normalization。也就是說在大模型 Transformer 中使用 post Norm 能夠更加穩(wěn)定訓(xùn)練過程。

          3.1.2.6 分類預(yù)測(cè)頭模塊


          在 ViT 中通過追加額外一個(gè) Class Token,將該 Token 對(duì)應(yīng)的編碼器輸出輸入到 MLP 分類頭(實(shí)際上是一個(gè)線性投影層)進(jìn)行分類,如下所示:



          self.mlp_head = nn.Sequential( nn.LayerNorm(dim), nn.Linear(dim, num_classes) )# x 是 patch embedding 輸出 cls_tokens = repeat(self.cls_token, '() n d -> b n d', b = b)x = torch.cat((cls_tokens, x), dim=1)
          ... # x 是最后一個(gè) Transformer 輸出 self.mlp_head(x[:, 0])


          為何不能和我們常規(guī)的圖像分類一樣,直接聚合所有特征,而需要單獨(dú)引入一個(gè) ?Class Token ?這個(gè)問題自然有人進(jìn)一步探索,經(jīng)過簡(jiǎn)單總結(jié),可以歸納為如下結(jié)構(gòu)圖:
          865537c41f6b101a1cd632eb2b321186.webp
          從目前來看主要包括 2 種做法:Class Token 和常規(guī)分類一樣直接聚合特征。
          Class Token 方面的改進(jìn)典型代碼是 ?CeiT ,作者的出發(fā)點(diǎn)是 ViT 僅僅使用最后一個(gè) ?Transformer 輸出做分類,但是實(shí)驗(yàn)觀察不同的 Transformer 層輸出特性不一樣,如果能夠聚合多個(gè)輸出層的特征進(jìn)行分類,也許會(huì)更好,具體做法如下所示:
          62695af8668391f02cd5c30729f028b1.webp
          首先收集不同 Transformer 層的 Class Token 對(duì)應(yīng)的輸出,然后通過一個(gè) Layer-wise Class-token Attention (LCA) 模塊來通過注意力自適應(yīng)聚合所需要的 token。LCA 可以看出一個(gè)簡(jiǎn)單的 Transformer 模塊,其包括多頭注意力模塊 MSA 和前向網(wǎng)絡(luò) FFN,在聚合信息后,取輸出序列的最后一個(gè)輸出進(jìn)行分類訓(xùn)練。為了節(jié)省計(jì)算量, MSA 只計(jì)算最后一個(gè) Class Token 和其他 Class Token 之間的單向注意力,而沒有必要算全局。
          隨著視覺 Transformer 的快速發(fā)展,后人發(fā)現(xiàn)其實(shí)直接采用 Avg Pool 聚合特征性能也很不錯(cuò),甚至?xí)?,典型的代表?Swin Transformer 和 CPVT-GAP,這種做法無需引入額外的 Class Token,和我們 CNN 中常用的分類套路一致,如下所示:
          61b74c8a9c2f8570a2f3f5d8416f8e0e.webp


          3.1.2.7 其他


          這里說的其他包括兩個(gè)部分內(nèi)容,如下所示:
          9109f563386357be5ca1866b94cd671e.webp

          3.1.2.7.1 多尺度特征圖輸出


          在 CNN 時(shí)代的各種下游任務(wù)(例如目標(biāo)檢測(cè)、語義分割)中,多分辨率多尺度特征已經(jīng)被廣泛證明非常重要。不同尺度特征可以提供不同的感受野,適合提取不同物體尺度的特征。然而 ViT 僅僅是為圖像分類而設(shè)計(jì),無法很好地應(yīng)用于下游任務(wù),這嚴(yán)重制約了視覺 Transformer 的廣泛應(yīng)用,故迫切需要一種能夠類似 ResNet 在不同 stage 輸出不同尺度的金字塔特征做法。
          cde1520b2fa4b9e8157fd6d3e7a9969f.webp
          ViT 要輸出多尺度特征圖,最常見做法是 Patch Merging。Patch Mergeing 含義是對(duì)不同窗口的 Patch 進(jìn)行合并,在目前主流的 PVT、Twins、Swin Transformer 和 ResT 中都有廣泛的應(yīng)用,以 PVT 為例詳細(xì)說明,結(jié)構(gòu)圖如下所示:
          11b983df34ee2ecdbecba54d3053ccda.webp
          假設(shè)圖片大小是 (H, W, 3),暫時(shí)不考慮 batch。
          1. 考慮將圖片切割為 HW/(4X4) 個(gè)塊,每個(gè)塊像素大小是 4x4x3, 此處 stride=4。

          2. 將每個(gè) 4x4x3 像素塊展開,變成 1 維向量,然后經(jīng)過線性投影層,輸出維度變成 C1,此時(shí)特征圖 shape 是 (HW/(4X4), C1) 即每個(gè)像素塊現(xiàn)在變成了長(zhǎng)度為 C1 的向量,這兩個(gè)步驟合并稱為 Patch Embedding。

          3. 將上一步輸出序列和位置編碼相加,輸入到編碼器中,輸出序列長(zhǎng)度不變。

          4. 將這個(gè)輸出序列恢復(fù)成空間結(jié)構(gòu),其 shape 是 (H/4, W/4, C1),此時(shí)特征圖相比原始圖片就下采樣了 4x4 倍。

          5. 在下一個(gè) stage 中改變 stride 數(shù)目,然后重復(fù) 1-4 步驟就又可以縮減對(duì)應(yīng) sxs 倍,假設(shè)設(shè)置 4 個(gè) stage 的 stride 為 [4, 2, 2, 2],那么 4 個(gè) stage 輸出的 stride 就是 [4, 8, 16, 32],這個(gè)就和 ResNet 輸出 stride 完全對(duì)齊。


          CSWin Transformer 則更加徹底,直接將上述 stride 下采樣過程替換為 kernel 為 3x3,stride為 2 的卷積,做法和 ResNet 中下采樣一致。我們將上述改變 stride 導(dǎo)致序列長(zhǎng)度變少?gòu)亩s減空間特征圖的過程統(tǒng)稱為 Patch Merging。
          除了上述這種相對(duì)樸素的做法,還有一些其他做法。例如 MViT ,其不存在專門的 Patch Merging 模塊,而是在注意力模塊中同時(shí)嵌入下采樣功能,如下所示:
          1e86a8de35f729452bfa4dc224c421bb.webp
          只要在每個(gè) stage 中改進(jìn) Pool 模塊的 stride 就可以控制實(shí)現(xiàn) ResNet 一樣的多尺度輸出,從而實(shí)現(xiàn)多分辨率金字塔特征輸出。
          ViTAE 則直接引入空洞卷積,然后設(shè)置不同的空洞率來實(shí)現(xiàn)下采樣從而輸出不同尺度的特征圖。
          f9cfa12e27e08a2f603e014cf8b63697.webp

          3.1.2.7.2 訓(xùn)練深層 Transformer


          探討如何訓(xùn)練更深的 Transformer 典型算法是 CaiT 和 DeepViT。前面的諸多 ViT 改進(jìn)都是在編碼層為 6 的基礎(chǔ)上進(jìn)行設(shè)計(jì)的,是否可以類似 CNN 分類網(wǎng)絡(luò)設(shè)計(jì)更深的 Transformer,性能也能出現(xiàn)一致性提升,不至于過早飽和?
          (1) CaiT
          在 CaiT 算法中,作者從 Transformer 架構(gòu)和優(yōu)化關(guān)系會(huì)相互影響相互作用角度出發(fā)進(jìn)行探討。在 ResNet 中,作者也說過較深的網(wǎng)絡(luò)能不能順利的優(yōu)化才是其成功的關(guān)鍵,而不是在于特征提取能力多強(qiáng),對(duì)應(yīng)到 ViT 中依然是首先要考慮如何更容易優(yōu)化,這會(huì)涉及到 Normalize 選擇、權(quán)重初始化、殘差塊初始化等模塊,不能小看這些模塊,一個(gè)良好的初始化設(shè)計(jì)都可能避免深模型的過早飽和問題。
          除了上述影響,作者發(fā)現(xiàn) ViT 的 class token 似乎有點(diǎn)不合理,ViT 在一開始就將 class token 和 patch embedding 輸出序列拼接,然后輸入給自注意力模塊,這個(gè)自注意力模塊需要同時(shí)完成兩個(gè)任務(wù):
          • 引導(dǎo) attention 過程,幫助得到 attention map。

          • token 最后輸入到 classifier 中,完成分類任務(wù)。


          也就是說,將 class token 和 ?patch embedding 過早融合,但是兩者優(yōu)化方向不一樣,可能存在矛盾。同時(shí)說到更順利的優(yōu)化,Normalize 的重要性應(yīng)該是第一個(gè)能想到的?;谶@兩個(gè)出發(fā)點(diǎn),作者進(jìn)行了如下改進(jìn):
          • 提出 LayerScale,更合理的 Norm 策略使深層 Transformer 易于收斂,并提高精度。

          • 提出 class-attention layers,class token 和 patch embedding 在最后融合,并且通過 CA 模塊來更加高效地將 patch embedding 信息融合到 class embedding 中,從而提升性能。


          結(jié)構(gòu)圖如下所示:
          2195b6c21fcaa531b2a349dc0a1ba990.webp
          (a) LayerScale
          99d438890dd50a8e5ba332435fb5c1b3.webp
          • (a) 是 ViT 做法即先進(jìn)行 Layer Normalization,再進(jìn)行 Self-attention 或者 FFN,然后結(jié)果與 block 輸入相加。

          • (b) 是 ReZero、Skipinit 和 Fixup 算法的做法,引入了一個(gè)可學(xué)習(xí)的參數(shù) alpha 作用在 residual block 的輸出,并移除了 Layer Normalization 操作,這個(gè)可學(xué)習(xí)參數(shù)初始化可以從 0 開始,也可以從 1 開始,實(shí)驗(yàn)表示都無法很好地解決深層 Transformer 優(yōu)化問題。

          • (c) 是一個(gè)組合做法,實(shí)驗(yàn)發(fā)現(xiàn)這種組合做法有一定效果。

          • (d) 是本文所提 LayerScale,效果最好。


          LayerScale 的做法是保留 Layer Normalization,并對(duì) Self-attention 或者 FFN 的輸出乘上一個(gè)對(duì)角矩陣,由于其對(duì)角矩陣,這個(gè)實(shí)際上就等效于通道注意力(對(duì)不同通道乘上不同的系數(shù)),這些系數(shù)的設(shè)置比較有講究,在 18 層之前,它們初始化為 0.1,若網(wǎng)絡(luò)更深,則在 24 層之前初始化為 10^-5,若網(wǎng)絡(luò)更深,則在之后更深的網(wǎng)絡(luò)中初始化為 10^-6,這樣設(shè)計(jì)的原因是希望越深的 block 在一開始的時(shí)候更接近恒等映射,在訓(xùn)練的過程中逐漸地學(xué)習(xí)到模塊自身所需要的特征,這個(gè)理論和 ResNet 中初始化設(shè)計(jì)非常類似。
          (b) Class-Attention Layers
          從上述結(jié)構(gòu)圖中可以看出, class token 是在后面融合,前面的 Transformer 層專注于 patch embedding 信息提取。CA 模塊做法為:
          60755718560c607df2f55791aee69f38.webpcc284cc60c7782ad0dfa1a2e9736ce34.webp461b78837b5439f37b8585fc97b3fcc9.webp
          Q 僅僅來自 class token,而 KV 來自 z=[class token, patch embedding],上述做法是常規(guī)的交叉注意力計(jì)算方式。作者實(shí)驗(yàn)發(fā)現(xiàn) CA layer 使用 2 層就夠了,前面依舊是 N 個(gè)正常的 Transformer Block。如果直接看代碼可能會(huì)更清晰一些:
          def forward_features(self, x):    B = x.shape[0]    # x 是圖片,經(jīng)過 patch embed 變成序列    x = self.patch_embed(x)    # n 個(gè) transformer 模塊    x = x + self.pos_embed    x = self.pos_drop(x)    # SA+FFN    for i , blk in enumerate(self.blocks):        x = blk(x)    cls_tokens = self.cls_token.expand(B, -1, -1)     # CA+FFN        for i , blk in enumerate(self.blocks_token_only):        cls_tokens = blk(x,cls_tokens)    x = torch.cat((cls_tokens, x), dim=1)       x = self.norm(x)    return x[:, 0]


          上述就是 CaiT 算法主要改進(jìn),但是其實(shí)要想成功訓(xùn)練出來還需要諸多 trick,作者在論文中也貼了大量對(duì)比實(shí)驗(yàn),有興趣的建議直接閱讀原文,本文僅僅描述了最重要的改進(jìn)而已。更貼心的是,作者還列出了 DeiT-S 到 CaiT-36 的性能提升 trick 表,這個(gè)表格同樣重要。
          8b38a6b86bbb81d46b769b0d0ae305ce.webp
          (2) DeepViT
          CaiT 算法是從整體架構(gòu)和優(yōu)化聯(lián)系角度入手,而 DeepViT 不一樣,他通過分析得出深層 Transformer 性能飽和的原因是注意力崩塌,即深層的 Transformer 學(xué)到的 attention 非常相似。這意味著隨著 ViT 的層次加深,self-attention 模塊在生成不同注意力以捕獲多樣性特征方面變得低效。如下圖所示,上面一行是 ViT 訓(xùn)練結(jié)果,隨著模型深入,自注意力層學(xué)到的自注意力權(quán)重圖趨向均勻且都非常類似,下面一類是作者改進(jìn)后的可視化結(jié)果,根據(jù)多樣性。
          82d22613e87963f5d7ae86641f685f42.webp
          DeepViT 中作者也做了很多前期實(shí)驗(yàn),來驗(yàn)證注意力崩塌現(xiàn)象。那么現(xiàn)在核心問題就是要使得各個(gè)注意力層所提取的注意力權(quán)重圖根據(jù)多樣性,獨(dú)特性。
          為了解決這個(gè)問題,作者提出了 2 種解決辦法:
          (a) 增加 self-attention 模塊的嵌入維度
          ab11c8d995d8194e0a2fe38b44d2a54d.webp
          作者認(rèn)為,增加嵌入維度,可以增加表征容量從而避免注意力崩塌。實(shí)驗(yàn)結(jié)果如上所示,隨著 Embedding Dimension 的增長(zhǎng),相似的 Block 的數(shù)量在下降, Acc 在上升,說明這個(gè)策略實(shí)際上確實(shí)是有效的。但增加 Embedding Dimension 也會(huì)顯著增加計(jì)算成本,帶來的性能改進(jìn)往往會(huì)減少,且需要更大的數(shù)據(jù)量來訓(xùn)練,增加了過擬合的風(fēng)險(xiǎn),這個(gè)也不是啥實(shí)質(zhì)性的解決辦法。為此作者提出了第二個(gè)改進(jìn) Re-attention。
          (b) ?Re-attention
          6cc7246449f96d07a82e5cf6634bd0ce.webp
          只需要替換 Self-Attention 為 Re-Attention 即可,其結(jié)構(gòu)圖如下右圖所示:
          85f4116f8fec9fddfe3545dfe404fd07.webp
          作者通過實(shí)驗(yàn)觀察到同一個(gè)層的不同 head 之間的相似度比較小,這表明來自同一自注意力層的不同head 關(guān)注到了輸入 token 的不同方面,基于此作者提出可以把不同的 head 的輸出信息融合,然后利用它們?cè)偕鲆粋€(gè)新的 attention map。具體為引入一個(gè)可學(xué)習(xí) Linear Transformation,在注意力圖生成后乘上 Linear Transformation,從而生成一個(gè)新的 ?attention map,然后進(jìn)行 Norm 后乘上 V。
          3c13b3656673da12c7e8d85de3d4a93e.webp
          因?yàn)槲覀兡康氖羌訌?qiáng)同一個(gè)自注意力層間不同 head (通常是8,也就是 ?Linear Transformation 矩陣大小是 8x8) 之間的交流,所以這個(gè)可學(xué)習(xí) Linear Transformation 是作用在 head 維度,同時(shí) Norm 是 BatchNorm 而不是傳統(tǒng)的 LayerNorm。
          CaiT 和 DeepViT 都是關(guān)注深層 Transformer 出現(xiàn)的過早飽和問題,不過關(guān)注的地方不一樣,解決辦法也完全不同,但是效果類似,這或許說明還有很大的改進(jìn)空間。


          4. 總結(jié)


          ViT 的核心在于 Attention,但是整個(gè)架構(gòu)也包括多個(gè)組件,每個(gè)組件都比較關(guān)鍵,有諸多學(xué)者對(duì)多個(gè)組件進(jìn)行了改進(jìn)。我們可以簡(jiǎn)單將 ViT 結(jié)構(gòu)分成 6 個(gè)部分:
          1. Token 模塊,其中可以分成 Image to Token 模塊 和 Token to Token 模塊,Image to Token 將圖片轉(zhuǎn)化為 Token,通常可以分成非重疊 Patch Embedding 和重疊 Patch Embedding,而 ?Token to Token 用于各個(gè) Transformer 模塊間傳遞 Token,大部分方案都和 Image to Token 做法一樣即 Patch Embedding,后續(xù)也有論文提出動(dòng)態(tài)窗口劃分方式,本質(zhì)上是利用了圖片級(jí)別的語義自動(dòng)生成最有代表性的采樣窗口。

          2. 位置編碼模塊,其中可以分成顯式位置編碼和隱式位置編碼,顯式位置編碼表示需要手動(dòng)設(shè)置位置編碼,包括絕對(duì)位置編碼和相對(duì)位置編碼,而隱式位置編碼一般是指的利用網(wǎng)絡(luò)生成自適應(yīng)內(nèi)容的位置編碼向量,其提出的主要目的是為了解決顯式位置編碼中所遇到的當(dāng)圖片尺寸變化時(shí)位置編碼插值帶來的性能下降的問題。

          3. 注意力模塊,早期的自注意力模塊都是全局注意力,計(jì)算量巨大,因此在圖片領(lǐng)域會(huì)針對(duì)性設(shè)計(jì)減少全局注意力,典型做法是降低 KV 空間維度,但是這種做法沒有解決根本問題,因此 Swin Transformer 中提出了局部窗口自注意力層,自注意力計(jì)算僅僅在每個(gè)窗口內(nèi)單獨(dú)計(jì)算,不再存在上述問題。

          4. FFN 模塊,其改進(jìn)方向大部分是引入 DW 卷積增強(qiáng)局部特征提取能力,實(shí)驗(yàn)也證明了其高效性。

          5. Normalization 模塊位置,一般是 pre norm。

          6. 分類預(yù)測(cè)模塊,通常有兩種做法,額外引入 Class Token 和采用常規(guī)分類做法引入全局池化模塊進(jìn)行信息聚合。


          隨著研究的不斷深入,大家發(fā)現(xiàn) Attention 可能不是最重要的,進(jìn)而提出了 MLP-based 和 ConvMixer-based 類算法,這些算法都是為了說明自注意力模塊可以采用 MLP 或者 Conv 層代替,這說明 Transformer 的成功可能來自整個(gè)架構(gòu)設(shè)計(jì)。MLP-based 和 ConvMixer-based 部分將會(huì)在下一篇文章中進(jìn)行說明。

          - The End -


          GiantPandaCV

          長(zhǎng)按二維碼關(guān)注我們

          本公眾號(hào)專注:

          1. 技術(shù)分享;

          2.?學(xué)術(shù)交流;

          3.?資料共享。

          歡迎關(guān)注我們,一起成長(zhǎng)!

          瀏覽 588
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人久久91久久 | 黄色免费在线观看网站 | 毛片网站在线看 | www.国产视频在线观看 | 高清无码乱伦片 |