Seq2Seq詳解

David_Hernandez發表於2020-10-14

10. Seq2Seq

10.1 Baseline Seq2Seq 架構

10.1.1 技術架構

10.1.1.1 第一步:Tokenization & Build Dictionary

10.1.1.2 第二步:Word Emebedding

這裡以 One-hot Encoding 為例。分別對兩種語言進行 Encoding。

在這裡插入圖片描述

在這裡插入圖片描述

每個詞彙對應一個列向量。輸入的句子變成一個矩陣。

在這裡插入圖片描述

10.1.1.3 第三步:Training Seq2Seq Model

Encoder 部分只保留最後一個 State。

在這裡插入圖片描述

將這個 State 作為 Decoder 的第一個輸入。Decoder 第一個輸入還有 開始標記 [start]。之後 Decoder 會預測出一個概率分佈 p。

在這裡插入圖片描述

[start] 標記的下一個字元 m 被當成 Label y。使用 CrossEntropy 最小化 loss。並使用反向傳播更新 Decoder 和 Encoder 的網路引數。

在這裡插入圖片描述

Decoder 的下一個輸入是 \t和m. 此時,Label y 是 a.

在這裡插入圖片描述

Decoder 的第三次輸入是 \t、m、a. Label y 是 c.

在這裡插入圖片描述

重複這個過程,當整個德語句子輸入完時,Label y 是 停止標記 [stop]。

在這裡插入圖片描述

10.1.1.4 第四步:Inference Using the Seq2Seq Model

輸入要翻譯句子的 Matrix. 保留最後一個輸出 State。

在這裡插入圖片描述

Encoder 的最後一個輸出 State 和 [start] 標記被傳入到 Decoder 中。

在這裡插入圖片描述

記錄 Decoder 的輸出 State( h 1 h_1 h1, c 1 c_1 c1) 和 m. 並將她們當作是 Decoder 的下一次輸入。

在這裡插入圖片描述

在這裡插入圖片描述

記錄 Decoder 第二次的輸出 State(h_2$, c 2 c_2 c2) 和 a.

在這裡插入圖片描述

注意, Decoder 第三次的輸入 不是 ma,而是 a。這和訓練時不一樣。 同樣,作為輸入的還有上一步輸出的 State ( h 2 h_2 h2, c 2 c_2 c2)。

在這裡插入圖片描述

同理,Decoder 的每一次輸入都是上一步的輸出,而不是當前Decoder的所有輸出 y ^ \hat y y^

在這裡插入圖片描述

重複這個過程,直到最終輸出 [stop] 標記。

在這裡插入圖片描述

返回 Decoder的所有輸出 y ^ \hat y y^。即:mach ne fliege。

在這裡插入圖片描述

在這裡插入圖片描述

10.1.2 模型優缺點

在這裡插入圖片描述

在機器翻譯任務中,使用 Seq2Seq 模型,BLEU 指標隨句子長度增長逐漸降低。

在這裡插入圖片描述

在這裡插入圖片描述

10.1.3 優化

10.1.3.1 Encoder 變成 雙向

Use Bi-LSTM in the encoder; use unidirectional LSTM in the decoder.

在這裡插入圖片描述

10.1.3.2 Word-level 詞向量

在這裡插入圖片描述

10.1.3.3 多工學習

在這裡插入圖片描述

10.1.3.4 Attention(最有效)

Attention 機制優化。下一節詳細講解。

10.2 Seq2Seq + Attention

在這裡插入圖片描述

10.2.1 技術架構

這裡為了方便理解,使用了 SimpleRNN,而不是上面的LSTM。重點在於理解這個過程。觸類旁通。

10.2.1.1 第一步:得到 Encoder 的最後一個輸出

Decoder 的第一步中, s 0 s_0 s0 就是 Encoder 的最後一個輸出 h m h_m hm

在這裡插入圖片描述

10.2.1.2 第二步:計算權重 α i \alpha_i αi

使用 Attention 機制計算 s 0 s_0 s0 與 Encoder 中每一步產生的 h i h_i hi 計算得到c權重 α i \alpha_i αi. 所有 α \alpha α 加和 等於 1.

在這裡插入圖片描述

10.2.1.2.1 Attention 計算方法一:Bahdanau Attention

計算權重 α i \alpha_i αi 的方法有很多。常用的有兩種。第一種是cBahdanau,也就是 Attention 開山鼻祖論文中的方法:

在這裡插入圖片描述

10.2.1.2.2 Attention 計算方法二:Transformer Attention

第二種方法分別使用了兩個矩陣。和 Transformer 中一樣。

在這裡插入圖片描述

10.2.1.3 第三步:計算 Context Vector: c c c

在上一小節中,我們講了兩種計算 Attention 的方法,這裡我們不討論如何得到 α i \alpha_i αi 的細節。無論選擇哪一種,都會得到 α i \alpha_i αi。我們假設現在已經得到了 α i \alpha_i αi

注意:這裡我們遮蔽了計算 α i \alpha_i αi 的細節,本節僅給大家展示 SimpleRNN 與 Attention 如何結合的。在 Transformer 章節中,我們會將計算 α i \alpha_i αi 的過程引入進來。在本節中引入,大家可能很難理解。本章節先整體理解,後續章節再細節理解。

α i \alpha_i αi h i h_i hi 對應相乘,得到 c 0 c_0 c0

在這裡插入圖片描述

s 0 s_0 s0, c 0 c_0 c0, x 1 ′ x_1^{\prime} x1 傳入 decoder 得到 輸出 s 1 s_1 s1

在這裡插入圖片描述

同樣, s 1 s_1 s1 與 Encoder 中的每個 h h h 計算得到 α i \alpha_i αi。注意,這裡的 α i \alpha_i αi s 0 s_0 s0 時計算的不是一個 α \alpha α不可以複用權重 α \alpha α。對於每一個新的 s i s_i si,都需要重新計算一遍 α \alpha α。最後得到 c 2 c_2 c2.

在這裡插入圖片描述

s 1 s_1 s1, c 1 c_1 c1, x 2 ′ x_2^{\prime} x2 傳入 decoder 得到 輸出 s 2 s_2 s2

在這裡插入圖片描述

重複上面的過程。

10.2.1.4 時間複雜度

在這裡插入圖片描述

10.2.1.5 Weights Visualization

在這裡插入圖片描述

10.2.1.6 Summary

在這裡插入圖片描述

在這裡插入圖片描述

上圖中,五個 encoder 單元都會輸出 encoder_outputs,所以上面 encoder_outputs 其實有五條線。為了美觀,只畫了一條線。

  1. Encoder 產出:encoder outputs 和 hidden state;
  2. hidden_state 和 encoder_outputs 計算得到 attention weights;
  3. attention weights 和 encoder outputs 加權求和 得到 context_vector;
  4. context_vector 和 下一個 input 一起輸入給 decoder,計算得到一個輸出 和一個 hidden_state。這個輸出會當做下一次 decoder 計算的輸入。第一個輸入是 NULL 標記。這些輸出就是 final_input。

具體計算過程:

在這裡插入圖片描述

注意:score 計算時,H 是某一步的,而EO是encoder的多步的,大家可能會有一個疑問,兩者維度會不對應。在 TensorFlow 中,如果出現維度不對應,H會被拷貝多份,和 EO 長度一樣,分別和 EO 中的每個向量進行加法。