Este código foi escrito em Pytorch 0.2. Quando o Pytorch lançou sua versão 1.0, há muitos pacotes de aprendizado de Seq2seq excepcionais construídos em Pytorch, como OpenNMT, AllennLP e etc., você pode aprender com o código -fonte deles.
Uso: Consulte o tutorial de Pytorch ORFICAL sobre a tradução da máquina de atenção-RNN, exceto que essa implementação lida com entradas em lotes e que implementa um mecanismo de atenção ligeiramente diferente.
Para descobrir a diferença de implementação no nível da fórmula, as ilustrações abaixo ajudarão muito.
Ilustração do mecanismo de versão pytorch, veja aqui:
http://pytorch.org/tutorials/_images/decoder-network.png
Tutorial de tradução de máquina OFPICAL Pytorch Seq2seq:
http://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html
Ilustração de Atenção de Bahdanau, veja aqui:
http://images2015.cnblogs.com/blog/670089/201610/670089-20161012111504671-910168246.png
Pytorch Versão Decodificador de atenção alimentado "word_embedding" para calcular pesos de atenção, enquanto no artigo de origem deve ser "coder_outputs". Neste repositório, implementamos o decodificador de atenção de origem de acordo com o artigo
Atualização: o codificador dinâmico adicionado e não exige que as entradas sejam classificadas por comprimento em um lote.
O Pytorch suporta busca e atribuição de elementos para atribuir valores de tensor durante o procedimento, mas na verdade é lento, especialmente ao executar na GPU. Em um tutorial (https://github.com/spro/practical-pytorch), os valores de atenção são atribuídos por elemento; É absolutamente correto (e intuitivo das fórmulas no papel), mas lento em nossa GPU. Assim, reimplementamos uma versão real de manipulação de tensores em lote e ela alcança mais de 10x de melhoria de velocidade.
Este código funciona bem em projetos pessoais.