此代码用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倍以上的速度。
该代码在个人项目上效果很好。