注意力机制是你所需要的:PyTorch 实现
这是 Transformer 模型在 "Attention is All You Need"(Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin, arxiv, 2017)中的 PyTorch 实现。
一种新颖的序列到序列框架利用了 自注意力机制,取代了卷积操作或循环结构,并在 WMT 2014 英语到德语翻译任务中达到了最先进的表现。(2017/06/12)
官方的 TensorFlow 实现可以在此找到:tensorflow/tensor2tensor。
想要了解更多关于自注意力机制的内容,可以阅读 "A Structured Self-attentive Sentence Embedding"。
该项目目前支持使用训练好的模型进行训练和翻译。
请注意,该项目仍在进行中。
与 BPE 相关的部分尚未完全测试。
如果有任何建议或错误,请随时提出 issue 让我知道。 :)
使用方法
WMT'16 多模态翻译:德-英
这是 WMT'16 多模态翻译任务(http://www.statmt.org/wmt16/multimodal-task.html)训练的一个示例。
0) 下载 spacy 语言模型。
# conda install -c conda-forge spacy
python -m spacy download en
python -m spacy download de
1) 使用 torchtext 和 spacy 预处理数据。
python preprocess.py -lang_src de -lang_trg en -share_vocab -save_data m30k_deen_shr.pkl
2) 训练模型
python train.py -data_pkl m30k_deen_shr.pkl -log m30k_deen_shr -embs_share_weight -proj_share_weight -label_smoothing -output_dir output -b 256 -warmup 128000 -epoch 400
3) 测试模型
python translate.py -data_pkl m30k_deen_shr.pkl -model trained.chkpt -output prediction.txt
[(进行中)] WMT'17 多模态翻译:德-英(使用 BPE)
1) 使用 bpe 下载和预处理数据:
由于接口尚未统一,您需要将主函数调用从
main_wo_bpe
切换到main
。
python preprocess.py -raw_dir /tmp/raw_deen -data_dir ./bpe_deen -save_data bpe_vocab.pkl -codes codes.txt -prefix deen
2) 训练模型
python train.py -data_pkl ./bpe_deen/bpe_vocab.pkl -train_path ./bpe_deen/deen-train -val_path ./bpe_deen/deen-val -log deen_bpe -embs_share_weight -proj_share_weight -label_smoothing -output_dir output -b 256 -warmup 128000 -epoch 400
3) 测试模型(未完成)
- 待办事项:
- 加载词汇表。
- 翻译后执行解码。
性能
训练
- 参数设置:
- 批处理大小 256
- 预热步骤 4000
- 训练轮数 200
- 学习率乘数 0.5
- 标签平滑
- 不使用 BPE 和共享词汇表
- 目标嵌入层和预 Softmax 线性层权重共享。
测试
- 即将推出。
待办事项
- 生成文本的评估。
- 注意力权重图。
致谢
- 字节对编码部分借鉴自 subword-nmt。
- 项目结构、一些脚本和数据集预处理步骤主要借鉴自 OpenNMT/OpenNMT-py。
- 感谢 @srush, @iamalbert, @Zessay, @JulesGM, @ZiJianZhao, 和 @huanghoujing 的建议。