前言
之前已經提到過好幾次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\)
其中\(s_i\)表示Decoder上一時刻的輸出狀態,\(c_i\)為當前的時刻的中間語義向量
- 當前的時刻的中間語義向量\(c_i\)為對輸入信息注意力加權求和之后得到的向量,即:
其中\(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\)為對輸入信息注意力加權求和之后得到的向量,即:
而注意力權重\(\alpha_{ij}\)表示Decoder端的第i個詞對Encoder端的第j個詞的注意力大小,即輸入的第j個詞對生成的第i個詞的影響程度。其基本的計算方式如下:
其中,\(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\)
將公式整合一下:
其中,\(Query\)為我們之前提到的\(s_{i-1}\),\(Keys\) 和 \(Values\)為 \(h\)
Self-Attention
重溫一下我們講解Transformer時提到的Self-Attention,其 \(Query\),\(Keys\) 和 \(Values\) 均為Encoder層的詞表征通過一個簡單的線性映射矩陣得到的,即可將其表示為
從其注意力分數的計算方法上來看也是一種典型的縮放點積,其關鍵在於僅對句子本身進行注意力權值計算,使其更能夠把握句子中詞與詞之前的關系,從而提取出句子中的句法特征或語義特征。
小結
這一塊對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