Seq2Seq 是一種循環神經網絡的變種,包括編碼器 (Encoder) 和解碼器 (
Decoder) 兩部分。Seq2Seq 是自然語言處理中的一種重要模型,可以用於機器翻譯、對話系統、自動文摘。1. RNN 結構及使用
在之前的文章 中介紹了 RNN 模型,RNN 基本的模型如上圖所示,每個神經元接受的輸入包括:前一個神經元的隱藏層狀態 h (用於記憶) 和當前的輸入 x (當前信息)。神經元得到輸入之後,會計算出新的隱藏狀態 h 和輸出 y,然後再傳遞到下一個神經元。因為隱藏狀態 h 的存在,使得 RNN 具有一定的記憶功能。
針對不同任務,通常要對 RNN 模型結構進行少量的調整,根據輸入和輸出的數量,分為三種比較常見的結構:N vs N、1 vs N、N vs 1。
1.1 N vs N
上圖是RNN 模型的一種 N vs N 結構,包含 N 個輸入 x1, x2, ..., xN,和 N 個輸出 y1, y2, ..., yN。N vs N 的結構中,輸入和輸出序列的長度是相等的,通常適合用於以下任務:
- 詞性標註
- 訓練語言模型,使用之前的詞預測下一個詞等
1.2 1 vs N
在 1 vs N 結構中,我們只有一個輸入 x,和 N 個輸出 y1, y2, ..., yN。可以有兩種方式使用 1 vs N,第一種只將輸入 x 傳入第一個 RNN 神經元,第二種是將輸入
x 傳入所有的 RNN 神經元。1 vs N 結構適合用於以下任務:- 圖像生成文字,輸入 x 就是一張圖片,輸出就是一段圖片的描述文字
- 根據音樂類別,生成對應的音樂
- 根據小說類別,生成相應的小說
1.3 N vs 1
在 N vs 1 結構中,我們有 N 個輸入 x1, x2, ..., xN,和一個輸出 y。N vs 1 結構適合用於以下任務:
- 序列分類任務,一段語音、一段文字的類別,句子的情感分析
2. Seq2Seq 模型
2.1 Seq2Seq 結構
上面的三種結構對於 RNN 的輸入和輸出個數都有一定的限制,但實際中很多任務的序列的長度是不固定的,例如機器翻譯中,源語言、目標語言的句子長度不一樣;對話系統中,問句和答案的句子長度不一樣。
Seq2Seq 是一種重要的 RNN 模型,也稱為 Encoder-Decoder 模型,可以理解為一種 N×M 的模型。模型包含兩個部分:Encoder 用於編碼序列的信息,將任意長度的序列信息編碼到一個向量
c 裡。而 Decoder 是解碼器,解碼器得到上下文信息向量 c 之後可以將信息解碼,並輸出為序列。Seq2Seq 模型結構有很多種,下面是幾種比較常見的:2.2 編碼器 Encoder
這三種 Seq2Seq 模型的主要區別在於 Decoder,他們的 Encoder 都是一樣的。下圖是 Encoder 部分,Encoder 的 RNN 接受輸入 x,最終輸出一個編碼所有信息的上下文向量 c,中間的神經元沒有輸出。Decoder 主要傳入的是上下文向量
c,然後解碼出需要的信息。從上圖可以看到,Encoder 與一般的 RNN 區別不大,只是中間神經元沒有輸出。其中的上下文向量 c 可以採用多種方式進行計算。
從公式可以看到,c 可以直接使用最後一個神經元的隱藏狀態 hN 表示;也可以在最後一個神經元的隱藏狀態上進行某種變換 hN 而得到,q 函數表示某種變換;也可以使用所有神經元的隱藏狀態 h1, h2, ..., hN 計算得到。得到上下文向量 c 之後,需要傳遞到 Decoder。
2.3 解碼器 Decoder
Decoder 有多種不同的結構,這裡主要介紹三種。
第一種
第一種 Decoder 結構比較簡單,將上下文向量 c 當成是 RNN 的初始隱藏狀態,輸入到 RNN 中,後續只接受上一個神經元的隱藏層狀態 h' 而不接收其他的輸入 x。第一種 Decoder 結構的隱藏層及輸出的計算公式:
第二種
第二種 Decoder 結構有了自己的初始隱藏層狀態 h'0,不再把上下文向量 c 當成是 RNN 的初始隱藏狀態,而是當成 RNN 每一個神經元的輸入。可以看到在 Decoder 的每一個神經元都擁有相同的輸入 c,這種 Decoder 的隱藏層及輸出計算公式:
第三種
第三種 Decoder 結構和第二種類似,但是在輸入的部分多了上一個神經元的輸出 y'。即每一個神經元的輸入包括:上一個神經元的隱藏層向量 h',上一個神經元的輸出 y',當前的輸入 c (Encoder 編碼的上下文向量)。對於第一個神經元的輸入 y'0,通常是句子其實標誌位的 embedding 向量。第三種 Decoder 的隱藏層及輸出計算公式:
3. Seq2Seq模型使用技巧
3.1 Teacher Forcing
Teacher Forcing 用於訓練階段,主要針對上面第三種 Decoder 模型來說的,第三種 Decoder 模型神經元的輸入包括了上一個神經元的輸出 y'。如果上一個神經元的輸出是錯誤的,則下一個神經元的輸出也很容易錯誤,導致錯誤會一直傳遞下去。
而 Teacher Forcing 可以在一定程度上緩解上面的問題,在訓練 Seq2Seq 模型時,Decoder 的每一個神經元並非一定使用上一個神經元的輸出,而是有一定的比例採用正確的序列作為輸入。
舉例說明,在翻譯任務中,給定英文句子翻譯為中文。"I have a cat" 翻譯成 "我有一隻貓",如果不使用 Teacher Forcing:
如果使用 Teacher Forcing,則神經元直接使用正確的輸出作為當前神經元的輸入。
3.2 Attention
在 Seq2Seq 模型,Encoder 總是將源句子的所有信息編碼到一個固定長度的上下文向量 c 中,然後在 Decoder 解碼的過程中向量
c 都是不變的。這存在著不少缺陷:- 對於比較長的句子,很難用一個定長的向量 c 完全表示其意義。
- RNN 存在長序列梯度消失的問題,只使用最後一個神經元得到的向量 c 效果不理想。
- 與人類的注意力方式不同,即人類在閱讀文章的時候,會把注意力放在當前的句子上。
Attention 即注意力機制,是一種將模型的注意力放在當前翻譯單詞上的一種機制。例如翻譯 "I have a cat",翻譯到 "我" 時,要將注意力放在源句子的 "I" 上,翻譯到 "貓" 時要將注意力放在源句子的 "cat" 上。
使用了 Attention 後,Decoder 的輸入就不是固定的上下文向量 c 了,而是會根據當前翻譯的信息,計算當前的 c。
Attention 需要保留 Encoder 每一個神經元的隱藏層向量 h,然後 Decoder 的第 t 個神經元要根據上一個神經元的隱藏層向量 h't-1 計算出當前狀態與 Encoder 每一個神經元的相關性 et。et 是一個 N 維的向量 (Encoder 神經元個數為 N),若 et 的第 i 維越大,則說明當前節點與 Encoder 第 i 個神經元的相關性越大。et 的計算方法有很多種,即相關性係數的計算函數 a 有很多種:
上面得到相關性向量 et 後,需要進行歸一化,使用 softmax 歸一化。然後用歸一化後的係數融合 Encoder 的多個隱藏層向量得到 Decoder 當前神經元的上下文向量 ct:
3.3 beam search
beam search 方法不用於訓練的過程,而是用在測試的。在每一個神經元中,我們都選取當前輸出概率值最大的 top k 個輸出傳遞到下一個神經元。下一個神經元分別用這 k 個輸出,計算出 L 個單詞的概率 (L 為詞彙表大小),然後在 kL 個結果中得到 top k 個最大的輸出,重複這一步驟。
4. Seq2Seq 總結
Seq2Seq 模型允許我們使用長度不同的輸入和輸出序列,適用範圍相當廣,可用於機器翻譯,對話系統,閱讀理解等場景。
Seq2Seq 模型使用時可以利用 Teacher Forceing,Attention,beam search 等方法優化。
參考文獻
博客園:RNN神經網絡模型的不同結構
知乎:Tensorflow中的Seq2Seq全家桶
知乎:Attention機制詳解(一)——Seq2Seq中的Attention
閱讀更多 NLP與人工智能 的文章