这个存储库包含使用 MindSpore 2.2.10 和 spaCy 3.0 以及 Python 3.7.5 实现序列到序列(seq2seq)模型的教程,该教程能够使您更好地利用hugging face社区中的数据集与评估方法与MindSpore结合使用。
如果您发现任何错误或对解释有异议,请随时 提交问题。我欢迎任何反馈,无论是积极的还是消极的!
安装Mindspore请参考MindSpore官网
我们还将使用 spaCy 对我们的文本数据进行处理。要安装 spaCy,请按照此处的说明进行操作,确保安装英语和德语模型:
python -m spacy download en_core_web_sm
python -m spacy download de_core_news_sm
国内环境如无法安装,请尝试使用direct
模式下载数据集。
python -m spacy download en_core_web_sm-3.7.0 --direct
python -m spacy download de_core_news_sm-3.7.0 --direct
-
1 - 序列到序列学习与神经网络
第一个教程涵盖了使用 MindSpore 的 seq2seq 项目的工作流程。我们将介绍使用编码器-解码器模型的 seq2seq 网络的基础知识,如何在 MindSpore 中实现这些模型,以及如何使用 Vocab 处理文本方面的繁重工作。模型本身将基于使用神经网络进行序列到序列学习的实现,该实现使用多层 LSTM。
-
2 - 使用RNN编码器-解码器学习短语表示进行统计机器翻译
现在我们已经掌握了基本的工作流程,这个教程将专注于提升我们的结果。借助于从前一个教程中获得的有关MindSporet的知识,我们将介绍第二个模型,该模型有助于解决编码器-解码器模型面临的信息压缩问题。这个模型将基于使用RNN编码器-解码器学习短语表示进行统计机器翻译的实现,该实现使用GRU(门控循环单元)。
-
接下来,我们将学习有关注意力机制的知识,通过实现通过联合学习对齐和翻译进行神经机器翻译。这进一步缓解了信息压缩问题,允许解码器通过创建上下文向量来“回顾”输入句子,这些上下文向量是编码器隐藏状态的加权和。这个加权和的权重是通过注意力机制计算的,其中解码器学会关注输入句子中最相关的单词。
-
在这个笔记本中,我们将通过添加pack填充序列和掩码来改进先前的模型架构。这两种方法在自然语言处理中常用。Pack填充序列允许我们仅使用我们的RNN处理输入句子的非填充元素。掩码用于强制模型忽略我们不希望它查看的特定元素,例如填充元素上的注意力。这两者共同为我们提供了一些性能提升。我们还介绍了一种非常基本的使用模型进行推理的方法,使我们能够获得对我们想要提供给模型的任何句子的翻译,并且可以查看这些翻译的源序列上的注意值。最后,我们展示了如何从我们的翻译中计算BLEU指标。
-
5 - 序列到序列卷积学习
最后,我们将摆脱基于RNN的模型,实现一个完全卷积的模型。RNN的一个缺点是它们是顺序的。也就是说,在RNN处理单词之前,所有先前的单词也必须被处理。卷积模型可以完全并行化,这使得它们能够更快地训练。我们将实现卷积序列到序列模型,该模型在编码器和解码器中都使用多个卷积层,并在它们之间使用注意机制。
-
继续使用非RNN的模型,我们实现了来自Attention Is All You Need的Transformer模型。该模型完全基于注意机制,引入了多头注意力。编码器和解码器由多个层组成,每个层都包含多头注意力和位置前馈子层。该模型目前用于许多最先进的序列到序列和迁移学习任务。
这里是我在制作这些教程时参考的一些工作。但是请注意,其中一些可能已经过时。
- https://github.com/bentrevett/pytorch-seq2seq
- https://github.com/spro/practical-pytorch
- https://github.com/keon/seq2seq
- https://github.com/pengshuang/CNN-Seq2Seq
- https://github.com/pytorch/fairseq
- https://github.com/jadore801120/attention-is-all-you-need-pytorch
- http://nlp.seas.harvard.edu/2018/04/03/attention.html
- https://www.analyticsvidhya.com/blog/2019/06/understanding-transformers-nlp-state-of-the-art-models/
- 1~4章节 需要Mindspore-2.1.1以下版本才能够正确运行,这是由于截至编写时 (2024-1-20) 的2.2相关版本
Mindspore-2.2.10
中GRU相关算子无法正确使用,详见这里。- 2024.02.28, 问题已在Mindspore-2.3修复。
- 截至编写时(2024-1-20), Mindspore中的
ops.clip_by_norm(grads, max_norm=clip)
函数因为某些原因运行存在问题,所以笔记中相应的部分进行了注释,您可以尝试解除注释观察该部分是否在未来的更新中得到了正确的修复。 - 第五章需要Mindspore-2.2.10以上版本才能够正确运行,这可能是由于Mindspore的某些版本内部view导致梯度丢失引起的,详见这里。
@misc{mindsporeseq2seq,
title={MindSpore Seq2Seq},
year={2024},
author={umeiko},
publisher={GitHub},
journal={GitHub repository},
howpublished ={\url{https://github.com/umeiko/mindspore-seq2seq}}
}