【CV中的Attention機制】基礎篇-視覺注意力機制和SENet

注意力機制

注意力機制(Attention Mechanism)是機器學習中的一種數據處理方法,廣泛應用在自然語言處理、圖像識別及語音識別等各種不同類型的機器學習任務中。注意力機制本質上與人類對外界事物的觀察機制相似。通常來說,人們在觀察外界事物的時候,首先會比較關注比較傾向於觀察事物某些重要的局部信息,然後再把不同區域的信息組合起來,從而形成一個對被觀察事物的整體印象。Attention機制最先應用在自然語言處理方面,主要是爲了改進文本之間的編碼方式,通過編碼-解碼之後能學習到更好的序列信息。可以參考一篇具有劃時代意義的論文:Attention is all you need

Attention Mechanism可以幫助模型對輸入的X每個部分賦予不同的權重,抽取出更加關鍵及重要的信息,使模型做出更加準確的判斷,同時不會對模型的計算和存儲帶來更大的開銷,這也是Attention Mechanism應用如此廣泛的原因。

總的來說,注意力機制可分爲兩種:一種是軟注意力(soft attention),另一種則是強注意力(hard attention)。

軟注意力(soft attention)與強注意力(hard attention)的不同之處在於:

  • 軟注意力更關注區域或者通道,而且軟注意力是確定性的注意力,學習完成後直接可以通過網絡生成,最關鍵的地方是軟注意力是可微的,這是一個非常重要的地方。可以微分的注意力就可以通過神經網絡算出梯度並且前向傳播和後向反饋來學習得到注意力的權重。 在計算機視覺中,很多領域的相關工作(例如,分類、檢測、分割、生成模型、視頻處理等)都在使用Soft Attention,典型代表:SENet、SKNet。

  • 首先強注意力是更加關注點,也就是圖像中的每個點都有可能延伸出注意力,同時強注意力是一個隨機的預測過程,更強調動態變化。當然,最關鍵是強注意力是一個不可微的注意力,訓練過程往往是通過增強學習(reinforcement learning) 來完成的。

CV中的注意力機制

近幾年來,深度學習與視覺注意力機制結合的研究工作,大多數是集中於使用掩碼(mask)來形成注意力機制。掩碼的原理在於通過另一層新的權重,將圖片數據中關鍵的特徵標識出來,通過學習訓練,讓深度神經網絡學到每一張新圖片中需要關注的區域,也就形成了注意力

計算機視覺中的注意力機制的基本思想是讓模型學會專注,把注意力集中在重要的信息上而忽視不重要的信息。

attention機制的本質就是利用相關特徵圖學習權重分佈,再用學出來的權重施加在原特徵圖之上最後進行加權求和。不過施加權重的方式略有差別,大致總結爲如下四點:

  • 這個加權可以是保留所有分量均做加權(即soft attention);也可以是在分佈中以某種採樣策略選取部分分量(即hard attention),此時常用RL來做。
  • 加權可以作用在空間尺度上,給不同空間區域加權
  • 加權可以作用在Channel尺度上,給不同通道特徵加權
  • 加權可以作用在不同時刻歷史特徵上,結合循環結構添加權重,例如機器翻譯,或者視頻相關的工作。

爲了更清楚地介紹計算機視覺中的注意力機制,通常將注意力機制中的模型結構分爲三大注意力域來分析。主要是:空間域(spatial domain),通道域(channel domain),混合域(mixed domain)。

  1. 空間域——將圖片中的的空間域信息做對應的空間變換,從而能將關鍵的信息提取出來。對空間進行掩碼的生成,進行打分,代表是Spatial Attention Module。

  2. 通道域——類似於給每個通道上的信號都增加一個權重,來代表該通道與關鍵信息的相關度的話,這個權重越大,則表示相關度越高。對通道生成掩碼mask,進行打分,代表是senet, Channel Attention Module。

  3. 混合域——空間域的注意力是忽略了通道域中的信息,將每個通道中的圖片特徵同等處理,這種做法會將空間域變換方法侷限在原始圖片特徵提取階段,應用在神經網絡層其他層的可解釋性不強。

卷積神經網絡中常用的Attention

在卷積神經網絡中常用到的主要有兩種:一種是spatial attention, 另外一種是channel attention。當然有時也有使用空間與通道混合的注意力,其中混合注意力的代表主要是BAM, CBAM。

Spatial Attention:
對於卷積神經網絡,CNN每一層都會輸出一個C x H x W的特徵圖,C就是通道,同時也代表卷積核的數量,亦爲特徵的數量,H 和W就是原始圖片經過壓縮後的圖的高度和寬度,
spatial attention就是對於所有的通道,在二維平面上,對H x W尺寸的特徵圖學習到一個權重,對每個像素都會學習到一個權重。你可以想象成一個像素是C維的一個向量,深度是C,在C個維度上,權重都是一樣的,但是在平面上,權重不一樣。

Channel Attention: 就是對每個C(通道),在channel維度上,學習到不同的權重,平面維度上權重相同。所以基於通道域的注意力通常是對一個通道內的信息直接全局平均池化,而忽略每一個通道內的局部信息。

spatial 和 channel attention可以理解爲關注圖片的不同區域和關注圖片的不同特徵。channel attention的全面介紹可以參考論文:SCA-CNN,通道注意力在圖像分類中的網絡結構方面,典型的就是SENet。

下文將主要介紹:注意力機制在分類網絡中的典型應用–SENet

視覺注意力機制在分類網絡中的應用

Squeeze-and-Excitation Networks(SENet)

SENet是Squeeze-and-Excitation Networks的簡稱,由Momenta公司所作併發於2017CVPR,論文中的SENet贏得了ImageNet最後一屆(ImageNet 2017)的圖像識別冠軍,SENet主要是學習了channel之間的相關性,篩選出了針對通道的注意力,稍微增加了一點計算量,但是效果比較好。

論文中的motivation: 希望顯式地建模特徵通道之間的相互依賴關係,通過採用了一種全新的“特徵重標定”策略–自適應地重新校準通道的特徵響應 。具體來說,就是通過學習的方式來自動獲取到每個特徵通道的重要程度,然後依照這個重要程度去提升有用的特徵並抑制對當前任務用處不大的特徵。 該文提出的SE模塊思想簡單,易於實現,並且很容易可以加載到現有的網絡模型框架中。
在這裏插入圖片描述

下面是SE模塊的具體介紹:

  • Sequeeze:順着空間維度來進行特徵壓縮,將每個二維的特徵通道變成一個實數,這個實數某種程度上具有全局的感受野,並且輸出的維度和輸入的特徵通道數相匹配。它表徵着在特徵通道上響應的全局分佈,而且使得靠近輸入的層也可以獲得全局的感受野。具體操作就是對原特徵圖C * W * H 進行global average pooling,然後得到了一個 1 * 1 * C 大小的特徵圖,這個特徵圖具有全局感受野。

  • Excitation :輸出的1x1xC特徵圖,再經過兩個全連接神經網絡,最後用一個類似於循環神經網絡中門的機制。通過參數來爲每個特徵通道生成權重,其中參數被學習用來顯式地建模特徵通道間的相關性(論文中使用的是sigmoid)。

  • 特徵重標定:使用Excitation 得到的結果作爲權重,然後通過乘法逐通道加權到U的C個通道上,完成在通道維度上對原始特徵的重標定,並作爲下一級的輸入數據。

這種結構的原理是想通過控制scale的大小,把重要的特徵增強,不重要的特徵減弱,從而讓提取的特徵指向性更強。

SENet 通俗的說就是:通過對卷積之後得到的feature map進行處理,得到一個和通道數一樣的一維向量作爲每個通道的評價分數,然後將改動之後的分數通過乘法逐通道加權到原來對應的通道上,最後得到輸出結果,就相當於在原有的基礎上只添加了一個模塊而已。

Pytorch代碼實現上述該模塊:

class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

    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)
        return x * y.expand_as(x)

SENet可以作爲一個子模塊加載到分類網絡結構中去,具體如下所示:
在這裏插入圖片描述
上左圖是將SE模塊嵌入到Inception結構的一個示例。方框旁邊的維度信息代表該層的輸出。這裏我們使用global average pooling作爲Squeeze操作。緊接着兩個Fully Connected 層組成一個Bottleneck結構去建模通道間的相關性,並輸出和輸入特徵同樣數目的權重。我們首先將特徵維度降低到輸入的1/16,然後經過ReLu激活後再通過一個Fully Connected 層升回到原來的維度。

這樣做比直接用一個Fully Connected層的好處在於:

  1. 具有更多的非線性,可以更好地擬合通道間複雜的相關性;
  2. 極大地減少了參數量和計算量。然後通過一個Sigmoid的門獲得0-1 之間歸一化的權重,最後通過一個Scale的操作來將歸一化後的權重加權到每個通道的特徵上。

除此之外,SE模塊還可以嵌入到含有skip-connections的模塊中。

上右圖是將SE嵌入到 ResNet模塊中的一個例子,操作過程基本和SE-Inception一樣,只不過是在Addition前對分支上Residual的特徵進行了特徵重標定。如果對Addition後主支上的特徵進行重標定,由於在主幹上存在0~1的scale操作,在網絡較深BP優化時就會在靠近輸入層容易出現梯度消散的情況,導致模型難以優化。

目前大多數的主流網絡都是基於這兩種類似的單元通過repeat方式疊加來構造的。由此可見,SE模塊可以嵌入到現在幾乎所有的網絡結構中。通過在原始網絡結構的building block 單元中嵌入SE模塊,我們可以獲得不同種類的SENet 。如SE-BN-Inception、SE-ResNet 、SE-ReNeXt、SE-Inception-ResNet-v2等等。

下篇文章將主要介紹針對SENet進行改進的文章-SKNet和ResNeSt,敬請關注!

參考鏈接:
3. https://zhuanlan.zhihu.com/p/31547842
4. https://www.zhihu.com/question/68482809
5. https://blog.csdn.net/yideqianfenzhiyi/article/details/79422857
6. https://www.zhihu.com/question/68482809/answer/264070398
7. https://www.zhihu.com/question/63460684/answer/300021819
8. https://zhuanlan.zhihu.com/p/59690223

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章