自然语言处理-基于Transformer实现机器翻译

原理:

Transformer是一种基于注意力机制的深度学习模型,最初由Google在2017年提出。它在机器翻译任务中取得了很大成功,因为它能够在处理长距离依赖关系时表现优异,并且可以并行化处理。

在机器翻译任务中,Transformer模型通常包括编码器和解码器两部分。编码器将源语言句子编码成一个上下文表示,解码器则根据这个上下文表示生成目标语言句子。Transformer模型的核心是自注意力机制(self-attention),它允许模型在处理每个单词时都能够关注输入序列中的所有其他单词,从而更好地捕捉语言之间的依赖关系。

在机器翻译任务中,Transformer模型会通过多层堆叠的编码器和解码器来实现翻译过程。在训练过程中,模型会根据源语言句子生成目标语言句子,并通过最小化预测值与真实值之间的差距来优化模型参数。在推理过程中,模型会根据编码器生成的上下文表示和解码器的预测逐步生成目标语言句子。

总的来说,Transformer模型通过引入自注意力机制和多头注意力机制,实现了对长距离依赖关系的建模,从而在机器翻译任务中取得了较好的效果。

主要特点
 自注意力机制:
自注意力机制使模型能够在处理每个单词时,考虑到句子中的所有单词,从而更好地理解上下文。
这一机制有助于捕获长距离依赖,特别适用于处理具有复杂结构的句子。
 并行化处理:
与传统的循环神经网络(RNN)不同,Transformer不需要按顺序处理数据,因此可以高效地利用现代计算硬件进行并行计算。
这显著提高了训练速度,尤其是在处理大规模数据集时。
 编码器—解码器结构:
Transformer遵循编码器—解码器结构,其中编码器用于理解输入数据,解码器负责生成输出。
这种结构使得模型不仅可用于翻译任务,还可用于文本摘要、文本生成等应用。
 无需递归或卷积层:
Transformer完全依赖于自注意力机制和Feed-Forward神经网络,不需要传统的卷积层或递归层。
这使得模型结构简单而有效,减少了需要调整的超参数数量。
 可扩展性和灵活性: 
Transformer的可扩展性使其成为构建大型语言模型的理想选择。
通过增加模型的层数和参数量,可以不断提高模型的性能。
 应用领域
机器翻译:最初为解决机器翻译问题而设计,Transformer在多个翻译任务上取得了最佳效果。
文本生成:用于生成连贯的文本,例如在自动写作、聊天机器人等场景中。
文本理解:在文本分类、情感分析等理解型任务中也显示出强大的性能。
多模态学习:最近的研究将Transformer应用于处理多模态数据,如结合文本和图像的任务。 

环境及软件包

获取平行数据集 
        在本教程中,我们将使用从JParaCrawl[http://www.kecl.ntt.co.jp/icl/lirg/jparacrawl]下载的日英平行数据集,该数据集被描述为“由NTT创建的最大的可公开获取的英日平行语料库。它是通过在网上大规模爬取并自动对齐平行句子而创建的。” 

导入所有日语及其英文对应文本后,我删除了数据集中的最后一条数据,因为它有一个缺失值。总共,在trainen和trainja中的句子数量为5,973,071条,然而,为了学习目的,通常建议对数据进行抽样,并确保一切按预期工作正常,然后再一次使用所有数据,以节省时间。

 我们还可以使用不同的平行数据集来跟随本文,只需确保我们可以将数据处理成上面所示的两个字符串列表,其中包含日语和英语句子。

准备分词器。 
       与英语或其他字母语言不同,日语句子中没有空格来分隔单词。我们可以使用由JParaCrawl提供的标记工具,该工具使用SentencePiece为日语和英语创建,您可以访问JParaCrawl网站下载它们,或点击这里。

构建TorchText词汇对象,并将句子转换为Torch张量
       使用标记器和原始句子,然后构建从TorchText导入的词汇对象。这个过程可能需要几秒钟或几分钟,这取决于我们数据集的大小和计算能力。不同的标记器也会影响构建词汇所需的时间,我尝试了几种其他的日语标记器,但SentencePiece 似乎对我来说运行得很好且足够快。

创建DataLoader对象,在训练过程中进行迭代
       这里,我将BATCH_SIZE设置为16,以防止“cuda内存不足”的问题,但这取决于诸如您的机器内存容量、数据大小等各种因素,因此根据您的需要随意更改批处理大小

 序列到序列变压器
        下面几行代码和文本解释(用斜体)取自原始的PyTorch教程[https://pytorch.org/tutorials/beginner/translation_transformer.html]。我除了将BATCH_SIZE和单词de_vocab更改为ja_vocab外,没有做任何修改。

        Transformer是一种Seq2Seq模型,介绍了“Attention is all you need”文档,用于解决机器翻译任务。Transformer模型包括一个编码器和一个解码器块,每个块包含固定数量的层。

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

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

我们创建一个后续的单词掩码,防止目标单词关注其后续的单词。我们还创建掩码,用于掩盖源和目标的填充标记

Define model parameters and instantiate model. 这里我们服务器实在是计算能力有限,按照以下配置可以训练但是效果应该是不行的。如果想要看到训练的效果请使用你自己的带GPU的电脑运行这一套代码。

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

开始训练
终于,在准备好必要的课程和功能之后,我们准备好训练我们的模型了。毋庸置疑,但训练所需的时间可能会因许多因素而大不相同,比如计算能力、参数和数据集的大小。我使用了来自JParaCrawl的完整句子列表来训练模型,该列表每种语言约有590万个句子个NVIDIA GeForcRTX 3070 GPU每个时代大约需要5个小时。

尝试使用训练模型翻译一个日语句子,首先,我们创建函数来翻译一句新的句子,包括获取日语句子、分词、转换为张量、推理,然后将结果解码回一句句子,但这次是用英语。

那么,我们可以直接调用翻译函数并传入所需的参数

保存词汇对象和训练好的模型

         最后, 培训完成后, 我们将首先使用Pickle保存Vocab对象(en_vocab和ja_vocab)

最后,我们还可以使用PyTorch的保存和加载函数来保存模型以备以后使用。通常,根据我们以后想要使用模型的方式,有两种保存模型的方法。第一种是仅用于推断,可以稍后加载模型并将其用于从日语翻译成英语

# save model for inference
                                         

第二个参数也用于推断,但是还用于当我们想要稍后加载模型并恢复训练时。torch.save(transformer.state_dict(), 'inference_model')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值