Transformer模型中的解码器自回归生成机制详解
字数 2338 2025-12-15 06:21:50

Transformer模型中的解码器自回归生成机制详解


一、问题描述

在Transformer的解码器中,自回归生成(Autoregressive Generation)是实现序列生成(如机器翻译、文本生成)的核心机制。它要求解码器在生成当前词时,只能依赖已生成的左侧词,而不能看到未来词。这个过程涉及掩码多头注意力编码器-解码器注意力逐步生成等技术。

关键问题

  1. 如何通过掩码实现自回归约束?
  2. 解码器在推理时如何逐步生成序列?
  3. 训练与推理阶段的自回归机制有何差异?

二、核心机制分步讲解

步骤1:自回归的数学形式

设目标序列为 \(y = (y_1, y_2, ..., y_T)\),解码器生成第 \(t\) 个词的概率为:

\[P(y_t \mid y_1, ..., y_{t-1}, \text{Encoder输出}) \]

即当前词仅依赖于历史已生成词和编码器信息。


步骤2:训练阶段的掩码注意力实现

  1. 输入处理

    • 将完整的目标序列右移一位(添加起始符<sos>),作为解码器输入。
    • 例如:生成序列 "I love AI",输入为 "<sos> I love AI",输出对应 "I love AI <eos>"
  2. 掩码多头注意力层

    • 在计算注意力分数时,对未生成的未来位置添加负无穷掩码-inf),使得Softmax后未来位置的权重为0。
    • 掩码矩阵示例(序列长度=4):
      [[0, -inf, -inf, -inf],
       [0,   0, -inf, -inf],
       [0,   0,    0, -inf],
       [0,   0,    0,    0]]
      
      其中 0 表示允许注意力,-inf 表示屏蔽。
  3. 编码器-解码器注意力层

    • 这一层无需掩码,因为解码器可以访问编码器的全部输出(已完整编码源序列)。
    • Query来自解码器上层输出,Key/Value来自编码器输出。
  4. 训练目标

    • 使用交叉熵损失,并行计算所有位置的输出概率(因已知完整目标序列)。

步骤3:推理阶段的逐步生成

推理时目标序列未知,需逐步生成:

  1. 初始化

    • 输入起始符<sos>,编码器输入为源序列(如待翻译的句子)。
  2. 循环生成步骤(以时间步 \(t\) 为例):

    • 步骤①:将当前已生成的序列 \((y_1, ..., y_{t-1})\) 输入解码器。
    • 步骤②:解码器通过掩码注意力计算最后一词 \(y_{t-1}\) 的隐状态,输出下一个词的概率分布 \(P(y_t)\)
    • 步骤③:从分布中采样或选取最高概率词(如Top-k采样),将新词 \(y_t\) 追加到序列。
    • 步骤④:重复直到生成结束符<eos>或达到最大长度。
  3. 关键优化

    • 缓存机制(Key-Value Cache):
      每个时间步仅新增一个词的查询,而之前词的Key/Value可缓存,避免重复计算,大幅提升效率。

步骤4:训练与推理的差异对比

方面 训练阶段 推理阶段
输入序列 完整目标序列(右移) 逐步生成的序列(从起始符开始)
注意力掩码 下三角掩码矩阵 动态扩展的掩码(每步追加新词)
并行性 全序列并行计算 逐词顺序生成(但可批处理多个样本)
Key/Value计算 每轮重新计算(但可用缓存优化) 依赖缓存避免重复计算

三、具体例子说明

以翻译任务为例:

  • 源序列"今天天气很好"
  • 目标序列"The weather is nice today"

训练阶段

  1. 解码器输入:"<sos> The weather is nice today"
  2. 通过掩码注意力,计算 "The" 时看不到后续词,计算 "weather" 时只能看到 "<sos> The",依此类推。

推理阶段

  1. 输入 <sos> → 输出 "The"
  2. 输入 <sos> The → 输出 "weather"
  3. 输入 <sos> The weather → 输出 "is"
  4. 持续直到生成 <eos>

四、常见面试问题延伸

  1. 为什么推理必须逐词生成?

    • 因为生成当前词前,未来词未知,无法并行计算完整序列的概率分布。
  2. 如何加速推理?

    • 缓存机制:保存历史词的Key/Value,减少重复计算。
    • 束搜索(Beam Search):保留多个高概率候选序列,平衡质量与效率。
  3. 掩码如何实现?

    • 在Softmax前,将未来位置的注意力分数加一个极大负数(如 -1e9),使权重接近0。
  4. 自回归与非自回归生成的对比?

    • 自回归(如Transformer):质量高但速度慢,适合对准确性要求高的任务。
    • 非自回归(如NAT):并行生成所有词,速度快但可能损失一致性,需额外技术(如迭代修正)。

通过以上步骤,你可以理解Transformer解码器如何通过掩码实现自回归约束,并在推理时逐步生成序列。此机制是生成式任务(如GPT、机器翻译)的核心基础。

Transformer模型中的解码器自回归生成机制详解 一、问题描述 在Transformer的解码器中, 自回归生成 (Autoregressive Generation)是实现序列生成(如机器翻译、文本生成)的核心机制。它要求解码器在生成当前词时,只能依赖已生成的左侧词,而不能看到未来词。这个过程涉及 掩码多头注意力 、 编码器-解码器注意力 和 逐步生成 等技术。 关键问题 : 如何通过掩码实现自回归约束? 解码器在推理时如何逐步生成序列? 训练与推理阶段的自回归机制有何差异? 二、核心机制分步讲解 步骤1:自回归的数学形式 设目标序列为 \( y = (y_ 1, y_ 2, ..., y_ T) \),解码器生成第 \( t \) 个词的概率为: \[ P(y_ t \mid y_ 1, ..., y_ {t-1}, \text{Encoder输出}) \] 即当前词仅依赖于 历史已生成词 和编码器信息。 步骤2:训练阶段的掩码注意力实现 输入处理 : 将完整的目标序列右移一位(添加起始符 <sos> ),作为解码器输入。 例如:生成序列 "I love AI" ,输入为 "<sos> I love AI" ,输出对应 "I love AI <eos>" 。 掩码多头注意力层 : 在计算注意力分数时,对未生成的未来位置添加 负无穷掩码 ( -inf ),使得Softmax后未来位置的权重为0。 掩码矩阵示例 (序列长度=4): 其中 0 表示允许注意力, -inf 表示屏蔽。 编码器-解码器注意力层 : 这一层 无需掩码 ,因为解码器可以访问编码器的全部输出(已完整编码源序列)。 Query来自解码器上层输出,Key/Value来自编码器输出。 训练目标 : 使用交叉熵损失,并行计算所有位置的输出概率(因已知完整目标序列)。 步骤3:推理阶段的逐步生成 推理时目标序列未知,需逐步生成: 初始化 : 输入起始符 <sos> ,编码器输入为源序列(如待翻译的句子)。 循环生成步骤 (以时间步 \( t \) 为例): 步骤① :将当前已生成的序列 \( (y_ 1, ..., y_ {t-1}) \) 输入解码器。 步骤② :解码器通过掩码注意力计算最后一词 \( y_ {t-1} \) 的隐状态,输出下一个词的概率分布 \( P(y_ t) \)。 步骤③ :从分布中采样或选取最高概率词(如Top-k采样),将新词 \( y_ t \) 追加到序列。 步骤④ :重复直到生成结束符 <eos> 或达到最大长度。 关键优化 : 缓存机制 (Key-Value Cache): 每个时间步仅新增一个词的查询,而之前词的Key/Value可缓存,避免重复计算,大幅提升效率。 步骤4:训练与推理的差异对比 | 方面 | 训练阶段 | 推理阶段 | |------------------------|--------------------------------------|--------------------------------------| | 输入序列 | 完整目标序列(右移) | 逐步生成的序列(从起始符开始) | | 注意力掩码 | 下三角掩码矩阵 | 动态扩展的掩码(每步追加新词) | | 并行性 | 全序列并行计算 | 逐词顺序生成(但可批处理多个样本) | | Key/Value计算 | 每轮重新计算(但可用缓存优化) | 依赖缓存避免重复计算 | 三、具体例子说明 以翻译任务为例: 源序列 : "今天天气很好" 目标序列 : "The weather is nice today" 训练阶段 : 解码器输入: "<sos> The weather is nice today" 通过掩码注意力,计算 "The" 时看不到后续词,计算 "weather" 时只能看到 "<sos> The" ,依此类推。 推理阶段 : 输入 <sos> → 输出 "The" 输入 <sos> The → 输出 "weather" 输入 <sos> The weather → 输出 "is" 持续直到生成 <eos> 。 四、常见面试问题延伸 为什么推理必须逐词生成? 因为生成当前词前,未来词未知,无法并行计算完整序列的概率分布。 如何加速推理? 缓存机制 :保存历史词的Key/Value,减少重复计算。 束搜索(Beam Search) :保留多个高概率候选序列,平衡质量与效率。 掩码如何实现? 在Softmax前,将未来位置的注意力分数加一个极大负数(如 -1e9 ),使权重接近0。 自回归与非自回归生成的对比? 自回归(如Transformer):质量高但速度慢,适合对准确性要求高的任务。 非自回归(如NAT):并行生成所有词,速度快但可能损失一致性,需额外技术(如迭代修正)。 通过以上步骤,你可以理解Transformer解码器如何通过掩码实现自回归约束,并在推理时逐步生成序列。此机制是生成式任务(如GPT、机器翻译)的核心基础。