Attention機制全解

  • 2019 年 10 月 22 日
  • 筆記

前言

之前已經提到過好幾次Attention的應用,但還未對Attention機制進行系統的介紹,之後的實踐模型attention將會用到很多,因此這裡對attention機製做一個總結。

Seq2Seq

注意力機制(Attention Mechanism)首先是用於解決 Sequence to Sequence 問題提出的,因此我們了解下研究者是怎樣設計出Attention機制的。

Seq2Seq,即序列到序列,指的是用Encoder-Decoder框架來實現的端到端的模型,最初用來實現英語-法語翻譯。Encoder-Decoder框架是一種十分通用的模型框架,其抽象結構如下圖所示:

其中,Encoder和Decoder具體使用什麼模型都是由研究者自己定的,CNN/RNN/Transformer均可。Encoder的作用就是將輸入序列映射成一個固定長度的上下文向量C,而Decoder則將上下文向量C作為預測(Y_1)輸出的初始向量,之後將其作為背景向量,並結合上一個時間步的輸出來對下一個時間步進行預測。

由於Encoder-Decoder模型在編碼和解碼階段始終由一個不變的語義向量C來聯繫著,這也造成了如下一些問題:

  • 所有的輸入單詞 X 對生成的所有目標單詞 Y 的影響力是相同的
  • 編碼器要將整個序列的資訊壓縮進一個固定長度的向量中去,使得語義向量無法完全表示整個序列的資訊
  • 最開始輸入的序列容易被後輸入的序列給覆蓋掉,會丟失許多細節資訊,這點在長序列上表現的尤為明顯

Attention機制的引入

Attention機制的作用就是為模型增添了注意力功能,使其傾向於根據需要來選擇句子中更重要的部分。

加入加入Attention機制的Seq2Seq模型框架如下圖所示:

與傳統的語義向量C不同的是,帶有注意力機制的Seq2Seq模型與傳統Seq2Seq模型的區別如下:

  • 其為每一次預測都有不同的上下文資訊(C_i)
    [P(y_i|y_1, y_2, …, y_{i-1}, X) = P(y_i-1, s_i, c_i)]

其中(s_i)表示Decoder上一時刻的輸出狀態,(c_i)為當前的時刻的中間語義向量

  • 當前的時刻的中間語義向量(c_i)為對輸入資訊注意力加權求和之後得到的向量,即:
    [c_i = sum_{j=1}^{Tx}alpha_{ij}h_j]

其中(h_j)為Encoder端的第j個詞的隱向量,(alpha_{ij})表示Decoder端的第i個詞對Encoder端的第j個詞的注意力大小,即輸入的第j個詞對生成的第i個詞的影響程度。這意味著在生成每個單詞(Y_i)的時候,原先都是相同的中間語義表示(C)會替換成根據當前生成單詞而不斷變化的(c_i)。生成(c_i)最關鍵的部分就是注意力權重(alpha_{ij})的計算,具體的計算方法我們下面再討論。

Hard or Soft

之前我們提到的為Soft Attention的一般形式,還有一種Hard Attention,其與Soft Attention的區別在於,其通過隨機取樣或最大取樣的方式來選取特徵資訊(Soft Attention是通過加權求和的方式),這使得其無法使用反向傳播演算法進行訓練。因此我們常用的通常是Soft Attention

Global or Local

Global Attention 與 Local Attention 的區別在於二者的關注範圍不同。Global Attention 關注的是整個序列的輸入資訊,相對來說需要更大的計算量。而 Local Attention 僅僅關注限定窗口範圍內的序列資訊,但窗口的限定使得中心詞容易忽視不在窗口範圍內的資訊,因此窗口的大小設定十分重要。在實踐中,默認使用的是Global Attention。

注意力的計算

我們之前已經討論過,中間語義向量(c_i)為對輸入資訊注意力加權求和之後得到的向量,即:
[c_i = sum_{j=1}^{Tx}alpha_{ij}h_j]

而注意力權重(alpha_{ij})表示Decoder端的第i個詞對Encoder端的第j個詞的注意力大小,即輸入的第j個詞對生成的第i個詞的影響程度。其基本的計算方式如下:
[alpha_{ij} = frac{exp(e_{ij})}{sum_{k=1}^{T_x}exp(e_{ik})}]

[e_{ij} = Score(s_{i-1}, h_j)]

其中,(s_{i-1})需要根據具體任務進行選擇,對於機器翻譯等生成任務,可以選取 Decoder 上一個時刻的隱藏層輸出,對於閱讀理解等問答任務,可以選擇問題或問題+選項的表徵,對於文本分類任務,可以是自行初始化的上下文向量。而(h_j)為 Encoder 端第j個詞的隱向量,分析上面公式,可以將Attention的計算過程總結為3個步驟:

  • 將上一時刻Decoder的輸出與當前時刻Encoder的隱藏詞表徵進行評分,來獲得目標單詞 Yi 和每個輸入單詞對應的對齊可能性(即一個對齊模型),Score(·)為一個評分函數,一般可以總結為兩類:
    • 點積/放縮點積:
      [e_{ij} = Score(s_{i-1}, h_j) = s_{i-1} cdot h_j]

    [e_{ij} = Score(s_{i-1}, h_j) = frac{s_{i-1} cdot h_j}{||s_{i-1}||cdot||h_j||}]

    • MLP網路:
      [e_{ij} = Score(s_{i-1}, h_j) = MLP(s_{i-1}, h_j)]

    [e_{ij} = Score(s_{i-1}, h_j) = s_{i-1}Wh_{j}]

    [e_{ij} = Score(s_{i-1}, h_j) = W|h_j;s_{i-1}|]

  • 得到對齊分數之後,用Softmx函數將其進行歸一化,得到注意力權重

  • 最後將注意力權重與 Encoder 的輸出進行加權求和,得到需要的中間語義向量(c_i)

將公式整合一下:
[c_{i,j} = Attention(Query, Keys, Values) = Softmax(Score(Query, Keys)) * Values]

其中,(Query)為我們之前提到的(s_{i-1})(Keys)(Values)(h)

Self-Attention

重溫一下我們講解Transformer時提到的Self-Attention,其 (Query)(Keys)(Values) 均為Encoder層的詞表徵通過一個簡單的線性映射矩陣得到的,即可將其表示為
[Attention(Q,K,V) = Attention(W^QX,W^KX,W^VX)]

從其注意力分數的計算方法上來看也是一種典型的縮放點積,其關鍵在於僅對句子本身進行注意力權值計算,使其更能夠把握句子中詞與詞之前的關係,從而提取出句子中的句法特徵或語義特徵。

小結

這一塊對Attention的原理基本已經全部總結了,主要是對自己只是的鞏固,以及對之後的實踐工作做鋪墊,之後有時間再將Attention這塊相關的程式碼寫出來。

參考鏈接
https://zhuanlan.zhihu.com/p/31547842
https://zhuanlan.zhihu.com/p/59698165
https://zhuanlan.zhihu.com/p/53682800
https://zhuanlan.zhihu.com/p/43493999