输入 输出
回归任务 向量
分类任务 图片 类别
序列 类别
生成任务 序列 序列

不同 NLP 任务的输入输出形式:

任务类型 输入形式 输出形式 示例(输入 -> 输出)
文本分类 一个文本序列 一个类别标签 "这部电影太棒了!" -> "正面"
文本生成 一个文本序列(上文) 一个文本序列(下文) "中国的首都是" -> "北京"
序列标注 一个文本序列 等长的标签序列 "小明在北京上学" -> ["B-PER","I-PER","O","B-LOC","O","O"]
句子对任务 两个文本序列 一个类别标签或分数 ["苹果好吃","我不喜欢苹果"] -> "矛盾"

Seq2Seq(Sequence-to-Sequence) 是一种将一个序列转换为另一个序列的通用模型架构。它最初为解决机器翻译问题而提出,后来被广泛应用于文本摘要、对话生成、语音识别、代码生成等众多任务。

Seq2Seq 的核心思想是:使用一个编码器(Encoder) 将输入序列编码为一个固定长度的上下文向量(Context Vector),然后使用一个解码器(Decoder) 从这个上下文向量中逐步生成输出序列。

输入序列: [x1, x2, x3, ..., xn]
         ↓
    ┌────────────┐
    │  编码器     │  (RNN/LSTM/Transformer)
    └────────────┘
         ↓
    上下文向量 (Context Vector)
         ↓
    ┌────────────┐
    │  解码器     │  (RNN/LSTM/Transformer)
    └────────────┘
         ↓
输出序列: [y1, y2, y3, ..., ym]

Decoder

整个过程可以分为两大步:

  1. 编码器:理解输入,形成“语义精髓”

    • 输入:原始文本序列,例如法语句子 "Je t'aime"

    • 过程:编码器(通常是一个 RNN、LSTM 或 Transformer 编码器)逐个词地读取这个句子。它不仅仅是看到单个的词,更重要的是捕捉词与词之间的顺序和依赖关系,从而理解整个句子的含义。

    • 输出:编码器将整个句子的“语义精髓”浓缩成一个或多个上下文向量。这个向量是编码器对输入信息的最终总结,包含了生成目标句子所需的所有关键信息。

  2. 解码器:逐词生成,将“精髓”展开为文字

    • 输入:它接收两个东西——一是来自编码器的上下文向量(即句子的“语义精髓”),二是它自己在上一个时间步生成的词。

    • 过程:解码器是一个自回归模型,这意味着它是一个词一个词地生成句子的。

      • 第一步:解码器接收一个特殊的开始符 <sos> (start of sequence) 和上下文向量,预测出第一个最可能的目标词,比如英文的 "I"

      • 第二步:解码器将第一步生成的 "I" 作为输入,再次结合上下文向量,预测出第二个词 "love"

      • 第三步:将 "love" 作为输入,预测出第三个词 "you"

      • 最后一步:当解码器预测出特殊的结束符 <eos> (end of sequence) 时,生成过程停止。

自回归(Autoregressive) 是一种在时间序列预测和自然语言生成中广泛使用的建模方法。它的核心思想是:用过去的值来预测未来的值。在自然语言处理中,这意味着模型根据已经生成的词来预测下一个词。

“自回归”这个名字源于统计学和时间序列分析:

  • 自(Auto):表示自己

  • 回归(Regression):表示用过去预测未来

在推理(生成)时,必须逐个词生成,因为未来的词还不知道:

step1: 输入 ["<sos>"] → 输出 ["我"]
step2: 输入 ["<sos>", "我"] → 输出 ["爱"]
step3: 输入 ["<sos>", "我", "爱"] → 输出 ["NLP"]

维度 编码器(Encoder) 解码器(Decoder)
主要任务 理解输入序列,提取特征 根据理解生成输出序列
输入 原始序列(如源语言句子) 目标序列(已生成部分)及编码器输出
输出 输入序列的上下文表示 下一个词元的概率分布
注意力机制 可看到整个输入序列(双向) 只能看到已生成部分(单向/因果掩码)
典型应用 文本分类、语义理解 文本生成、机器翻译
代表模型 BERT、RoBERTa GPT、LLaMA
编码器层结构:
输入 → 多头自注意力 → 残差&层归一 → 前馈网络 → 残差&层归一 → 输出

解码器层结构:
输入 → 掩码多头自注意力 → 残差&层归一 
     → 编码器-解码器注意力 → 残差&层归一 
     → 前馈网络 → 残差&层归一 → 输出

问题:一步错步步错,只能串行不能并行(慢)

优点

  • 生成质量高:每一步都基于真实的历史,能捕捉复杂的依赖关系。

  • 概率解释清晰:可以精确计算序列的概率。

  • 灵活性:可以处理变长序列。

缺点

  • 生成速度慢:必须串行生成,无法并行。

  • 误差累积:如果某一步预测错误,错误会传播到后续步骤。

  • 训练推理不一致:训练时用教师强制(看到真实历史),推理时看到的是自己生成的历史,可能存在差异。

特性 自回归模型 非自回归模型
生成方式 逐个词生成,每一步依赖上一步输出 一次性生成整个序列
速度 慢(串行计算) 快(并行计算)
质量 通常更高,能捕捉长距离依赖 可能稍差,难以处理依赖关系
典型模型 GPT、LSTM 语言模型

部分非自回归翻译模型(如 NAT)

Masked Self-attention

掩码自注意力(Masked Self-Attention) 是 Transformer 解码器中的核心机制,它通过在自注意力计算中引入掩码,确保模型在生成每个位置的输出时只能看到当前位置之前的信息,而无法看到未来的信息。这是实现自回归生成的关键技术。

特性 标准自注意力 掩码自注意力
可见范围 整个序列 当前位置及之前的位置
掩码矩阵 上三角为 -∞ 的矩阵
适用场景 编码器、非自回归任务 解码器、自回归生成任务
典型模型 BERT 的注意力层 GPT 的注意力层
计算复杂度 O(n²) O(n²)(相同,但多一步掩码)

在自回归生成任务中(如文本生成、机器翻译的解码阶段),模型需要逐个词地生成输出序列。当预测第 t 个词时,模型只能依赖已经生成的词(位置 1 到 t-1),而不能看到未来的词(位置 t 及以后)。如果不加掩码,自注意力会让每个位置都能看到整个序列,这就相当于“作弊”——模型可以根据未来的词来预测当前词,这在真实生成场景中是不可能的。

4阶掩码矩阵(下三角矩阵)

位置:   1    2    3    4
1: [ 0, -∞, -∞, -∞ ]
2: [ 0,  0, -∞, -∞ ]
3: [ 0,  0,  0, -∞ ]
4: [ 0,  0,  0,  0 ]
解码器输入
    ↓
[掩码多头自注意力]  ← 这里使用因果掩码,防止看到未来
    ↓
[残差连接 + 层归一化]
    ↓
[编码器-解码器注意力]  ← 这里无掩码,可以关注编码器所有输出
    ↓
[残差连接 + 层归一化]
    ↓
[前馈网络]
    ↓
[残差连接 + 层归一化]
    ↓
解码器输出

Cross-Attention

交叉注意力(Cross-Attention) 是 Transformer 解码器中的一个关键子层,它允许解码器在生成每个目标词时,动态地关注编码器输出的所有位置,从而获取输入序列的相关信息。它是连接编码器和解码器的桥梁,也是 Seq2Seq 模型能够有效工作的核心。

交叉注意力与自注意力在计算上非常相似,唯一的区别在于 Query、Key、Value 的来源不同

组件 自注意力 交叉注意力
Query 来自当前层输入(同一序列) 来自解码器上一层的输出
Key 来自当前层输入 来自编码器的输出
Value 来自当前层输入 来自编码器的输出
  1. 解码器 的上一子层输出作为 Query

  2. 编码器 的最终输出作为 Key 和 Value

  3. 计算 Query 与所有 Key 的注意力分数,得到每个编码器位置的权重。

  4. 用这些权重对 Value 加权求和,得到当前解码器位置关注的上下文向量。

  5. 这个上下文向量与解码器的输入一起用于后续计算。

生成任务Training

交叉熵损失函数

输入:start+label

输出:label+end

输入长度=输出长度

计算输出与真实label+end之间的损失

ground truth真实标签

生成任务的推断

Beam Search

Beam Search(束搜索) 是一种在序列生成任务(如机器翻译、文本摘要、对话生成)中常用的解码策略。它在每个时间步保留多个候选序列(称为“束”),而不是像贪心搜索那样只保留一个最优解,从而在生成质量和计算效率之间取得平衡。

当前候选:
1. "我" (0.4)
   - "我 爱" (0.4 × 0.5 = 0.20)
   - "我 很" (0.4 × 0.3 = 0.12)
2. "爱" (0.3)
   - "爱 你" (0.3 × 0.6 = 0.18)
   - "爱 我" (0.3 × 0.2 = 0.06)

保留 top 2: ["我 爱"(0.20), "爱 你"(0.18)]
束宽 优点 缺点
小 (如 1) 速度快,计算量小 易陷入局部最优,生成质量可能较差
中 (如 4-10) 平衡质量和速度,多数任务常用 计算量随 k 线性增长
大 (如 50+) 更可能找到全局最优 计算量巨大,收益递减,可能引入噪声

贪婪策略

贪心搜索在每个时间步只选择概率最高的词作为输出。虽然简单高效,但它容易陷入局部最优——当前的最佳选择可能导致后续无法生成整体最优的句子。

例子:翻译 "I love NLP"

  • 贪心可能选择概率最高的第一个词 "I"(没问题)

  • 但第二个词,可能 "really" 概率比 "love" 略低,但若选了 "really",后面可能生成不通顺的句子

  • 贪心无法回头修正

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐