什麼是Seq2Seq算法
Seq2Seq模型,全稱Sequence to sequence,由Encoder和Decoder兩個部分組成,每部分都是一個RNNCell(RNN、LSTM、GRU等)結構。Encoder將一個序列編碼爲一個固定長度的語義向量,Decoder將該語義向量解碼爲另外一個序列。輸入序列和輸出序列均可以是不定長序列。ide
Seq2Seq能夠用於機器翻譯、文本摘要生成、對話生成等領域。函數
Seq2Seq結構工具
Seq2Seq包含一個RNN做爲Encoder對輸入序列進行編碼,一個RNN做爲Decoder對輸出序列進行解碼。下面參考https://zhuanlan.zhihu.com/p/70880679介紹兩種最經常使用的Seq2Seq結構。學習
爲簡化描述,這裏都以RNN代替LSTM和GRU,而且省略偏置項。編碼
結構1lua
Encoder輸入序列ABC,生成語義向量 c 做爲Decoder的初始隱藏狀態,Decoder中初始時刻輸入 \(<EOS>\)做爲開始標誌,直至輸出\(<EOS>\)結束預測。spa
Encoder第i個時刻的隱藏狀態和輸出爲:.net
Encoder輸出的語義向量爲最後一個時刻T的隱藏狀態:翻譯
Decoder第t個時刻的隱藏狀態和輸出爲:
Decoder的初始隱藏狀態爲Encoder編碼的語義向量,即:
結構2
結構1的Encoder所編碼的語義向量只做用於Decoder的第一個時刻,而結構2的語義向量做用於Decoder的每個時刻。
結構2的Encoder部分與結構1一致,惟一一點小區別是會對語義向量作一個非線性變換:
Decoder部分,結構2首先會初始化一個開始信號\(y_0\)(如\(<Start>\))以及一個初始隱藏狀態\(s_0\),Decoder第t個時刻的隱藏狀態和輸出爲:
Seq2Seq+Attention
Seq2Seq+Attention都是基於上述結構2,即Encoder生成的語義向量c會傳給的Decoder每個時刻。但這顯然是不合理的。好比翻譯一句話,I like watching movie.
翻譯成:我喜歡看電影。
,其中喜歡
基本上是由like
得來的,I like watching movie.
中每一個詞對翻譯成喜歡
的影響是不一樣的。因此,在Decoder中,每一個時刻的語義向量 \(c_t\) 都應該是不一樣的。Seq2Seq+Attention基於的就是這一想法。
這裏參考https://zhuanlan.zhihu.com/p/70905983介紹兩種Seq2Seq+Attention的方法,分別爲Bahdanau Attention和Luong Attention。
Bahdanau Attention
Encoder部分與前面所述一致,Decoder部分每一個時刻的語義向量 \(c_t\) 經過如下方式生成:
其中\(\alpha_{ti}\)爲輸入序列第i個字符對輸出序列第t個字符的歸一化權重,\(e_{ti}\)爲歸一化前的權重,\(v_a^T\)和\(W_a\)爲Attention的可學習參數。
Decoder第t個時刻的隱藏狀態和輸出爲:
Luong Attention
Luong Attention與Bahdanau Attention不一樣的地方在於歸一化前的權重計算,其計算方式爲:
而後計算注意力層的隱層狀態和輸出:
須要注意的是Decoder傳給下一個時刻的隱藏狀態是\(s_t\)而不是\(\widetilde s_t\)。
Bahdanau Attention與Luong Attention兩種注意力機制大致結構一致,區別在於計算影響程度的對齊函數。在計算時刻的影響程度時,前者使用\(s_{t-1}\)和\(h_i\)來計算,後者使用\(s_t\)和\(h_i\)來計算。從邏輯來看貌似後者更合邏輯,但兩種機制如今都有在用,效果應該沒有很大差異。
Seq2Seq訓練
Seq2Seq對Encoder和Decoder進行聯合訓練,目標是使得給定輸入序列的目標序列的條件機率最大化,即:
損失函數爲:
預測時須要將Decoder上一個時刻的輸出做爲下一個時刻的輸入,在訓練中咱們也能夠將標籤序列(訓練集的真實輸出序列)在上⼀個時間步的標籤做爲解碼器在當前時間步的輸⼊。這叫做強制教學(teacher forcing)。通常設置一個強制教學的比例,如50%使用強制教學,剩下的50%將Decoder上一個時刻的輸出做爲下一個時刻的輸入。
Seq2Seq預測
設輸出詞彙表大小爲|Y|(包括\(<EOS>\)),輸出序列的最大長度爲\(T'\)。
窮舉模式(exhaustive search)
窮舉全部可能的\(|Y|^{T'}\)個輸出序列而後選擇最優序列。但這樣時間空間消耗都很是的大,通常不用。
貪婪模式(greedy search)
每一個時刻都選擇當前時刻條件機率最大的詞,即:
⼀旦搜索出\(<EOS>\),或者輸出序列長度已經達到了最大長度T′,便完成輸出。
貪婪模式不能保證搜索出全局最優。
束搜索(beam search)
束搜索(beam search)是對貪婪搜索的⼀個改進算法。它有⼀個束寬(beam size)超參數。咱們將它設爲 k。在時間步 1 時,選取當前時間步條件機率最⼤的 k 個詞,分別組成 k 個候選輸出序列的⾸詞。在以後的每一個時間步,基於上個時間步的 k 個候選輸出序列,從 k |Y| 個可能的輸出序列中選取條件機率最⼤的 k 個,做爲該時間步的候選輸出序列。
因爲束搜索傾向於選擇長度較短的輸出序列,所以通常對長度進行歸一化,每一個序列的得分爲:
當\(\alpha\)取0時不進行長度歸一化,取1時進行標準長度歸一化。取值是試探性的,能夠嘗試不一樣的值,看哪個能獲得最好的結果。通常取0.7。
束搜索的PyTorch實現方式能夠參考:https://blog.csdn.net/u014514939/article/details/95667422。
BLEU得分
BLEU(bilingual evaluation understudy,雙語互譯質量評估輔助工具),是用來評估機器翻譯質量的一個指標,其計算公式爲:
其中,\(P_n\)爲n-gram對應的得分,\(w_n\)爲n-gram的權重,k爲但願匹配的最長的子序列長度,BP爲長度懲罰項。
其中,\(Count_n\)爲翻譯序列中全部n-gram的數量,\(Count_n^{clip}\)爲翻譯序列中全部n-gram與全部參考翻譯的匹配數量,例如對於某個n-gram,其在翻譯序列中出現次數爲3,在3個參考翻譯中出現次數爲2,4,1,則\(Count_n^{clip}=min(3,max(2,4,1))=3\)。
通常將各n-gram的做用視爲等重要的,即取權重服從均勻分佈,即:
因爲對於較長序列,其\(P_n\)每每較小,所以較長序列的BLEU得分每每偏小。BP項對短序列施加懲罰:
其中c爲翻譯序列長度,r爲全部參考序列中最大的長度。