淺談 Attention 機制的理解


什么是注意力機制?

注意力機制模仿了生物觀察行為的內部過程,即一種將內部經驗和外部感覺對齊從而增加部分區域的觀察精細度的機制。例如人的視覺在處理一張圖片時,會通過快速掃描全局圖像,獲得需要重點關注的目標區域,也就是注意力焦點。然后對這一區域投入更多的注意力資源,以獲得更多所需要關注的目標的細節信息,並抑制其它無用信息。

uploading-image-766351.png

圖片來源:深度學習中的注意力機制,其中紅色區域表示更關注的區域。

Encoder-Decoder 框架

目前大多數的注意力模型都是依附在 Encoder-Decoder 框架下,但並不是只能運用在該模型中,注意力機制作為一種思想可以和多種模型進行結合,其本身不依賴於任何一種框架。Encoder-Decoder 框架是深度學習中非常常見的一個模型框架,例如在 Image Caption 的應用中 Encoder-Decoder 就是 CNN-RNN 的編碼 - 解碼框架;在神經網絡機器翻譯中 Encoder-Decoder 往往就是 LSTM-LSTM 的編碼 - 解碼框架,在機器翻譯中也被叫做 Sequence to Sequence learning

所謂編碼,就是將輸入的序列編碼成一個固定長度的向量;解碼,就是將之前生成的固定向量再解碼成輸出序列。這里的輸入序列和輸出序列正是機器翻譯的結果和輸出。

為了說明 Attention 機制的作用,以 Encoder-Decoder 框架下的機器翻譯的應用為例,該框架的抽象表示如下圖:

uploading-image-481071.png

為了方便闡述,在選取 Encoder 和 Decoder 時都假設其為 RNN。在 RNN 中,當前時刻隱藏狀態 \(h_t\) 是由上一時刻的隱藏狀態 \(h_{t-1}\) 和當前時刻的輸入 \(x_t\) 決定的,如公式(1)所示:

\[h_t = f(h_{t-1},x_t)\tag{1} \]

編碼階段,獲得各個時刻的隱藏層狀態后,通過把這些隱藏層的狀態進行匯總,可以生成最后的語義編碼向量 \(C\) ,如公式(2)所示,其中 \(q\) 表示某種非線性神經網絡,此處表示多層 RNN 。

\[C=q(h_1,h_2,\cdots,h_{T_x})\tag{2} \]

在一些應用中,也可以直接將最后的隱藏層編碼狀態作為最終的語義編碼 \(C\),即滿足:

\[C=q(h_1,h_2,\cdots,h_{T_x})=h_{T_x}\tag{3} \]

解碼階段,需要根據給定的語義向量 \(C\) 和之前已經生成的輸出序列 \(y_1,y_2,\cdots,y_{t-1}\) 來預測下一個輸出的單詞 \(y_t\),即滿足公式(4):

\[y_t=\arg \max P(y_t)=\prod_{t=1}^{T}p(y_t|y_1,y_2,\cdots,y_{t-1},C)\tag{4} \]

由於我們此處使用的 Decoder 是 RNN ,所以當前狀態的輸出只與上一狀態和當前的輸入相關,所以可以將公式(4)簡寫成如下形式:

\[y_t=g(y_{t-1},s_{t-1},C)\tag{5} \]

在公式(5)中,\(s_{t-1}\) 表示 Decoder 中 RNN 神經元的隱藏層狀態,\(y_{t-1}\) 表示前一時刻的輸出,\(C\) 代表的是編碼后的語義向量,而 \(g(\cdot)\) 則是一個非線性的多層神經網絡,可以輸出 \(y_t\) 的概率,一般情況下是由多層 RNN 和 softmax 層組成。

局限性

Encoder-Decoder 框架雖然應用廣泛,但是其存在的局限性也比較大。其最大的局限性就是 Encoder 和 Decoder 之間只通過一個固定長度的語義向量 \(C\) 來唯一聯系。也就是說,Encoder 必須要將輸入的整個序列的信息都壓縮進一個固定長度的向量中,存在兩個弊端:一是語義向量 C 可能無法完全表示整個序列的信息;二是先輸入到網絡的內容攜帶的信息會被后輸入的信息覆蓋掉,輸入的序列越長,該現象就越嚴重。這兩個弊端使得 Decoder 在解碼時一開始就無法獲得輸入序列最夠多的信息,因此導致解碼的精確度不夠准確。

Attention 機制

在上述的模型中,Encoder-Decoder 框架將輸入 \(X\) 都編碼轉化為語義表示 \(C\),這就導致翻譯出來的序列的每一個字都是同權地考慮了輸入中的所有的詞。例如輸入的英文句子是:Tom chase Jerry,目標的翻譯結果是:湯姆追逐傑瑞。在未考慮注意力機制的模型當中,模型認為 湯姆 這個詞的翻譯受到 TomchaseJerry 這三個詞的同權重的影響。但是實際上顯然不應該是這樣處理的,湯姆 這個詞應該受到輸入的 Tom 這個詞的影響最大,而其它輸入的詞的影響則應該是非常小的。顯然,在未考慮注意力機制的 Encoder-Decoder 模型中,這種不同輸入的重要程度並沒有體現處理,一般稱這樣的模型為 分心模型

而帶有 Attention 機制的 Encoder-Decoder 模型則是要從序列中學習到每一個元素的重要程度,然后按重要程度將元素合並。因此,注意力機制可以看作是 Encoder 和 Decoder 之間的接口,它向 Decoder 提供來自每個 Encoder 隱藏狀態的信息。通過該設置,模型能夠選擇性地關注輸入序列的有用部分,從而學習它們之間的“對齊”。這就表明,在 Encoder 將輸入的序列元素進行編碼時,得到的不在是一個固定的語義編碼 C ,而是存在多個語義編碼,且不同的語義編碼由不同的序列元素以不同的權重參數組合而成。一個簡單地體現 Attention 機制運行的示意圖如下:

定義:對齊

對齊是指將原文的片段與其對應的譯文片段進行匹配。

uploading-image-653173.png

在 Attention 機制下,語義編碼 C 就不在是輸入序列 \(X\) 的直接編碼了,而是各個元素按其重要程度加權求和得到的,即:

\[C_i=\sum_{j=0}^{T_x}{a_{ij}f(x_j)}\tag{6} \]

在公式(6)中,參數 \(i\) 表示時刻, \(j\) 表示序列中的第 \(j\) 個元素, \(T_x\) 表示序列的長度, \(f(\cdot)\) 表示對元素 \(x_j\) 的編碼。\(a_{ij}\) 可以看作是一個概率,反映了元素 \(h_j\)\(C_i\) 的重要性,可以使用 softmax 來表示:

\[a_{ij}=\frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})}\tag{7} \]

這里 \(e_{ij}\) 正是反映了待編碼的元素和其它元素之間的匹配度,當匹配度越高時,說明該元素對其的影響越大,則 \(a_{ij}\) 的值也就越大。

因此,得出 \(a_{ij}\) 的過程如下圖:

uploading-image-611860.png

其中,\(h_i\) 表示 Encoder 的轉換函數,\(F(h_j,H_i)\) 表示預測與目標的匹配打分函數。將以上過程串聯起來,則注意力模型的結構如下圖所示:

uploading-image-905958.png

Attention 原理

到目前為止,相信各位客官對 Attention 機制的思想和作用都有了一定的了解。接下來,我們將對 Attention 機制的具體實現原理進行剖析。

Attention 機制的一個重點就是獲得 attention value,即機器翻譯中的語義編碼 \(C_i\)。在上一節中我們知道該值是通過輸入元素按照不同的權重參數組合而成的,所以我們可以將其定義為一個 attention 函數,比較主流的 attention 函數的機制是采用鍵值對查詢的方式,其工作實質如下圖所示:

uploading-image-736793.png

在自然語言任務中,往往 Key 和 Value 是相同的。需要注意的是,計算出來的 attention value 是一個向量,代表序列元素 \(x_j\) 的編碼向量,包含了元素 \(x_j\) 的上下文關系,即同時包含全局聯系和局部聯系。全局聯系很好理解,因為在計算時考慮了該元素與其他所有元素的相似度計算;而局部聯系則是因為在對元素 \(x_j\) 進行編碼時,重點考慮與其相似度較高的局部元素,尤其是其本身。

閱讀到一篇有關 動畫圖解Attention機制 的文章,這里主要是對 Attention 層的實現做下總結,詳細內容請查看原文。注意力機制可以看作是神經網絡架構中的一層神經網絡,注意力層的實現可以分為 6 個步驟。

Step 0:准備隱藏狀態

首先准備第一個 Decoder 的隱藏層狀態(紅色)和所有可用的 Encoder 隱藏層狀態(綠色)。在示例中,有 4 個 Encoder 隱藏狀態和 1 個 Decoder 隱藏狀態。

640.gif

Step 1:得到每一個 Encoder 隱藏狀態的得分

分值(score)由 score 函數來獲得,最簡單的方法是直接用 Decoder 隱藏狀態和 Encoder 中的每一個隱藏狀態進行點積。

獲得score.gif

假設 Decoder 中的隱藏狀態為 [5, 0, 1],分別與 Encoder 中的每個隱藏狀態做點積,得到第二個隱藏狀態的分值最高,說明下一個要解碼的元素將受到當前這種隱藏狀態的嚴重影響。

decoder_hidden = [10, 5, 10]
encoder_hidden score
---------------------
     [0, 1, 1]     15 (= 10×0 + 5×1 + 10×1, the dot product)
     [5, 0, 1]     60
     [1, 1, 0]     15
     [0, 5, 1]     35

Step 2:將所有得分送入 softmax 層

該部分實質上就是對得到的所有分值進行歸一化,這樣 softmax 之后得到的所有分數相加為 1。而且能夠使得原本分值越高的隱藏狀態,其對應的概率也越大,從而抑制那些無效或者噪音信息。

softmax得分.gif

通過 softmax 層后,可以得到一組新的隱藏層狀態分數,其計算方法即為公式(7):\(a_{ij}=\frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})}\)。注意,此處得到的分值應該是浮點數,但是由於無限接近於 0 和 1,所以做了近似。

encoder_hidden score score^
-----------------------------
     [0, 1, 1]     15       0
     [5, 0, 1]     60       1
     [1, 1, 0]     15       0
     [0, 5, 1]     35       0

Step 3:用每個 Encoder 的隱藏狀態乘以 softmax 之后的得分

通過將每個編碼器的隱藏狀態與其softmax之后的分數(標量)相乘,我們得到 對齊向量 或標注向量。這正是對齊產生的機制

得到對齊的向量.gif

加權求和之后可以得到新的一組與 Encoder 隱藏層狀態對應的新向量,由於之后第二個隱藏狀態的分值為 1 ,而其它的為0,所以得到的新向量也只有第二個向量有效。

 encoder score score^ alignment
 ---------------------------------
 [0, 1, 1]   15     0   [0, 0, 0]
 [5, 0, 1]   60     1   [5, 0, 1]
 [1, 1, 0]   15     0   [0, 0, 0]
 [0, 5, 1]   35     0   [0, 0, 0]

Step 4:將所有對齊的向量進行累加

對對齊向量進行求和,生成 上下文向量 。上下文向量是前一步的對齊向量的聚合信息。

向量累加.gif

該步驟其實就對應了公式(6),得到最終的編碼后的向量來作為 Decoder 的輸入,其編碼后的向量為 [5, 0, 1]

Step 5:把上下文向量送到 Decoder 中

通過將上下文向量和 Decoder 的上一個隱藏狀態一起送入當前的隱藏狀態,從而得到解碼后的輸出。

解碼.gif

最終得到完整的注意力層結構如下圖所示:

uploading-image-281648.png

Attention 機制的優劣

相比於傳統的 RNN 和 CNN,attention 機制具有如下優點:

  • 一步到位的全局聯系捕捉,且關注了元素的局部聯系;attention 函數在計算 attention value 時,是進行序列的每一個元素和其它元素的對比,在這個過程中每一個元素間的距離都是一;而在時間序列 RNNs 中,元素的值是通過一步步遞推得到的長期依賴關系獲取的,而越長的序列捕捉長期依賴關系的能力就會越弱。

  • 並行計算減少模型訓練時間;Attention 機制每一步的計算都不依賴於上一步的計算結果,因此可以並行處理。

  • 模型復雜度小,參數少

但 attention 機制的缺點也比較明顯,因為是對序列的所有元素並行處理的,所以無法考慮輸入序列的元素順序,這在自然語言處理任務中比較糟糕。因為在自然語言中,語言的順序是包含了十分多的信息的,如果缺失了該部分的信息,則得到的結果往往會大大折扣。

總結

簡而言之,Attention 機制就是對輸入的每個元素考慮不同的權重參數,從而更加關注與輸入的元素相似的部分,而抑制其它無用的信息。其最大的優勢就是能一步到位的考慮全局聯系和局部聯系,且能並行化計算,這在大數據的環境下尤為重要。同時,我們需要注意的是 Attention 機制作為一種思想,並不是只能依附在 Encoder-Decoder 框架下的,而是可以根據實際情況和多種模型進行結合。

該文僅是對 Attention 機制的思想和原理進行了分析,在具體的實現上還有許多的細節信息,包括和框架的結合方式,具體的數學計算,並行計算的過程以及具體的代碼實現等,后續會持續更新 Attention 機制這些部分的內容。

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM