当前位置:   article > 正文

NLP Transformer的Decoder的输入输出都是什么?每个部分都是什么? NLP中的encoder和decoder的输入是什么?_transformer decoder的输入

transformer decoder的输入

以翻译为例:

  • 输入:我爱中国
  • 输出: I Love China

因为输入(“我爱中国”)在Encoder中进行了编码,这里我们具体讨论Decoder的操作,也就是如何得到输出(“L Love China”)的过程。

训练过程中,第i个Decoder输入是: Encoder的输出 + 目标序列的一部分

 目标序列例如,如果一个机器翻译系统被设计为将“”英文翻译成中文“”:

  • 源语言(Encoder的输入):英文。这是原始文本所用的语言,需要被翻译。
  • 目标语言(Decoder的输入和输出):中文。这是翻译的目标,即我们希望模型生成的语言。

推理过程中,第i个Decoder输入是:  Encoder的输出 + 第(i-1)个decoder输出。

第一次decoder的输入是:Decoder接收初始输入(开始符号)(如“<s>”)和来自Encoder的输出。基于这些信息,它生成对序列中下一个词的预测。

transformer模型与常规的seq2seq模型不同,

  • 常规的seq2seq模型的 Decoder的输入则是目标序列数据,以及来自Encoder的上下文向量。Decoder通过逐个生成目标序列中的单词或字符,从而输出翻译或生成的结果,
  • 在Transformer模型中,encoder和decoder都接收完整的源序列和目标序列作为输入,并使用自注意力机制进行编码和解码

训练时因为知道ground truth embeding,相当于知道正确答案,网络可以一次训练完成。
预测时,首先输入start,输出预测的第一个单词 然后start和新单词组成新的query,再输入decoder来预测下一个单词,循环往复 直至end 

Decoder执行步骤(推理过程)

Time Step 1

    • 初始输入: 起始符</s> + Positional Encoding(位置编码)
    • 中间输入: 整个Encoder Embedding【也就是“我爱中国”的Embedding】
    • 最终输出:产生预测“I”

在这里插入图片描述

Time Step 2

    • 初始输入:起始符</s> + “I”+ Positonal Encoding
    • 中间输入:整个Encoder Embedding【也就是“我爱中国”的Embedding】
    • 最终输出:产生预测“Love”

Time Step 3

    • 初始输入:起始符</s> + “I”+ “Love”+ Positonal Encoding
    • 中间输入:整个Encoder Embedding【也就是“我爱中国”的Embedding】
    • 最终输出:产生预测“China”


为什么整体右移一位(Shifted Right)

回答:在输出(Decoder的输入)前添加起始符,方便预测第一个Token

细心的同学会发现论文在Decoder的输入上,对Outputs有Shifted Right操作。

Shifted Right 实质上是给输出(Decoder的输入)添加起始符/结束符,方便预测第一个Token/结束预测过程。

正常的输出序列位置关系如下:

  • 0-"I"
  • 1-"Love"
  • 2-"China"

但在执行的过程中,我们在初始输出(Decoder的输入)中添加了起始符</s>,相当于将输出整体右移一位(Shifted Right),所以输出序列变成如下情况:

  • 0-</s>【起始符】
  • 1-“I”
  • 2-“Love”
  • 3-“China”

这样我们就可以通过起始符</s>预测“I”,也就是通过起始符预测实际的第一个输出。

(预测时候Decoder是怎么输入?)transformer 模型的decoder部分 带gif动图_decoder动态图_薛定谔的炼丹炉!的博客-CSDN博客

哪位大神讲解一下Transformer的Decoder的输入输出都是什么?能解释一下每个部分都是什么? - 知乎


NLP中的encoder和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 序列移除。

  1. if self.myargs.pred_target == 'reconstruction':
  2. decoder_smiles = encoder_smiles
  3. elif self.myargs.pred_target == 'canonical':
  4. decoder_smiles = mol
  5. elif self.myargs.pred_target == 'nearestn':
  6. start_idx = 1 if self.retrieval[mol][0] == mol else 0
  7. decoder_smiles = self.retrieval[mol][start_idx]
  8. self.retrieval[mol] = self.retrieval[mol][start_idx + 1:]

代码示例:

  1. # 4、将融合后的memory输入到decoder中
  2. model_output = self.decoder(
  3. decoder_embs,
  4. fused_memory,
  5. tgt_mask=tgt_mask,
  6. tgt_key_padding_mask=decoder_pad_mask,
  7. memory_key_padding_mask=encoder_pad_mask.clone()
  8. )

# 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内容。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/348293?site
推荐阅读
相关标签
  

闽ICP备14008679号