http://c.biancheng.net/view/1947.htmlhtml
seq2seq 是一類特殊的 RNN,在機器翻譯、文本自動摘要和語音識別中有着成功的應用。本節中,咱們將討論如何實現神經機器翻譯,獲得相似於谷歌神經機器翻譯系統獲得的結果(https://research.googleblog.com/2016/09/a-neural-network-for-machine.html)。
關鍵是輸入一個完整的文本序列,理解整個語義,而後輸出翻譯結果做爲另外一個序列。閱讀整個序列的想法與之前的架構大相徑庭,在該架構中,一組固定詞彙從一種源語言翻譯成目標語言。
本節受到 Minh-Thang Luong 於 2016 年所寫的博士論文「Neural Machine Translation」的啓發。第一個關鍵概念是編碼器–解碼器架構,其中編碼器將源語句轉換爲表示語義的向量,而後這個向量經過解碼器產生翻譯結果。
編碼器和解碼器都是 RNN,它們能夠捕捉語言中的長距離依賴關係,例如性別一致性和語法結構,而沒必要事先知道它們,也不須要跨語言進行 1:1 映射。它可以流利地翻譯而且具備強大的功能。python
來看一個 RNN 例子:將 She loves cute cats 翻譯成 Elle aime les chats mignons。有兩個 RNN:一個充當編碼器,一個充當解碼器。源語句 She loves cute cats 後面跟着一個分隔符「-」和目標語句 Elle aime les chats mignon。這兩個關聯語句被輸入給編碼器用於訓練,而且解碼器將產生目標語句 Elle aime les chats mignon。固然,須要大量相似例子來得到良好的訓練。git
NUM序列模型,一個深度循環結構示例,用於將源語句「She loves cute cats」 翻譯成目標語句「Elle aimel les chats mignons」。解碼器側,前面時序中產生的單詞做爲輸出下一個單詞的輸入,「_」表明語句的結束。github
如今有一些可使用的 RNN 變體,具體介紹其中的一些:算法
仍然考慮博士論文「Neural Machine Translation」,可使用嵌入層將輸入的句子映射到一個嵌入空間。而後,存在兩個鏈接在一塊兒的 RNN——源語言的編碼器和目標語言的解碼器。以下圖所示,有多個隱藏層和兩個流動方向:前饋垂直方向鏈接隱藏層,水平方向是將知識從上一步轉移到下一步的循環部分。api
本節使用 NMT(Neural Machine Translation,神經機器翻譯),這是一個在 TensorFlow 上在線可得的翻譯演示包。網絡
NMT 可經過https://github.com/tensorflow/nmt/ 獲取,具體代碼可經過 GitHub 獲取。架構
全部上述代碼已經在 https://github.com/tensorflow/nmt/blob/master/nmt/model.py 上給出。關鍵是將兩個 RNN 打包在一塊兒,第一個是嵌入空間的編碼器,將類似的單詞映射得很接近,編碼器理解訓練樣例的語義,併產生一個張量做爲輸出。而後經過將編碼器的最後一個隱藏層鏈接到解碼器的初始層能夠簡單地將該張量傳遞給解碼器。函數
請注意,學習可以進行是由於損失函數基於交叉熵,且labels=decoder_outputs。學習
以下圖所示,代碼學習如何翻譯,並經過BLEU指標的迭代跟蹤進度:
下面咱們將源語言翻譯成目標語言。這個想法很是簡單:一個源語句做爲兩個組合的 RNN(編碼器+解碼器)的輸入。一旦句子結束,解碼器將發出 logit 值,採用貪婪策略輸出與最大值相關的單詞。
例如,單詞 moi 做爲來自解碼器的第一個標記被輸出,由於這個單詞具備最大的 logit 值。此後,單詞 suis 輸出,等等:
解碼器的輸出有多種策略:
兩個 RNN 封裝在一塊兒造成編碼器–解碼器 RNN 網絡。解碼器發出的 logits 被貪婪策略轉換成目標語言的單詞。做爲一個例子,下面顯示了一個從越南語到英語的自動翻譯的例子: