注意力機制的原理與應用

1、Attention機制的研究進展

  Attention機制最早是應用於圖像領域,九幾年就提出來的思想。在2014年,Google Mind團隊發表的《Recurrent Models of Visual Attention》[2]論文使Attention機制開始火了起來,該論文提出在RNN模型上使用Attention機制來進行圖像分類,結果取得了很好的性能。隨後,在Bahdanau等人發表論文《Neural Machine Translation by Jointly Learning to Align and Translate》[8]中提出在機器翻譯任務上使用Attention機制將翻譯和對齊同時進行,他們的工作是第一個將Attention機制應用在NLP領域中的。接着,在Xu等人發表的論文《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》[10]中,成功的將Attention機制應用在Image Caption領域。從此,Attention機制就被廣泛應用在基於RNN神經網絡模型的各種深度學習任務中。隨後,如何在CNN中使用Attention機制也成爲研究的熱點。2017年,Google發表的論文《Attention is all you need》[12]中提出在機器翻譯上大量使用自注意力(self-attention)機制來學習文本表示。圖1展示了Attention機制研究進展的大概趨勢。
在這裏插入圖片描述

圖1 Attention機制研究進展的大概趨勢

2、基本原理

  注意力機制認爲,網絡中每層不同的特徵的重要性不同,後面的層應該更注重其中重要的信息,抑制不重要的信息。

3、Encoder-Decoder框架

  目前大多數注意力模型都附着在Encoder-Decoder框架下,其實注意力機制也可以作爲一種通用的思想。
  Encoder-Decoder框架可以看作是一種深度學習領域的研究模式,應用場景異常廣泛。圖2是文本處理領域裏常用的Encoder-Decoder框架最抽象的一種表示。
在這裏插入圖片描述

圖2 Encoder-Decoder框架

  Encoder就是對輸入句子Source進行編碼,將輸入句子通過非線性變換轉化爲中概念語義表示CC,公式如下:

C=F(x1,x2,..,xm)(3-1) C=F(x_1,x_2,..,x_m)\tag{3-1}

  解碼器Decoder的任務是根據句子Source的中間於一表示CC和之前已經生成的歷史信息y1,y2,...,yi1y_1,y_2,...,y_{i-1}來生成ii時刻要生成的單詞yiy_i,公式如下:

yi=G(C,y1,y2,...,yi1)(3-2) y_i=G(C,y_1,y2,...,y_{i-1})\tag{3-2}

  圖2中展示的Encoder-Decoder框架是沒有體現出注意力模型的,所以可以把它看作是注意力不集中的分心模型。請觀察下目標句子Target中每個單詞的生成過程如下:

y1=f(C)(3-3) y_1=f(C)\tag{3-3}

y2=f(C,y1)(3-4) y_2=f(C,y_1)\tag{3-4}

y3=f(C,y1,y2)(3-5) y_3=f(C,y_1,y_2)\tag{3-5}

其中ff是Decoder的非線性變換函數。我們可以看出無論生成哪個單詞,他們使用的輸入句子Source的語義編碼C都是一樣的。句子Source中任意單詞對生成某個目標單詞yiy_i來說影響力都是相同的。

4、軟注意力機制

在這裏插入圖片描述

圖3 引入注意力模型的Encoder-Decoder框架

  目標句子中每個單詞都應該學會其對應的Source中單詞的注意力分配改了信息。這意味着在生成每個單詞yiy_i的時候,原先都是相同的中間語義表示CC會被替換成根據當前生成單詞而不斷變化的CiC_i。理解Attention模型的關鍵就是這裏,即由固定的中間語義表示CC換成了根據當前輸出單詞來調整成加入注意力模型的變化的CiC_i。增加了注意力模型的Encoder-Decoder框架理解起來如圖3所示。
  即生成目標句子單詞的過程成了下面的形式:

y1=f(C1)(4-1) y_1=f(C_1)\tag{4-1}

y2=f(C2,y1)(4-2) y_2=f(C_2,y_1)\tag{4-2}

y3=f(C3,y1,y2)(4-3) y_3=f(C_3,y_1,y_2)\tag{4-3}

而每個CiC_i可能對應着不同的Source句子單詞的注意力分配概率分佈。

5、注意力機制的本質思想

在這裏插入圖片描述

圖4 注意力機制的本質思想

  我們可以這樣看注意力機制:將數據源(Source)中的構成元素想象成是由一系列的<Key,Value>數據對組成,此時給定目標中某個元素的Query,通過計算Query和各個Key的相似性或者相關性,得到每個Key對應Value的權重係數,然後對Value進行加權求和,即得到了最終的注意力數值。所以本質上注意力機制是對數據源(Source)中元素的Value值進行加權求和,而Query和Key用來計算對應Value的權重係數。
  即可以將其本質思想改寫爲如下公式:
Attention(Query,Source)=i=1LxSimilarity(Query,Keyi)Valuei(5-1) Attention(Query,Source)=\sum_{i=1}^{L_x}{Similarity(Query,Key_i) \ast Value_i} \tag{5-1}

其中,Lx=SourceL_x=||Source||代表SourceSource的長度,公式含義即如上所述。

6、注意力機制的具體計算過程

在這裏插入圖片描述

圖5 三階段計算注意力機制過程

  對目前大多數方法進行抽象,可以將其歸納爲兩個過程
  根據Query和Key計算權重係數,可以細分爲兩個階段:
  第一個階段根據Query和Key計算兩者的相似性或者相關性;
  在第一個階段,可以引入不同的函數和計算機制,根據Query和某個KeyiKey_i,計算兩者的相似性或者相關性,最常見的方法包括:求兩者的向量點積、求兩者的向量Cosine相似性或者通過在引入額外的神經網絡來求值,如下公式:
  點積:Similarity(Query,Keyi)=QueryKeyi(6-1) Similarity(Query,Key_i)=Query \cdot Key_i\tag{6-1}

  Cosine相似性:

Similarity(Query,Keyi)=QueryKeyiQueryKeyi(6-2)Similarity(Query,Key_i)=\frac{Query \cdot Key_i}{\parallel Query \parallel \cdot \parallel Key_i \parallel}\tag{6-2}

  MLP網絡:
Similarity(Query,Keyi)=MLP(Query,Keyi)(6-3) Similarity(Query,Key_i)=MLP(Query,Key_i)\tag{6-3}

  第二個階段對第一階段的原始分值進行歸一化處理;
  第二階段引入類似Softmax的計算方式對第一階段的得分進行數值轉換,一方面可以進行歸一化,將原始計算分值整理成所有元素權重之和爲1的概率分佈;另一方面也可以通過Softmax的內在機制更加突出重要元素的權重。即一般採用如下公式計算:
ai=Softmax(Simi)=eSimij=1LxeSimi(6-4) a_i=Softmax(Sim_i)=\frac{e^{Sim_i}}{\sum_{j=1}^{L_x}e^{Sim_i}} \tag{6-4}

  根據權重係數對Value進行加權求和
  之後進行加權求和即可得到Attention數值:
Attention(Query,Source)=i=1LxaiValuei(6-5) Attention(Query,Source)=\sum_{i=1}^{L_x} a_i \cdot Value_i\tag{6-5}

7、自注意力機制

什麼是自注意力機制

  Self Attention也經常被稱爲intra Attention。
  在一般任務的Encoder-Decoder框架中,輸入Source和輸出Target內容是不一樣的,Attention 機制發生在Target的元素Query和Source中的所有元素之間。Self Attention機制指的不是Target和Source之間的Attention機制,而是Source內部元素治安或者Target內部元素之間發生的Attention機制,也可以理解爲Target=Source這種特殊情況下的注意力計算機制。其具體計算過程一樣的,只是計算對象發生了變化而已。

爲什麼要引入自注意力機制

  引入Self Attention後會更容易捕獲句子中長距離的相互依賴的特徵,因爲如果是RNN或者LSTM,需要依次序序列計算,對於遠距離的相互依賴的特徵,要經過若干時間步步驟的信息累計才能將兩者聯繫起來,而距離越遠,有效捕獲的可能性越小。但是Self Attention在計算過程中會直接將句子中任意兩個單詞的聯繫通過一個計算步驟直接聯繫起來,所以遠距離依賴特徵之間的距離被極大縮短,有利於有效地利用這些特徵。此外Self Attention對於增加計算地並行性也有直接幫助作用

8、非局部神經網絡(Non-local Neural Networks)

在這裏插入圖片描述

圖6 空間非局部塊

網絡結構

  在深度學習中非局部操作可以表達爲:
yi=1C(x)jf(xi,xj)g(xj)(8-1) y_i=\frac{1}{C(x)} \sum_{\forall j} f(x_i,x_j)g(x_j)\tag{8-1}

  ii是輸出特徵圖的其中一個位置,通用來說這個位置可以是時間、空間和時空。jj是所有可能位置的索引,xx是輸入信號,可以是圖像、序列和視頻,通常是特徵圖。yy是和xx尺度一樣的輸出圖,f是配對計算函數,計算第ii個位置和其他所有位置的相關性,gg是一元輸入函數,目的是進行信息變換,C(x)C(x)是歸一化函數,保證變換前後整體信息不變。以上是一個非常泛化的公式,具體細節見下面。在局部卷積算子中,一般的i1ji+1i-1 \leqslant j \leqslant i+1
  由於ffgg都是通式,故結合神經網絡特定,需要考慮其具體形式。
  首先g由於是一元輸出,比較簡單,我可以採用1x1卷積,代表線性嵌入,其形式爲:

g(xj)=Wgxj(8-2) g(x_j)=W_gx_j\tag{8-2}

  對於ff,前面我們說過其實就是計算兩個位置的相關性,那麼第一個非常自然的函數是Gaussian。
(1) Gaussian

f(xi,xj)=exiTxj(8-3) f(x_i,x_j)=e^{x_{i}^Tx_j}\tag{8-3}

對兩個位置進行點乘,然後通過指數映射,放大差異。
(2) Embedded Gaussian
f(xi,xj)=eθ(xi)Tϕ(xj)(8-4) f(x_i,x_j)=e^{\theta(x_i)^T\phi(x_j)}\tag{8-4}

前面的gaussian形式是直接在當前空間計算,而(2)更加通用,在嵌入空間中計算高斯距離。這裏:
θ(xi)=Wθxi(8-5) \theta(x_i)=W_{\theta}x_i\tag{8-5}

ϕ(xj)=Wϕxj(8-6) \phi(x_j)=W_{\phi}x_j\tag{8-6}

前面兩個:
C(x)=jf(xi,xj)(8-7) C(x)=\sum_{\forall j}f(x_i,x_j)\tag{8-7}

仔細觀察,如果把*C(x)*考慮進去,那麼1C(x)f(xi,xj)\frac{1}{C(x)}f(x_i,x_j)其實就是Softmax形式,完整考慮就是:
y=softmax(xTWθTWϕx)g(x)(8-8) y=softmax(x^T W_{\theta}^T W_{\phi} x)g(x)\tag{8-8}

最終地結果爲:

zi=Wzyi+xi(8-9) z_i=W_zy_i+x_i\tag{8-9}

可以看出,上面構造了殘差形式。上面地做法地好處就是可以隨意嵌入到任何一個預訓練好的網絡中,因爲只要設置WzW_z初始化爲0,那麼就沒有任何影響,然後在遷移學習中學習新的權重。這樣就不會因爲引入新的模塊而導致預訓練權重無法使用。

9、PAM

在這裏插入圖片描述

圖7 位置注意力模型

  場景理解的本質是判別特徵的表示,它能捕獲長範圍上下文信息。然而一些工作表明通過傳統的FCN網絡產生的局部特徵會導致目標或物體的錯分。爲了相對於局部特徵豐富上下文的信息,我們介紹了一個位置注意力模型。位置注意力模型編碼了廣泛的上下文信息進入局部特徵,因此增強了網絡的表示能力。接下來,我們詳細闡述自適應的聚合空間關係。

  闡述圖片2,給了一個局部特徵AC×H×WA \in \Re^{C \times H \times W},爲了產生兩個獨立的新的特徵圖B和C,我們將它輸入到卷積層,這裏B,CC×H×W{B,C} \in \Re^{C \times H \times W}。之後我們將它們變形到C×N\Re^{C \times N},這裏的N=H×WN=H \times W是像素的數量。之後我們將C和B的轉置矩陣相乘,並且應用softmax層爲了計算空間注意力圖SN×NS \in \Re^{N \times N}

sji=exp(BiCj)i=1Nexp(BiCj)B,CC×H×W,SN×N(9-1) s_ji=\frac {exp(B_i \cdot C_j)}{\sum_{i=1}^N exp(B_i \cdot C_j)} \quad \text {B,C}\in \Re^{C \times H \times W},S \in \Re^{N \times N} \tag{9-1}
這裏的sjis_{ji}是i位置對j位置的影響的測量。兩個位置的更相似的特徵表示有助於更好的相關性。

  同時,我們將A輸入卷積層產生了一個新的特徵圖DC×H×WD \in \Re^{C \times H \times W}重塑爲C×N\Re^{C \times N}。然後我們將D和轉置的S矩陣相乘並且結果重塑爲RC×H×WR^{C\times H\times W}。最後我們將它與尺度參數α\alpha相乘並且與特徵A逐元素相加,獲得最終的輸出結果EC×H×WE \in \Re^{C \times H \times W},公式如下所示:

Ej=αi=1N(sjiDi)+Aj(9-2) E_j=\alpha \sum_{i=1}^{N} (s_{ji} D_i)+A_j \tag{9-2}

這裏的α\alpha是初始值爲0並且逐漸分配更多的權重。它能夠從公式6中推斷出,結果特徵E的每個位置是這個特徵通過所有位置和原始特徵的權重之和。所以,它有一個全局上下文視野和選擇性聚集上下文關於空間注意力圖。相似的語義特徵實現了互惠因此改善了類間的影響和語義一致性。

代碼

class PAM_Module(Module):
    """ Position attention module"""
    #Ref from SAGAN
    def __init__(self, in_dim):
        super(PAM_Module, self).__init__()
        self.chanel_in = in_dim

        self.query_conv = Conv2d(in_channels=in_dim, out_channels=in_dim//8, kernel_size=1)
        self.key_conv = Conv2d(in_channels=in_dim, out_channels=in_dim//8, kernel_size=1)
        self.value_conv = Conv2d(in_channels=in_dim, out_channels=in_dim, kernel_size=1)
        
        self.gamma = Parameter(torch.zeros(1))
        self.softmax = Softmax(dim=-1)
        
    def forward(self, x):
        """
            inputs :
                x : input feature maps( B X C X H X W)
            returns :
                out : attention value + input feature
                attention: B X (HxW) X (HxW)
        """
        m_batchsize, C, height, width = x.size()
        proj_query = self.query_conv(x).view(m_batchsize, -1, width*height).permute(0, 2, 1)
        proj_key = self.key_conv(x).view(m_batchsize, -1, width*height)
        energy = torch.bmm(proj_query, proj_key)
        attention = self.softmax(energy)
        proj_value = self.value_conv(x).view(m_batchsize, -1, width*height)

        out = torch.bmm(proj_value, attention.permute(0, 2, 1))
        out = out.view(m_batchsize, C, height, width)

        out = self.gamma*out + x
        return out

10、CAM

在這裏插入圖片描述

圖8 通道注意力模型

  高階特徵的每個通道圖可以看作是對特定類的響應,並且不同的語義響應與其他相結合。利用通道圖之間的相互依存,我們能夠突出特徵圖之間的相互依存和改善特定語義的特徵表示。因此,我們建立了通道注意力模型爲了明確通道間的模型相互依存。

  通道注意力模型的結構闡述了在圖3。不同於位置注意力模型,我們直接計算通道注意力圖XC×CX \in \Re^{C \times C}從原始的特徵AC×H×WA \in \Re^{C \times H \times W}特別的,我們將A重塑爲C×N\Re^{C \times N},並且將A與A的轉置矩陣相乘。最後,我們應用softmax層獲得通道注意力圖XC×CX \in \Re^{C \times C},公式如下:

xji=exp(AiAj)i=1Cexp(AiAj)AC×H×W,XC×C(10-1) x_ji=\frac {exp(A_i \cdot A_j)}{\sum_{i=1}^C exp(A_i \cdot A_j)} \quad \text {A}\in \Re^{C \times H \times W},X \in \Re^{C \times C} \tag{10-1}

這裏的xjix_{ji}是i通道對j通道的影響的測量。另外,我們將X的轉置與A矩陣相乘並且重塑他們的結果到C×H×W\Re^{C \times H \times W}。然後我們將結果與β\beta相乘並且與A逐元素相加,獲得最終的輸出結果EC×H×WE \in \Re^{C \times H \times W},公式如下所示:
Ej=βi=1N(xjiAi)+Aj(10-2) E_j=\beta \sum_{i=1}^{N} (x_{ji} A_i)+A_j \tag{10-2}
這裏的β\beta的權重從0開始學習。公式8展示了是每個通道最終的特徵是所有通道特徵和原始特徵的和,模型能夠捕捉特徵圖之間的長距離的語義依賴。它幫助改善特徵辨別。

代碼

class CAM_Module(Module):
    """ Channel attention module"""
    def __init__(self, in_dim):
        super(CAM_Module, self).__init__()
        self.chanel_in = in_dim


        self.gamma = Parameter(torch.zeros(1))
        self.softmax  = Softmax(dim=-1)
    def forward(self,x):
        """
            inputs :
                x : input feature maps( B X C X H X W)
            returns :
                out : attention value + input feature
                attention: B X C X C
        """
        m_batchsize, C, height, width = x.size()
        proj_query = x.view(m_batchsize, C, -1)
        proj_key = x.view(m_batchsize, C, -1).permute(0, 2, 1)
        energy = torch.bmm(proj_query, proj_key)
        energy_new = torch.max(energy, -1, keepdim=True)[0].expand_as(energy)-energy
        attention = self.softmax(energy_new)
        proj_value = x.view(m_batchsize, C, -1)

        out = torch.bmm(attention, proj_value)
        out = out.view(m_batchsize, C, height, width)

        out = self.gamma*out + x
        return out

參考

https://zhuanlan.zhihu.com/p/37601161
https://arxiv.org/pdf/1809.02983.pdf
http://openaccess.thecvf.com/content_cvpr_2018/papers/Wang_Non-Local_Neural_Networks_CVPR_2018_paper.pdf
https://arxiv.org/pdf/1811.05544.pdf

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