深度 | 從各種注意力機制窺探深度學習在NLP中的神威
選自 arXiv
作者:Antoine J.-P. Tixier
機器之心編譯
參與:思源
隨著層級表征的興起,自然語言處理在很多方面都應(yīng)用了深度神經(jīng)網(wǎng)絡(luò)。它們可以實現(xiàn)語言建模、情感分析、機器翻譯、語義解析等非常多的任務(wù),這些序列建模任務(wù)可以使用循環(huán)神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)甚至近來比較流行的 Transformer。機器之心也介紹過基于循環(huán)與卷積的序列建模方法,而近日一篇綜述文章進一步介紹了 NLP 中各種深度技術(shù)。由于很多基礎(chǔ)知識讀者可能已經(jīng)比較熟悉了,因此本文只重點介紹該綜述文章討論的注意力機制。
綜述文章地址:https://arxiv.org/abs/1808.09772
作者 Antoine Tixier 表示整篇綜述筆記也是他學習過程的一部分,所以這一文章還會在 arXiv 上繼續(xù)更新。為了完成整篇文章,作者主要借鑒了各種卷積神經(jīng)網(wǎng)絡(luò)的原論文、斯坦福 CS231n 課程筆記、 Zhang 和 Wallace 關(guān)于在 NLP 中運用 CNN 的實戰(zhàn)指南、基于 CNN 的文本分類論文等,這些構(gòu)建了該綜述文章卷積神經(jīng)網(wǎng)絡(luò)部分的主體內(nèi)容。
對于循環(huán)神經(jīng)網(wǎng)絡(luò),作者參考了 Denny Britz 的 RNN 教程、Chris Colah 關(guān)于理解 LSTM 單元的技術(shù)博客、關(guān)于 GRU 單元的新穎論文、編碼器-解碼器架構(gòu)和注意力機制方面的論文。最后,Yoav Golderg 的 NLP 神經(jīng)網(wǎng)絡(luò)入門和 Manning 關(guān)于神經(jīng)機器翻譯的教程也都非常有幫助。
作者在完成綜述文章的同時,還根據(jù) Keras 與 IMDB 數(shù)據(jù)集實現(xiàn)了很多模型算法,這些代碼都能在作者的 GitHub 項目中找到。
項目地址:https://github.com/Tixierae/deep_learning_NLP
整個綜述文章分為七章,我們僅會展示第七章的編碼器解碼器架構(gòu)與注意力機制。其余關(guān)于卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)的具體內(nèi)容可查閱原文章,以下展示了整篇綜述文章的目錄:



7 注意力機制
注意力機制 [1] 是在編碼器-解碼器結(jié)構(gòu)下用于神經(jīng)機器翻譯(NMT)[2, 24] 的一種結(jié)構(gòu),它已經(jīng)非??焖俚財U展到了其它相關(guān)任務(wù),例如圖像描述 [25] 和文本摘要 [21] 等。直觀而言,注意力機制通過允許解碼器在多個向量中關(guān)注它所需要的信息,從而使編碼器避免了將輸入嵌入為定長向量,因此能保留更多的信息 [1]。
如今,注意力機制在深度模型中已經(jīng)非常普遍,它已經(jīng)不再僅流行于編碼器-解碼器架構(gòu)。尤其是一些注意力變體,它們僅作用于編碼器而解決文本分類或表征學習等問題,這些變體適用于自注意力或內(nèi)部注意力。
在本文中,我們會首先討論編碼器-解碼器架構(gòu)中的注意力機制,它們常用于神經(jīng)機器翻譯,隨后本文會介紹自注意力與層級注意力等。
7.1 編碼器-解碼器注意力機制
7.1.1 編碼器解碼器架構(gòu)
從概念上來說,如圖 10 所示編碼器希望將輸入嵌入為一個向量,而解碼器根據(jù)該向量生成一些輸出。

圖 10:編碼器-解碼器架構(gòu)概覽。
在神經(jīng)機器翻譯中,輸入與輸出都是由單詞組成的序列,即 x=(x_1, ... , x_T) 和 y=(y_1, ... , y_T),其中 x 和 y 通常表示原語句子與目標語句子。因為輸入與輸出都是序列,編碼器-解碼器架構(gòu)也稱為序列到序列的模型(Seq2Seq)。因為編碼器-解碼器架構(gòu)處處可微,所以它們的參數(shù)θ可以根據(jù)平行語料庫和最大似然估計同時得到優(yōu)化,這種訓練類型也稱為端到端的訓練。

如上所示,我們希望最大化的函數(shù)即正確翻譯的對數(shù)概率。
7.1.2 編碼器
原語句子可以通過 CNN 或全連接網(wǎng)絡(luò)等某個模型編碼為一個向量,機器翻譯通常會選擇 RNN 作為編碼器。Bahdanau[1] 等人最開始使用雙向深度 RNN 網(wǎng)絡(luò),該模型使用兩條深度單向 RNN 構(gòu)建模型,且方向相反的兩條 RNN 不會共享參數(shù)。第一個前向 RNN 從左到右處理原語句子,而第二條反向的 RNN 由右到左處理原語句子。兩個 RNN 編碼的隱向量在每一個時間步都會拼接在一起,從而作為雙向 RNN 的內(nèi)部表征:

雙向 RNN 在考慮整個句子所有信息的情況下再編碼原語句子,它不會僅考慮當前時間步之前的單詞。因此 h_t 偏向于利用以 x_t 為中心的小區(qū)間信息,而在單向 RNN 中,h_t 偏向于利用 x_t 的信息。關(guān)注 x_t 周圍小區(qū)間的信息可能會產(chǎn)生一些優(yōu)勢,但并不是絕對性的。Luong et al. [20] 使用一般的單向深度 RNN 編碼器同樣獲得了當前最優(yōu)的模型性能。在下文中,編碼器的隱藏狀態(tài)將寫為 h_t bar。
7.1.3 解碼器
編碼器可以使用不同的模型,而在 NMT 中,解碼器通常會使用深度的單向 RNN,這主要因為單向 RNN 會比較自然地適應(yīng)于序列生成任務(wù)。解碼器的目標是在每一個時間步生成目標語中的一個詞,直到讀到停止詞而完成整句話的輸出。
解碼器的關(guān)鍵思想是僅使用原語句子最后時間步編碼的隱藏向量來生成目標語句子,這會強迫編碼器擬合盡可能多的原語句子信息,并整合到最后的隱藏向量 h_T 中。因為 h_T 是一個定長的向量,因此表征能力十分有限,很多信息也會損失掉。另一方面,注意力機制允許解碼器在每一個時間步考慮整個編碼器的隱藏狀態(tài)序列 (h_1, ... , h_T),也就是說解碼器在生成每一個目標語單詞中能決定需要注意哪些編碼向量。
更具體而言,目標語序列 y=(y_1, ... , y_T) 中每一個詞 y_t 的生成都基于條件分布:

其中 h_t tilde 為注意的隱藏狀態(tài),它的計算表達式為:

h_t 為解碼器的隱藏狀態(tài),當解碼器是深度 RNN 時,h_t 就是編碼器頂層的隱藏狀態(tài),它提供了前面所生成目標語詞序列 {y_1, ... , y_(t-1)} 的信息。c_t 為原語的上下文向量,而「;」則表示了拼接操作。W_s 和 W_c 矩陣為可訓練的參數(shù),且該式子為了簡化并沒有展示偏置項。如下圖 11 所示,上下文向量 c_t 能通過兩種方式計算:全局和局部。本文在后面會討論這兩種方法。

圖 11:全局注意力(左)和局部注意力(右)。
7.1.4 全局注意力
在全局注意力中,上下文向量 c_t 為整個原語序列隱藏狀態(tài) h_i bar 的加權(quán)和,即編碼器所有時間步上隱藏狀態(tài)的加權(quán)和。其中每一個隱藏狀態(tài)向量的維度為編碼器隱藏層的神經(jīng)元數(shù)量,c_t 的維度與編碼器的隱藏狀態(tài)相等。校準向量α_t 的維度等于原語句子序列長度 T_x,所以它是一個變量。

校準向量(alignment vector)α_t 需要先對當前目標語隱藏狀態(tài) h_t 和所有原語隱藏狀態(tài) h_i bar 之間做校準運算(score()),然后再對運算結(jié)果應(yīng)用 Softmax:

換而言之,α_t 為所有原語隱藏狀態(tài)上的概率分布,即所有α_t 都在 0 和 1 之間,且加和為 1。α_t 表明原語句子中哪一個單詞對預(yù)測目標語下一個單詞最重要。score() 在理論上可以是任何對比函數(shù),Luong et al. [20] 通過點乘試驗該函數(shù)

,而更一般的公式是通過參數(shù)矩陣與全連接層確定

。他們發(fā)現(xiàn)點乘在全局注意力中有更好的效果,而全連接層在局部注意力中有更好的效果。全局注意力在圖 12 中有所總結(jié):

圖 12:全局注意力機制總結(jié)。
7.1.5 局部注意力
每生成單個目標詞都需要考慮原語句子的所有詞在計算上是非常昂貴的,也不是必需的。為了減少這種問題,Luong et al. [20] 提出了一種僅關(guān)注固定窗口大小 2D+1 的局部注意力機制:

D 是開發(fā)者指定的超參數(shù),位置 p_t 為窗口的中心,它可以設(shè)置為 t(單調(diào)性校準)或者由可微分機制確定(預(yù)測性校準),其中預(yù)測性校準基于前面生成的目標語單詞信息 {y_1, ... , y_t-1},即儲存在 h_t 中的信息:

其中 T_x 為原語句子的長度、σ為 Sigmoid 函數(shù)、v_p 和 w_p 為可訓練參數(shù)。校準權(quán)重的計算方式與全局注意力相同(公式 19),只是加了一個均值為 p_t、標準差為 D/2 的正態(tài)分布項:

注意

。增加的高斯分布項會確保校準權(quán)重會隨著 i 遠離窗口中心 p_t 而衰減,即它會認為窗口中心附近的詞更重要。同樣不同于全局注意力,α_t 的維度固定等于 2D+1,只有在窗口內(nèi)的隱藏向量才會得到考慮。局部注意力其實也可以視為全局注意力,只不過校準權(quán)重會乘上一個截斷的正態(tài)分布。下圖 13 總結(jié)了局部注意力機制:

圖 13:局部注意力的總結(jié),其帶有預(yù)測性的校準機制。
7.2 自注意力
現(xiàn)在假定單個 RNN 編碼器采用序列 (x_1, ..., x_T) 作為輸入,其長度為 T,該 RNN 會將輸入序列映射到隱藏向量序列 (h_1, ..., h_T)。該模型的目標與編碼器-解碼器架構(gòu)中的注意力機制一樣:它不希望僅考慮最后一個隱藏向量 h_T 作為對整個序列的總結(jié),這會引起輸入信息的損失,它希望考慮所有時間步下的隱藏狀態(tài),并計算一個新的上下文向量。為了這個目標,2016/2017 年提出了自注意力或內(nèi)部注意力機制。
如下公式 23 所示,隱藏向量 h_t 首先會傳遞到全連接層。然后校準系數(shù) α_t 會對比全連接層的輸出 u_t 和可訓練上下文向量 u(隨機初始化),并通過 Softmax 歸一化而得出。注意力向量 s 最后可以為所有隱藏向量的加權(quán)和。

score 函數(shù)理論上可以是任意校準函數(shù),一個比較直接的方式是使用點乘 score(u_t , u) =u_t*u。上下文向量可以解釋為在平均上表征的最優(yōu)單詞。但模型面臨新的樣本時,它會使用這一知識以決定哪一個詞需要更加注意。在訓練中,模型會通過反向傳播更新上下文向量,即它會調(diào)整內(nèi)部表征以確定最優(yōu)詞是什么。
7.2.1 與 Seq2Seq 注意力的不同
自注意力中定義的上下文向量與 Seq2Seq 注意力中定義的上下文向量是不同的。在 Seq2Seq 中,上下文向量 c_t 等于加權(quán)和

,它用來計算需要注意的隱藏狀態(tài) h_t tilde = tanh(W_c [c_t; h_t]。在自注意力中,上下文向量用來替代解碼器的隱藏狀態(tài),因為模型沒有解碼器。所以在自注意力中,校準向量 α 表示每一個輸入單詞與平均最優(yōu)單詞的相似性,而在 Seq2Seq 注意力中,α 表示每一個原語單詞對生成下一個目標語單詞的相關(guān)性。
7.2.2 層級注意力
圖 14 展示了一個很好的案例,它表示自注意力機制為什么在實踐中非常有用。在該架構(gòu)中,自注意力機制共使用了兩次:在詞層面與在句子層面。該方法因為兩個原因而非常重要,首先是它匹配文檔的自然層級結(jié)構(gòu)(詞——句子——文檔)。其次在計算文檔編碼的過程中,它允許模型首先確定哪些單詞在句子中是非常重要的,然后再確定哪個句子在文檔中是非常重要的。

圖 14:層級注意力架構(gòu)。

