Este código está escrito en Pytorch 0.2. Cuando el Pytorch ha lanzado su versión 1.0, hay muchos paquetes de aprendizaje SEQ2SEQ excepcionales construidos en Pytorch, como OpenNMT, Allennlp y, etc., puede aprender de su código fuente.
Uso: consulte el tutorial de Pytorch Oficial sobre la traducción automática de atención de atención, excepto que esta implementación maneja las entradas por lotes, y que implementa un mecanismo de atención ligeramente diferente.
Para averiguar la diferencia de implementación a nivel de fórmula, las ilustraciones a continuación ayudarán mucho.
Ilustración del mecanismo de la versión de Pytorch, ver aquí:
http://pytorch.org/tutorials/_images/decoder-network.png
Tutorial de traducción automática de SEQ2SEQ de Pytorch:
http://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html
Ilustración de atención de Bahdanau, ver aquí:
http://images2015.cnblogs.com/blog/670089/201610/670089-20161012111504671-910168246.png
Versión de Pytorch Decoder de atención alimentada "Word_embedding" para calcular los pesos de atención, mientras que en el documento de origen se supone que es "Encoder_outputs". En este repositorio, implementamos el decodificador de atención de origen de acuerdo con el documento
Actualización: el codificador dinámico agregado y no requiere que las entradas se ordenen por longitud en un lote.
Pytorch admite la recuperación de elementos y la asignación de valores de tensor durante el procedimiento, pero en realidad es lento, especialmente cuando se ejecuta en GPU. En un tutorial (https://github.com/spro/practical-pytorch), los valores de atención se asignan alemanes; Es absolutamente correcto (e intuitivo de las fórmulas en papel), pero lento en nuestra GPU. Por lo tanto, volvimos a implementar una versión de manipulación de tensor por lotes real, y logra más de 10x mejora de velocidad.
Este código funciona bien en proyectos personales.