(预测时候Decoder是怎么输入?)transformer 模型的decoder部分 带gif动图

本文详细解释了Transformer模型中Decoder在训练和预测阶段的工作方式。在训练时,由于知道目标输出,Encoder和Decoder的输入输出可以并行处理。而在预测时,由于Decoder必须依赖于前一时刻的输出来生成下一个预测,因此必须以序列方式进行。Decoder通过添加起始符号并逐步预测每个输出 Token,确保了预测过程的正确进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

训练的时候并行,预测的时候串行
训练阶段所有encoder的正确的输入输出都是已知的,所以可以并行执行,因为我们拿ground truth进行训练,预测阶段我们并不能知道decoder会输出什么,所以只能逐个生成。
以翻译为例,训练阶段我是知道decoder最终输出是“我爱中国”,所以decoder的【输入】在训练阶段分别为(1)起始符(2)起始符+我(3)起始符+我+爱(4)起始符+我+爱+中国,因为我们知道正确的最终输出是什么,所以这4个阶段是可以并行执行的
但是预测阶段,我们是不知道decoder的输出的,所以我们只能decoder的输入只能逐步进行(1)起始符(2)起始符+decoder预测单词1(3)起始符+decoder预测单词1+decoder预测单词2,这样
在这里插入图片描述

原文链接:https://www.zhihu.com/question/337886108/answer/770243956

308 人赞同了该回答

创建于: 2019-11-13 18:23:37   编辑于: 2020-06-22 01:03:14

正好最近在学习Transformer,回答一下,可能有误,欢迎指正


要弄清楚Decoder的输入输出,关键在于图示三个箭头的位置:


以翻译为例:

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

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

Decoder执行步骤

Time Step 1

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

Time Step 2

    • 初始输入:起始符</s> + “I”+ Positonal Encoding
    • 中间输入:(我爱中国)Encoder Embedding
    • 最终输出:产生预测“Love”

Time Step 3

    • 初始输入:起始符</s> + “I”+ “Love”+ Positonal Encoding
    • 中间输入:(我爱中国)Encoder Embedding
    • 最终输出:产生预测“China”

【图示】



操作:整体右移一位(Shifted Right)

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

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

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

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

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

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

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

【总结】

Transformer Decoder的输入:

  • 初始输入:前一时刻Decoder输入+前一时刻Decoder的预测结果 + Positional Encoding
  • 中间输入:Encoder Embedding
  • Shifted Right:在输出前添加起始符,方便预测第一个Token

参考文献:


【维度笔记】

赞同 308​ 49 条评论
分享
收藏 ​ 喜欢
收起
继续浏览内容
知乎
发现更大的世界
打开
Chrome
继续
### Transformer 解码器的输入结构与数据处理 Transformer 的解码器 (Decoder) 是整个模型的重要组成部分之一,其主要功能是基于编码器的输出以及先前生成的内容逐步构建目标序列。以下是关于解码器输入结构及其数据处理方式的具体说明: #### 1. 输入构成 解码器的输入主要包括两个部分: - **来自编码器的上下文向量**:这是编码器对源序列进行编码后的连续表示形式。这些上下文向量通过多头自注意力机制被传递到解码器中[^1]。 - **前一时刻的目标序列嵌入**:在训练阶段,解码器会接收实际的目标序列作为输入;而在推理阶段,则以前一步预测的结果作为当前步的输入[^4]。 #### 2. 数据预处理过程 为了使原始文本能够适配神经网络的要求,在送入解码器之前通常需要经过以下几个步骤的数据变换操作: ##### (1)词嵌入(Token Embedding) 每一条输入语句中的单词会被映射至高维空间内的稠密向量——即所谓的“token embedding”。此步骤旨在捕捉词语间的相似性和关系特性[^2]。 ##### (2)位置编码(Positional Encoding) 由于 transformer 架构本身并不具备像 RNN 那样的天然顺序感知能力,因此引入了位置编码来显式表达 token 在句子中的相对或绝对位置信息。具体实现上可以采用正弦/余弦函数组合的方式生成固定模式的位置信号并加到对应的 token embeddings 上去[^3]。 ##### (3)掩蔽(Masking Mechanism) 对于目标端而言,在每一个时间戳 t 处只允许看到前面已经产生的 tokens 而不是未来可能出现的部分(这被称为 causal masking 或 future-timestep masking),从而确保预测逻辑的一致性并且防止泄露未发生事件的信息给当前决策点来干扰影响最终效果评估准确性。 #### 3. 综合流程概述 当上述准备工作完成后, 就可以把准备好的 inputs 提供给 decoder 层内部进一步计算分析: - 利用 masked multi-head attention 来关注自身历史记录; - 结合 encoder outputs 实现 cross-attention 功能获取更丰富的特征描述; 最后再经由全连接层完成分类或者回归任务得到最终结果概率分布用于选取最佳候选答案项. ```python import torch.nn as nn class PositionalEncoding(nn.Module): def __init__(self, d_model, max_len=5000): super().__init__() pe = ... # Compute positional encoding matrix here. self.register_buffer('pe', pe) def forward(self, x): seq_len = x.size(1) pos_encoding = Variable(self.pe[:, :seq_len], requires_grad=False).to(x.device) return x + pos_encoding def generate_square_subsequent_mask(sz): mask = (torch.triu(torch.ones((sz, sz))) == 1).transpose(0, 1) mask = mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0)) return mask ``` 以上代码片段展示了如何创建位置编码模块以及因果遮罩矩阵的方法实例。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值