Involution再思考:三大任務(wù)漲點明顯
【GiantPandaCV導語】在被Transformer結(jié)構(gòu)刷榜之前,CNN一直都是CV任務(wù)的標配。卷積有兩個基本性質(zhì),分別是空間不變性 (spatial-agnostic)和通道特異性 (channel-specific)。空間不變性使得卷積能夠在所有位置共享參數(shù),并充分利用視覺特征的“平移等變性”。通道特異性使得卷積能夠充分建模通道之間的關(guān)系,提高模型的學習能力。
但是任何事物其實都是有兩面性的,這兩個性質(zhì)在具有優(yōu)點的同時,也同樣存在缺點(缺點會在Motivation中進行具體分析)。因此,作者腦洞打開,將卷積的性質(zhì)進行了反轉(zhuǎn),提出了一個新的算子——Involution,這個算子具有空間特異性和通道不變性。最終,基于Involution結(jié)構(gòu),作者提出了實例化網(wǎng)絡(luò)結(jié)構(gòu)RedNet,并在分類、檢測、分割任務(wù)上提點明顯。
這篇工作其實是作者在rethink卷積的性質(zhì)之后提出的一個新的結(jié)構(gòu),雖然相比于最近幾篇ViT的文章,這篇文章在性能上顯得有些無力。但是相比于ResNet結(jié)構(gòu),這篇文章無論是在參數(shù)量,還是計算量、性能上都有非常大的優(yōu)越性。
另外,這篇文章其實是加強了空間上的建模,減弱了通道上建模關(guān)系。個人感覺視覺特征上的通道信息還是比較有用的,而相比之下,文本的通道信息作用就沒有那么大,而文本上的空間關(guān)系是更加有用的。所以,個人覺得,按照這個思路,Involution在NLP 領(lǐng)域說不定提點效果會更加明顯,有興趣的同學也可是在NLP任務(wù)中試試Involution的效果,效果應(yīng)該會比TextCNN會好一些,說不定能達到跟Transformer差不多的結(jié)果。
1. 論文和代碼地址
Involution: Inverting the Inherence of Convolution for Visual Recognition
論文地址:https://arxiv.org/pdf/2103.06255.pdf
代碼地址:https://github.com/d-li14/involution
核心代碼:https://github.com/xmu-xiaoma666/External-Attention-pytorch/blob/master/conv/Involution.py
2. Motivation
前面說到了CNN的空間不變性 (spatial-agnostic)和通道特異性 (channel-specific)有一些優(yōu)點,但這些優(yōu)點有時候也會變成缺點。
CNN在空間不變性表現(xiàn)在:卷積核在所有的空間位置上都共享參數(shù),那就會導致不同空間位置的局部空間建模能力受限,并無法有效的捕獲空間上長距離的關(guān)系。
CNN的通道特異性指的是:輸出特征的每個通道信息是由輸入特征的所有通道信息聚合而來,并且參數(shù)不共享,所以就會導致參數(shù)和計算量比較大。并且,也有一些工作表明了不同輸出通道對應(yīng)的卷積濾波器之間是存在信息冗余的,因此對每個輸出通道都使用不同的卷積核這一方式其實是并不高效的。
因此,基于發(fā)現(xiàn)的這兩個缺點,作者采用了一種非?!昂唵未直钡姆绞絹斫鉀Q這兩個缺點——把整兩個性質(zhì)顛倒一下,提出一個“空間特異性”和“通道不變性”的算子。
3. 方法
3.1. 卷積的過程
在介紹Involution之前,我們先回顧一下正常卷積的過程:
(圖來自https://zhuanlan.zhihu.com/p/339835983)
如上圖所示,正常卷積的卷積核大小為,可以看出卷積核矩陣的大小,我們也可以看出,卷積的參數(shù)與輸入特征的大小H和W是無關(guān)的,因此具有空間不變性;與輸入和輸出通道的數(shù)量是呈正比的,因此具有通道特異性??梢员硎境上旅娴墓剑?img data-ratio="0.1650943396226415" src="https://filescdn.proginn.com/cb0a9abfeaf3551f6ffe69269cd26878/8716ee570d528263863f7b4f5d9caeab.webp" data-type="png" data-w="636" style="display: block;margin-right: auto;margin-left: auto;">

(圖來自https://zhuanlan.zhihu.com/p/339835983)
除了正常的卷積,如上圖所示,還有一種輕量級的卷積Depthwise Conv在深度學習中使用也非常多,Depthwise卷積是正常卷積的一種特殊情況(卷積的groups數(shù)等于輸入通道的數(shù)量),可以用下面的公式表示:
3.2. Involution生成kernel的過程
在每一個不同的位置,Involution都有不同的kernel,所以Involution的kernel是和輸入特征的大小是相關(guān)的,特征大小為,計算方式和卷積很像:

與卷積不同,Involution的kernel是根據(jù)輸入特征自動生成的,本文的具體操作是對輸入的特征進行特征的映射來形成動態(tài)的卷積核:

其中代表輸入的特征,分別為特征映射的矩陣(具體實現(xiàn)的時候可以用卷積),代表Involution的kernel在上的參數(shù)。
和分別用來壓縮和拓展通道數(shù)(類似SENet的第一個和第二個FC),將特征從個通道壓縮為個通道,將特征從個通道拓展為個通道。這里是分組的數(shù)量,每個組內(nèi)的kernel共享參數(shù)。
這一步的偽代碼為:
# kernel generation, Eqn.(6)
kernel = span(reduce(o(x))) # B,KxKxG,H,W
kernel = kernel.view(B, G, K*K, H, W).unsqueeze(2)
卷積其實還有一個缺點就是,他的卷積核是靜態(tài)的,與輸入的特征無關(guān),是一個Data-independent的操作;但是本文的Involution是根據(jù)輸入特征,在不同的位置,動態(tài)生成不同的卷積核,是一個Data-dependent的操作。這一點也是能夠提點的一個原因。
3.3. Involution的操作解析

如上圖所示,Involution的操作其實和Convolution的操作非常相似,都是用以當前點為中心的的區(qū)域與Involution的kernel的進行element-wise product操作,然后將區(qū)域內(nèi)的信息進行求和,得到輸出的特征。
那么,在實現(xiàn)上,怎么獲取每個點的的的區(qū)域呢?作者采用的unfold操作,經(jīng)過這個操作之后,就能夠獲得每個點對應(yīng)的的的區(qū)域(有點類似手動卷積)。偽代碼如下:

從上面的計算中,大家應(yīng)該都發(fā)現(xiàn)了Involution的一個BUG,就是它不能像卷積一樣靈活的改變的通道的數(shù)量。因為Involution其實就是對空間上,用不同的Data-dependent的卷積濾波器進行乘積、求和操作,在通道上并沒有進行改變維度的映射,每個group里,通道維度上都是用了相同的kernel。如果需要改變通道維度,就需要在Involution的后面再接上一個1x1的卷積(Point-wise Conv),那這么做就相當于深度可分離卷積(先在空間上卷積,然后在通道上卷積,只不過這里的卷積是Data-dependent的卷積)。
3.4. Involution和Self-Attention的對比
Self-Attention可以表示成下面的公式:

Involution可以表示成下面的公式:

我們可以發(fā)現(xiàn):
1.Self-Attention的分head操作就是就是Involution的分組操作。
2.Self-Attention的操作是求權(quán)重的過程,Involution的也是求權(quán)重的過程。
這么說來,Self-Attention其實就是Involution的某一種特殊的情況。
但也不能完全這么說,Self-Attention中計算權(quán)重矩陣時通過Q和K進行點積來求相似度,但是Involution的求權(quán)重矩陣時通過兩個可學習的矩陣,通過梯度更新來學習權(quán)重,所以本質(zhì)上SA和Involution計算權(quán)重的時候還是有很大區(qū)別的。如果說相似,個人覺得這篇文章的方法還是跟SENet比較相似,都是根據(jù)輸入的特征,通過兩個可學習矩陣(FC)學出一個權(quán)重,然后將權(quán)重乘到原來的特征,這么看來Involution不就是空間維度上的SENet上嗎?只不過Involution還引入了卷積的計算性質(zhì)。所以個人覺得,這篇工作有點像是Spatial SENet+Convolution(如有不同的觀點,歡迎大家一起交流) 。
4.實驗
4.1. ImageNet分類

可以看出基于Involution的RedNet,性能和效率優(yōu)于ResNet和其他self-attention做算子的SOTA模型。
4.2. COCO目標檢測和實例分割

可以看出,相比于ResNet,RedNet在性能上都能有明顯提升,或者在計算量上都有明顯下降。
4.3. 語義分割

在Cityscapes分割任務(wù)中,RedNet相比于ResNet能夠有明顯的性能提升。
4.4. 可視化

通過可視化,我們可以發(fā)現(xiàn)kernel對空間上不同位置是有不同的關(guān)注度的,這也證實了Involution空間特異性的有效性;基于每一行對比不同的group,我們發(fā)現(xiàn),不同組的kernel編碼不同的語義信息。
4.5. 消融實驗



從消融實驗可以看出,更大的kernel size、更少的分組數(shù)、更小的reduction ratio都有助于模型獲得更好的性能。
5. 總結(jié)
作者對Convolution的形成進行了rethink,并提出了一種的新的算子,相比于ResNet,本文在三大任務(wù)上確實有比較大的優(yōu)越性。在參數(shù)量和計算復雜度上,相比于Convolution,Involution有明顯的優(yōu)勢。但是Involution也有一個很明顯的缺點,由于Involution在通道維度上采用了參數(shù)共享,所以就會導致通道上的信息不能進行很好的交互。
個人覺得Convlution和Involution像是兩種極端,前者更加關(guān)注于通道進行的交互,所以在空間維度上進行參數(shù)共享;后者更加關(guān)注于空間維度上的信息建模,所以在通道維度上進行了參數(shù)共享。(由于平移不變性這個假設(shè)偏置,所以看起來還是Convolution會更加合理一些。)但是在實際應(yīng)用中真的是非A即B的嗎?在實際應(yīng)用中很可能是通道信息和空間信息都是非常重要的,所以如果能夠在空間和通道維度上都基于一定的偏置進行必要的參數(shù)共享,達到更好的speed-accuracy trade off,這或許會是一個更有意思的工作。
關(guān)于文章有任何問題,歡迎在評論區(qū)留言或者添加作者微信: xmu_xiaoma
