機器之心轉(zhuǎn)載
來源:知乎
作者:丁霄漢
你有多久沒調(diào)過 kernel size 了?雖然常常被人忽略,但只要將其簡單加大,就能給人驚喜。
當你在卷積網(wǎng)絡(CNN)的深度、寬度、groups、輸入分辨率上調(diào)參調(diào)得不可開交的時候,是否會在不經(jīng)意間想起,有一個設計維度 kernel size,一直如此顯而易見卻又總是被忽視,總是被默認設為 3x3 或 5x5?
當你在 Transformer 上調(diào)參調(diào)得樂不思蜀的時候,是否希望有一種簡單、高效、部署容易、下游任務性能又不弱于 Transformer 的模型,帶給你樸素的快樂?
近日,清華大學、曠視科技等機構(gòu)的研究者發(fā)表于 CVPR 2022 的工作表明,CNN 中的 kernel size 是一個非常重要但總是被人忽略的設計維度。在現(xiàn)代模型設計的加持下,卷積核越大越暴力,既漲點又高效,甚至大到 31x31 都非常 work(如下表 5 所示,左邊一欄表示模型四個 stage 各自的 kernel size)!
即便在大體量下游任務上,我們提出的超大卷積核模型 RepLKNet 與 Swin 等 Transformer 相比,性能也更好或相當!
論文地址:https://arxiv.org/abs/2203.06717
MegEngine 代碼和模型:https://github.com/megvii-research/RepLKNet
PyTorch 代碼和模型:https://github.com/DingXiaoH/RepLKNet-pytorch
太長不看版
以下是兩分鐘內(nèi)可以看完的內(nèi)容總結(jié)。
A. 我們對業(yè)界關于 CNN 和 Transformer 的知識和理解有何貢獻?
我們挑戰(zhàn)了以下習慣認知:
1. 超大卷積不但不漲點,而且還掉點?我們證明,超大卷積在過去沒人用,不代表其現(xiàn)在不能用。人類對科學的認知總是螺旋上升的,在現(xiàn)代 CNN 設計(shortcut、重參數(shù)化等)的加持下,kernel size 越大越漲點!
2. 超大卷積效率很差?我們發(fā)現(xiàn),超大 depth-wise 卷積并不會增加多少 FLOPs。如果再加點底層優(yōu)化,速度會更快,31x31 的計算密度最高可達 3x3 的 70 倍!
3. 大卷積只能用在大 feature map 上?我們發(fā)現(xiàn),在 7x7 的 feature map 上用 13x13 卷積都能漲點。
4. ImageNet 點數(shù)說明一切?我們發(fā)現(xiàn),下游(目標檢測、語義分割等)任務的性能可能跟 ImageNet 關系不大。
5. 超深 CNN(如 ResNet-152)堆疊大量 3x3,所以感受野很大?我們發(fā)現(xiàn),深層小 kernel 模型有效感受野其實很小。反而少量超大卷積核的有效感受野非常大。
6. Transformers(ViT、Swin 等)在下游任務上性能強悍,是因為 self-attention(Query-Key-Value 的設計形式)本質(zhì)更強?我們用超大卷積核驗證,發(fā)現(xiàn)kernel size 可能才是下游漲點的關鍵。
B. 我們做了哪些具體的工作?
1. 通過一系列探索性的實驗,總結(jié)了在現(xiàn)代 CNN 中應用超大卷積核的五條準則:
用 depth-wise 超大卷積,最好再加底層優(yōu)化(已集成進開源框架 MegEngine)
加 shortcut
用小卷積核做重參數(shù)化(即結(jié)構(gòu)重參數(shù)化方法論,見我們?nèi)ツ甑?RepVGG,參考文獻 [1])
要看下游任務的性能,不能只看 ImageNet 點數(shù)高低
小 feature map 上也可以用大卷積,常規(guī)分辨率就能訓大 kernel 模型
2. 基于以上準則,簡單借鑒 Swin Transformer 的宏觀架構(gòu),我們提出了一種架構(gòu) RepLKNet,其中大量使用超大卷積,如 27x27、31x31 等。這一架構(gòu)的其他部分非常簡單,都是 1x1 卷積、Batch Norm 等喜聞樂見的簡單結(jié)構(gòu),不用任何 attention。
3. 基于超大卷積核,對有效感受野、shape bias(模型做決定的時候到底是看物體的形狀還是看局部的紋理?)、Transformers 之所以性能強悍的原因等話題的討論和分析。我們發(fā)現(xiàn),ResNet-152 等傳統(tǒng)深層小 kernel 模型的有效感受野其實不大,大 kernel 模型不但有效感受野更大而且更像人類(shape bias 高),Transformer 可能關鍵在于大 kernel 而不在于 self-attention 的具體形式。
例如,下圖 1 分別表示 ResNet-101、ResNet-152、全為 13x13 的 RepLKNet、kernel 大到 31x31 的 RepLKNet 的有效感受野,可見較淺的大 kernel 模型的有效感受野非常大。
有效感受野。
C. 提出的架構(gòu) RepLKNet 效果如何?
1. ImageNet 上,與 Swin-Base 相當。在額外數(shù)據(jù)訓練下,超大量級模型最高達到 87.8% 的正確率。超大卷積核本來不是為刷 ImageNet 設計的,這個點數(shù)也算是可以讓人滿意。
2. Cityscapes 語義分割上,僅用ImageNet-1K pretrain 的 RepLKNet-Base,甚至超過了ImageNet-22K pretrain 的 Swin-Large。這是跨模型量級、跨數(shù)據(jù)量級的超越。
3. ADE20K 語義分割上,ImageNet-1K pretrain 的模型大幅超過 ResNet、ResNeSt 等小 kernel 傳統(tǒng) CNN。Base 級別模型顯著超過 Swin,Large 模型與 Swin 相當。超大量級模型達到56% 的 mIoU。
4. COCO 目標檢測上,大幅超過同量級的傳統(tǒng)模型 ResNeXt-101(超了 4.4 的 mAP),與 Swin 相當,在超大量級上達到55.5% 的 mAP。
下面是詳細介紹。
初衷:我們?yōu)槭裁葱枰?kernel size?
在當今這個時代,我們再去研究聽起來就很復古的大 kernel,是為什么呢?
1.復興被「錯殺」的設計元素,為大 kernel 正名。在歷史上,AlexNet 曾經(jīng)用過 11x11 卷積,但在 VGG 出現(xiàn)后,大 kernel 逐漸被淘汰了,這標志著從淺而 kernel 大到深而 kernel 小的模型設計范式的轉(zhuǎn)變。這一轉(zhuǎn)變的原因包括大家發(fā)現(xiàn)大 kernel 的效率差(卷積的參數(shù)量和計算量與 kernel size 的平方成正比)、加大 kernel size 反而精度變差等。但是時代變了,在歷史上不 work 的大 kernel,在現(xiàn)代技術的加持下能不能 work 呢?
2.克服傳統(tǒng)的深層小 kernel 的 CNN 的固有缺陷。我們曾經(jīng)相信大 kernel 可以用若干小 kernel 來替換,比如一個 7x7 可以換成三個 3x3,這樣速度更快(3x3x3回避了「深層模型難以優(yōu)化」的問題,而并沒有真正解決它。既然深而 kernel 小的模型有這樣的本質(zhì)問題,淺而 kernel 大的設計范式效果會如何呢?
3.理解 Transformer 之所以 work 的原因。已知 Transformer 性能拔群,特別是在檢測、分割等下游任務上。Transformer 的基本組件是 self-attention,而 self-attention 的實質(zhì)是在全局尺度或較大的窗口內(nèi)進行Query-Key-Value 運算。那么 Transformer 性能強悍的原因是什么,是Query-Key-Value的設計形式嗎?我們猜測,會不會「全局尺度或較大的窗口」才是關鍵?對應到 CNN 中,這就需要用超大卷積核來驗證。
探索實驗
為了搞明白大 kernel 到底應該怎么用,我們在 MobileNet V2 上進行了一系列探索實驗,總結(jié)出五條準則。這里略去細節(jié)只說結(jié)論:
1.用 depth-wise 大 kernel,完全可以做到相當高效。在我們的優(yōu)化(已經(jīng)集成進開源框架 MegEngine)下,31x31 depth-wise 卷積的用時最低可達 3x3 卷積的 1.5 倍,而前者的 FLOPs 是后者的 106 倍(31x31/9),這意味著前者的效率是后者的 71 倍!
2. 不帶 identity shortcut,增大 kernel 會大幅掉點(ImageNet 掉了 15%);帶 shortcut,增大 kernel 才會漲點。
3. 如果要想進一步加大 kernel size,從大 kernel 到超大 kernel,可以用小 kernel 做結(jié)構(gòu)重參數(shù)化(參考文獻 1)。也就是說,在訓練的時候并行地加一個 3x3 或 5x5 卷積,訓練完成后將小 kernel 等價合并到大 kernel 里面去。這樣,模型就可以有效捕捉到不同尺度的特征。不過我們發(fā)現(xiàn),數(shù)據(jù)集越小、模型越小,重參數(shù)化越重要。反之,在我們的超大規(guī)模數(shù)據(jù)集 MegData73M 上,重參數(shù)化提升很?。?.1%)。這一發(fā)現(xiàn)跟 ViT 類似:數(shù)據(jù)規(guī)模越大,inductive bias 越不重要。
4. 我們要的是在目標任務上漲點,而不是 ImageNet 上漲點,ImageNet 的精度跟下游任務不一定相關。隨著 kernel size 越來越大,ImageNet 上不再漲點,但是 Cityscapes、ADE20K 語義分割上還能漲一到兩個點,而增大 kernel 帶來的額外的參數(shù)量和計算量很少,性價比極高!
5. 有點反直覺的是,在 7x7 的小 feature map 上用 13x13 也可以漲點!也就是說,大 kernel 模型不一定需要大分辨率來訓,跟小 kernel 模型差不多的訓練方法就可以,又快又?。?/p>
RepLKNet:超大卷積核架構(gòu)
我們以 Swin 作為主要的對比對象,并無意去刷 SOTA,所以簡單借鑒 Swin 的宏觀架構(gòu)設計了一種超大卷積核架構(gòu)。這一架構(gòu)主要在于把 attention 換成超大卷積和與之配套的結(jié)構(gòu),再加一點 CNN 風格的改動。根據(jù)以上五條準則,RepLKNet 的設計元素包括 shortcut、depth-wise 超大 kernel、小 kernel 重參數(shù)化等。
整體架構(gòu)圖。
增大 kernel size:越大越暴力!
我們給 RepLKNet 的四個 stage 設定不同的 kernel size,在 ImageNet 和 ADE20K 語義分割數(shù)據(jù)集上進行實驗,結(jié)果頗為有趣:ImageNet 上從 7x7 增大到 13x13 還能漲點,但從 13x13 以后不再漲點;但是在 ADE20K 上,從四個 stage 均為 13 增大到四個 stage 分別為 31-29-27-13,漲了 0.82 的 mIoU,參數(shù)量只漲了 5.3%,F(xiàn)LOPs 只漲了 3.5%。
所以,后面的實驗主要用 31-29-27-13 的 kernel size,稱為 RepLKNet-31B,并將其整體加寬為 1.5 倍,稱為 RepLKNet-31L。
Cityscapes 語義分割
RepLKNet-31B 的體量略小于 Swin-Base,在僅僅用 ImageNet-1K pretrain 前提下,mIoU 超過 Swin-Large + ImageNet-22K,完成了跨模型量級、跨數(shù)據(jù)量級的超越。
Cityscapes 結(jié)果。
ADE20K 語義分割
RepLKNet 相當能打,特別是 Base 級別。跟量級差不多的 ResNet 相比,mIoU 高了 6.1,體現(xiàn)出了少量大 kernel 相對于大量小 kernel 的顯著優(yōu)勢。(COCO 目標檢測上也有相同結(jié)論,RepLKNet-31B 的 mAP 比體量相當?shù)?ResNeXt-101 高了4.4)RepLKNet-XL 是更大級別的模型,用私有數(shù)據(jù)集 MegData-73M 進行預訓練,達到了56.0 的 mIoU(跟 ViT-L 相比,這個模型其實并不算很大)。
ADE20K 結(jié)果。
ImageNet 分類、COCO 目標檢測結(jié)果參見「太長不看」部分或論文。
討論與分析
有效感受野:大 kernel 模型遠超深層小 kernel 模型
我們可視化了 RepLKNet-31、RepLKNet-13(前文所說的每個 stage 都是 13x13 的模型)、ResNet-101、ResNet-152 的有效感受野(方法詳見論文)發(fā)現(xiàn) ResNet-101 的有效感受野其實很小,而且ResNet-152 相對于 101 的提升也很小;RepLKNet-13 的有效感受野很大,而 RepLKNet-31通過增大 kernel size 進一步將有效感受野變得非常大。
Shape bias:大 kernel 模型更像人類
我們又研究了模型的 shape bias(即模型有多少比例的預測是基于形狀而非紋理做出的),人類的 shape bias 在 90% 左右,見下圖左邊的菱形點。我們選用的模型包括 Swin、ResNet152、RepLKNet-31 和 RepLKNet-3(前文提到的每個 stage 都是 3x3 的小 kernel baseline),發(fā)現(xiàn) RepLKNet-3 和 ResNet-152 的 kernel size 一樣大(3x3),shape bias 也非常接近(圖中的兩條豎直實線幾乎重合)。
有意思的是,關于 shape bias 的一項工作提到 ViT(全局 attention)的 shapebias 很高(參見參考文獻 3 中的圖),而我們發(fā)現(xiàn) Swin(窗口內(nèi)局部 attention)的 shape bias 其實不高(下圖),這似乎說明attention 的形式不是關鍵,作用的范圍才是關鍵,這也解釋了RepLKNet-31 的高 shape bias(即更像人類)。
shape bias 對比
MegEngine 對大 kernel 的強力優(yōu)化
以往大家不喜歡用大 kernel 的其中一個原因是其較低的運行效率。但曠視開源的深度學習框架 MegEngine 通過分析和實驗發(fā)現(xiàn)大 kernel depth-wise 卷積仍有很大的優(yōu)化潛力,其運行時間可能不會顯著慢于小 kernel(延展閱讀 https://zhuanlan.zhihu.com/p/479182218)。
MegEngine 針對大 kernel depthwise 卷積做了多種深度優(yōu)化,優(yōu)化后的 MegEngine 性能比 PyTorch 最高快 10 倍,31x31 大小卷積核上的運行時間幾乎和 9x9 大小卷積核的運行時間差不多,可以打滿設備的浮點理論峰值。MegEngine 用實際數(shù)據(jù)在一定意義上打消了大家對大 kernel 卷積運行效率的疑慮。這些優(yōu)化已經(jīng)集成到了 MegEngine 中,歡迎使用~
知乎原文:https://zhuanlan.zhihu.com/p/481445076?utm_source=wechat_session&utm_medium=social&utm_oi=56560353017856&utm_campaign=shareopn