CPVT:一個(gè)卷積就可以隱式編碼位置信息

極市導(dǎo)讀
當(dāng)使用ViT模型時(shí),當(dāng)圖像輸入大小變化時(shí)會造成性能損失而本文介紹了一個(gè)新方案-CPVT。CPVT通過引入一個(gè)帶有zero-padding的卷積來隱式地拜納姆位置信息,從而省去了顯式的positional embedding。>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺的最前沿
對于transformer來說,由于self-attention操作是permutation-invariant的,所以需要一個(gè)positional encodings(PE)來顯示地編碼sequence中tokens的位置信息。ViT模型是采用學(xué)習(xí)的固定大小的positional embedding,但是當(dāng)圖像輸入大小變化時(shí),就需要對positional embedding來插值來適應(yīng)輸入tokens數(shù)量帶來的變化,這一過程會造成性能損失。這里介紹的CPVT,就主要來解決這個(gè)問題,CPVT的解決方案是引入一個(gè)帶有zero-padding的卷積來隱式地編碼位置信息(PEG),從而省去了顯式的positional embedding,最重要的是CPVT模型在輸入圖像大小變化時(shí)性能是穩(wěn)定的。CPVT這種特性是很多圖像任務(wù)所需要的,比如分割和檢測往往需要大小變化的輸入圖像。

位置編碼的影響
由于self-attention的permutation-invariant使得transformer需要一個(gè)特殊的positional encodings來顯式地引入sequence中tokens的位置信息,因?yàn)闊o論是文本還是圖像sequence,位置信息都是非常重要的。論文中以DeiT-tiny為實(shí)驗(yàn)?zāi)P?,分別采用no positional encodings,learnable absolute positional encodings,fixed sin-cos positional encodings以及relative postional encodings等,不同的策略在ImageNet下的效果如下表所示:

主要結(jié)論如下:
positional encodings對模型性能比較關(guān)鍵,不采用任何PE效果最差; relative postional encodings相比absolute positional encodings效果稍差,絕對位置編碼比較重要; 采用顯式的PE,當(dāng)圖像分辨率提升時(shí)直接對PE插值處理,性能會下降;
對于顯式的PE,當(dāng)圖像分辨率與訓(xùn)練時(shí)不一致,往往需要finetune來彌補(bǔ)PE插值帶來的性能損失。另外,論文中還提到了采用顯式的PE會破壞圖像tokens的“平移等價(jià)性”(translation equivariance,論文中說的是translation invariance:“平移不變性”,但是我理解應(yīng)該前者更合適):當(dāng)一個(gè)物體在圖像中進(jìn)行平移時(shí),只是物體對應(yīng)的tokens發(fā)生了變化,但是token embeddings并不會變(卷積也具有平移等價(jià)性:物體平移,“特征”也是同樣平移)。但是不同位置的PE是不同的,雖然token embeddings是一樣的,但是會加上不同的PE,那么平移等價(jià)性就被破壞了。
PEG:Conditional Positional Encodings
基于上面的實(shí)驗(yàn)分析,論文中認(rèn)為一個(gè)理想的positional encoding應(yīng)該滿足一下條件:
處理sequence時(shí),操作具有permutation-variant但translation-equivariance特性:對位置敏感但同時(shí)具有平移等價(jià)性; 能夠自然地處理變長的sequence; 能夠一定程度上編碼絕對位置信息(absolute position)。
基于這三點(diǎn),論文中給出的方案是采用一個(gè)帶有zero padding的2D卷積( kernel size k ≥ 3)來充當(dāng)positional encodings。卷積是一種局部運(yùn)算,所以當(dāng)tokens順序被打亂,特征就發(fā)生了變化,卷積天生具有平移等價(jià)性,所以卷積滿足第一點(diǎn),對于第二點(diǎn)更是毫無疑問?,F(xiàn)在關(guān)鍵的是第三點(diǎn),因?yàn)閺闹庇X來看,卷積具有平移等價(jià)性,那么是無法編碼絕對信息,這兩個(gè)特性其實(shí)是相互矛盾的。但是其實(shí)CNN已經(jīng)被證明了可以編碼圖像的絕對位置信息,這主要是因?yàn)閳D像的boundary effects以及卷積的zero-padding操作造成的。感興趣的可以看看參考文獻(xiàn)中的論文[2-4]。
具體的,論文中設(shè)計(jì)了基于卷積的Positional Encoding Generator (PEG)來進(jìn)行positional encodings,其結(jié)構(gòu)圖如下所示:

首先對input sequence 進(jìn)行reshape到2-D圖像空間得到,然后通過一個(gè)kernel size為k(k ≥ 3),(k?1)/2 zero paddings的2-D卷積操作,最后再reshape成token sequence。這里的zero-padding比較關(guān)鍵,這樣才能編碼絕對位置信息,為了減少計(jì)算量,論文中采用depth-wise convolution。論文中稱這種編碼方式為Conditional Positional Encodings,因?yàn)?positional encodings是基于限定tokens的局部關(guān)系來產(chǎn)生的。PEG的具體實(shí)現(xiàn)比較簡單,PyTorch實(shí)現(xiàn)代碼如下:
class PEG(nn.Module):def __init__(self, dim=256, k=3):self.proj = nn.Conv2d(dim, dim, k, 1, k//2, groups=dim)# Only for demo use, more complicated functions are effective too.def forward(self, x, H, W):B, N, C = x.shapecls_token, feat_token = x[:, 0], x[:, 1:] # cls token不參與PEGcnn_feat = feat_token.transpose(1, 2).view(B, C, H, W)x = self.proj(cnn_feat) + cnn_feat # 產(chǎn)生PE加上自身x = x.flatten(2).transpose(1, 2)x = torch.cat((cls_token.unsqueeze(1), x), dim=1)return x
CPVT
和ViT和DeiT類似,論文也基于PEG設(shè)計(jì)了三種不同的CVPT結(jié)構(gòu),如下表所示,最大的模型CPVT-B和ViT-B,DeiTB設(shè)置一樣,而CPVT-S和CPVT-Ti分別和DeiT-small及DeiT-tiny采用同樣的配置。

ViT和Deit模型都在transformer encoder開始之前,直接將token embeddings加上positional embeddings。而CPVT是將PEG插在第一個(gè)encoder之后效果最好,這是因?yàn)榻?jīng)過encoder之后的特征具有全局信息,再施加PEG可以產(chǎn)生更好的位置信息,這和PEG采用較大的卷積核類似,實(shí)驗(yàn)上也證明了這一點(diǎn)(另外論文中還實(shí)驗(yàn)證明后面的encoder也添加PEG可以實(shí)現(xiàn)更好的效果)。CPVT的簡單實(shí)現(xiàn)如下所示:
import torchimport torch.nn as nnclass VisionTransformer:def __init__(layers=12, dim=192, nhead=3, img_size=224, patch_size=16):self.pos_block = PEG(dim)self.blocks = nn.ModuleList([TransformerEncoderLayer(dim, nhead, dim*4) for _ in range(layers)])self.patch_embed = PatchEmbed(img_size, patch_size, dim*4)def forward_features(self, x):B, C, H, W = x.shapex, patch_size = self.patch_embed(x)_H, _W = H // patch_size, W // patch_sizex = torch.cat((self.cls_tokens, x), dim=1)for i, blk in enumerate(self.blocks):x = blk(x)if i == 0: # 第一個(gè)encoder之后施加PEGx = self.pos_block(x, _H, _W)return x[:, 0]
CPVT相比DeiT,當(dāng)輸入大小增大時(shí)(從224增加到384)表現(xiàn)更好的效果,具體對比如下所示,可以看到CPVT的acc相比DeiT來說不降反升。論文中還有更多細(xì)致的分析,這里就不展開了。

另外,論文中還提出用GAP( Global Average Pooling)來替換class token來實(shí)現(xiàn)分類,因?yàn)镚AP是translation-invariant的(這里是平移不變性),配合PEG的平移等價(jià)性,模型就是translation-invariant的,這樣效果更好。比如CPVT-Ti采用GAP相比CLT提升了1點(diǎn)以上。

除了CPVT,近期一篇論文CvT也發(fā)現(xiàn)添加卷積之后,模型完全可以去除PE,而且CvT實(shí)現(xiàn)了更好的效果(在ImageNet-22k預(yù)訓(xùn)練后, 在ImageNet-1k上top-1 accuracy達(dá)到87.7% )。
參考
Conditional Positional Encodings for Vision Transformers How Much Position Information Do Convolutional Neural Networks Encode? Position, Padding and Predictions: A Deeper Look at Position Information in CNNs On Translation Invariance in CNNs: Convolutional Layers can Exploit Absolute Spatial Location CvT: Introducing Convolutions to Vision Transformers
推薦閱讀
2021-03-23
2021-02-23
2020-12-10

# CV技術(shù)社群邀請函 #
備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測-深圳)
即可申請加入極市目標(biāo)檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學(xué)影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群
每月大咖直播分享、真實(shí)項(xiàng)目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~

