Seq2Seq詳解
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 其實有五條線。為了美觀,只畫了一條線。
- Encoder 產出:encoder outputs 和 hidden state;
- hidden_state 和 encoder_outputs 計算得到 attention weights;
- attention weights 和 encoder outputs 加權求和 得到 context_vector;
- context_vector 和 下一個 input 一起輸入給 decoder,計算得到一個輸出 和一個 hidden_state。這個輸出會當做下一次 decoder 計算的輸入。第一個輸入是 NULL 標記。這些輸出就是 final_input。
具體計算過程:
注意:score 計算時,H 是某一步的,而EO是encoder的多步的,大家可能會有一個疑問,兩者維度會不對應。在 TensorFlow 中,如果出現維度不對應,H會被拷貝多份,和 EO 長度一樣,分別和 EO 中的每個向量進行加法。
相關文章
- Seq2Seq原理詳解
- seq2seq之雙向解碼
- Seq2Seq那些事:詳解深度學習中的“注意力機制”深度學習
- TensorFlow實現seq2seq
- seq2seq 的 keras 實現Keras
- 深度學習的seq2seq模型深度學習模型
- 系統學習NLP(十五)--seq2seq
- http協議/cookie詳解/session詳解HTTP協議CookieSession
- seq2seq裡在chatbot的一些用法
- 注意力(Attention)與Seq2Seq的區別
- Java註解最全詳解(超級詳細)Java
- Java註解詳解Java
- Lombok 註解詳解Lombok
- @FeignClient註解詳解client
- Java 註解詳解Java
- ECharts 詳解Echarts
- Dialogment詳解
- hibernate詳解
- 詳解bind
- 詳解GOPATHGo
- nginx 詳解Nginx
- HTTP 詳解HTTP
- StreamingContext詳解GCContext
- JavaScript this詳解JavaScript
- promise詳解Promise
- DiskBasedCache詳解
- ReentrantLock詳解ReentrantLock
- Redis詳解Redis
- epoll詳解
- typeid詳解
- TLS 詳解TLS
- webpack詳解Web
- 列表詳解
- kubectl詳解
- HTML詳解HTML
- Callback詳解
- TCP詳解TCP
- JSON詳解JSON