实验14.基于Transformer实现机器翻译(日译中)

一,Transformer

1 定义

Transformer是一种基于深度学习的神经网络模型,它由Vaswani等人在2017年提出,主要用于机器翻译任务,但也被广泛应用于其他自然语言处理(NLP)领域,如文本摘要、语言理解、文本生成等。

2 核心思想

Transformer的核心思想是自注意力(Self-Attention)机制,它能够使模型在处理输入数据时同时考虑序列中的所有元素,并赋予不同权重,从而捕捉到长距离依赖关系。这意味着在翻译一个词时,模型能够考虑到整个句子的上下文信息。

3 模型结构

1. 编码器(Encoder)


输入层:将输入的词或子词(Token)转换为词向量。
自注意力层:计算输入序列中每个元素的自注意力权重,生成新的表示。
前馈神经网络:对自注意力层的输出应用前馈网络进行变换。

 2. 解码器(Decoder)


输入层:与编码器类似,转换词向量。
自注意力层:关注输入序列中的不同部分。
编码器-解码器注意力层:帮助解码器关注编码器输出的相关信息。
前馈神经网络:操作与编码器中相同。

3. 输出层


 将解码器的输出转换成预测词汇的概率分布。

3 特点与优势

1. 并行计算:与传统的循环神经网络(RNN)不同,Transformer允许所有序列位置同时进行计算,极大提高了训练和推理的速度。
2. 自注意力机制:能够动态地关注输入序列中的任何位置,较好地解决了长距离依赖问题。
3. 可扩展性:模型可以通过增加层数来提高其能力,适应不同复杂度的任务。
4. 无需预训练:与一些其他模型不同,Transformer不需要从预训练任务开始,可以直接应用于下游任务。

4 应用

除了机器翻译,Transformer模型也成功应用于其他多种NLP任务,例如:文本分类,情感分析,文本摘要,问答系统,语言建模。

二,实验介绍与代码

1 导入所需的包

首先,让我们确保我们的系统中安装了以下软件包,如果您发现某些软件包丢失,请确保安装它们。

2 获取并行数据集

在本教程中,我们将使用从JParaCrawl下载的日英并行数据集![http://www.kecl.ntt.co.jp/icl/lirg/jparacrawl]它被描述为“NTT创建的最大的公开的英语-日语平行语料库。它是通过大量抓取网络和自动对齐平行句子创建的。”你也可以在这里看到这篇论文。

在导入所有日语和英语对应数据后,我删除了数据集中的最后一个数据,因为它缺少值。总的来说,trainen和trainja中的句子数量都是5973071,然而,出于学习目的,通常建议在一次使用所有数据之前,对数据进行采样,并确保一切正常,以节省时间。

以下是数据集中包含的句子示例。

3 准备标记器

与英语或其他按字母顺序排列的语言不同,日语句子不包含空格来分隔单词。我们可以使用JParaCrawl提供的标记器,该标记器是使用日语和英语的句子片段创建的,您可以访问JParaCrawl网站下载它们,或单击此处。

在加载了标记器之后,可以测试它们,例如,通过执行以下代码。

4 构建TorchText Vocab对象并将句子转换为Torch张量

使用标记器和原始句子,我们构建从TorchText导入的Vocab对象。这个过程可能需要几秒钟或几分钟,这取决于我们数据集的大小和计算能力。不同的标记器也会影响构建vocab所需的时间,我尝试了其他几种日语标记器,但PensionePiece似乎对我来说足够好、足够快。

在我们有了词汇表对象之后,我们可以使用vocab和标记器对象来为我们的训练数据构建张量。

5创建要在训练期间迭代的DataLoader对象

在这里,我将BATCH_SIZE设置为16,以防止“cuda内存不足”,但这取决于各种因素,如机器内存容量、数据大小等,所以可以根据您的需要随意更改批量大小(注意:PyTorch的教程使用Multi30k德语-英语数据集将批量大小设置为128。)

6 顺序到顺序变压器

接下来的几个代码和文本解释(用斜体书写)取自PyTorch的原始教程[https://pytorch.org/tutorials/beginner/translation_transformer.html]. 我没有做任何更改,除了BATCH_SIZE和单词de_vocab被改为ja_vocab。

Transformer是“注意力就是你所需要的”论文中介绍的一个Seq2Seq模型,用于解决机器翻译任务。转换器模型由编码器和解码器块组成,每个块包含固定数量的层。

编码器通过一系列多头注意和前馈网络层传播输入序列来处理输入序列。编码器的输出(称为存储器)与目标张量一起被馈送到解码器。编码器和解码器使用教师强制技术以端到端的方式进行训练。

文本标记通过使用标记嵌入来表示。位置编码被添加到标记嵌入中,以引入单词顺序的概念。

我们创建一个后续单词掩码来阻止目标单词关注其后续单词。我们还创建掩码,用于掩码源和目标填充令牌

定义模型参数并实例化模型。这里我们服务器实在是计算能力有限,按照以下配置可以训练但是效果应该是不行的。如果想要看到训练的效果请使用你自己的带GPU的电脑运行这一套代码。

当你使用自己的GPU的时候,NUM_ENCODER_LAYERS 和 NUM_DECODER_LAYERS 设置为3或者更高,NHEAD设置8,EMB_SIZE设置为512。

7 开始培训

最后,在准备好必要的类和函数之后,我们就可以训练我们的模型了。这是不言而喻的,但完成训练所需的时间可能会因计算能力、参数和数据集大小等因素的不同而有很大差异。

当我使用JParaCrawl的完整句子列表训练模型时,每种语言大约有590万个句子,使用一个NVIDIA GeForce RTX 3070 GPU每个历元大约需要5个小时。

这是代码:

8 尝试使用经过训练的模型翻译日语句子

首先,我们创建翻译新句子的功能,包括获取日语句子、标记化、转换为张量、推理,然后将结果解码回句子等步骤,但这次是用英语。

然后,我们可以直接调用translate函数并传递所需的参数。

9 保存Vocab对象和训练的模型

最后,在训练完成后,我们将首先使用Pickle保存Vocab对象(en_Vocab和ja_Vocab)。

最后,我们还可以使用PyTorch保存和加载函数保存模型以供以后使用。通常,有两种方法可以保存模型,具体取决于我们以后要使用它们。第一个仅用于推理,我们可以稍后加载模型,并使用它将日语翻译为英语。

第二个也用于推理,但也用于稍后加载模型并恢复训练时。

三,实验总结

本次实验展示了基于Transformer的模型在日译中机器翻译任务上的有效性和潜力。我们相信,通过进一步优化和改进,该模型有望在实际应用中取得更好的效果。

  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值