一、Seq2Seq簡介
seq2seq 是一個Encoder–Decoder 結構的網路,它的輸入是一個序列,輸出也是一個序列。Encoder 中將一個可變長度的訊號序列變為固定長度的向量表達,Decoder 將這個固定長度的向量變成可變長度的目標的訊號序列。
很多自然語言處理任務,比如聊天機器人,機器翻譯,自動文摘,智慧問答等,傳統的解決方案都是檢索式(從候選集中選出答案),這對素材的完善程度要求很高。seq2seq模型突破了傳統的固定大小輸入問題框架。採用序列到序列的模型,在NLP中是文字到文字的對映。其在各主流語言之間的相互翻譯以及語音助手中人機短問快答的應用中有著非常好的表現。
二、編碼解碼模型
1、模型框架
在NLP任務中,其實輸入的是文字序列,輸出的很多時候也是文字序列,下圖所示的是一個典型的機器翻譯任務中,輸入的文字序列(源語言表述)到輸出的文字序列(目標語言表述)之間的變換。
2、編碼解碼器結構
(1)編碼器處理輸入序列中的每個元素(在這裡可能是1個詞),將捕獲的資訊編譯成向量(稱為上下文內容向量)。在處理整個輸入序列之後,編碼器將上下文傳送到解碼器,解碼器逐項開始產生輸出序列。如,機器翻譯任務
(2)上下文向量
- 輸入的資料(文字序列)中的每個元素(詞)通常會被編碼成一個稠密的向量,這個過程叫做word embedding
- 經過迴圈神經網路(RNN),將最後一層的隱層輸出作為上下文向量
- encoder和decoder都會藉助於迴圈神經網路(RNN)這類特殊的神經網路完成,迴圈神經網路會接受每個位置(時間點)上的輸入,同時經過處理進行資訊融合,並可能會在某些位置(時間點)上輸出。如下圖所示。
動態地展示整個編碼器和解碼器,分拆的步驟過程:
更詳細地展開,其實是這樣的:
三、加入attention注意力機制的Seq2Seq
1、為什麼加入attention機制:
提升效果,不會寄希望於把所有的內容都放到一個上下文向量(context vector)中,而是會採用一個叫做注意力模型的模型來動態處理和解碼,動態的圖如下所示。
所謂的注意力機制,可以粗略地理解為是一種對於輸入的資訊,根據重要程度進行不同權重的加權處理(通常加權的權重來源於softmax後的結果)的機制,如下圖所示,是一個在解碼階段,簡單地對編碼器中的hidden states進行不同權重的加權處理的過程。
2、attention機制結構
3、加入attention機制的Seq2Seq原理
- 帶注意力的解碼器RNN接收的嵌入(embedding)和一個初始的解碼器隱藏狀態(hidden state)。
- RNN處理輸入,產生輸出和新的隱藏狀態向量(h4),輸出被摒棄不用。
- attention的步驟:使用編碼器隱藏狀態(hidden state)和h4向量來計算該時間步長的上下文向量(C4)。
- 把h4和C4拼接成一個向量。
- 把拼接後的向量連線全連線層和softmax完成解碼
- 每個時間點上重複這個操作
也可以把這個動態解碼的過程展示成下述圖所示的過程。
四、圖解Attention Seq2Seq
輸入:$x = (x_1,...,x_{T_x})$
輸出:$y = (y_1,...,y_{T_y})$
1、$h_t = RNN_{enc}(x_t, h_{t-1})$,Encoder方面接受的每一個單詞word embedding,和上一個時間點的hidden state。輸出的是這個時間點的hidden state。
2、$s_t = RNN_{dec}(\hat{y_{t-1}},s_{t-1})$,Decoder方面接受的是目標句子裡單詞的word embedding,和上一個時間點的hidden state。
3、$c_i = \sum_{j=1}^{T_x} \alpha_{ij}h_j$,context vector是一個對於encoder輸出的hidden states的一個加權平均。
4、$\alpha_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})}$,每一個encoder的hidden states對應的權重。
5、$e_{ij} = score(s_i, h_j)$,通過decoder的hidden states加上encoder的hidden states來計算一個分數,用於計算權重(4)
6、$\hat{s_t} = tanh(W_c[c_t;s_t])$,將context vector 和 decoder的hidden states 串起來。
7、$p(y_t|y_{<t},x) = softmax(W_s\hat{s_t})$,計算最後的輸出概率。
(1)$h_t = RNN_{enc}(x_t, h_{t-1})$,Encoder方面接受的是每一個單詞word embedding,和上一個時間點的hidden state。輸出的是這個時間點的hidden state。
(2)$s_t = RNN_{dec}(\hat{y_{t-1}},s_{t-1})$,Decoder方面接受的是目標句子裡單詞的word embedding,和上一個時間點的hidden state。
(3)、$c_i = \sum_{j=1}^{T_x} \alpha_{ij}h_j$,context vector是一個對於encoder輸出的hidden states的一個加權平均。
(4)、$\alpha_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})}$,每一個encoder的hidden states對應的權重。
(5)、$e_{ij} = score(s_i, h_j)$,通過decoder的hidden states加上encoder的hidden states來計算一個分數,用於計算權重(4)
下一個時間點:
(6)$\hat{s_t} = tanh(W_c[c_t;s_t])$,將context vector 和 decoder的hidden states 串起來。
(7)$p(y_t|y_{<t},x) = softmax(W_s\hat{s_t})$,計算最後的輸出概率。
五、三種Attention得分計算方式
在luong中提到了三種score的計算方法。這裡圖解前兩種:
1、方法一
輸入是encoder的所有hidden states H: 大小為(hid dim, sequence length)。decoder在一個時間點上的hidden state, s: 大小為(hid dim, 1)。
(1)旋轉H為(sequence length, hid dim) 與s做點乘得到一個 大小為(sequence length, 1)的分數。
(2)對分數做softmax得到一個合為1的權重。
(3)將H與第二步得到的權重做點乘得到一個大小為(hid dim, 1)的context vector。
2、方法二
輸入是encoder的所有hidden states H: 大小為(hid dim1, sequence length)。decoder在一個時間點上的hidden state, s: 大小為(hid dim2, 1)。此處兩個hidden state的緯度並不一樣。
(1)旋轉H為(sequence length, hid dim1) 與 Wa [大小為 hid dim1, hid dim 2)] 做點乘, 再和s做點乘得到一個 大小為(sequence length, 1)的分數。
(2)對分數做softmax得到一個合為1的權重。
(3)將H與第二步得到的權重做點乘得到一個大小為(hid dim, 1)的context vector。