赞
踩
以翻译为例:
因为输入(“我爱中国”)在Encoder中进行了编码,这里我们具体讨论Decoder的操作,也就是如何得到输出(“L Love China”)的过程。
训练过程中,第i个Decoder输入是: Encoder的输出 + 目标序列的一部分
目标序列:例如,如果一个机器翻译系统被设计为将“”英文翻译成中文“”:
- 源语言(Encoder的输入):英文。这是原始文本所用的语言,需要被翻译。
- 目标语言(Decoder的输入和输出):中文。这是翻译的目标,即我们希望模型生成的语言。
推理过程中,第i个Decoder输入是: Encoder的输出 + 第(i-1)个decoder输出。
第一次decoder的输入是:Decoder接收初始输入(开始符号)(如“<s>”)和来自Encoder的输出。基于这些信息,它生成对序列中下一个词的预测。
transformer模型与常规的seq2seq模型不同,
训练时因为知道ground truth embeding,相当于知道正确答案,网络可以一次训练完成。
预测时,首先输入start,输出预测的第一个单词 然后start和新单词组成新的query,再输入decoder来预测下一个单词,循环往复 直至end
回答:在输出(Decoder的输入)前添加起始符,方便预测第一个Token
细心的同学会发现论文在Decoder的输入上,对Outputs有Shifted Right操作。
Shifted Right 实质上是给输出(Decoder的输入)添加起始符/结束符,方便预测第一个Token/结束预测过程。
正常的输出序列位置关系如下:
但在执行的过程中,我们在初始输出(Decoder的输入)中添加了起始符</s>,相当于将输出整体右移一位(Shifted Right),所以输出序列变成如下情况:
这样我们就可以通过起始符</s>预测“I”,也就是通过起始符预测实际的第一个输出。
(预测时候Decoder是怎么输入?)transformer 模型的decoder部分 带gif动图_decoder动态图_薛定谔的炼丹炉!的博客-CSDN博客
哪位大神讲解一下Transformer的Decoder的输入输出都是什么?能解释一下每个部分都是什么? - 知乎
最近在看一个论文,原来我不是做NLP的,看了很久的NLP代码后发现decoder的输入和image的那一套的输入不一样,因为NLP是序列模型,主要是做的预测下一个序列是什么。所以decoder的输入并不是我传统认为的encoder的输出,decoder的输入是什么取决于你定义的任务是什么?并且encoder的输入直接放在decoder中也是无法重建为原来的输入的。
NLP中的encoder和decoder更像是连成一起的东西,而不像VAE这种encoder和decoder单独拿出来做故事。
例如下面的代码,取决于预测目标的不同,decoder的输入(decoder_smiles)也不同,
如果预测目标为 'reconstruction'
,则将解码器的 SMILES 设置为与编码器相同,即 decoder_smiles = encoder_smiles
。
如果预测目标为 'canonical'
,则将解码器的 SMILES 设置为变量 mol
,表示train,valid,test中的分子列表
如果预测目标为 'nearestn'
,则通过检索字典 self.retrieval
中与变量 mol
相关的条目,获取与之最相似的一个 SMILES 序列,并将其设置为解码器的输入。然后,更新 self.retrieval
,将已使用过的 SMILES 序列移除。
- if self.myargs.pred_target == 'reconstruction':
- decoder_smiles = encoder_smiles
- elif self.myargs.pred_target == 'canonical':
- decoder_smiles = mol
- elif self.myargs.pred_target == 'nearestn':
- start_idx = 1 if self.retrieval[mol][0] == mol else 0
- decoder_smiles = self.retrieval[mol][start_idx]
- self.retrieval[mol] = self.retrieval[mol][start_idx + 1:]
- # 4、将融合后的memory输入到decoder中
- model_output = self.decoder(
-
- decoder_embs,
- fused_memory,
- tgt_mask=tgt_mask,
- tgt_key_padding_mask=decoder_pad_mask,
- memory_key_padding_mask=encoder_pad_mask.clone()
-
- )
# decoder_embs: 这是经过嵌入层处理的目标序列的表示,通常是指在序列到序列模型中的目标语言(例如,在翻译任务中,如果输入是英语,则目标可能是法语)。这些嵌入通常包含了关于目标序列单词的信息。
# fused_memory: 这是从encoder传递给decoder的信息,通常是encoder对输入序列(如源语言)的embedding表示。这个编码包含了输入序列的重要信息,decoder利用这些信息来更好地生成输出序列。
# tgt_mask: 目标掩码(Target Mask)是一种机制,用于防止decoder在生成一个特定词时看到未来的词。在Transformer模型中,这通常通过所谓的“前瞻掩码”来实现,确保在预测当前词时,仅使用到当前词之前的词。
# tgt_key_padding_mask: 用于指示目标序列(target sequence)中填充(padding)元素的位置,在处理不同长度的序列时,较短的序列会被填充以匹配最长序列的长度。这个掩码告诉decoder应该忽略target中的填充的部分,因为填充的部分对于理解或生成目标序列没有实际意义。
# memory_key_padding_mask: 这是另一个padding掩码,用于编码器的输出。它确保decoder在使用来自编码器的信息时忽略任何padding内容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。