淺談CMT以及從0-1復現

「來源: |GiantPandaCV ID:BBuf233」

【GiantPandaCV導語】本篇部落格講解CMT模型並給出從0-1復現的過程以及實驗結果,由於論文的細節並沒有給出來,所以最後的復現和paper的精度有一點差異,等作者release程式碼後,我會詳細的校對我自己的code,找找原因。

論文連結

: https://arxiv。org/abs/2107。06263

論文程式碼(個人實現版本): https://github.com/FlyEgle/CMT-pytorch

知乎專欄:https://www.zhihu.com/people/flyegle

1。 出發點

Transformers與現有的卷積神經網路(CNN)在效能和計算成本方面仍有差距。

希望提出的模型不僅可以超越典型的Transformers,而且可以超越高效能卷積模型。

2。 怎麼做

提出混合模型(序列),透過利用Transformers來捕捉長距離的依賴關係,並利用CNN來獲取區域性特徵。

引入depth-wise卷積,獲取區域性特徵的同時,減少計算量

使用類似R50模型結構一樣的stageblock,使得模型具有下采樣增強感受野和遷移dense的能力。

使用conv-stem來使得影象的解析度縮放從VIT的1/16變為1/4,保留更多的patch資訊。

3。 模型結構

淺談CMT以及從0-1復現

模型結構

(a)表示的是標準的R50模型,具有4個stage,每個都會進行一次下采樣。最後得到特徵表達後,經過AvgPool進行分類

(b)表示的是標準的VIT模型,先進行patch的劃分,然後embeeding後進入Transformer的block,這裡,由於Transformer是long range的,所以進入什麼,輸出就是什麼,引入了一個非image的class token來做分類。

(c)表示的是本文所提出的模型框架CMT,由CMT-stem, downsampling, cmt block所組成,整體結構則是類似於R50,所以可以很好的遷移到dense任務上去。

3。1。 CMT Stem

使用convolution來作為transformer結構的stem,這個觀點FB也有提出一篇paper,Early Convolutions Help Transformers See Better。

CMT&Conv stem共性

使用4層conv3x3+stride2 + conv1x1 stride 1 等價於VIT的patch embeeding,conv16x16 stride 16。

使用conv stem,可以使模型得到更好的收斂,同時,可以使用SGD最佳化器來訓練模型,對於超引數的依賴沒有原始的那麼敏感。好處那是大大的多啊,僅僅是改了一個conv stem。

CMT&Conv stem異性

本文僅僅做了一次conv3x3 stride2,實際上只有一次下采樣,相比conv stem,可以保留更多的patch的資訊到下層。

從時間上來說,一個20210628(conv stem), 一個是20210713(CMT stem),存在借鑑的可能性還是比較小的,也說明了conv stem的確是work。

3。2。 CMT Block

每一個stage都是由CMT block所堆疊而成的,CMT block由於是transformer結構,所以沒有在stage裡面去設計下采樣。每個CMT block都是由Local Perception Unit, Ligntweight MHSA, Inverted Residual FFN這三個模組所組成的,下面分別介紹:

Local Perception Unit(LPU)

淺談CMT以及從0-1復現

本文的一個核心點是希望模型具有long-range的能力,同時還要具有local特徵的能力,所以提出了LPU這個模組,很簡單,一個3X3的DWconv,來做區域性特徵,同時減少點計算量,為了讓Transformers的模組獲取的longrange的資訊不缺失,這裡做了一個shortcut,公式描述為:

Lightweight MHSA(LMHSA)

淺談CMT以及從0-1復現

MHSA這個不用多說了,多頭注意力,Lightweight這個作用,PVT(連結:https://arxiv。org/abs/2102。12122)曾經有提出過,目的是為了降低複雜度,減少計算量。那本文是怎麼做的呢,很簡單,假設我們的輸入為, 對其分別做一個scale,使用卷積核為,stride為的Depth Wise卷積來做了一次下采樣,得到的shape為,那麼對應的Q,K,V的shape分別為:

我們知道,在計算MHSA的時候要遵守兩個計算原則:

Q, K的序列dim要一致。

K, V的token數量要一致。

所以,本文中的MHSA計算公式如下:

Inverted Resdiual FFN(IRFFN)

淺談CMT以及從0-1復現

ffn

FFN的這個模組,其實和mbv2的block基本上就是一樣的了,不一樣的地方在於,使用的是GELU,採用的也是DW+PW來減少標準卷積的計算量。很簡單,就不多說了,公式如下:

那麼我們一個block裡面的整體計算公式如下:

3。3 patch aggregation

每個stage都是由上述的多個CMTblock所堆疊而成, 上面也提到了,這裡由於是transformer的操作,不會設計到scale尺度的問題,但是模型需要構造下采樣,來實現層次結構,所以downsampling的操作單獨拎了出來,每個stage之前會做一次卷積核為2x2的,stride為2的卷積操作,以達到下采樣的效果。

所以,整體的模型結構就一目瞭然了,假設輸入為224x224x3,經過CMT-STEM和第一次下采樣後,得到了一個56x56的featuremap,然後進入stage1,輸出不變,經過下采樣後,輸入為28x28,進入stage2,輸出後經過下采樣,輸入為14x14,進入stage3,輸出後經過最後的下采樣,輸入為7x7,進入stage4,最後輸出7x7的特徵圖,後面接avgpool和分類,達到分類的效果。

我們接下來看一下怎麼復現這篇paper。

4。 論文復現

ps

: 這裡的

復現

指的是沒有原始碼的情況下,實現網路,訓練等,如果是結果復現,會標明為

復現精度

這裡存在幾個問題

文章的問題:我看到paper的時候,是第一個版本的arxiv,大概過了一週左右V2版本放出來了,這兩個版本有個很大的diff。Version1

淺談CMT以及從0-1復現

Version2

淺談CMT以及從0-1復現

網路結構可以說完全不同的情況下,FLOPs竟然一樣的,當然可能是寫錯了,這裡就不吐槽了。不過我一開始程式碼復現就是按下面來的,所以對於我也沒影響多少,只是體驗有點差罷了。

細節的問題:paper和很多的transformer一樣,都是採用了Deit的訓練策略,但是差別在於別的paper或多或少會給出來額外的tirck,比如最後FC的dp的ratio等,或者會改變一些,再不濟會把程式碼直接release了,所以只好悶頭嘗試Trick。

4。1 復現難點

paper裡面採用的Position Embeeding和Swin是類似的,都是Relation Position Bias,但是和Swin不相同的是,我們的Q,K,V尺度是不一樣的。這裡我考慮了兩種實現方法,一種是直接bicubic插值,另一種則是切片,切片更加直觀且embeeding我設定的可BP,所以,實現裡面採用的是這種方法,程式碼如下:

defgenerate_relative_distance(number_size):

“”“return relative distance, (number_size**2, number_size**2, 2)

”“”

indices = torch。tensor(np。array([[x, y] for x in range(number_size) for y in range(number_size)]))

distances = indices[None, :, :] - indices[:, None, :]

distances = distances + number_size - 1# shift the zeros postion

return distances

。。。

elf。position_embeeding = nn。Parameter(torch。randn(2 * self。features_size - 1, 2 * self。features_size - 1))

。。。

q_n, k_n = q。shape[1], k。shape[2]

attn = attn + self。position_embeeding[self。relative_indices[:, :, 0], self。relative_indices[:, :, 1]][:, :k_n]

4。2 復現trick歷程(血與淚TT)

一方面想要看一下model是否是work的,一方面想要順便驗證一下DeiT的策略是否真的有效,所以從頭開始做了很多的實驗,簡單整理如下:

資料:

訓練資料: 20%的imagenet訓練資料(快速實驗)。

驗證資料: 全量的imagenet驗證資料。

環境:

8xV100 32G

CUDA 10。2 + pytorch 1。7。1

sgd最佳化器實驗記錄

淺談CMT以及從0-1復現

結論

: 可以看到在SGD最佳化器的情況下,使用1。6的LR,訓練300個epoch,warmup5個epoch,是用cosine衰減學習率的策略,用randaug+colorjitter+mixup+cutmix+labelsmooth,設定weightdecay為0。1的配置下,使用QKV的bias以及相對位置偏差,可以達到比baseline高11%個點的結果,所有的實驗都是用FP16跑的。

adamw最佳化器實驗記錄

淺談CMT以及從0-1復現

結論

:使用AdamW的情況下,對學習率的縮放則是以512的bs為基礎,所以對於4k的bs情況下,使用的是4e-3的LR,但是實驗發現增大到6e-3的時候,還會帶來一些提升,同時放大一點weightsdecay,也略微有所提升,最終使用AdamW的配置為,6e-3的LR,1e-1的weightdecay,和sgd一樣的增強方法,然後加上了隨機深度失活設定,最後比baseline高了16%個點,比SGD最好的結果要高0。8%個點。

4。3。 imagenet上的結果

淺談CMT以及從0-1復現

result

最後用全量跑,使用SGD會報nan的問題,我定位了一下發現,running_mean和running_std有nan出現,本以為是資料增強導致的0或者nan值出現,結果空跑幾次資料發現沒問題,只好把最佳化器改成了AdamW,結果上述所示,CMT-Tiny在160x160的情況下達到了75。124%的精度,相比MbV2,MbV3的確是一個不錯的精度了,但是相比paper本身的精度還是差了將近4個點,很是離譜。

速度上,CMT雖然FLOPs低,但是實際的推理速度並不快,128的bs條件下,速度慢了R50將近10倍。

5。 實驗結果

總體來說,CMT達到了更小的FLOPs同時有著不錯的精度, imagenet上的結果如下:

淺談CMT以及從0-1復現

coco2017上也有這不錯的精度

淺談CMT以及從0-1復現

6。 結論

本文提出了一種名為CMT的新型混合架構,用於視覺識別和其他下游視覺任務,以解決在計算機視覺領域以粗暴的方式利用Transformers的限制。所提出的CMT同時利用CNN和Transformers的優勢來捕捉區域性和全域性資訊,促進網路的表示能力。在ImageNet和其他下游視覺任務上進行的大量實驗證明了所提出的CMT架構的有效性和優越性。

程式碼復現repo: https://github.com/FlyEgle/CMT-pytorch

, 實現不易,求個star!