神經(jīng)網(wǎng)絡(luò)加上注意力機(jī)制,精度反而下降,為什么會(huì)這樣呢?
【GiantPandaCV導(dǎo)語】?
問題來自于知乎:"神經(jīng)網(wǎng)絡(luò)加上注意力機(jī)制,精度反而下降,為什么會(huì)這樣呢?"
因?yàn)橹皩戇^Attention+YOLOv3的文章,做過相關(guān)實(shí)驗(yàn),所以被問過很多問題,舉幾個(gè)典型的問題:
我應(yīng)該在哪里添加注意力模塊? 我應(yīng)該使用那種注意力模塊? 為什么我添加了注意力模塊以后精度反而下降了? 你添加注意力模塊以后有提升嗎? 注意力模塊的參數(shù)如何設(shè)置? 添加注意力模塊以后如何使用預(yù)訓(xùn)練模型?

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

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

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

單純看圖a可能完全不知道該目標(biāo)是什么,但是有了圖b的時(shí)候,知道這是廚房以后,就可以識(shí)別出該目標(biāo)是廚房用手套。
因此注意力模塊具有讓模型看的更廣的能力,近期vision transformer的出現(xiàn)和注意力也有一定關(guān)聯(lián),比如Non Local Block模塊就與ViT中的self-attention非常類似。vision transformer在小數(shù)據(jù)集上性能不好的也可以從這個(gè)角度解釋,因?yàn)樘P(guān)注于全局性(并且參數(shù)量比較大),非常容易過擬合,其記憶數(shù)據(jù)集的能力也非常強(qiáng),所以只有大規(guī)模數(shù)據(jù)集預(yù)訓(xùn)練下才能取得更好的成績(jī)。(感謝李沐老師出的系列視頻?。?/p>
再回到這個(gè)問題,注意力模塊對(duì)感受野的影響,直觀上來講是會(huì)增加模型的感受野大小。理論上最好的情況應(yīng)該是模型的實(shí)際感受野(不是理論感受野)和目標(biāo)的尺寸大小相符。
如果添加注意力模塊之前,模型的感受野已經(jīng)足夠擬合數(shù)據(jù)集中目標(biāo),那么如果再添加注意力模塊有些畫蛇添足。但是由于實(shí)際感受野是會(huì)變化的,所以可能即便加了注意力模塊也可以自調(diào)節(jié)實(shí)際感受野在目標(biāo)大小附近,這樣模型可能保持性能不變。 如果添加注意力模塊之前,模型的感受野是不足的,甚至理論感受野都達(dá)不到目標(biāo)的大小(實(shí)際感受野大小<理論感受野大?。?,那么這個(gè)時(shí)候添加注意力模塊就可以起到非常好的作用,性能可能會(huì)有一定幅度提升。
從這個(gè)角度來分析,題主只用了兩個(gè)卷積層,然后就開始使用CBAM模塊,很有可能是感受野不足的情況。但是為什么性能會(huì)下降呢,可能有其他方面因素影響,可以考慮先構(gòu)建一個(gè)差不多的baseline,比如帶殘差的ResNet20,或者更小的網(wǎng)絡(luò),然后再在其基礎(chǔ)上進(jìn)行添加注意力模塊。
以上結(jié)論并不嚴(yán)謹(jǐn),歡迎評(píng)論探討。
筆者開源了注意力模塊庫,歡迎提issue貢獻(xiàn)!
https://github.com/pprp/awesome-attention-mechanism-in-cv
對(duì)文中實(shí)驗(yàn)源碼感興趣可以訪問這個(gè)鏈接:
https://github.com/pprp/pytorch-cifar-model-zoo


