iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
AI & Data

當自然語言處理遇上深度學習系列 第 22

[神經機器翻譯理論與實作] 你只需要專注力(I): Attention Mechanism

前言

Google 翻譯團隊在2016年發表了重要文章《Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation》,其中提出了深層 LSTM 翻譯器網絡 GNMT 。其由多層的 LSTM 建構編碼器及解碼器所構成,並在加入了注意力機制( attention mechanism ),大幅提升了長句翻譯的效率。

2016年提出的GNMT翻譯器架構加入了注意力機制:
https://ithelp.ithome.com.tw/upload/images/20211001/20140744utRBnyM6rf.jpg

NMT is often accompanied by an attention mechanism which helps it cope effectively with long input sequences.

文字出處:GNMT (2016)

圖片來源:Make a Meme.org

到底要專注什麼呢?

Seq2seq 模型先經由編碼器來吃進所有輸入的詞向量( word embedding ),內部狀態(例如 RNNhidden stateLSTMhidden statecell state )的遞嬗,暫時存在單一個 context vector 裡,再傳入解碼器之間依照時間序吐出目標詞向量,完成目標文句的預測。

傳統encoder-decoder的翻譯過程:

圖片來源:jalammar.github.io

雖然 LSTM 增加了內部狀態 cell state 來保存長期記憶,彌補了傳統 RNN 長距離依賴的問題(白話來說 RNN 很健忘),傳統基於 LSTM 架構的 seq2seq 模型依舊難以克服序列化計算所帶來的低效率。改善方法就是在解碼器生成新的詞向量之前,由上帝視角來「注意」編碼器當中所有時間點的內部狀態,這便是注意力機制!

https://ithelp.ithome.com.tw/upload/images/20210930/20140744JFEOc3z3of.jpg

如何保持專注力?

在生成當下時間點的詞向量https://chart.googleapis.com/chart?cht=tx&chl=y_t之前,我們有以下幾個步驟要做:

  1. 站在當下的內部狀態https://chart.googleapis.com/chart?cht=tx&chl=h_t 回望編碼器各個時間點的內部狀態https://chart.googleapis.com/chart?cht=tx&chl=s_1%2C%20s_2%2C%20%5Ccdots%2C%20s_T
    https://ithelp.ithome.com.tw/upload/images/20210930/20140744dARQhVqtqW.jpg
  2. 評估兩兩內部狀態之間的關聯性分數 https://chart.googleapis.com/chart?cht=tx&chl=score(h_t%2C%20s_i)%2C%20%5Cquad%20%5Cforall%20i%20%3D%201%2C%202%2C%20%5Ccdots%2C%20T%20,這是為了衡量目標單詞與各個輸入單詞之間的關聯性
    https://ithelp.ithome.com.tw/upload/images/20210930/20140744UMJI1WcsRI.jpg
  3. 根據關聯性分數計算出目標單詞在所有輸入單詞之中的注意力權重:
    https://ithelp.ithome.com.tw/upload/images/20210930/20140744P8ZkJvbBmi.jpg
  4. 產生當下時間點的 context vector https://chart.googleapis.com/chart?cht=tx&chl=c%5E%7B(t)%7D
    https://ithelp.ithome.com.tw/upload/images/20210930/20140744k3nIDv0f7U.jpg
  5. https://chart.googleapis.com/chart?cht=tx&chl=c%5E%7B(t)%7D與內部狀態https://chart.googleapis.com/chart?cht=tx&chl=h_t 輸出神經元,輸出當下的詞向量(以 Luong Model 為例):
    https://ithelp.ithome.com.tw/upload/images/20211001/201407449fMxwazTvL.jpg
    (以上步驟圖片來源:Sequence to Sequence (seq2seq) and Attention

經過了所有時間點之後,我們在編碼器與解碼器之間架起了多個 context vectors ,實現平行化計算( parallelism ),較傳統的 seq2seq 翻譯速度更快。
https://ithelp.ithome.com.tw/upload/images/20210930/20140744DjjiECgvoX.jpg

圖片來源:medium.com

計算關聯性分數

在上述的四個步驟中,我們如何求出關聯性分數呢?
https://ithelp.ithome.com.tw/upload/images/20210930/20140744vJBBBdT9zy.jpg

最常採用的三個計算方式有:

  1. 點積法( dot-product approach ):
    點積便是我們在中學幾何學中的標準向量內積,這是最簡單的方法,其計算方式如下圖
  2. 雙線性法( bilinear approach ):
    又稱為 Luong attention ,計算權重方陣的雙線性形式( bilinear form ),其計算方式如下圖
  3. 多層感知器法( multi-layer perceptron ):
    又稱為 Bahdanau attention ,將內部狀態並列起來,配上權重後輸入激活函數,再求出加權平均,其計算方式如下圖
    https://ithelp.ithome.com.tw/upload/images/20210930/20140744UmEIHFMw64.jpg

我們可以將每個輸入單詞序列與目標單詞序列之間的關聯性分數以矩陣來呈現(輸入與輸出文句的長度通常並不一,因此並非方陣),其表示了各個輸入單詞與目標單詞之間的關聯性:

https://ithelp.ithome.com.tw/upload/images/20210930/20140744giXRYQgGwz.jpg

圖片來源:Neural Machine Translation by Jointly Learning to Align and Translate (2016)

結語

附帶注意力機制的 seq2seq 模型能夠實現 encoderdecoder 之間的平行計算,以提升神經機器翻譯的文字生成效率。最重要的是,注意力機制允許編碼器中尚未傳遞完成的內部狀態也輸入解碼器,藉由比較當下輸出與各輸入單詞之間的相關性,能避免逐字翻譯的窘境,增加了翻譯的準確度。在2017年 Google 又在各層 LSTM 神經元之間加入了審視各層內部狀態與下一層其他內部狀態之間的注意力機制,被稱之為自注意力機制( self-attention mechanism ),與今天所介紹的 encoder-decoder attention 相對。這種機制藉由找出文中與某單詞最高度相關的其他單詞,更加提升了語意的判讀。今天的理論就介紹到這邊,明天將進行在翻譯器神經網絡之間加入注意力的實作。期待與各位明天再會,晚安!

閱讀更多

  1. Sequence to Sequence (seq2seq) and Attention
  2. Luong Attention: Effective Approaches to Attention-based Neural Machine Translation
  3. Bahdanau Attention: Neural Machine Translation by Jointly Learning to Align and Translate

上一篇
[神經機器翻譯理論與實作] Google Translate的神奇武器- Seq2Seq (III)
下一篇
[神經機器翻譯理論與實作] 你只需要專注力(II): 建立更專注的seq2seq模型
系列文
當自然語言處理遇上深度學習33

尚未有邦友留言

立即登入留言