神經(jīng)網(wǎng)絡加上注意力機制,為什么精度反而下降?
重磅干貨,第一時間送達
導讀
?問題來自于知乎:"神經(jīng)網(wǎng)絡加上注意力機制,精度反而下降,為什么會這樣呢?"?作者對該問題從兩個角度對其進行了解釋。
因為之前寫過Attention+YOLOv3的文章,做過相關(guān)實驗,所以被問過很多問題,舉幾個典型的問題:
我應該在哪里添加注意力模塊? 我應該使用那種注意力模塊? 為什么我添加了注意力模塊以后精度反而下降了? 你添加注意力模塊以后有提升嗎? 注意力模塊的參數(shù)如何設(shè)置? 添加注意力模塊以后如何使用預訓練模型?

周末的時候看到了這個問題,也看到了各位的解答,感覺也非常有道理,萌生出用實驗來證明的想法,于是花了一點時間測試了題目中提到的CBAM模塊。一個模型精度是否提高會受到非常多因素影響,需要考慮的因素包括模型的參數(shù)量、訓練策略、用到的超參數(shù)、網(wǎng)絡架構(gòu)設(shè)計、硬件以及軟件使用(甚至pytorch版本都會有影響,之前在某個版本卡了半天,換了版本問題就解決了)等等。注意力機制到底work不work,我覺得可以從兩個角度來解釋。
第一個角度是模型的欠擬合與過擬合
大部分注意力模塊是有參數(shù)的,添加注意力模塊會導致模型的復雜度增加。
如果添加attention前模型處于欠擬合狀態(tài),那么增加參數(shù)是有利于模型學習的,性能會提高。 如果添加attention前模型處于過擬合狀態(tài),那么增加參數(shù)可能加劇過擬合問題,性能可能保持不變或者下降。
為了驗證以上猜想,使用cifar10數(shù)據(jù)集中10%的數(shù)據(jù)進行驗證,模型方面選擇的是wideresnet,該模型可以通過調(diào)整模型的寬度來靈活調(diào)整模型的容量。

構(gòu)建了模型族:
| Norm系列表示沒有使用注意力,nd代表寬度 | CBAM系列表示在ResBlock中使用了注意力 |
|---|---|
| norm_8d | cbam_8d |
| norm_32d | cbam_32d |
| norm_64d | cbam_64d |
具體來說,從上到下模型容量越來越高,下圖展示了各個模型在訓練集和驗證集上的收斂結(jié)果。

可以發(fā)現(xiàn)一下幾個現(xiàn)象:
隨著寬度增加,模型過擬合現(xiàn)象會加劇,具體來說是驗證集準確率變低。 cbam與norm進行比較可以發(fā)現(xiàn),在8d(可能還處于欠擬合)基礎(chǔ)上使用cbam可以取得驗證集目前最高的結(jié)果,而在64d(可能出現(xiàn)過擬合)基礎(chǔ)上使用cbam后準確率幾乎持平。 還有一個有趣的現(xiàn)象,就是收斂速度方面,大體符合越寬的模型,收斂速度越快的趨勢(和我們已知結(jié)論是相符的,寬的模型loss landscape更加平滑,更容易收斂)
以上是第一個角度,另外一個角度可能沒那么準確,僅提供一種直覺。
第二個角度是從模型感受野來分析
我們知道CNN是一個局部性很強的模型,通常使用的是3x3卷積進行掃描整張圖片,一層層抽取信息。而感受野疊加也是通過多層疊加的方式構(gòu)建,比如兩個3x3卷積的理論感受野就是5x5, 但是其實際感受野并沒有那么大。
各種注意力模塊的作用是什么呢?他們能夠彌補cnn局部性過強,全局性不足的問題,從而獲取全局的上下文信息,為什么上下文信息重要呢?可以看一張圖來自CoConv。

單純看圖a可能完全不知道該目標是什么,但是有了圖b的時候,知道這是廚房以后,就可以識別出該目標是廚房用手套。因此注意力模塊具有讓模型看的更廣的能力,近期vision transformer的出現(xiàn)和注意力也有一定關(guān)聯(lián),比如Non Local Block模塊就與ViT中的self-attention非常類似。vision transformer在小數(shù)據(jù)集上性能不好的也可以從這個角度解釋,因為太關(guān)注于全局性(并且參數(shù)量比較大),非常容易過擬合,其記憶數(shù)據(jù)集的能力也非常強,所以只有大規(guī)模數(shù)據(jù)集預訓練下才能取得更好的成績。(感謝李沐老師出的系列視頻?。┰倩氐竭@個問題,注意力模塊對感受野的影響,直觀上來講是會增加模型的感受野大小。理論上最好的情況應該是模型的實際感受野(不是理論感受野)和目標的尺寸大小相符。
如果添加注意力模塊之前,模型的感受野已經(jīng)足夠擬合數(shù)據(jù)集中目標,那么如果再添加注意力模塊有些畫蛇添足。但是由于實際感受野是會變化的,所以可能即便加了注意力模塊也可以自調(diào)節(jié)實際感受野在目標大小附近,這樣模型可能保持性能不變。 如果添加注意力模塊之前,模型的感受野是不足的,甚至理論感受野都達不到目標的大小(實際感受野大小<理論感受野大?。?,那么這個時候添加注意力模塊就可以起到非常好的作用,性能可能會有一定幅度提升。
從這個角度來分析,題主只用了兩個卷積層,然后就開始使用CBAM模塊,很有可能是感受野不足的情況。但是為什么性能會下降呢,可能有其他方面因素影響,可以考慮先構(gòu)建一個差不多的baseline,比如帶殘差的ResNet20,或者更小的網(wǎng)絡,然后再在其基礎(chǔ)上進行添加注意力模塊。以上結(jié)論并不嚴謹,歡迎評論探討。
筆者開源了注意力模塊庫,歡迎提issue貢獻!https://github.com/pprp/awesome-attention-mechanism-in-cv對文中實驗源碼感興趣可以訪問這個鏈接:https://github.com/pprp/pytorch-cifar-model-zoo
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有美顏、三維視覺、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群
個人微信(如果沒有備注不拉群!) 請注明:地區(qū)+學校/企業(yè)+研究方向+昵稱
下載1:何愷明頂會分享
在「AI算法與圖像處理」公眾號后臺回復:何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結(jié)分析
下載2:終身受益的編程指南:Google編程風格指南
在「AI算法與圖像處理」公眾號后臺回復:c++,即可下載。歷經(jīng)十年考驗,最權(quán)威的編程規(guī)范!
下載3 CVPR2021 在「AI算法與圖像處理」公眾號后臺回復:CVPR,即可下載1467篇CVPR?2020論文 和 CVPR 2021 最新論文

