![PyTorch深度学习项目教程课件:文本翻译_第1页](http://file4.renrendoc.com/view9/M00/32/0B/wKhkGWcyLhuAE_rNAACh6lti1mw416.jpg)
![PyTorch深度学习项目教程课件:文本翻译_第2页](http://file4.renrendoc.com/view9/M00/32/0B/wKhkGWcyLhuAE_rNAACh6lti1mw4162.jpg)
![PyTorch深度学习项目教程课件:文本翻译_第3页](http://file4.renrendoc.com/view9/M00/32/0B/wKhkGWcyLhuAE_rNAACh6lti1mw4163.jpg)
![PyTorch深度学习项目教程课件:文本翻译_第4页](http://file4.renrendoc.com/view9/M00/32/0B/wKhkGWcyLhuAE_rNAACh6lti1mw4164.jpg)
![PyTorch深度学习项目教程课件:文本翻译_第5页](http://file4.renrendoc.com/view9/M00/32/0B/wKhkGWcyLhuAE_rNAACh6lti1mw4165.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PyTorch深度学习项目教程
文本翻译TEXTTRANSLATION要点:Transformer、自注意力机制、自然语言处理、中文分词、词向量化、位置编码
项目背景ProjectBackground问题:文本翻译是自然语言处理的任务之一。相对于视觉而言,语言表达多变。受词汇量、语法结构、表达语境、专业术语等影响,传统的神经网络对于文本翻译表现较差。解决:Transformer是一种用于自然语言处理任务的深度学习模型,其性能基于自注意力机制。自注意力机制允许模型动态地为输入序列的每个位置分配不同的权重,以便更好地捕捉其内部的关系和依赖。Transformer是当前大模型的技术基础。知识目标KnowledgeObjectives理解自然语言处理(NLP)的基本概念及其在人工智能中的应用熟悉图灵测试的基本原理,了解其对人工智能发展的意义学习并掌握中文分词、向量化、位置编码等技术,理解它们在NLP中的重要性深入了解Transformer编码器和解码器的结构,以及它们在处理序列数据中的作用掌握Transformer的多头注意力机制,理解其如何提高模型的表征能力学习Transformer中的掩码机制,并了解其在解码过程中的应用能力目标AbilityGoals能够独立构建NLP相关的数据集,并对其进行预处理具备比较和选择不同分词方法的能力,并能构建相应的数据词典熟练使用PyTorch框架,调用Transformer相关API,构建和训练模型能够根据项目需求合理设置网络参数,进行模型的调优素养目标ProfessionalAttainments培养对项目需求的理解能力,能够快速把握项目的核心提升根据项目需求快速收集相关素材的能力,包括数据集、工具和文献资源加强快速查阅资料的能力,培养在面对问题时能够快速定位和解决问题的素养目录任务1认知自然语言处理技术任务2构建中英文翻译数据集任务3搭建Transformer神经网络任务4训练Transformer网络任务5完成文本翻译推理任务6理解Transformer网络模型01任务1认知自然语言处理及相关技术1.1自然语言处理的概念自然语言处理(NaturalLanguageProcessing,NLP)是一门融合了计算机科学、人工智能及语言学的交叉学科,它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法1.1自然语言处理的概念自然语言NaturalLanguage自然语言是指汉语、英语、法语等人们日常使用的语言,是人类社会发展演变而来的语言,而不是人造的语言,它是人类学习生活的重要工具。概括说来,自然语言是指人类社会约定俗成的,区别于如程序设计的语言的人工语言。在整个人类历史上以语言文字形式记载和流传的知识占到知识总量的80%以上。编程语言也是语言的一种,相对而言,自然语言更难处理。特点比较不同点词汇量自然语言中的词汇比编程语言中的关键词丰富,随时创造各种类型的新词结构化自然语言非结构化,而编程语言是结构化的歧义性自然语言含有大量歧义,而编程语言是确定的容错性自然语言的错误随处可见,而编程语言错误会导致编译不通过易变性自然语言变化相对迅速嘈杂一些,而编程语言的变化要缓慢得多简略性自然语言往往简洁、干练,而编程语言就要明确定义自然语言与编程语言的比较1.1自然语言处理的概念处理包含理解、转化、生成等过程。自然语言处理,是指用计算机对自然语言的形、音、义等信息进行处理,即利用计算机实现对字、词、句、段、章、篇等的输出、识别、分析、理解和生成。自然语言处理的具体表现形式包括机器翻译、文本摘要、文本分类、文本校对、信息抽取、语音合成、语音识别等。自然语言处理就是要计算机理解自然语言,自然语言处理机制涉及两个流程,包括:自然语言理解(NaturalLanguageUnderstanding,NLU):计算机能够理解自然语言文本的意义自然语言生成(NaturalLanguageGeneration,NLG):以自然语言文本来表达给定的意图。1.1自然语言处理的概念自然语言的理解和分析是一个层次化的过程:语音分析词法分析句法分析语义分析语用分析语音分析:要根据音位规则,从语音流中区分出一个个独立的音素,再根据音位形态规则找出音节及其对应的词素或词。词法分析:找出词汇的各个词素,从中获得语言学的信息。句法分析:对句子和短语的结构进行分析,目的是要找出词、短语等的相互关系以及各自在句中的作用。语义分析:找出词义、结构意义及其结合意义,从而确定语言所表达的真正含义或概念。语用分析:研究语言所存在的外界环境对语言使用者所产生的影响。1.2图灵测试在人工智能领域或者是语音信息处理领域中,学者们普遍认为采用图灵测试可以判断计算机是否理解了某种自然语言,具体的判别标准有以下几条:问答:机器人能正确回答输入文本中的有关问题。文摘生成:机器有能力生成输入文本的摘要。释义:机器能用不同的词语和句型来复述其输入的文本。翻译:机器具有把一种语言翻译成另一种语言的能力。1.3自然语言处理技术的发展02任务2构建中英文翻译数据集2.1数据集格式中英文翻译需要建立两者之前的对应关系,常见的几种格式有:①json格式,类似如下:{"english":<english>,"chinese":<chinese>}例如:{"english":"It'sabeautifulday","chinese":"今天是个好日子"}②csv格式,中间以逗号分隔:<english>,<chinese>例如:"It'sabeautifulday","今天是个好日子""artificialintelligence","人工智能"③或者以空格/制表符分割:<english> <chinese>例如:"It'sabeautifulday" "今天是个好日子"2.2数据集获取
数据结构为“英文+TAB+中文+TAB+其他说明”Becalm. 冷静点。 CC-BY2.0(France)Attribution:…Befair. 公平点。 CC-BY2.0(France)Attribution:…Bekind. 友善点。 CC-BY2.0(France)Attribution:…2.3数据集处理classTranslationDataset(Dataset):
def__init__(self,filepath,use_cache=True):
#句子数量
self.row_count=self.get_row_count(filepath)
#分词器
self.tokenizer=get_tokenizer('basic_english')
#是否需要缓存
self.use_cache=use_cache
#加载英文词典
self.en_vocab=self.get_en_vocab(filepath)
#加载中文词典
self.zh_vocab=self.get_zh_vocab(filepath)
#加载英文tokens
self.en_tokens=self.load_tokens(filepath,self.en_tokenizer,self.en_vocab,"构建英文tokens",'en')
#加载中文tokens
self.zh_tokens=self.load_tokens(filepath,self.zh_tokenizer,self.zh_vocab,"构建中文tokens",'zh')
def__getitem__(self,index):
returnself.en_tokens[index],self.zh_tokens[index]
def__len__(self):
returnself.row_count…
我们需要做的工作是将中文、英文均数字化。即:Becalm.→['be','calm','.']→查字典→[41,1442,4]冷静点。→['冷静','点','。']→查字典→[2584,182,4]以上过程可以概括为:①根据文章构建词典,例如根据cmn.txt构建所有词的中文词典和英文词典。②将句子转换为词组片段,该过程简称为分词,分词的格式有多种方法:基于空格的分词方法,基于字母的分词方法,基于子词(subword)的分词方法等。子词的分词方法示例如下:“unfortunately”=“un”+“for”+“tun”+“ate”+“ly”③基于词典查找分词后的单词在词典中的索引序号。④完成分词到索引序号的转换。建立了英文和中文每个翻译语句对应的索引序列,就可以利用深度学习方法来完成神经模型设计及训练。03任务3搭建Transformer神经网络3.1Transformer网络结构Transformer网络结构模块化解释Transformer网络结构包括输入序列向量化、位置编码、编码器、解码器和输出序列化等几个组成部分3.2.1输入序列向量化使用数学模型处理文本语料的第一步就是把文本转换成数学表示①One-Hot矩阵
问题1:矩阵的每一维长度都是字典的长度,比如字典包含10000个单词,那么每个单词对应的One-Hot向量就是1×10000的向量,而这个向量只有一个位置为1,其余都是0,浪费空间,不利于计算。问题2,One-Hot矩阵相当于简单地给每个单词编了个号,但是单词和单词之间的关系则完全体现不出来。②输入序列向量化(WordEmbedding)WordEmbedding矩阵给每个单词分配一个固定长度的向量表示,这个长度可以自行设定,比如300,实际上会远远小于字典长度(比如10000)。两个单词向量之间的夹角值可以作为他们之间关系的一个衡量:
单词之间的关系也可以进行计算,例如:
隐含了马德里和巴黎均为首都的意义。3.2.1输入序列向量化因为WordEmbedding节省空间和便于计算的特点,使得它广泛应用于NLP领域。PyTorch提供了WordEmbedding算法,代码如下:self.src_embedding=nn.Embedding(len(src_vocab),d_model,padding_idx=2)第一个参数为字典长度第二个参数为序列转为向量矩阵的维度第三个参数指出填充索引,例如我们自定义的“<pad>”,索引值为2:{0:'<s>',1:'</s>',2:'<pad>',3:'<unk>',…}第四个参数padding_idx标识了该位置的参数不参与神经网络梯度传播,即网络在训练时忽略该位置的参数更新3.2.2位置编码位置编码是一种将位置信息添加到序列数据的技术,特别用于Transformer等模型中。位置编码的目标是为了在序列数据的嵌入向量中引入位置信息。classPositionalEncoding(nn.Module):
"ImplementthePEfunction."
def__init__(self,d_model,dropout,device,max_len=5000):
super(PositionalEncoding,self).__init__()
self.dropout=nn.Dropout(p=dropout)
#初始化Shape为(max_len,d_model)的PE(positionalencoding)
pe=torch.zeros(max_len,d_model).to(device)
#初始化一个tensor[[0,1,2,3,...]]
position=torch.arange(0,max_len).unsqueeze(1)
#这里就是sin和cos括号中的内容,通过e和ln进行了变换
div_term=torch.exp(
torch.arange(0,d_model,2)*-(math.log(10000.0)/d_model)
)
#计算PE(pos,2i)
pe[:,0::2]=torch.sin(position*div_term)
#计算PE(pos,2i+1)
pe[:,1::2]=torch.cos(position*div_term)
#为了方便计算,在最外面在unsqueeze出一个batch
pe=pe.unsqueeze(0)
#如果一个参数不参与梯度下降,但又希望保存model的时候将其保存下来
#这个时候就可以用register_buffer
self.register_buffer("pe",pe)
defforward(self,x):
"""
x为embedding后的inputs,例如(1,7,128),batchsize为1,7个单词,单词维度为128
"""
#将x和positionalencoding相加。
x=x+self.pe[:,:x.size(1)].requires_grad_(False)
returnself.dropout(x)在Transformer中,位置编码采用了一种特殊的编码方式,通常使用正弦和余弦函数来生成位置编码矩阵,使得每个单词在句子中的位置编号位于[-1,1]之间。位置编码矩阵的维度与词嵌入或字符嵌入的维度相同,但其中的每个元素都对应于不同位置和不同维度的位置信息。位置编码矩阵与输入的词嵌入或字符嵌入相加,以在模型的输入中保留位置信息。这样,在经过一系列的自注意力机制和前馈神经网络层后,模型能够更好地理解序列数据的上下文和顺序信息。3.2.3编码器、解码器和输出序列化classTranslationModel(nn.Module):
def__init__(self,d_model,src_vocab,tgt_vocab,max_seq_length,device,dropout=0.1):
super(TranslationModel,self).__init__()
self.device=device
#定义原句子的embedding
self.src_embedding=nn.Embedding(len(src_vocab),d_model,padding_idx=2)
#定义目标句子的embedding
self.tgt_embedding=nn.Embedding(len(tgt_vocab),d_model,padding_idx=2)
#定义posintionalencoding
self.positional_encoding=PositionalEncoding(d_model,dropout,device,max_len=max_seq_length)
#定义Transformer
self.transformer=nn.Transformer(d_model,dropout=dropout,batch_first=True)
#定义最后的预测层,这里并没有定义Softmax,而是把他放在了模型外。
self.predictor=nn.Linear(d_model,len(tgt_vocab))
defforward(self,src,tgt):
"""
进行前向传递,输出为Decoder的输出。注意,这里并没有使用self.predictor进行预测,
因为训练和推理行为不太一样,所以放在了模型外面。
:paramsrc:原batch后的句子,例如[[0,12,34,..,1,2,2,...],...]
:paramtgt:目标batch后的句子,例如[[0,74,56,..,1,2,2,...],...]
:return:Transformer的输出,或者说是TransformerDecoder的输出。
"""
"""
生成tgt_mask,即阶梯型的mask,例如:
[[0.,-inf,-inf,-inf,-inf],
[0.,0.,-inf,-inf,-inf],
[0.,0.,0.,-inf,-inf],
[0.,0.,0.,0.,-inf],
[0.,0.,0.,0.,0.]]
tgt.size()[-1]为目标句子的长度。
"""
3.2.3编码器、解码器和输出序列化
tgt_mask=nn.Transformer.generate_square_subsequent_mask(tgt.size()[-1]).to(self.device)
#掩盖住原句子中<pad>的部分,例如[[False,False,False,...,True,True,...],...]
src_key_padding_mask=TranslationModel.get_key_padding_mask(src)
#掩盖住目标句子中<pad>的部分
tgt_key_padding_mask=TranslationModel.get_key_padding_mask(tgt)
#对src和tgt进行编码
src=self.src_embedding(src)
tgt=self.tgt_embedding(tgt)
#给src和tgt的token增加位置信息
src=self.positional_encoding(src)
tgt=self.positional_encoding(tgt)
#将准备好的数据送给transformer
out=self.transformer(src,tgt,
tgt_mask=tgt_mask,
src_key_padding_mask=src_key_padding_mask,
tgt_key_padding_mask=tgt_key_padding_mask)
3.2.3编码器、解码器和输出序列化"""
这里直接返回transformer的结果。因为训练和推理时的行为不一样,
所以在该模型外再进行线性层的预测。
"""
returnout
@staticmethod
defget_key_padding_mask(tokens,pad_idx=2):
"""
用于key_padding_mask
"""
returntokens==pad_idx
#测试网络模型device=torch.device('cuda:0'iftorch.cuda.is_available()else'cpu')
fromdataset.cmn_engimportTranslationDataset
dataset=TranslationDataset("../data/cmn-eng/cmn.txt")
model=TranslationModel(512,dataset.en_vocab,dataset.zh_vocab,50,device).to(device)
en="helloworld"
input=torch.tensor([0]+dataset.en_vocab(dataset.en_tokenizer(en))+[1]).unsqueeze(0).to(device)
zh="你"
output=torch.tensor([0]+dataset.zh_vocab(dataset.zh_tokenizer(zh))).unsqueeze(0).to(device)
result=model(input,output)
print(result)
predict=model.predictor(result[:,-1])
print(predict)
#找出最大值的index
y=torch.argmax(predict,dim=1).cpu().item()
print(dataset.zh_vocab.lookup_tokens([y]))对应的输出04任务4训练Transformer网络4网络训练及评估中英文语料数据Transformer模型KLDiv损失函数Adam优化器损失函数Loss给到模型Autograd反向传播计算梯度,并输入到优化器更新模型参数Dataloader按照BatchSize加载数据迭代训练
4网络训练及评估优化器选择了Adam优化器,Adam优化器能够快速、准确地最小化损失函数,提高深度神经网络的训练效果和泛化能力:自适应调整学习率:Adam优化器可以根据历史梯度信息来自适应地调节学习率,使得在训练初期使用较大的学习率,能够快速收敛,在训练后期使用较小的学习率,能够更加准确地找到损失函数的最小值调整动量:Adam优化器能够调整动量参数,以平衡上一次梯度和当前梯度对参数更新的影响,从而避免过早陷入局部极小值归一化处理:Adam优化器对参数的更新进行了归一化处理,使得每个参数的更新都有一个相似的量级,从而提高训练效果防止过拟合:Adam优化器结合了L2正则化的思想,在更新时对参数进行正则化,从而防止神经网络过度拟合训练数据4网络训练及评估利用TensorBoard观测运行过程损失函数变化界面可以通过TensorBoard观测训练过程:05任务5完成文本翻译推理5完成文本翻译推理deftranslate(src:str):
"""
:paramsrc:英文句子,例如"Ilikemachinelearning."
:return:翻译后的句子,例如:”我喜欢机器学习“
"""
model=torch.load(model_dir/f'model_10000.pt')
model.to(device)
model=model.eval()
#将与原句子分词后,通过词典转为index,然后增加<bos>和<eos>
src=torch.tensor([0]+dataset.en_vocab(dataset.en_tokenizer(src))+[1]).unsqueeze(0).to(device)
#首次tgt为<bos>
tgt=torch.tensor([[0]]).to(device)
#一个一个词预测,直到预测为<eos>,或者达到句子最大长度
foriinrange(max_seq_length):
#进行transformer计算
out=model(src,tgt)
#预测结果,因为只需要看最后一个词,所以取`out[:,-1]`
predict=model.predictor(out[:,-1])
#找出最大值的index
y=torch.argmax(predict,dim=1)
#和之前的预测结果拼接到一起
tgt=torch.concat([tgt,y.unsqueeze(0)],dim=1)
#如果为<eos>,说明预测结束,跳出循环
ify==1:
break
#将预测tokens拼起来
tgt=''.join(dataset.zh_vocab.lookup_tokens(tgt.squeeze().tolist())).replace("<s>","").replace("</s>","")
returntgt
print(translate("Thetrainwillprobablyarriveatthestationbeforenoon."))
print(translate("Ilikeapple."))加载模型加载词典分词序列化预测06任务6理解Transformer网络模型6.1Transformer模型结构nn.Transformer模块并没有实现Embedding、PositionalEncoding以及最后的Linear+Softmax部分,这几部分的作用总结如下:1.EmbeddingEmbedding负责将token映射成高维向量。例如将123映射成[0.34,0.45,0.123,...,0.33]。通常使用nn.Embedding来实现。但nn.Embedding的参数并不是一成不变的,也是会参与梯度下降。关于nn.Embedding可参考Python文档或相关文章,进一步查看Pytorchnn.Embedding的基本使用。2.PositionalEncodingPositionalEncoding即位置编码。用于为token编码增加位置信息,例如Ilikeapple.这三个tokenEmbedding后的向量并不包含其位置信息(like左边是I,右边是you这个信息),需要和位置编码结果进行相加。位置信息对于输出结果的影响巨大,可以自行进行实验,取消PositionalEncoding模块,比较训练结果。3.Linear+SoftmaxLinear+Softmax为一个线性层加一个Softmax,用于对nn.Transformer输出的结果进行token预测。如果把Transformer比作CNN,那么nn.Transformer实现的就是卷积层,而Linear+Softmax就是卷积层后面的线性层。6.2Transformer的输入和输出Transformer输入输出框图以文本翻译为例:输入1:原句子对应的tokens,且是完整句子。一般0表示句子开始(<s>),1表示句子结束(</s>),2为填充(<pad>)。填充的目的是为了让不同长度的句子变为同一个长度,这样才可以组成一个batch。在项目代码中,该变量一般取名src。输入2:输出(shiftedright),上一个阶段的输出。虽然名字叫outputs,但是它是输入。最开始为0(<bos>),然后本次预测出“我”后,下次调用Transformer的该输入就变成“<s>我”。在代码中,该变量一般取名tgt。输出:当前阶段的输出。这里为经过全连接nn.Linear后的输出。输出长度为中文词典长度,输出值为属于词典中某个取值的概率分布。我们取最大概率位置的索引作为输出。6.3Transformer的推理过程迭代调用Transformer模型,直到输出</s>或达到句子最大长度为止:第一次输出序列为“<s>”,第二次序列为“<s>我”,对应输出为“爱”6.4Transformer的训练过程Transformer推理时:一个词一个词输出Transformer训练时:target一次性给到Transformer训练过程,一次性输入GrouthTruth进行训练6.4nn.Transformer的构造参数
6.4nn.Transformer的构造参数多头注意力:多个头连接然后线性变换6.4nn.Transformer的构造参数注意力的计算:6.4nn.Transformer的构造参数6.5nn.Transformer的forward参数Transformer的forward参数如下:
src:Encoder的输入。也就是将token进行Embedding并PositionalEncoding之后的tensor。必填参数。Shape为(batch_size,词数,词向量维度)tgt:与src同理,Decoder的输入。必填参数。Shape为(词数,词向量维度)src_mask:对src进行mask。不常用。Shape为(词数,词数)tgt_mask:对tgt进行mask。常用。Shape为(词数,词数)memory_mask–对Encoder的输出memory进行mask。
不常用。Shape为(batch_size,词数,词数)src_key_padding_mask:对src的token进行mask.常用。Shape为(batch_size,词数)tgt_key_padding_mask:对tgt的token进行mask。常用。Shape为(batch_size,词数)memory_key_padding_mask:对tgt的token进行mask。不常用。Shape为(batch_size,词数)6.5nn.Transformer的forward参数1.src和tgtsrc参数和tgt参数分别为Encoder和Decoder的输入参数。它们是对token进行编码后,再经过PositionalEncoding之后的结果。例如:我们一开始的输入为:[[0,3,4,5,6,7,8,1,2,2]],Shape为(1,10),表示batch_size为1,每句10个词。在经过Embedding后,Shape就变成了(1,10,128),表示batch_size为1,每句10个词,每个词被编码为了128维的向量。src就是这个(1,10,128)的向量。tgt同理。6.5nn.Transformer的forward参数2.src_mask、tgt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年税务工作者工作总结范文(3篇)
- 2024-2025学年广东省清远市八校联盟高一上学期教学质量检测(二)历史试卷
- 2025年企业文化建设策划咨询协议
- 2025年企业数据保密共享协议
- 2025年基础设施建设项目合同律师服务协议
- 2025年公司员工协议范本
- 2025年设备采购租赁合同协议范本
- 2025年裂隙灯显微镜项目立项申请报告模板
- 2025年医药产品销售合同样本
- 2025年频率测量仪器项目立项申请报告模板
- 17J008挡土墙(重力式、衡重式、悬臂式)图示图集
- 地震应急预案及应急演练脚本
- 道教系统诸神仙位宝诰全谱
- 中国经济转型导论-政府与市场的关系课件
- 二十四节气文化融入幼儿园食育的有效途径
- 统计过程控制SPC培训资料
- 食品经营操作流程图
- 新视野大学英语读写教程 第三版 Book 2 unit 8 教案 讲稿
- 小学生必背古诗词80首硬笔书法字帖
- X52K铣床参数
- 村务公开表格
评论
0/150
提交评论