在PyTorch中使用Seq2Seq构建的神经机器翻译模型

本文涉及的产品
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
简介: 在PyTorch中使用Seq2Seq构建的神经机器翻译模型

1.介绍

神经机器翻译(NMT)是一种机器翻译方法,它使用人工神经网络来预测一个单词序列的可能性,通常在一个单一的集成模型中建模整个句子。

对于计算机来说,用一个简单的基于规则的系统从一种语言转换成另一种语言是最困难的问题之一,因为它们无法捕捉到过程中的细微差别。不久之后,我们开始使用统计模型,但在进入深度学习之后,这个领域被统称为神经机器翻译,现在已经取得了最先进的成果。

这篇文章是针对于初学者的,所以一个特定类型的架构(Seq2Seq)显示了一个好的开始,这就是我们要在这里实现的。

因此,本文中的序列对序列(seq2seq)模型使用了一种编码器-解码器架构,它使用一种名为LSTM(长短期记忆)的RNN,其中编码器神经网络将输入的语言序列编码为单个向量,也称为上下文向量。

这个上下文向量被称为包含输入语言序列的抽象表示。

然后将这个向量传递到解码器神经网络中,用解码器神经网络一个词一个词地输出相应的输出语言翻译句子。

这里我正在做一个德语到英语的神经机器翻译。但同样的概念可以扩展到其他问题,如命名实体识别(NER),文本摘要,甚至其他语言模型,等等。

2.数据准备和预处理

为了以我们想要的最佳方式获取数据,我使用了SpaCy(词汇构建)、TorchText(文本预处理)库和multi30k dataset,其中包含英语、德语和法语的翻译序列

让我们看看它能做的一些过程,

  1. 训练/验证/测试分割:将数据分割到指定的训练/验证/测试集。
  2. 文件加载:加载各种格式(.txt、.json、.csv)的文本语料库。
  3. 分词:把句子分解成一串单词。
  4. 从文本语料库生成一个词汇表列表。
  5. 单词编码:将单词映射为整个语料库的整数,反之亦然。
  6. 字向量:将字从高维转换为低维(字嵌入)。
  7. 批处理:生成批次的样品。

因此,一旦我们了解了torch文本可以做什么,让我们谈谈如何在torch text模块中实现它。在这里,我们将利用torchtext下的3个类。

Fields :这是torchtext下的一个类,在这里我们指定如何在我们的数据库里进行预处理。

TabularDataset:我们实际上可以定义以CSV、TSV或JSON格式存储的列数据集,并将它们映射为整数。

BucketIterator:我们可以填充我们的数据以获得近似,并使用我们的数据批量进行模型训练。

这里我们的源语言(SRC - Input)是德语,目标语言(TRG - Output)是英语。为了有效的模型训练,我们还额外增加了两个令牌“序列开始”<sos>和“序列结束”<eos>

!pipinstalltorchtext==0.6.0--quietimporttorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchtext.datasetsimportMulti30kfromtorchtext.dataimportField, BucketIteratorimportnumpyasnpimportpandasaspdimportspacy, random##LoadingtheSpaCy's vocabulary for our desired languages.!python -m spacy download en --quiet!python -m spacy download de --quietspacy_german = spacy.load("de")spacy_english = spacy.load("en")def tokenize_german(text):return [token.text for token in spacy_german.tokenizer(text)]def tokenize_english(text):return [token.text for token in spacy_english.tokenizer(text)]german = Field(tokenize=tokenize_german, lower=True,init_token="<sos>", eos_token="<eos>")english = Field(tokenize=tokenize_english, lower=True,init_token="<sos>", eos_token="<eos>")train_data, valid_data, test_data = Multi30k.splits(exts = (".de", ".en"),fields=(german, english))german.build_vocab(train_data, max_size=10000, min_freq=3)english.build_vocab(train_data, max_size=10000, min_freq=3)print(f"Unique tokens in source (de) vocabulary: {len(german.vocab)}")print(f"Unique tokens in target (en) vocabulary: {len(english.vocab)}")******************************* OUTPUT *******************************Unique tokens in source (de) vocabulary: 5376Unique tokens in target (en) vocabulary: 4556

在设置了语言预处理标准之后,下一步是使用迭代器创建成批的训练、测试和验证数据。

创建批是一个详尽的过程,幸运的是我们可以利用TorchText的迭代器库。

这里我们使用BucketIterator来有效填充源句和目标句。我们可以使用.src属性访问源(德语)批数据,使用.trg属性访问对应的(英语)批数据。同样,我们可以在标记之前看到数据。

device=torch.device('cuda'iftorch.cuda.is_available() else'cpu')
BATCH_SIZE=32train_iterator, valid_iterator, test_iterator=BucketIterator.splits((train_data, valid_data, test_data),
batch_size=BATCH_SIZE,
sort_within_batch=True,
sort_key=lambdax: len(x.src),
device=device)
#DatasetSneekpeekbeforetokenizingfordataintrain_data:
max_len_ger.append(len(data.src))
max_len_eng.append(len(data.trg))
ifcount<10 :
print("German - ",*data.src, " Length - ", len(data.src))
print("English - ",*data.trg, " Length - ", len(data.trg))
print()
count+=1print("Maximum Length of English Sentence {} and German Sentence {} in the dataset".format(max(max_len_eng),max(max_len_ger)))
print("Minimum Length of English Sentence {} and German Sentence {} in the dataset".format(min(max_len_eng),min(max_len_ger)))
**************************************************************OUTPUT**************************************************************German-zweijungeweißemännersindimfreienindernähevielerbüsche . Length-13English-twoyoung , whitemalesareoutsidenearmanybushes . Length-11German-einmanningrünhälteinegitarre , währendderanderemannseinhemdansieht . Length-16English-amaningreenholdsaguitarwhiletheothermanobserveshisshirt . Length-15German-einmannlächelteinenausgestopftenlöwenan . Length-8English-amanissmilingatastuffedlionLength-8German-einschickesmädchensprichtmitdemhandywährendsielangsamdiestraßeentlangschwebt . Length-14English-atrendygirltalkingonhercellphonewhileglidingslowlydownthestreet . Length-14German-einefraumiteinergroßengeldbörsegehtaneinemtorvorbei . Length-12English-awomanwithalargepurseiswalkingbyagate . Length-12German-jungentanzenmittenindernachtaufpfosten . Length-9English-boysdancingonpolesinthemiddleofthenight . Length-11MaximumLengthofEnglishSentence41andGermanSentence44inthedatasetMinimumLengthofEnglishSentence4andGermanSentence1inthedataset

我刚刚试验了一批大小为32和样本批如下所示。这些句子被标记成一个单词列表,并根据词汇索引。“pad”标记的索引值为1。

每一列对应一个句子,用数字索引,在单个目标批处理中有32个这样的句子,行数对应于句子的最大长度。短句用1来填充以弥补其长度。

下表包含批处理的数字索引,这些索引稍后被输入到嵌入的单词中,并转换为密集表示,以便进行Seq2Seq处理。

640.png

下表包含与批处理的数字索引映射的对应单词。

640.png

3.长短期记忆(LSTM)背景知识

640.png

上面的图片显示了在单个LSTM单元下的计算。在最后一篇文章中,我将添加一些参考资料来学习更多关于LSTM的知识,以及为什么它适用于长序列。

但简单地说,传统RNN和门控(GRU)是无法捕捉的长期依赖性因其自然消失的梯度设计和遭受严重的问题,这使得权重和偏置值的变化率可以忽略不计,导致器泛化性的降低。

但是LSTM有一些特殊的单元称为门(记忆门,忘记门,更新门),这有助于克服前面提到的问题。

在LSTM细胞内,我们有一堆小型神经网络,在最后一层有sigmoid 和TanH激活和少量矢量加法,连接,乘法操作。

Sigmoid NN→压缩0到1之间的值。说接近0的值表示忘记,而接近1的值表示记住。

EmbeddingNN→将输入的单词索引转换为单词嵌入。

TanH NN→压缩-1和1之间的值。有助于调节矢量值,使其免于爆炸至最大值或缩小至最小值。

隐藏状态和单元状态在此称为上下文向量,它们是LSTM单元的输出。输入则是输入到嵌入NN中的句子的数字索引。

目录
相关文章
|
2月前
|
算法 PyTorch 算法框架/工具
Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)
本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。
332 2
|
15天前
|
机器学习/深度学习 人工智能 PyTorch
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
本文探讨了Transformer模型中变长输入序列的优化策略,旨在解决深度学习中常见的计算效率问题。文章首先介绍了批处理变长输入的技术挑战,特别是填充方法导致的资源浪费。随后,提出了多种优化技术,包括动态填充、PyTorch NestedTensors、FlashAttention2和XFormers的memory_efficient_attention。这些技术通过减少冗余计算、优化内存管理和改进计算模式,显著提升了模型的性能。实验结果显示,使用FlashAttention2和无填充策略的组合可以将步骤时间减少至323毫秒,相比未优化版本提升了约2.5倍。
33 3
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
|
1月前
|
并行计算 监控 搜索推荐
使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程
当处理大规模图数据时,复杂性难以避免。PyTorch-BigGraph (PBG) 是一款专为此设计的工具,能够高效处理数十亿节点和边的图数据。PBG通过多GPU或节点无缝扩展,利用高效的分区技术,生成准确的嵌入表示,适用于社交网络、推荐系统和知识图谱等领域。本文详细介绍PBG的设置、训练和优化方法,涵盖环境配置、数据准备、模型训练、性能优化和实际应用案例,帮助读者高效处理大规模图数据。
48 5
|
29天前
|
机器学习/深度学习 人工智能 PyTorch
使用Pytorch构建视觉语言模型(VLM)
视觉语言模型(Vision Language Model,VLM)正在改变计算机对视觉和文本信息的理解与交互方式。本文将介绍 VLM 的核心组件和实现细节,可以让你全面掌握这项前沿技术。我们的目标是理解并实现能够通过指令微调来执行有用任务的视觉语言模型。
35 2
|
2月前
|
机器学习/深度学习 自然语言处理 监控
利用 PyTorch Lightning 搭建一个文本分类模型
利用 PyTorch Lightning 搭建一个文本分类模型
65 8
利用 PyTorch Lightning 搭建一个文本分类模型
|
2月前
|
机器学习/深度学习 自然语言处理 数据建模
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
本文深入探讨了Transformer模型中的三种关键注意力机制:自注意力、交叉注意力和因果自注意力,这些机制是GPT-4、Llama等大型语言模型的核心。文章不仅讲解了理论概念,还通过Python和PyTorch从零开始实现这些机制,帮助读者深入理解其内部工作原理。自注意力机制通过整合上下文信息增强了输入嵌入,多头注意力则通过多个并行的注意力头捕捉不同类型的依赖关系。交叉注意力则允许模型在两个不同输入序列间传递信息,适用于机器翻译和图像描述等任务。因果自注意力确保模型在生成文本时仅考虑先前的上下文,适用于解码器风格的模型。通过本文的详细解析和代码实现,读者可以全面掌握这些机制的应用潜力。
112 3
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
|
3月前
|
机器学习/深度学习 PyTorch 调度
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
在深度学习中,学习率作为关键超参数对模型收敛速度和性能至关重要。传统方法采用统一学习率,但研究表明为不同层设置差异化学习率能显著提升性能。本文探讨了这一策略的理论基础及PyTorch实现方法,包括模型定义、参数分组、优化器配置及训练流程。通过示例展示了如何为ResNet18设置不同层的学习率,并介绍了渐进式解冻和层适应学习率等高级技巧,帮助研究者更好地优化模型训练。
193 4
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
|
3月前
|
机器学习/深度学习 监控 PyTorch
PyTorch 模型调试与故障排除指南
在深度学习领域,PyTorch 成为开发和训练神经网络的主要框架之一。本文为 PyTorch 开发者提供全面的调试指南,涵盖从基础概念到高级技术的内容。目标读者包括初学者、中级开发者和高级工程师。本文探讨常见问题及解决方案,帮助读者理解 PyTorch 的核心概念、掌握调试策略、识别性能瓶颈,并通过实际案例获得实践经验。无论是在构建简单神经网络还是复杂模型,本文都将提供宝贵的洞察和实用技巧,帮助开发者更高效地开发和优化 PyTorch 模型。
50 3
PyTorch 模型调试与故障排除指南
|
2月前
|
存储 并行计算 PyTorch
探索PyTorch:模型的定义和保存方法
探索PyTorch:模型的定义和保存方法
|
2月前
|
机器学习/深度学习 数据采集 自然语言处理
【NLP自然语言处理】基于PyTorch深度学习框架构建RNN经典案例:构建人名分类器
【NLP自然语言处理】基于PyTorch深度学习框架构建RNN经典案例:构建人名分类器

热门文章

最新文章