標籤:

深入理解注意力機制

深入理解注意力機制

來自專欄計算機視覺on the way20 人贊了文章

本篇文章會同步到公眾號 機器學習演算法全棧工程師 ,歡迎大家關注~

簡述

注意力機制和人類的視覺注意力很相似,人類的注意力是人類視覺所特有的大腦信號處理機制。人類通過快速掃描全局圖像,獲得需要重點關注的目標區域,得到注意力焦點,而後對這一區域投入更多注意力,以獲取更多所需要關注目標的細節信息,從而抑制其他無用信息。這是人類利用有限的注意力資源從大量信息中快速篩選出高價值信息的手段,是人類在長期進化中形成的一種生存機制,極大地提高了視覺信息處理的效率與準確性。比如給一張印有圖片的報紙,那人會先去看報紙的標題,然後會看顯目的圖片.

深度學習中的注意力機制從本質上講和人類的選擇性視覺注意力機制類似,目的也是從眾多信息中選擇出對當前任務目標更關鍵的信息

channel-wise attention

本文從SCA-CNN中提到的channel-wise的角度來理解注意力機制,paper地址:SCA-CNN

,首先我們從幾個問題出發來理解.

為什麼要引入channel wise attention?

舉個例子:當你要預測一張圖片中的帥哥時,那麼channel wise attention就會使得提取到帥哥特徵的feature map的權重加大,這樣最後output結果就會準確不少.

為什麼要引入multi-layer呢?

因為高層的feature map的生成是依賴低層的feature map的,比如你要預測圖片中的帥哥,我們知道,底層網路提取到的更多是底層的細節,而高層網路才能提取到全局的語義信息,那麼只有低層kernel提取到更多帥哥邊緣特徵,高層才能更好地抽象出帥哥來。另外如果只在最後一個卷積層做attention,其feature map的receptive field已經很大了(幾乎覆蓋整張圖像),那麼feature map之間的差異就比較小,不可避免地限制了attention的效果,所以對multi-layer的feature map做attention是非常重要的.

為什麼還需要spatial attention?

前面channel-wise attention 只會關注到圖像的一個小部分,而spatial attention的作用為關鍵部分配更大的權重,讓模型的注意力更集中於這部分內容。

channel wise attention是在回答「是什麼」,而spatial attention是在回答「在哪兒」.

spatial attention是以feature map的每個像素點為單位,對feature map的每個像素點都配一個權重值,因此這個權重值應該是一個矩陣,大小是圖片的大小;channel wise attention則是以feature map為單位,對每個channel都配一個權重值,因此這個權重值應該是一個向量。

具體細節

首先,我們可以通過下圖看到整個attention添加的過程,作用在multi-layer 的feature map上.

網路中第(l-1)層的輸出feature map,該feature map經過channel wise attention 函數得到權重 βl。然後這個βl和Vl相乘就得到中間結果的feature map。接下來feature map經過spatial attention函數得到權重 αl。這個αl和前面生成的feature map相乘得到最終的Xl.

本文主要講channel-wise attention,首先我們將feature map V reshape to U, and U = [u1,u2.....uC], U是R^(W*H),分別代表每個channel;C代表channel的總數;然後我們用mean pooling得到 channel feature v;然後我們再實現下圖所示的公式.

最後,channel-wise attention的具體實現pytorch代碼:

class AttentionLayer(nn.Module): def __init__(self, channel, reduction=64, multiply=True): super(AttentionLayer, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channel, channel // reduction), nn.ReLU(inplace=True), nn.Linear(channel // reduction, channel), nn.Sigmoid() ) self.multiply = multiply def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) if self.multiply == True: return x * y else: return y

推薦閱讀:

注意力不集中就是多動症
孩子「注意力」不集中——家長在不經意中造成的錯!家長看過來!
找回專註——寫給在互聯網時代迷失了閱讀能力的朋友

TAG:注意力 |