from : https://caicai.science/2018/10/06/attention%E6%80%BB%E8%A7%88/
一、Seq2Seq 模型
1. 簡介
Sequence-to-sequence (seq2seq) 模型,顧名思義,其輸入是一個序列,輸出也是一個序列,例如輸入是英文句子,輸出則是翻譯的中文。seq2seq 可以用在很多方面:機器翻譯、QA 系統、文檔摘要生成、Image Captioning (圖片描述生成器)。
2. 基本框架
第一種結構
[參考1]論文中提出的 seq2seq 模型可簡單理解為由三部分組成:Encoder、Decoder 和連接兩者的 State Vector (中間狀態向量) C 。
上圖中 Encoder 和 Decoder 可以是一個 RNN ,但通常是其變種 LSTM 或者 GRU 。Encoder 和 Decoder 具體介紹請見第三部分。
第二種結構
該結構是最簡單的結構,和第一種結構相似,只是 Decoder 的第一個時刻只用到了 Encoder 最后輸出的中間狀態變量 :
應用:
-
在英文翻譯中,將英文輸入到 Encoder 中,Decoder 輸出中文。
-
在圖像標注中,將圖像特征輸入到 Encoder 中,Decoder 輸出一段文字對圖像的描述。
參考2:-原創翻譯- 圖像標注生成器 (Show and Tell: A Neural Image Caption Generator)
-
在 QA 系統中,將提出的問題輸入 Encoder 中,Decoder 輸出對於問題的回答。
……
注:確保你對所有模型都有所了解后再閱讀應用后面的參考鏈接。
二、RNN 結構
1. 為什么在這里提及 RNN 及 RNN 變種?
接下來要介紹的 Encoder-Decoder 模型中,Encoder 和 Decoder 兩部分的輸入輸出可以是文字、圖像、語音等等,所以 Encoder 和 Decoder 一般采用 CNN 、RNN 、LSTM 、GRU 等等。這里,我們只介紹經典 RNN 的結構。
如果對 LSTM 感興趣的話,請參考 -原創翻譯- 詳解 LSTM(Understanding LSTM Networks)
2. 圖解 RNN 結構
RNN 大都用來處理像一串句子、一段語音這種的序列化數據。展開的 RNN 結構圖如下:
由圖可見,其當前時間 t 的輸出依賴兩部分:前一時刻的隱層 $h_{t-1}$ 和當前的輸入 $x_{t}$ 。
下面主要介紹經典的三種 RNN 結構:
(1) n VS 1
注:圓圈代表給定的輸入,箭頭代表運算,矩形代表隱層,也就是箭頭運算后的結果。其中參數 $W、U、V$ 都是一樣的。在自然語言處理問題。$x_{1}$ 可以看做是第一個單詞,$x_{2}$ 可以看做是第二個單詞…
這種結構可應用於情感分析、文本分類等等。
(2) 1 VS n
下圖是把輸入當作每個時刻的輸入:
這種結構可應用於應用於 Image Caption ,輸入是圖像的特征矩陣,輸出是一段對圖像的描述。
(3) n VS n
這種結構可應用於機器翻譯等。如果感興趣,可以參考下面的 文章。作者使用 RNN 實現了根據一個字母推測下一個字母的概率。
參考3:-原創翻譯- RNNs的“神奇功效”(The Unreasonable Effectiveness of Recurrent Neural Networks)
(4) n VS m
在機器翻譯中,源語言和目標語言的句子序列都是不等長的,而原始的 n VS n 結構都是要求序列等長的。為此,我們有了 n VS m 結構,這種結構又被稱為 Encoder-Decoder模型 。具體請見下一部分。
三、Encoder-Decoder 模型
1. 簡介
在第二節的第四部分,我們提出了 RNN 的 n VS m 結構:Encoder-Decoder 模型,Encoder-Decoder 模型是深度學習中常見的一種模型。在本文中,我們只簡單介紹其在文本-文本的應用,比如將英語翻譯成漢語,所以該模型也可以稱為 Seq2Seq 模型 。下圖為 Encoder-Decoder 模型的抽象圖:
2. 分析
1) Encoder
給定句子對 <X,Y> ,我們的目標是給定輸入句子 X ,通過Encoder-Decoder 模型來翻譯成目標句子 Y 。而 X 和 Y 分別由各自的單詞序列構成:
首先,Encoder 對輸入語句 X 進行編碼,經過函數變換為中間語義向量 C (可以通過多種方式得到) :
2) Decoder
得到中間語義向量 C 后,使用 Decoder 進行解碼。Decoder根據中間狀態向量 C 和已經生成的歷史信息 y1,y2…yi-1 去生成 t 時刻的單詞 yi :
如果直接將 c 輸入到 Decoder 中,則是 Seq2Seq 模型的第二種模型:
如果將 c 當作 Decoder 的每一時刻輸入,則是 Seq2Seq 模型的第一種模型:
- 中英翻譯中, <X,Y> 是不同語言的句子,X 是英文句子,Y 是中文句子。
- QA 系統中,X 是問題,Y 是回答。
-
……
Encoder-Decoder 模型是使用非常廣泛的深度學習模型框架,與其說 Encoder-Decoder 是一種模型,不如稱其為一種通用框架。因為 Encoder 和 Decoder 具體使用什么模型是根據任務而定義的。在自然語言處理研究中通常使用 LSTM 或者是 GRU 。
四、Attention 模型
1. Encoder-Decoder 模型的局限性
(1) 從第三節的第一部分的 Encoder-Decoder 模型的抽象圖中可以看出 Encoder 和 Decoder 的唯一聯系只有語義編碼 C ,即將整個輸入序列的信息編碼成一個固定大小的狀態向量再解碼,相當於將信息”有損壓縮”。很明顯這樣做有兩個缺點:
- 中間語義向量無法完全表達整個輸入序列的信息。
- 隨着輸入信息長度的增加,由於向量長度固定,先前編碼好的信息會被后來的信息覆蓋,丟失很多信息。
(2)大家看第三節的第二部分的第二個 Decoder 過程,其輸出的產生如下:
$y_{1}=g(C, h’_{0})$
$y_{2}=g(C, y_{1})$
$y_{3}=g(C, y_{1}, y_{2})$
明顯可以發現在生成 $y_{1}、y_{2}、y_{3}$ 時,語義編碼 C 對它們所產生的貢獻都是一樣的。例如翻譯:Cat chase mouse ,Encoder-Decoder 模型逐字生成:“貓”、“捉”、“老鼠”。在翻譯 mouse 單詞時,每一個英語單詞對“老鼠”的貢獻都是相同的。如果引入了Attention 模型,那么 mouse 對於它的影響應該是最大的。
2. 圖解 Attention
為了解決上面兩個問題,於是引入了 Attention 模型。Attention 模型的特點是 Decoder 不再將整個輸入序列編碼為固定長度的中間語義向量 C ,而是根據當前生成的新單詞計算新的 $C_{i}$ ,使得每個時刻輸入不同的 C,這樣就解決了單詞信息丟失的問題。引入了 Attention 的 Encoder-Decoder 模型如下圖:
對於剛才提到的那個“貓捉老鼠”的翻譯過程變成了如下:
$y_{1}=g(C_{1}, h’_{0})$
$y_{2}=g(C_{2}, y_{1})$
$y_{3}=g(C_{3}, y_{1}, y_{2})$
整個翻譯流程如下:
圖中輸入是 Cat chase mouse ,Encoder 中隱層 h1、h2、h3 可看作經過計算 Cat、chase、mouse 這些詞的信息。
使用 $a_{ij}$ 表示 Encoder 中第 j 階段的 $h_{j}$ 和解碼時第 i 階段的相關性,計算出解碼需要的中間語義向量 $C_{i}$ 。$C_{1}$ 和 “貓” 關系最近,相對應的 $a_{11}$ 要比 $a_{12}$ 、$a_{13}$ 大;而 $C_{2}$ 和 “捉” 關系最近,相對應的 $a_{22}$ 要比 $a_{21}$ 、$a_{23}$ 大;同理 $C_{3}$ 和 “老鼠” 關系最近,相對應的 $a_{33}$ 要比 $a_{31}$ 、$a_{32}$ 大。
那么參數 $a_{ij}$ 是如何得到呢?
Encoder 中第 j 個隱層單元 $h_{j}$ 和 Decoder 第 i-1 個隱層單元 $h’{i-1}$ 經過運算得到 $a{ij}$ 。
例如 $a_{1j}$ 的計算過程:
$a_{2j}$ 的計算過程: