圓桌實(shí)錄 | 為什么不約而同選擇了大 Kernel
在 3.19 日的 “Large Kernel Makes CNN Great Again” 專題 Meetup 中,我們組織了一次圓桌討論,希望能通過討論一些比較有共性的問題,碰撞出更多新想法。本篇為文字實(shí)錄,enjoy~
視頻回顧見 01:42:40?Large Kernel Makes CNN Great Again
嘉賓介紹
主 持:?許欣然 | 曠視天元 MegEngine 負(fù)責(zé)人
嘉 賓:
劉 壯 | UC Berkeley 博士生,ConvNeXt 作者
張祥雨 | 曠視研究院 Base Model 組負(fù)責(zé)人
丁霄漢 | 曠視研究院 Base Model 組實(shí)習(xí)生、清華大學(xué)博士生
王 彪 | 曠視天元 MegEngine 異構(gòu)計(jì)算組負(fù)責(zé)人
Q1: ConvNeXt 論文里提到用 7x7 Kernel 之后性能飽和,而 RepLKNet 里提到越大越好,兩篇論文結(jié)論差別可能是因?yàn)槭裁矗?/h1>
主持 – 許欣然
非常感謝大家能參與到這次圓桌,這次第一個(gè)問題是我個(gè)人想問的,在 ConvNeXt 里面其實(shí)提到了 7×7 Kernel 之后性能飽和,而 RepLKNet 恰恰相反—— Kernel 越大性能越好。導(dǎo)致兩篇論文結(jié)論差別的原因是什么?只是上下游任務(wù)評(píng)價(jià)不一樣嗎,還是有什么別的原因?
Q1: ConvNeXt 論文里提到用 7x7 Kernel 之后性能飽和,而 RepLKNet 里提到越大越好,兩篇論文結(jié)論差別可能是因?yàn)槭裁矗?/h1>
主持 – 許欣然
非常感謝大家能參與到這次圓桌,這次第一個(gè)問題是我個(gè)人想問的,在 ConvNeXt 里面其實(shí)提到了 7×7 Kernel 之后性能飽和,而 RepLKNet 恰恰相反—— Kernel 越大性能越好。導(dǎo)致兩篇論文結(jié)論差別的原因是什么?只是上下游任務(wù)評(píng)價(jià)不一樣嗎,還是有什么別的原因?
嘉賓 – 劉壯
其實(shí)我們也有想過繼續(xù)再增大 Kernel,可能確實(shí)可以更好。我們發(fā)現(xiàn)在 ImageNet 1K 分類這個(gè)問題上,其實(shí)它跟網(wǎng)絡(luò) regularization(正則化)的強(qiáng)度是非常有關(guān)的。我們整個(gè)實(shí)驗(yàn)中主要調(diào)的一個(gè)參數(shù)就叫 stochastic depth(隨機(jī)深度),其他的參數(shù)基本沒有調(diào)過,都用的是以前別的論文用的。這個(gè)參數(shù)越大,網(wǎng)絡(luò) overfiting(過擬合)的程度就越低,然后我們發(fā)現(xiàn)它和 kernel size 之間相互影響很大。你改變一個(gè)值,另外一個(gè)值的 optimal value(最優(yōu)值) 就會(huì)改變。所以 7x7 只能說是在這一個(gè)特定 regularization 強(qiáng)度的情況下是最優(yōu)。如果加大你的 regularization ,那么繼續(xù)加大的 Kernel size 可能會(huì)更好,因?yàn)樗粫?huì)那么 overfiting。我發(fā)現(xiàn)在從 7x7 往上再增大到 9 和 11 的時(shí)候,網(wǎng)絡(luò)的 training loss(訓(xùn)練損失)依然在降低,但是 test accruacry(測(cè)試準(zhǔn)確率)就不再升高了。
還有一個(gè)問題就是上下游的問題:在 ADE20k 上面,我發(fā)現(xiàn)它的最優(yōu) Kernel size 也是不止 7x7 ——它到 9 的時(shí)候依然有提升。所以這跟曠視的 RepLKNet 也是相似的發(fā)現(xiàn)。
當(dāng)然還有一個(gè)最重要的原因:用 7x7 是為了和 Swin Transformer[1]他們保持一致,因?yàn)樗?window size 是 7。其他參數(shù),我們都基本和 Swin Transformer 保持一致。
主持 - 許欣然
對(duì)此,霄漢和祥雨看有什么看法?
嘉賓 - 張祥雨
我來簡(jiǎn)單發(fā)表一下我們這邊的觀察和一些觀點(diǎn)。
其實(shí)我們這項(xiàng)研究,其實(shí)首要目的并不是為了找一個(gè)在某項(xiàng)任務(wù)上最優(yōu)的一個(gè) Kernel size,而是指出一個(gè)方向——你想讓網(wǎng)絡(luò)達(dá)到更大的感受野,實(shí)現(xiàn)更好的性能,那么你的 Kernel size 的總體趨勢(shì)是要越變?cè)酱?,主要是一個(gè)趨勢(shì)的問題。
至于在現(xiàn)有的數(shù)據(jù)集、現(xiàn)有的 training setting(訓(xùn)練設(shè)置)下,哪個(gè) size 最好,這個(gè)是要看情況的。比如說 segmentation(分割),它是特別需要很大感受野的,這種情況下,更大的 Kernel size 就更為重要;并且現(xiàn)有的一些工作也展示出這個(gè)趨勢(shì),比如說大家可能會(huì)熟悉 Swin Transformer v2[2],還有像 CSwin[3]?這類改進(jìn)的 window transformer,你會(huì)發(fā)現(xiàn)它的總體趨勢(shì)也是感受野越來越大。具體來說,CSwin 的窗口是 3 乘以整個(gè)圖像尺寸這么大 ,Swin Transformer v2 也使用了好幾十的 window size。另一方面,隨著 window size 越大,我們的優(yōu)化就越困難,很有可能你在優(yōu)化上吃到一些負(fù)面的影響。但如果你能解決優(yōu)化問題,比如像 RepLKNet 里使用 reparam 或者用更大的數(shù)據(jù)集、更強(qiáng)的 augumentation(樣本增廣),只要把優(yōu)化問題解決的話,你會(huì)發(fā)現(xiàn)大 Kernel 的上限可能更高。
嘉賓 – 丁霄漢
剛才劉壯說 stochastic depth,我們也是發(fā)現(xiàn)這個(gè)東西比其他的影響更大,其他的參數(shù)基本上都跟 swin 差不多。這個(gè)參數(shù)我們當(dāng)時(shí)好好調(diào)了調(diào),但是最后也沒有發(fā)現(xiàn)說大 Kernel 要比 Swin 或者比別的模型要更容易過擬合。我們最后用的這些 stochastic depth 的值也都是 0.3 到 0.5,是一個(gè)常見的取值范圍,并沒有發(fā)現(xiàn)大 Kernel 顯著地比其他模型更容易過擬合,可能會(huì)更容易過擬合一點(diǎn),但是并沒有差別很大。
主持 - 許欣然
好的,看起來這可能是一個(gè)后續(xù)可以探索的地方。
Q2:大 Kernel 是否會(huì)導(dǎo)致優(yōu)化更困難的問題?怎么解決?過大的 Kernel 是否有可能讓模型更容易過擬合?如果有,有沒有發(fā)現(xiàn)需要增大正則化,或者改變其他訓(xùn)練的配置去解決這一問題?
主持 - 許欣然
第二個(gè)問題,其實(shí)是劉壯之前發(fā)的問題,然后結(jié)合了另外一個(gè)大 Kernel 導(dǎo)致優(yōu)化更困難的問題。剛才祥雨也提到了,比如說關(guān)于這些正則化或者優(yōu)化更困難的,看看對(duì)這個(gè)問題,霄漢和祥雨還有沒有其他的解決思路?
嘉賓 – 張祥雨
我來先開個(gè)頭,關(guān)于大 Kernel 是不是會(huì)導(dǎo)致優(yōu)化更困難,其實(shí)類似的現(xiàn)象大家在 ViT 這個(gè)系列已經(jīng)發(fā)現(xiàn)了。當(dāng)時(shí) ViT 剛出的時(shí)候,社區(qū)里有很多人批評(píng)說 ViT 跟普通 CNN 的對(duì)比完全不公平——用像普通 ResNet 這種標(biāo)準(zhǔn)的 training setting,它其實(shí)效果是比不過的。所以有人就以此來批評(píng) ViT 其實(shí)并不本質(zhì)。
但是后來大家發(fā)現(xiàn):雖然用比較弱的這種 training setting 它效果是比較差,但是一旦你用更強(qiáng)的 training setting 解決了它地優(yōu)化問題,它其實(shí)可以展示出比 CNN 更高的上限。因此,可見大 Kernel 可能導(dǎo)致優(yōu)化困難這件事確實(shí)是客觀存在的,
那大家是怎么解決的呢?在 ViT 里面我們知道現(xiàn)在有很多 ViT 加卷積地混合結(jié)構(gòu),那么這種加卷積的做法其實(shí)非常類似于我們?cè)?RepLKNet 里面通過 reparam 加小卷積核的這種做法,通過引入更多的 inductive bias(歸納偏置)來解決優(yōu)化的問題。
還有就比如說像 Google 它在 ViT 可能會(huì)使用 JFT 這種非常大的數(shù)據(jù)集做 pretrain 來解決優(yōu)化的問題。還有哪些?比如說最近非常火的基于 MIM(即 Masked Image Modeling)pretrain這種方法——像 BeIT[4]、MAE[5]、SimMIM[6]?等等這一系列工作通過自監(jiān)督預(yù)訓(xùn)練的方法,讓 Kernel 大體上預(yù)訓(xùn)練地比較好,它們也能解決優(yōu)化問題。
然后我們最近發(fā)現(xiàn),所有這些解決方案其實(shí)在大 Kenel 的 CNN 上也得到了驗(yàn)證,進(jìn)一步就說明大 Kernel 跟大 window size 或者 global 的 ViT,它們具有非常強(qiáng)的相似之處,也進(jìn)一步佐證大 Kernel 很可能是 self-attention(自注意力)的一個(gè)非常好的替代。
至于“過大的 Kernel 是否使模型更容易過擬合”,其實(shí)這里我們發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象,就是對(duì)于上游來說,它確實(shí)表現(xiàn)為更容易 overfit,對(duì)于下游來說可能相對(duì)而言反而會(huì)好一些,這其實(shí)有點(diǎn)反直覺——我們直覺是下游往往數(shù)據(jù)集比較小,更容易過擬合;而上游的話數(shù)據(jù)集越大,它反而不容易過擬合。
最近我們一些研究就發(fā)現(xiàn)過擬合很可能是(前面幾位講者都提到了)和絕對(duì)位置信息的泄露有關(guān)。因?yàn)樵谏嫌蔚臅r(shí)候 image size(圖片尺寸)比較小,然后我們知道大 Kernel 的話,它的 padding 是很大的,padding 會(huì)泄露很多絕對(duì)位置信息。比如,在上游訓(xùn)練中你要分類一個(gè)蘋果,假如說蘋果出現(xiàn)在左上角,那么如果你不泄露絕對(duì)位置信息,那么它就會(huì)嚴(yán)格根據(jù)蘋果的 appearance(外觀)來進(jìn)行分類,那么在你測(cè)試的時(shí)候把蘋果移到右下里,模型應(yīng)該也能識(shí)別;但是如果你泄露了絕對(duì)位置信息,那么就相當(dāng)于它只能記住左上角的蘋果應(yīng)該怎么分類,它可能就不知道右下角的蘋果是要怎么分類,因此這可能是過大的 Kernel 的一個(gè)副作用。
當(dāng)然想解決這件事也是非常簡(jiǎn)單的,只需要在上游在訓(xùn)練的時(shí)候采用 multiscale 訓(xùn)練,讓它在各種 padding 都見過一次,這樣的話就可以杜絕一些絕對(duì)位置信息泄露帶來的問題。
另外,絕對(duì)位置信息泄露其實(shí)很多時(shí)候不一定是壞事。比如說大家可能會(huì)熟悉在下游的檢測(cè)算法 DeTR[7]。在 DeTR 里,因?yàn)樗?query 是需要在全圖尺度進(jìn)行自動(dòng)訓(xùn)練,如果你的 backbone(主干網(wǎng)絡(luò))不蘊(yùn)含絕對(duì)位置信息,那么它 query 的對(duì)應(yīng)位置的學(xué)習(xí)就會(huì)變得非常困難。所以之前也有很多研究 positional embedding 的工作也指出了,如果你上游使用 ViT-like 的這種結(jié)構(gòu)的話,你必須要進(jìn)行絕對(duì)位置編碼,不能只使用相對(duì)位置編碼,這樣才能達(dá)到比較好的效果。
Q3:大 Kernel 和小 Kernel 是對(duì)立關(guān)系嗎?比如是否存在更偏好在淺層使用大 Kernel / 深層更傾向小 Kernel 之類的?
主持 – 許欣然
感謝祥雨給出了很多的建議。下面這個(gè)問題,就是大 Kernel 跟小 Kernel 是否為一個(gè)很對(duì)立的關(guān)系,是否存在一種比如說:在淺層更偏好用大 Kernel,深層更傾向于用小 Kernel 等等這一類。是否有一些網(wǎng)絡(luò)設(shè)計(jì)結(jié)構(gòu)上的不同位置的偏好?請(qǐng)霄漢先發(fā)表一下看法。
嘉賓 – 丁霄漢
首先大 Kernel 跟小 Kernel 它肯定不是對(duì)立的關(guān)系,我們?cè)谶@個(gè)文章里面只用了大 Kernel,我們用小 Kernel 只是拿它用來做重參數(shù)化而已。但是如果你想到某種機(jī)制,比如說像 SKNet[8]?那樣,找到某種機(jī)制把大 Kernel 和小 Kernel 的更好的結(jié)合起來,那肯定是可以的。
我們暫時(shí)沒有發(fā)現(xiàn)淺層和深層有什么普遍的規(guī)律。我們?cè)跍\層用比較大的 Kernel,只是因?yàn)樗鼫\層的通道數(shù)比較少,而且 feature map 比較大,所以我們用了大的 Kernel,深層用的稍微小一點(diǎn)的,但也是 13×13 這樣的 Kernel。但是我們并沒有觀察到什么顯著的規(guī)律,說在什么樣的層上用多大的 Kernel 更好。因?yàn)楫吘篃挼み€是一個(gè)玄學(xué)本質(zhì)的東西,這都是需要進(jìn)一步的嘗試才知道的。
主持 – 許欣然
那么,在設(shè)計(jì)整個(gè) ConvNeXt 的時(shí)候,因?yàn)椴煌?block 其實(shí)現(xiàn)在用了結(jié)構(gòu)都是一樣的,比如是 7×7 都是 7×7,是 3×3 都是 3×3。這個(gè)地方比如說有試過,不同位置大小不一樣之類的這種操作嗎。
嘉賓 – 劉壯
其實(shí)沒有,我們還是一切從簡(jiǎn)。
嘉賓 – 張祥雨
我簡(jiǎn)單評(píng)論一下,其實(shí)從表示能力來說,大 Kernel 肯定是嚴(yán)格高于小 Kernel,但是大 Kernel 如果你訓(xùn)練不好,它不容易得到好的性能,這也說明了這里面大 Kernel 和小 Kernel 的差距,它并不是在表示能力方面,而是在優(yōu)化方面。其實(shí)這給我們提出了一個(gè)更廣寬泛的一個(gè)課題,就是說到底現(xiàn)在這些CNN我們需要用哪些優(yōu)化手段才能把它優(yōu)化得更好?
我們知道現(xiàn)在大家普遍使用的優(yōu)化器都是 SGD、SGDM,或者是 Adam 。這些優(yōu)化器都是跟架構(gòu)無關(guān)的,屬于通用的、gradient-base 的優(yōu)化器,它沒有考慮架構(gòu)本身的特性。但事實(shí)上對(duì)于卷積神經(jīng)網(wǎng)絡(luò)這種特殊的結(jié)構(gòu),它具有很不同的感受野、不同的分辨率,我們?cè)趦?yōu)化 Kernel 的時(shí)候肯定是要考慮架構(gòu)本身的因素。
其實(shí)我們?cè)谶@次 CVPR2022 也投了一篇工作,雖然很遺憾被拒了,但是我覺得結(jié)論是非常有趣的。就是說我們只通過改優(yōu)化器的手段,然后既不改架構(gòu)、也不利用像 reparam 這種 trick(技巧),就僅僅是通過改優(yōu)化器,就把像 VGG-like 的一個(gè)直筒狀的結(jié)構(gòu),達(dá)到了 84% 的水平,這其實(shí)預(yù)示的是,大 Kernel 這件事,其實(shí)在提醒我們以后可能要更多的關(guān)注優(yōu)化,而不是架構(gòu)本身。這篇工作也是非常榮幸跟霄漢還有我的另一個(gè)實(shí)習(xí)生一起做的,我覺得可能是代表了下一代神經(jīng)網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)的新方向:我們不只要考慮表征(表示能力),還要考慮優(yōu)化。
主持 – 許欣然
其實(shí)這給我?guī)硪粋€(gè)感覺,因?yàn)闃O端情況下,我們完全可以把整個(gè)網(wǎng)絡(luò)看成一個(gè)全連接,只不過我們現(xiàn)在不管是大 Kernel、小 Kernel 還是 conv 的這些操作,都只是對(duì)它進(jìn)行了一些特定的約束,感覺大 Kernel 就是把約束稍微放寬了一點(diǎn),然后它的優(yōu)化就變得很困難。極端情況下我就是一個(gè)超大全連接,然后只要我能優(yōu)化得出來,他一定表達(dá)能力比 conv 強(qiáng)。
Q4: Kernel 變大之后,stride 可以做的更大嗎?在精度上有什么損失么?計(jì)算效率方面能提升么?
主持 – 許欣然
因?yàn)槠鋵?shí)咱們之前沒有討論過 stride 的相關(guān)問題,然后像 swin 里邊其實(shí)就可以認(rèn)為它 stride 跟 Kernel 差不多,就相當(dāng)于它跳著往前走,直接一次走 7 個(gè)格。然后想知道如果 stride 做的更大的話,在精度上會(huì)有什么損失嗎?以及在實(shí)現(xiàn)效率方面有什么提升嗎?王彪在計(jì)算效率這方面覺得有什么更好或者更壞的影響。
嘉賓 – 王彪
計(jì)算效率方面其實(shí)主要跟實(shí)驗(yàn)方法是相關(guān)的。比如說我們就像用 implicit batched matmal 去算的話,實(shí)際上它的 stride 的影響并不是很大。在類似英偉達(dá) GPU 這種架構(gòu)下面它的影響不是很大;但是如果你在嵌入式或者在一些比較低端的板卡上,因?yàn)樗?stride 大了,訪存會(huì)受一些影響,所以它計(jì)算效率方面肯定是不如 stride 等于 1 的。但是我們可以盡量的做到一個(gè)最優(yōu)的性能,就是優(yōu)化總是做不到盡頭的。
主持 – 許欣然
看起來隨著變大了之后,反而這塊更算起來效率更低了,好像這塊就沒有必要討論它在算法精度上的好處了。
然后這里引申了另外一個(gè)問題,就是現(xiàn)在咱們的卷積核變大了之后,還仍然都是奇數(shù),比如說 11×11、13×13。如果這個(gè)地方變成 32×32,在代碼優(yōu)化上會(huì)輕松很多,因?yàn)樗鋵?shí)會(huì)非常的整齊。這一點(diǎn)想問問三位網(wǎng)絡(luò)設(shè)計(jì)的同學(xué),在 Kernel 這么大了之后,還堅(jiān)持用奇數(shù)有什么考慮嗎?用偶數(shù)會(huì)有什么不好嗎?
嘉賓 – 劉壯
我的理解這是比較 technical 的問題。奇數(shù)的話,如果把一個(gè)像素看成一個(gè)小網(wǎng)格的話,卷積可以正對(duì)網(wǎng)格的中心。這樣的話你就可以做到 input、output 位置是完全 align(對(duì)齊)的。如果是偶數(shù)比如說 2×2 的話,這樣的話左上角 4 個(gè)像素的交叉點(diǎn)是下一層左上角第一個(gè)像素 feature 的中心,所以如果層數(shù)多了之后,它可能慢慢的跟原始的輸入圖像就會(huì)有一些偏移。
因此,之所以用奇數(shù)不用偶數(shù),其實(shí)是當(dāng) input、output 像素一樣時(shí)候,上一層和下一層的邊界處能不能 align 的問題。如果在分類任務(wù)可能沒有那么重要,但是在下游任務(wù)那種對(duì)于 input 和 output 一致性要求比較高的情況下,可能奇數(shù)是一個(gè)比較合適的選擇,如果偶數(shù)的話可能你要做一些 interpolation(插值)或者是 sampling(采樣)這樣子的,這就是我的理解。
嘉賓 – 張祥雨
對(duì),確實(shí)如劉壯所說,奇數(shù)它最大的好處就是可以做到對(duì)齊,當(dāng)然如果你故意不想對(duì)齊那也是可以的。我想講一個(gè)故事,是我們當(dāng)時(shí)做 ResNet 的時(shí)候,其實(shí)就特別考慮到這一點(diǎn)。大家可以計(jì)算一下, ResNet 的話它的 (0, 0)那個(gè) pixel 剛好對(duì)應(yīng) output feature map(特征圖)的那個(gè) (0, 0) 的 pixel;但是反過來,它的最右邊就是(223, 223),那個(gè) pixel 它并不對(duì)應(yīng)最后一層 feature map (6, 6) 那個(gè) pixel,它會(huì)對(duì)應(yīng)到外面去。
這種網(wǎng)絡(luò)我們內(nèi)部的說法叫做左對(duì)齊網(wǎng)絡(luò),它的左右是不對(duì)稱的,就是說它左邊是 (0, 0) 對(duì)應(yīng)到 (0, 0),右邊它并不是對(duì)應(yīng)的。而同時(shí)期還有一些其他的網(wǎng)絡(luò),比如說 VGG,我們把它叫做中心對(duì)齊網(wǎng)絡(luò),就是說它的左邊那個(gè) pixel 它剛好對(duì)應(yīng)到 feature map 的左邊,而是它輸入的正中間的位置剛好對(duì)應(yīng)輸出的正中間。
為什么這樣設(shè)計(jì)?當(dāng)時(shí)做 ResNet 的時(shí)候,這樣做也是有意為之。因?yàn)槲覀儼l(fā)現(xiàn)很多做下游任務(wù)的人,比如說做 detection 或者做 segmentation 的人,并沒有這種意識(shí),他不知道中心位置的 padding 要怎么計(jì)算。他只會(huì)就比較 naive 的,比如說輸入是線段長(zhǎng)度 32,它對(duì)應(yīng)到輸出 stride 是 16,我就簡(jiǎn)單的除個(gè) 16,就是只會(huì)這種等比例放縮。但按道理說你是要加一個(gè) offset,才能完成對(duì)齊,所以說如果你不知道這個(gè)東西,那么其實(shí)在做的時(shí)候就會(huì)顯著的掉點(diǎn)。為了防止這些用戶因?yàn)檫@個(gè)原因,把我們 ResNet 下游的點(diǎn)報(bào)低了,所以故意做成了左對(duì)齊網(wǎng)絡(luò)。
其實(shí)大家可以看到,當(dāng)時(shí)很多網(wǎng)絡(luò)都不是屬于這種左對(duì)齊,比如說 GoogleNet,它的中心 pixel 大概在 (5, 5) 那個(gè)地方,也就是說你在做 detection 的時(shí)候,整體 offset 要加一個(gè) 5,如果你不做這個(gè)就會(huì)顯著的掉點(diǎn)。對(duì)于 VGG 來說,它 offset 的大概是 (7, 7) 左右。但是反過來,左對(duì)齊網(wǎng)絡(luò)總體上來說就給人感覺就不是很make sense是吧?左邊和右邊它都不對(duì)稱,所以這也出現(xiàn)了一個(gè)現(xiàn)象,大家做 test time augmentation 的時(shí)候會(huì)用到一個(gè)叫 flip(翻轉(zhuǎn)),沿中間 flip 一下,然后 average 一下,大家發(fā)現(xiàn)很多網(wǎng)絡(luò)是可以漲點(diǎn)的。其實(shí)這個(gè)都是因?yàn)樽髮?duì)齊網(wǎng)絡(luò),它在左邊的關(guān)注中心點(diǎn)和右邊是不一樣的,它對(duì)圖像左邊的關(guān)注要高于右邊,所以你把右邊的一些概念給它 flip 到左邊,你會(huì)發(fā)現(xiàn)它再 ensemble 一下它經(jīng)??梢詽q點(diǎn)。
但是畢竟這是一個(gè)不好的特性,所以我認(rèn)為,在以后我們可能還是更傾向于用這種中心對(duì)齊的網(wǎng)絡(luò)來設(shè)計(jì),中心對(duì)齊當(dāng)然有各種方法,但是把 Kernel 變成偶數(shù),就是一個(gè)相對(duì)比較簡(jiǎn)單的方案。
主持人 – 許欣然
非常有意思,感覺這個(gè)地方后續(xù)咱們可以試一試。
Q5:在嵌入式設(shè)備上,DDR 帶寬更低,大 Kernel 是不是計(jì)算性能就上不來了?
主持人 – 許欣然
下一個(gè)問題想請(qǐng)王彪來回答一下:在 GPU 設(shè)備上,根據(jù) roofline model 的分析 depthwise conv 都是卡在訪存這一塊的,所以你通過大 Kernel 增加計(jì)算它是很值的;但是在嵌入式這些設(shè)備上,它的 DDR 的帶寬要顯著的低的多,比如比 CUDA 上是低 10 倍以上還是很容易的,大 Kernel 是不是計(jì)算性能就上不來了?就是說會(huì)不會(huì)出現(xiàn)在嵌入式設(shè)備上 dwconv kenel 直接在小 kernel 情況下就已經(jīng)就卡在計(jì)算而不是訪存的這種情況呢?
嘉賓 – 王彪
是有可能的,但是跟 DDR 帶寬可能關(guān)系不是很大。要綜合看設(shè)備上的理論峰值,看飽和點(diǎn)在什么地方,如果你 3×3 的 deconv conv 已經(jīng)飽和了,你再做大 Kernel 其實(shí)沒有多大意義了,因?yàn)樾阅懿粫?huì)有太大的提升了。但是實(shí)際上我們所看到的這些 ARM 上的板子,就是 dw conv 它的性能還是不飽和的。
主持 – 許欣然
這個(gè)問題可能未來對(duì)于像 NPU 類的設(shè)計(jì)會(huì)有比較大的影響,因?yàn)?NPU 的算力很猛,但是 DDR 其實(shí)跟 ARM 這些設(shè)備其實(shí)差的也不算太多。
嘉賓 – 王彪
是的。
Q6:如果使用全局大小的 Kernel,是否可以用最近 GFNet 中的 FFT 模塊代替?FFT 和全局卷積數(shù)學(xué)上是等價(jià)的
主持 – 許欣然
最后想聊聊全局大小的 Kernel,因?yàn)樽罱?GFNet[9]之中有 FFT ,然后能不能用FFT 的模塊代替之前,王彪已經(jīng)在算力這個(gè)角度上已經(jīng)回答完了,然后從算法角度上來說,想看看霄漢有沒有什么看法。
嘉賓 – 丁霄漢
這里面首先一個(gè)問題就是 FFT 它不一定特別好實(shí)現(xiàn),再一個(gè)就是 FFT 它等價(jià)于一個(gè)全局視角的卷積,但可能單層去做全局的卷積也不是一個(gè)最優(yōu)解。我們把小 Kernel 變大,但是也不一定要極端到要和輸入一樣大,可能也不是一個(gè)最優(yōu)解。而且我們也看到 GFNet 里面,它也并沒有展示出下游任務(wù)上的性能,因此也并不確定這樣的做法,它到底在下游任務(wù)和更大量級(jí)的模型上是不是一個(gè)更好的做法。
嘉賓 – 張祥雨
我評(píng)價(jià)一下。首先,剛剛有個(gè)地方說的不太對(duì),其實(shí) GFNet 是 benchmark 了下游,還可以。但是 GFNet 有幾個(gè)地方是跟大 Kernel 卷積是不太一樣的。
如果你直接使用 FFT,就像他 paper 里說的那樣,而不使用 padding 的話,它其實(shí)等價(jià)的不是普通的我們說的大 Kernel 卷積,而是大 Kernel 循環(huán)卷積,就是說左邊它要循環(huán)到右邊,上面要轉(zhuǎn)一個(gè)圈到下邊,這件事其實(shí)不是特別的 make sense,我們嘗試過其實(shí)效果也不是很好。
如果要嚴(yán)格實(shí)現(xiàn)等價(jià)的全局大小的 Kernel 的話,那么需要對(duì) GFNet 的做一些修改。比如說人為加一些大的 padding,這時(shí)候它確實(shí)是跟全局在數(shù)學(xué)上是等價(jià)??梢哉J(rèn)為,這是全局卷積的一種高效的實(shí)現(xiàn)方式。
但是就跟剛剛霄漢說的一樣,全局卷積目前來說它的必要性證據(jù)還不是很足,因?yàn)橹饕袃牲c(diǎn):
第一,隨著卷積和越大,它優(yōu)化就會(huì)變得越來越困難。我們到 31 的時(shí)候已經(jīng)需要一些像 reparam 這種策略來幫助它優(yōu)化,但是如果再大的話,其實(shí)我們也不是很清楚要用什么樣的方式才能讓它優(yōu)化的更好,但也許是重要的。
第二個(gè)問題我覺得更重要,就是我們把核心的卷積和擴(kuò)大,它是為了提升感受野,但是感受野可以類比為在 ViT 或者 transformer 里,大家都非常關(guān)心的叫做長(zhǎng)程依賴。但是在視覺里面,其實(shí)我們很多時(shí)候所需要的不只是長(zhǎng)程依賴,我們要的是高階的長(zhǎng)程依賴,就是說不只是依賴的范圍重要,依賴的階數(shù)也重要。
什么叫依賴的階數(shù)?比如說 a 點(diǎn) b 點(diǎn)和 c 點(diǎn)它屬于一個(gè)物體,那么 a 距離 b 它的特征是比較像,我們可以認(rèn)為它是一個(gè)物體, b 和 c 它的距離也是比較接近了,我們認(rèn)為它是一個(gè)物體,但是 a 和 c 相對(duì)比較遠(yuǎn)。那么我要想形成一個(gè)整體的分割 mask,其實(shí)我需要從 a 和 b 相近的關(guān)系和 b 和 c 相近的關(guān)系推導(dǎo)出 a 和 c 相近,這是一個(gè)二階的邏輯。更顯著的我們可能還要用三階、四階這種更高的邏輯才能推導(dǎo)出一個(gè)物體從最左邊到最右邊像素的相似度或者它們之間的關(guān)系。如果你直接一步看過去,從感受野的角度那是完全足夠,但從關(guān)系的階數(shù)角度可能還是不夠的,需要多建模幾層。
其實(shí)我們之前有兩篇工作叫做 Tree Filter[10][11]。比較詳細(xì)的提出了這個(gè)問題,并且我們發(fā)現(xiàn)在 segmentation 這樣的任務(wù),確實(shí)高階的長(zhǎng)程階段是更為關(guān)鍵的。如果大家想不太明白這個(gè)問題是為什么,可以再設(shè)想一個(gè)問題叫解迷宮。我們輸入一個(gè)迷宮。然后輸出一個(gè) segmentation mask,就是從入口到出口,大家想這個(gè)問題肯定是需要長(zhǎng)程依賴才能解決,因?yàn)樗莻€(gè) non-local 的問題,但是,是不是我就直接使用非常大的 Kernel,或者是使用一個(gè) attention 就可以解決,從出口看到入口呢。那顯然不行,我得從中間一步一步跟過去。事實(shí)上,我們發(fā)現(xiàn),為了解這種問題,中等尺度但是有一定層數(shù)的卷積反而是比較關(guān)鍵的,單層的大 Kernel或者是大的 attention 可能反而不行。
主持 – 許欣然
好的,那么以上就是本次圓桌重點(diǎn)想交流的問題,感謝幾位的分享。謝謝大家。
參考文獻(xiàn)
[1] Liu, Ze, et al. "Swin transformer: Hierarchical vision transformer using shifted windows." Proceedings of the IEEE/CVF International Conference on Computer Vision. 2021.
[2] Liu, Ze, et al. "Swin Transformer V2: Scaling Up Capacity and Resolution." arXiv preprint arXiv:2111.09883 (2021).
[3] Dong, Xiaoyi, et al. "Cswin transformer: A general vision transformer backbone with cross-shaped windows." arXiv preprint arXiv:2107.00652 (2021).
[4]Bao, Hangbo, Li Dong, and Furu Wei. "Beit: Bert pre-training of image transformers." arXiv preprint arXiv:2106.08254 (2021).
[5]He, Kaiming, et al. "Masked autoencoders are scalable vision learners." arXiv preprint arXiv:2111.06377 (2021).
[6]Xie, Zhenda, et al. "Simmim: A simple framework for masked image modeling." arXiv preprint arXiv:2111.09886 (2021).
[7]Carion, Nicolas, et al. "End-to-end object detection with transformers." European conference on computer vision. Springer, Cham, 2020.
[8]Li, Xiang, et al. "Selective kernel networks." Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2019.
[9]Rao, Yongming, et al. "Global filter networks for image classification." Advances in Neural Information Processing Systems 34 (2021).
[10]Song, Lin, et al. "Learnable tree filter for structure-preserving feature transform." Advances in neural information processing systems 32 (2019).
[11]Song, Lin, et al. "Rethinking learnable tree filter for generic feature transform." Advances in Neural Information Processing Systems 33 (2020): 3991-4002.
附:
更多 MegEngine 信息獲取,您可以查看:
文檔:https://www.megengine.org.cn/doc/stable/zh/?
深度學(xué)習(xí)框架?MegEngine 官網(wǎng):https://www.megengine.org.cn/
GitHub 項(xiàng)目:https://github.com/MegEngine,或加入 MegEngine 用戶交流 QQ 群:1029741705