此代碼用pytorch 0.2編寫。到Pytorch發布了1.0版本時,在Pytorch上構建了許多出色的SEQ2SEQ學習軟件包,例如OpenNMT,Allennlp等。您可以從他們的源代碼中學習。
用法:請參閱有關注意力RNN機器翻譯的官方Pytorch教程,但該實現處理批處理輸入,並且它實現了略有不同的注意機制。
要找出實施公式級別的差異,以下插圖將有很大幫助。
Pytorch版本機制插圖,請參閱此處:
http://pytorch.org/tutorials/_images/decoder-network.png
Pytorch官方SEQ2SEQ機器翻譯教程:
http://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html
Bahdanau注意插圖,請參閱此處:
http://images2015.cnblogs.com/blog/670089/201610/670089-20161012111504671-910168246.png
pytorch版本注意解碼器餵食“ word_embedding”以計算注意力的權重,而在原始紙中,它應該是“ encoder_outputs”。在此存儲庫中,我們根據論文實施了原始注意解碼器
更新:添加了動態編碼器,並且不需要輸入以批量的長度進行排序。
Pytorch支持元素的提取和分配張量值,但實際上它很慢,尤其是在GPU上運行時。在教程(https://github.com/spro/practical-pytorch)中,分配了注意值元素;這是絕對正確的(紙中的配方中的直覺),但我們的GPU速度很慢。因此,我們重新實現了一個真實的張力張量操縱版本,並提高了10倍以上的速度。
該代碼在個人項目上效果很好。