Attention機制的精要總結,附:中英文機器翻譯的實現!
1. 什麼是Attention機制
在“編碼器—解碼器(seq2seq)”⼀節⾥,解碼器在各個時間步依賴相同的背景變數來獲取輸⼊序列資訊。當編碼器為迴圈神經⽹絡時,背景變數來⾃它最終時間步的隱藏狀態。
現在,讓我們再次思考那⼀節提到的翻譯例⼦:輸⼊為英語序列“They”“are”“watching”“.”,輸出為法語序列“Ils”“regardent”“.”。不難想到,解碼器在⽣成輸出序列中的每⼀個詞時可能只需利⽤輸⼊序列某⼀部分的資訊。例如,在輸出序列的時間步1,解碼器可以主要依賴“They”“are”的資訊來⽣成“Ils”,在時間步2則主要使⽤來⾃“watching”的編碼資訊⽣成“regardent”,最後在時間步3則直接對映句號“.”。這看上去就像是在解碼器的每⼀時間步對輸⼊序列中不同時間步的表徵或編碼資訊分配不同的注意⼒⼀樣。這也是注意⼒機制的由來。
仍然以迴圈神經⽹絡為例,注意⼒機制通過對編碼器所有時間步的隱藏狀態做加權平均來得到背景變數。解碼器在每⼀時間步調整這些權重,即注意⼒權重,從而能夠在不同時間步分別關注輸⼊序列中的不同部分並編碼進相應時間步的背景變數。
在注意⼒機制中,解碼器的每⼀時間步將使⽤可變的背景變數。記 ct′ 是解碼器在時間步 t′ 的背景變數,那麼解碼器在該時間步的隱藏狀態可以改寫為:
\[s_{t^{′}}=g(y_{t^{′}-1},c_{t^{′}},s_{t^{′}-1})\]
這⾥的關鍵是如何計算背景變數 ct′ 和如何利⽤它來更新隱藏狀態 st′。下⾯將分別描述這兩個關鍵點。
2. 計算背景變數
我們先描述第⼀個關鍵點,即計算背景變數。下圖描繪了注意⼒機制如何為解碼器在時間步 2 計算背景變數。
- 函式 a 根據解碼器在時間步 1 的隱藏狀態和編碼器在各個時間步的隱藏狀態計算softmax運算的輸⼊。
- softmax運算輸出概率分佈並對編碼器各個時間步的隱藏狀態做加權平均,從而得到背景變數。
令編碼器在時間步t的隱藏狀態為 ht,且總時間步數為 T。那麼解碼器在時間步 t′ 的背景變數為所有編碼器隱藏狀態的加權平均:
\[c_{t^{′}}=\sum_{t=1}^{T}\alpha_{t^{′}t}h_t\]
向量化計算背景變數
我們還可以對注意⼒機制採⽤更⾼效的⽮量化計算。我們先定義,在上⾯的例⼦中,查詢項為解碼器的隱藏狀態,鍵項和值項均為編碼器的隱藏狀態。
⼴義上,注意⼒機制的輸⼊包括查詢項以及⼀⼀對應的鍵項和值項,其中值項是需要加權平均的⼀組項。在加權平均中,值項的權重來⾃查詢項以及與該值項對應的鍵項的計算。
讓我們考慮⼀個常⻅的簡單情形,即編碼器和解碼器的隱藏單元個數均為 h,且函式 \(a(s,h)=s^Th\)。假設我們希望根據解碼器單個隱藏狀態 st′−1 和編碼器所有隱藏狀態 ht, t = 1, . . . , T來計算背景向量 ct′ 。我們可以將查詢項矩陣 Q 設為 \(s_{t^{′}-1}^T\),並令鍵項矩陣 K 和值項矩陣 V 相同且第 t ⾏均為 \(h_t^T\)。此時,我們只需要通過⽮量化計算:
\[softmax(QK^T)V\]
即可算出轉置後的背景向量 \(c_{t^{′}}^T\)。當查詢項矩陣 Q 的⾏數為 n 時,上式將得到 n ⾏的輸出矩陣。輸出矩陣與查詢項矩陣在相同⾏上⼀⼀對應。
3. 更新隱藏狀態
現在我們描述第⼆個關鍵點,即更新隱藏狀態。以⻔控迴圈單元為例,在解碼器中我們可以對⻔控迴圈單元(GRU)中⻔控迴圈單元的設計稍作修改,從而變換上⼀時間步 t′−1 的輸出 yt′−1、隱藏狀態 st′−1 和當前時間步t′ 的含注意⼒機制的背景變數 ct′。解碼器在時間步: math:t’ 的隱藏狀態為:
\[s_{t^{′}}=z_{t^{′}}⊙s_{t^{′}-1}+(1-z_{t^{′}})⊙\tilde{s}_{t^{′}}\]
其中的重置⻔、更新⻔和候選隱藏狀態分別為:
\[r_{t^{′}}=\sigma(W_{yr}y_{t^{′}-1}+W_{sr}s_{t^{′}-1}+W_{cr}c_{t^{′}}+b_r)\]
\[z_{t^{′}}=\sigma(W_{yz}y_{t^{′}-1}+W_{sz}s_{t^{′}-1}+W_{cz}c_{t^{′}}+b_z)\]
\[\tilde{s}_{t^{′}}=tanh(W_{ys}y_{t^{′}-1}+W_{ss}(s_{t^{′}-1}⊙r_{t^{′}})+W_{cs}c_{t^{′}}+b_s)\]
其中含下標的 W 和 b 分別為⻔控迴圈單元的權重引數和偏差引數。
4. 發展
本質上,注意⼒機制能夠為表徵中較有價值的部分分配較多的計算資源。這個有趣的想法⾃提出後得到了快速發展,特別是啟發了依靠注意⼒機制來編碼輸⼊序列並解碼出輸出序列的變換器(Transformer)模型的設計。變換器拋棄了卷積神經⽹絡和迴圈神經⽹絡的架構。它在計算效率上⽐基於迴圈神經⽹絡的編碼器—解碼器模型通常更具明顯優勢。含注意⼒機制的變換器的編碼結構在後來的BERT預訓練模型中得以應⽤並令後者⼤放異彩:微調後的模型在多達11項⾃然語⾔處理任務中取得了當時最先進的結果。不久後,同樣是基於變換器設計的GPT-2模型於新收集的語料資料集預訓練後,在7個未參與訓練的語⾔模型資料集上均取得了當時最先進的結果。除了⾃然語⾔處理領域,注意⼒機制還被⼴泛⽤於影象分類、⾃動影象描述、脣語解讀以及語⾳識別。
5. 程式碼實現
注意力模型實現中英文機器翻譯
資料預處理
首先先下載本目錄的資料和程式碼,並執行 datautil.py,生成中、英文字典。
執行 train.ipynb,訓練時間會比較長。
測試模型,執行test.py檔案。
【機器學習通俗易懂系列文章】
6. 參考文獻
動手學深度學習
作者:@mantchs
GitHub:https://github.com/NLP-LOVE/ML-NLP
歡迎大家加入討論!共同完善此專案!群號:【541954936】