注意力機制模仿了生物觀察行爲的內部過程,即一種將內部經驗和外部感受對齊從而增長部分區域的觀察精細度的機制。例如人的視覺在處理一張圖片時,會經過快速掃描全局圖像,得到須要重點關注的目標區域,也就是注意力焦點。而後對這一區域投入更多的注意力資源,以得到更多所須要關注的目標的細節信息,並抑制其它無用信息。數組
圖片來源:深度學習中的注意力機制,其中紅色區域表示更關注的區域。網絡
目前大多數的注意力模型都是依附在 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}\]ui
在 編碼階段,得到各個時刻的隱藏層狀態後,經過把這些隱藏層的狀態進行彙總,能夠生成最後的語義編碼向量 \(C\) ,如公式(2)所示,其中 \(q\) 表示某種非線性神經網絡,此處表示多層 RNN 。編碼
\[C=q(h_1,h_2,\cdots,h_{T_x})\tag{2}\]spa
在一些應用中,也能夠直接將最後的隱藏層編碼狀態做爲最終的語義編碼 \(C\),即知足:.net
\[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 在解碼時一開始就沒法得到輸入序列最夠多的信息,所以致使解碼的精確度不夠準確。
在上述的模型中,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 value,即機器翻譯中的語義編碼 \(C_i\)。在上一節中咱們知道該值是經過輸入元素按照不一樣的權重參數組合而成的,因此咱們能夠將其定義爲一個 attention 函數,比較主流的 attention 函數的機制是採用鍵值對查詢的方式,其工做實質以下圖所示:
經過工做示意圖咱們能夠知道,一個 attention value 的得到須要通過三個階段:
SoftMax()
進行歸一化;在天然語言任務中,每每 Key 和 Value 是相同的。須要注意的是,計算出來的 attention value 是一個向量,表明序列元素 \(x_j\) 的編碼向量,包含了元素 \(x_j\) 的上下文關係,即同時包含全局聯繫和局部聯繫。全局聯繫很好理解,由於在計算時考慮了該元素與其餘全部元素的類似度計算;而局部聯繫則是由於在對元素 \(x_j\) 進行編碼時,重點考慮與其類似度較高的局部元素,尤爲是其自己。
相比於傳統的 RNN 和 CNN,attention 機制具備以下優勢:
一步到位的全局聯繫捕捉,且關注了元素的局部聯繫;attention 函數在計算 attention value 時,是進行序列的每個元素和其它元素的對比,在這個過程當中每個元素間的距離都是一;而在時間序列 RNNs 中,元素的值是經過一步步遞推獲得的長期依賴關係獲取的,而越長的序列捕捉長期依賴關係的能力就會越弱。
並行計算減小模型訓練時間;Attention 機制每一步的計算都不依賴於上一步的計算結果,所以能夠並行處理。
模型複雜度小,參數少
但 attention 機制的缺點也比較明顯,由於是對序列的全部元素並行處理的,因此沒法考慮輸入序列的元素順序,這在天然語言處理任務中比較糟糕。由於在天然語言中,語言的順序是包含了十分多的信息的,若是缺失了該部分的信息,則獲得的結果每每會大大折扣。
簡而言之,Attention 機制就是對輸入的每一個元素考慮不一樣的權重參數,從而更加關注與輸入的元素類似的部分,而抑制其它無用的信息。其最大的優點就是能一步到位的考慮全局聯繫和局部聯繫,且能並行化計算,這在大數據的環境下尤其重要。同時,咱們須要注意的是 Attention 機制做爲一種思想,並非只能依附在 Encoder-Decoder 框架下的,而是能夠根據實際狀況和多種模型進行結合。
該文僅是對 Attention 機制的思想和原理進行了分析,在具體的實現上還有許多的細節信息,包括和框架的結合方式,具體的數學計算,並行計算的過程以及具體的代碼實現等,後續會持續更新 Attention 機制這些部分的內容。