淺談 Attention 機制的理解
什麼是注意力機制?
注意力機制模仿了生物觀察行為的內部過程,即一種將內部經驗和外部感覺對齊從而增加部分割槽域的觀察精細度的機制。例如人的視覺在處理一張圖片時,會通過快速掃描全域性影象,獲得需要重點關注的目標區域,也就是注意力焦點。然後對這一區域投入更多的注意力資源,以獲得更多所需要關注的目標的細節資訊,並抑制其它無用資訊。
圖片來源:深度學習中的注意力機制,其中紅色區域表示更關注的區域。
Encoder-Decoder 框架
目前大多數的注意力模型都是依附在 Encoder-Decoder 框架下,但並不是只能運用在該模型中,注意力機制作為一種思想可以和多種模型進行結合,其本身不依賴於任何一種框架。Encoder-Decoder 框架是深度學習中非常常見的一個模型框架,例如在 Image Caption 的應用中 Encoder-Decoder 就是 CNN-RNN 的編碼 - 解碼框架;在神經網路機器翻譯中 Encoder-Decoder 往往就是 LSTM-LSTM 的編碼 - 解碼框架,在機器翻譯中也被叫做 Sequence to Sequence learning 。
所謂編碼,就是將輸入的序列編碼成一個固定長度的向量;解碼,就是將之前生成的固定向量再解碼成輸出序列。這裡的輸入序列和輸出序列正是機器翻譯的結果和輸出。
為了說明 Attention 機制的作用,以 Encoder-Decoder 框架下的機器翻譯的應用為例,該框架的抽象表示如下圖:
為了方便闡述,在選取 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
,目標的翻譯結果是:湯姆追逐傑瑞
。在未考慮注意力機制的模型當中,模型認為 湯姆
這個詞的翻譯受到 Tom
,chase
和 Jerry
這三個詞的同權重的影響。但是實際上顯然不應該是這樣處理的,湯姆
這個詞應該受到輸入的 Tom
這個詞的影響最大,而其它輸入的詞的影響則應該是非常小的。顯然,在未考慮注意力機制的 Encoder-Decoder 模型中,這種不同輸入的重要程度並沒有體現處理,一般稱這樣的模型為 ** 分心模型 **。
而帶有 Attention 機制的 Encoder-Decoder 模型則是要從序列中學習到每一個元素的重要程度,然後按重要程度將元素合併。這就表明,在 Encoder 將輸入的序列元素進行編碼時,得到的不在是一個固定的語義編碼 C ,而是存在多個語義編碼,且不同的語義編碼由不同的序列元素以不同的權重引數組合而成。一個簡單地體現 Attention 機制執行的示意圖如下:
在 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\) 的編碼。
Attention 原理
到目前為止,相信各位客官對 Attention 機制的思想和作用都有了一定的瞭解。接下來,我們將對 Attention 機制的具體實現原理進行剖析。
Attention 機制的一個重點就是獲得 attention value,即機器翻譯中的語義編碼 \(C_i\)。在上一節中我們知道該值是通過輸入元素按照不同的權重引數組合而成的,所以我們可以將其定義為一個 attention 函式,比較主流的 attention 函式的機制是採用鍵值對查詢的方式,其工作實質如下圖所示:
通過工作示意圖我們可以知道,一個 attention value 的獲得需要經過三個階段:
- 查詢 Query 和各個鍵值 Key 進行相似度計算得到權值;
- 對上述得到的權值利用類
SoftMax()
進行歸一化; - 用歸一化後的權值和各個 Value 進行加權求和,得到的值就是 attention value。
在自然語言任務中,往往 Key 和 Value 是相同的。需要注意的是,計算出來的 attention value 是一個向量,代表序列元素 \(x_j\) 的編碼向量,包含了元素 \(x_j\) 的上下文關係,即同時包含全域性聯絡和區域性聯絡。全域性聯絡很好理解,因為在計算時考慮了該元素與其他所有元素的相似度計算;而區域性聯絡則是因為在對元素 \(x_j\) 進行編碼時,重點考慮與其相似度較高的區域性元素,尤其是其本身。
Attention 機制的優劣
相比於傳統的 RNN 和 CNN,attention 機制具有如下優點:
一步到位的全域性聯絡捕捉,且關注了元素的區域性聯絡;attention 函式在計算 attention value 時,是進行序列的每一個元素和其它元素的對比,在這個過程中每一個元素間的距離都是一;而在時間序列 RNNs 中,元素的值是通過一步步遞推得到的長期依賴關係獲取的,而越長的序列捕捉長期依賴關係的能力就會越弱。
平行計算減少模型訓練時間;Attention 機制每一步的計算都不依賴於上一步的計算結果,因此可以並行處理。
模型複雜度小,引數少
但 attention 機制的缺點也比較明顯,因為是對序列的所有元素並行處理的,所以無法考慮輸入序列的元素順序,這在自然語言處理任務中比較糟糕。因為在自然語言中,語言的順序是包含了十分多的資訊的,如果缺失了該部分的資訊,則得到的結果往往會大大折扣。
總結
簡而言之,Attention 機制就是對輸入的每個元素考慮不同的權重引數,從而更加關注與輸入的元素相似的部分,而抑制其它無用的資訊。其最大的優勢就是能一步到位的考慮全域性聯絡和區域性聯絡,且能並行化計算,這在大資料的環境下尤為重要。同時,我們需要注意的是 Attention 機制作為一種思想,並不是只能依附在 Encoder-Decoder 框架下的,而是可以根據實際情況和多種模型進行結合。
該文僅是對 Attention 機制的思想和原理進行了分析,在具體的實現上還有許多的細節資訊,包括和框架的結合方式,具體的數學計算,平行計算的過程以及具體的程式碼實現等,後續會持續更新 Attention 機制這些部分的內容。
參考資料
- 深度學習中的注意力機制
- 淺談 Attention 機制的理解
- Attention 機制簡單總結
- 什麼是自注意力機制?