Seq2Seq
在開始Attention之前,我們先簡單回顧一下Seq2Seq模型,傳統的機器翻譯基本都是基於Seq2Seq模型來做的,該模型分爲encoder層與decoder層,並均爲RNN或RNN的變體構成,如下圖所示
在encode階段,第一個節點輸入一個詞,之後的節點輸入的是下一個詞與前一個節點的hidden state,最終encoder會輸出一個上下文向量c(context),這個c又作爲decoder的輸入,每經過一個decoder的節點就輸出一個翻譯後的詞,並把decoder的隱狀態和當前節點的輸出作爲下一層的輸入。該模型對於短文本的翻譯來說效果很好,但是其也存在一定的缺點,如果文本稍長一些,就很容易丟失文本的一些信息,bleu得分也會較低(關於什麼是bleu請看這篇博客https://blog.csdn.net/CharlesOyfz/article/details/90668423),而Attention就是爲了解決這個問題。下圖是Attention模型和普通Seq2Seq模型根據句子長度和bleu得分的對比(藍色爲普通seq2seq,綠色爲attention模型):
Attention,注意力,該模型在decode階段,會選擇最適合當前節點的c作爲輸入。
注意力機制在encoder階段,提供了更多的數據給到decoder階段,encoder會把所有的輸入節點的隱狀態形成一個加權和的上下文向量c提供給decoder。
具體的步驟看圖,如下:
圖示爲一個雙向rnn,a爲編碼器的隱狀態,s爲解碼器的隱狀態,當解碼輸出第1個輸出時,也就是單詞Jane,需要花多少注意力在每個輸入的單詞上?c代表輸入序列全部隱狀態的一個加權和,每個時刻生成輸出所對應的上下文向量c都不一樣。表示解碼器生成第1個輸出(單詞Jane)時;需要放在第1個單詞的隱狀態的注意力量,表示生成第1個輸出(單詞Jane)時,需要放在第2個單詞的隱狀態的注意力量;同理,表示需要放在第3個單詞的隱狀態的注意力量。也就是說表示模型在生成第i個輸出時,需要放多少注意力在第j個輸入隱狀態上。而傳給後面解碼器的該時刻t'=1的全部隱狀態的加權和(上下文向量c)爲:
同理,可得其他時刻輸出的上下文向量,從而完成解碼階段的輸出,下面上公式結合下圖說明:
編碼階段:
因爲是雙向RNN,所以編碼階段t'時刻隱狀態向量a爲該時刻正向與反向的隱狀態的拼接:
當t'=0, ,t'=+1時,;爲經過emberding後的詞嵌入向量
Attention部分:
第i個輸出對應的上下文向量c爲:
其中,所有該時刻i的注意力權重和爲1:
解碼階段: