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

以翻译为例:

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

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

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

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

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

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

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

这里来自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(位置编码)
  • 中间输入(Deocder中与Encoder交互的部分): 整个Encoder Embedding【也就是“我爱中国”的Embedding】
  • 最终输出:产生预测“I”

Time Step 2

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

Time Step 3

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

训练过程:

训练过程与推理过程不一样的地方在于训练的时候会在decoder中使用mask,然后在time step后求loss就可以了

 

这里需要注意的点:

1)Encoder生成的是KV矩阵(KV来源于Encoder)

2)Decoder生成的是Q矩阵(Q来源于本身)


为什么整体右移一位(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 序列移除。

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

1.从全局角度概括Transformer_哔哩哔哩_bilibili

  • 24
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马鹏森

太谢谢了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值