このコードは、Pytorch 0.2で記述されています。 Pytorchが1.0バージョンをリリースする頃には、Pytorch上に構築されたOpenNMT、AllENNLPなどの優れたSEQ2SEQ学習パッケージがたくさんあります。ソースコードから学ぶことができます。
使用法:この実装がバッチ入力を処理し、わずかに異なる注意メカニズムを実装することを除いて、RNNマシンの翻訳に関するOffical Pytorchチュートリアルを参照してください。
式レベルの実装の違いを見つけるために、以下の図は大いに役立ちます。
Pytorchバージョンのメカニズムイラスト、こちらを参照してください:
http://pytorch.org/tutorials/_images/decoder-network.png
pytorch offical seq2seqマシン翻訳チュートリアル:
http://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html
バダナウの注意イラスト、こちらを参照してください:
http://images2015.cnblogs.com/blog/670089/201610/670089-20161012111504671-910168246.png
Pytorchバージョンの注意デコーダー「Word_embedding」をFEDにして注意の重みを計算しますが、Origin Paperでは「encoder_outputs」であると想定されています。このリポジトリでは、論文に従ってOrigin Attention Decoderを実装しました
更新:ダイナミックエンコーダーが追加され、バッチ内の長さで入力をソートする必要はありません。
Pytorchは、プロシージャ中にテンソル値を取得および割り当てる要素ごとにサポートしますが、実際にはGPUで実行する場合は特に遅いです。チュートリアル(https://github.com/spro/practical-pytorch)では、注意値は要素ごとに割り当てられています。それは絶対に正しい(そして紙の式からは直感的です)が、GPUでは遅いです。したがって、実際のバッチテンソル操作バージョンを再実装し、 10倍以上の速度改善を達成しました。
このコードは、個人プロジェクトでうまく機能します。