이 코드는 Pytorch 0.2로 작성되었습니다. Pytorch가 1.0 버전을 출시 할 때까지 OpenNMT, Allennlp 등과 같은 Pytorch에 구축 된 뛰어난 SEQ2SEQ 학습 패키지가 많이 있습니다. 소스 코드에서 배울 수 있습니다.
사용법 :이 구현이 배치 된 입력을 처리하고 약간 다른주의 메커니즘을 구현한다는 점을 제외하고는주의 -RNN 머신 번역에 대한 오프파 Pytorch 자습서를 참조하십시오.
구현의 공식 수준 차이를 찾으려면 아래 그림이 많은 도움이 될 것입니다.
Pytorch 버전 메커니즘 그림, 여기를 참조하십시오.
http://pytorch.org/tutorials/_images/decoder-network.png
Pytorch Offical Seq2Seq Machine Translation Tutorial :
http://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html
Bahdanau주의 그림, 여기를 참조하십시오.
http://images201515.cnblogs.com/blog/670089/201610/670089-20161012111504671-910168246.png
Pytorch 버전주의 디코더는 "Word_embedding"을 공급하여주의 웨이트를 계산하고, 원점 용지에서는 "encoder_outputs"로 간주됩니다. 이 저장소에서 우리는 종이에 따라 Origin주의 디코더를 구현했습니다.
업데이트 : Dynamic Encoder가 추가되었으며 입력을 배치에서 길이별로 정렬 할 필요가 없습니다.
Pytorch는 절차 중에 요소 별 페치 및 할당을 지원하지만 실제로 GPU에서 실행할 때는 느리게 느립니다. 튜토리얼 (https://github.com/spro/practical-pytorch)에서는주의 값이 요소 별 할당됩니다. 그것은 절대적으로 정확하지만 (종이의 공식에서 직관적이지만) GPU에서는 느립니다. 따라서 실제 배치 텐서 조작 버전을 다시 구현했으며 10 배 이상의 속도 개선을 달성합니다.
이 코드는 개인 프로젝트에서 잘 작동합니다.