Ce code est écrit en Pytorch 0.2. Au moment où le Pytorch a publié sa version 1.0, il existe de nombreux packages d'apprentissage SEQ2SEQ exceptionnels construits sur Pytorch, tels que OpenNMT, ALLENNLP et etc. Vous pouvez apprendre de leur code source.
Utilisation: veuillez vous référer au didacticiel Pytorch officiel sur la traduction machine de l'attention, sauf que cette implémentation gère les entrées par lots, et qu'elle implémente un mécanisme d'attention légèrement différent.
Pour découvrir la différence de mise en œuvre au niveau de la formule, les illustrations ci-dessous vous aideront beaucoup.
Illustration de mécanisme de version de Pytorch, voir ici:
http://pytorch.org/tutorials/_images/decoder-network.png
Pytorch Offical SEQ2SEQ Tutoriel de traduction machine:
http://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html
Illustration de l'attention de Bahdanau, voir ici:
http://images2015.cnblogs.com/blog/670089/201610/670089-20161012111504671-910168246.png
Le décodeur d'attention de la version Pytorch a nourri "word_embedding" pour calculer les poids d'attention, tandis que dans le papier d'origine, il est censé être "Encoder_Outputs". Dans ce référentiel, nous avons mis en œuvre le décodeur d'attention d'origine selon le document
Mise à jour: Encodeur dynamique ajouté et ne nécessite pas que les entrées soient triées par longueur dans un lot.
Pytorch prend en charge la récupération et l'attribution des valeurs du tenseur au cours des éléments pendant la procédure, mais en fait, il est lent, surtout lors de l'exécution sur GPU. Dans un tutoriel (https://github.com/spro/practitical-pytorch), les valeurs d'attention sont attribuées au niveau de l'élément; C'est absolument correct (et intuitif des formules sur papier), mais lent sur notre GPU. Ainsi, nous avons réimplémenté une véritable version de manipulation du tenseur par lots, et il réalise plus de 10x amélioration de la vitesse.
Ce code fonctionne bien sur les projets personnels.