Seq2seq应用

Sequence-to-sequence(简称 Seq2seq,序列到序列) 是一种深度学习的通用建模框架,核心逻辑是将一个任意长度的输入序列,映射为另一个任意长度的输出序列,输入和输出的长度可以不相等,输出长度由模型自主决定。它是解决  “输入输出均为可变长度序列” 这类问题的通用范式,只要任务可以抽象为「序列→序列」的映射,就可以用 Seq2seq 架构解决,因此广泛成为自然语言处理(NLP)、语音处理等领域的核心框架。

Seq2seq在传统NLP任务中的应用有以下几种:

  1. 语音识别(Speech Recognition):
    1. 输入:长度为 T 的语音波形时间序列(音频信号,连续时间帧组成的序列)
    2. 输出:长度为 N 的文本字符 / 词语序列
    3. T 与 N 不相等,模型直接将输入的语音序列映射为不同长度的文本序列,完全符合 Seq2seq “输入序列→输出序列,长度由模型决定” 的核心特性。
  2. 机器翻译(Machine Translation):
    1. 输入:长度为 N 的源语言文本序列(如中文 “机器学习”,4 个汉字)
    2. 输出:长度为 N' 的目标语言文本序列(如英文 “machine learning” ,2 个单词)
    3. Seq2seq 最经典的应用场景。编码器编码源语言序列的语义信息,解码器基于该信息生成目标语言序列,完美适配 “源语言序列→目标语言序列” 的可变长度映射需求。
  3. 端到端语音翻译(Speech Translation):
    1. 输入:长度为 T 的源语言语音波形序列
    2. 输出:长度为 N 的目标语言文本序列
    3. 跳过 “语音转文本” 的中间步骤,直接将语音序列端到端映射为目标语言文本序列,输入输出长度可变。
  4. 语音合成(Text-to-Speech, TTS):
                                        
    1. 输入:长度为 N 的文本字符 / 词语序列(如英文 “hello!”)
    2. 输出:长度为 T 的语音波形时间序列(音频信号)
    3. 输入是文本序列,输出是语音时间序列,长度不固定。图中的 Tacotron 架构是典型的 Seq2seq+Attention 实现,Encoder(含 CBHG 模块)编码文本序列,Decoder(RNN+Attention)生成声学特征序列,最终通过声码器(Vocoder)转为语音,完全遵循 Seq2seq 的 “编码 - 解码” 序列映射逻辑。
  5. 聊天机器人(Chatbot):
    1. 输入:用户输入的对话文本序列(如 “Hi”)
    2. 输出:机器人生成的回复文本序列(如 “Hello! How are you today?”)
    3. 将对话建模为 “用户输入序列→机器人回复序列”的映射,训练数据为对话对(输入 - 回复),模型学习从输入序列生成符合语境的输出回复序列,输入输出长度可变,是 Seq2seq 在对话系统的经典应用。
  6. 问答系统(Question Answering, QA):
    1. 输入:“问题(Question)+ 上下文(Context)”  组成的文本序列(如问题 “What is a major importance... + 上下文...Southern California is a major economic center...”)
    2. 输出:“答案(Answer)”文本序列(如 “major economic center”)
    3. 将 QA 任务抽象为 “问题 + 上下文序列→答案序列” 的映射,直接用 Seq2seq 生成答案(而非分类 / 抽取),输入输出长度可变。

上述任务(语音识别、机器翻译、语音翻译、TTS、聊天机器人、问答系统)核心都围绕语言 / 语音序列的处理,因此绝大多数属于自然语言处理(NLP)或语音处理(Speech Processing,NLP 的交叉领域)。

并且,所有的Seq2seq NLP 任务都可以统一抽象为「Question-Answering(QA)」范式,核心是把 “输入序列” 定义为问题(Question)+ 上下文(Context),把 “输出序列” 定义为答案(Answer),本质是 “给定问题 ,生成对应答案”。各任务转换为QA范式如下:

所有 Seq2seq 任务都可以被统一到 QA 框架下,这也是大语言模型(LLM)能通过 “指令微调” 统一所有 NLP 任务的核心原理。

Seq2seq在非传统NLP任务中的应用:

  1. 句法分析(Syntactic Parsing):句法分析的目标是给输入的自然语言句子,生成对应的句法树(标注句子的语法结构,如名词短语 NP、动词短语 VP、形容词短语 ADJV 等)。
                              
    1. 输入:长度为 N 的单词序列(如 deep learning is very powerful5 个单词组成的序列)
    2. 输出:长度为 M 的线性化句法树序列(如 (S (NP deep learning ) (VP is (ADJV very powerful ))),用括号表示的树形结构的线性序列)
  2. 多标签分类(Multi-label Classification):多标签分类的目标是给一个输入样本(如一篇文章、一张图片),预测它属于多个类别标签(一个样本可同时属于多个类,区别于单标签分类)。
    1. 输入:输入样本的特征序列(如文本序列、图像特征序列,图中以文档为例)
    2. 输出:长度为 K 的标签序列(如 Class 9, Class 7, Class 13,按顺序生成的标签列表)
    3. 传统多标签分类是 “多分类问题”,需要固定标签数量、用 softmax 输出每个标签的概率;而 Seq2seq 的思路是把标签集合转化为标签序列生成问题。
  3. 目标检测(Object Detection):目标检测的目标是给输入图像,检测出图像中的所有物体,输出每个物体的类别和bounding box(边界框)坐标。
                        
    1. 输入:图像的视觉特征序列(CNN 提取的图像特征,加上空间位置编码,组成长度为N 的特征序列)
    2. 输出:长度为 M 的物体检测结果序列(每个元素是 “类别 + 边界框坐标”,对应图中 3 个斑马的检测结果)
    3. 上图使用的模型是DETR,传统目标检测(如 Faster R-CNN、YOLO)是 “锚框 + 分类” 的范式,而 DETR(Detection Transformer)首次把目标检测完全转化为Seq2seq 问题,结构就是标准的 Transformer Encoder-Decoder

Seq2seq 的本质不是 “语言模型”,而是 “序列到序列的通用映射框架”,只要任务可以被抽象为 “输入一个任意长度的序列 → 输出一个任意长度的序列”,就可以用 Seq2seq(尤其是 Transformer)解决。

Seq2seq结构

Sequence-to-sequence(Seq2seq)的本质是 “编码器 - 解码器(Encoder-Decoder)” 的通用建模框架,核心目标是将任意长度的输入序列 X=(x_{1},x_{2},\cdots ,x_{T}),映射为任意长度的输出序列 Y=(y_{1},y_{2},\cdots ,y_{N})( T 与 N 可完全不相等)。无论后续如何升级(加 Attention、换 Transformer),Seq2seq 的核心逻辑始终不变:

  • Encoder(编码器):理解输入,将输入序列压缩为上下文信息。一般Encoder 的输入序列长度与输出序列长度相等(如Transformer Encoder、BERT、大多数视觉 Encoder(如 DETR 的视觉 Encoder)),这是因为Encoder 本质是特征提取器 / 映射函数,它的核心任务是对序列中的每个元素进行深度特征变换,并建模元素间的依赖关系;但也有少数不相等的时候,比如经典 RNN Encoder、CNN Encoder、语音识别中的 Conv 层,这些模型之所以Encoder输出于输入序列长度不相等,主要是为了降低计算量,或者将局部特征聚合为更粗粒度的特征。
                                                         
  • Decoder(解码器):生成输出,基于上下文信息逐词生成目标序列。
  • 注意力机制(Attention):连接编码器与解码器,动态传递相关信息。

Seq2seq的原始版本完全基于循环神经网络(RNN/LSTM/GRU)实现:

  • Encoder(编码器):将输入序列X=(x_{1},x_{2},\cdots ,x_{T})编码为一个固定长度的上下文向量 c,用 c 承载整个输入序列的全部语义 / 特征信息。目的是作为解码器输入,让解码器能看到完整的输入内容,实现输入到输出的映射基础。
    实现上是用一个单向 / 双向循环神经网络(RNN/LSTM/GRU),逐时间步处理输入序列,更新隐藏状态,最终用最后一个时间步的隐藏状态作为上下文向量 c
  • Decoder(解码器):基于上下文向量 c,和已生成的历史输出 y_{1},y_{2},\cdots y_{t-1},逐时间步生成当前输出 y_{t},直到生成结束符 <EOS>(End of Sequence)。将编码器压缩的全局信息,解码为符合任务要求的目标序列,完成 输入→输出 的最终映射。
    实现上是用另一个独立的循环神经网络,每个时间步的输入包含三部分:上一个时间步的输出y_{t-1}、上下文向量c、上一个时间步的隐藏状态s_{t-1}

在RNN中我们说过,当输入序列很长时,早期的输入信息会被后期信息覆盖,导致解码器无法获取长序列的完整信息,性能急剧下降。

针对经典 RNN 版的长序列缺陷,引入注意力机制(Attention),彻底解决固定长度上下文的问题,是 Seq2seq 的里程碑式改进。Transformer完全抛弃 RNN,用自注意力(Self-Attention) 建模序列,解决了 RNN 的并行化差、长距离依赖弱的问题,是当前所有大模型、目标检测(DETR)、TTS 等任务的标准 Seq2seq 架构。

Transformer Encoder

Transformer的Encoder架构如下所示:

Encoder实际上是一个模型,或者说是一个由堆叠 Block 组成的深层网络架构。为了构建深度模型,提升特征表达能力,Encoder由多个Block堆叠而成,底层Block提取局部特征、语法结构(如单词的邻近关系),高层Block提取全局语义、长距离依赖(如主语和宾语的关系)。

在Transformer中这个Block的内部结构如图所示:将输入的离散 token 序列(如文本、特征序列),转化为融合全局上下文信息的稠密向量序列

  1. 输入处理层:Input Embedding + Positional Encoding:
    1. Input Embedding(输入嵌入层):将输入的离散 token(如文本单词、子词,对应x_{1}\sim x_{4})映射为低维稠密的连续向量(对应黄色块),把离散符号转化为模型可处理的数值表示,同时学习 token 的语义信息(相似语义的 token 向量更接近)。
      具体实现过程是通过可训练的嵌入矩阵W_{emb}\in \mathbb{R}^{V\times d_{model}},将编码的token映射为d_{model}维向量,即x_{emb}=W_{emb}\cdot x_{encoder}d_{model}是模型隐藏维度(原版 Transformer Base 为 512)。
    2. Positional Encoding(位置编码层):Transformer 的自注意力是位置无关的(仅计算 token 间的相关性,不感知顺序),因此必须给每个 token 注入位置信息,让模型能区分序列中不同位置的 token,捕捉顺序依赖。
      具体实现过程是将位置编码向量与嵌入向量逐元素相加,经典方案为正弦余弦位置编码,也可使用可学习的位置编码。
  2. Encoder Block(编码层):Encoder Block 是 Encoder 的核心计算单元,重复堆叠 N 次(图中标注N\times,原版 Base 为 N=6,Large 为 N=12),每个 Block 结构完全一致,包含 4 个核心子层:
    1. Multi-Head Self-Attention(多头自注意力层):建模输入序列中所有 token 之间的全局依赖关系,无论 token 距离远近,都能直接计算相关性,彻底解决 RNN 的长距离依赖问题;同时支持全序列并行计算,大幅提升训练效率。
    2. Add & Norm(残差连接 + 层归一化):
      残差连接可以缓解深度网络的梯度消失问题,让梯度可通过残差边直接回传,支持训练数十层的深度网络;同时保留原始输入的特征信息,防止深层网络丢失底层特征。
      层归一化对每个样本的特征维度做归一化(而非 BatchNorm 的 batch 维度),公式为LN(x)=\frac{x-\mu }{\sigma }\cdot \gamma +\beta\mu ,\sigma是单个样本特征的均值和标准差,\gamma ,\beta是可训练的缩放、偏移参数。
    3. Feed Forward Network(前馈神经网络,FFN):对自注意力输出的每个 token 的表示做独立的非线性变换,提取更高层的语义特征,与自注意力的全局依赖建模形成互补。自注意力负责建模 token 间的关联,FFN 负责对单个 token 做特征变换,增强模型的非线性表达能力。
    4. 第二个Add & Norm(残差连接 + 层归一化)
    5. 最终输出:全局上下文编码序列。经过 N 个堆叠的 Encoder Block 后,得到最终的编码序列H=[h_{1},h_{2},h_{3},h_{4}],其中每个 h_{i} 对应输入 token x_{i}的最终稠密表示,融合了整个输入序列的全局上下文信息。

Transformer 中归一化的设计对模型训练的决定性影响

 原始Transformer采用Post-LayerNorm(后归一化,Post-LN,如下左图所示),即先做 Attention/FFN,再做残差相加,最后归一化。这样会导致深层模型中梯度需要经过多层 LayerNorm 和子层,容易出现梯度消失 / 爆炸,训练极不稳定,需要严格调参(如学习率、 warm-up)。仅在小模型、特定任务(如机器翻译)中表现稳定,不适合大模型训练。

Pre-LayerNorm(前归一化,现代大模型标准结构,如下右图所示),即先做归一化,再做 Attention/FFN,最后残差相加,是 BERT、GPT、T5 等几乎所有现代大模型的标准结构,这样做可以使梯度流更顺畅,残差边直接传递梯度,无需经过 LayerNorm,解决深层模型梯度不稳定问题,训练更稳定、收敛更快。

Transformer Decoder

Seq2seq 的核心是Encoder 编码输入,Decoder 自回归生成输出:

  • Encoder:将任意长度的输入序列(如语音、文本)压缩为包含全局上下文的稠密表示,为 Decoder 提供输入信息。
  • Decoder:基于 Encoder 的上下文,自回归(Autoregressive) 逐词 / 逐帧生成目标序列,每一步的输出依赖于之前所有已生成的输出,输入输出长度可变,由模型自主决定。

自回归解码的完整流程(以上图为例):

  1. Encoder编码输入:输入是 “机器学习” 的语音波形序列,Encoder(RNN/Transformer)将语音逐帧编码,最终输出全局上下文向量(上图中 Encoder 上方的 4 个彩色块),完整承载输入语音的信息,传递给 Decoder。
  2. 初始化编码:Decoder 的第一个输入是特殊起始符 <BEGIN>,结合 Encoder 的上下文向量,Decoder 计算当前时间步的输出概率分布:
    1. 概率分布的大小为词表大小V(所有常用字符 和 结束符 <EOS>),图中 "机" 的概率为 0.8(最高),“習” 为 0.1,其他字符为 0。
    2. 取概率最大的 token得到第一个输出为 “机”。
  3. 自回归迭代生成完整序列:自回归的核心是 “前一个输出作为下一个输入”,逐字生成:
    1. 将上一步生成的 “机” 作为 Decoder 的下一个输入,结合 Encoder 上下文,Decoder 计算下一个概率分布,取 max 得到第二个输出 “器”。
    2. 将 “器” 作为输入,生成第三个输出 “学”。
    3. 将 “学” 作为输入,生成第四个输出 “习”。
    4. 直到生成特殊结束符 <EOS>,停止解码,最终得到完整输出序列 “机器学习”。

上述介绍的自回归解码(Autoregressive Decoding, 简称 AT),是 Transformer 的原生设计。它天然建模序列内 token 的强依赖关系,每一步生成都依赖历史输出,贴合自然语言 “顺序依赖、上下文关联” 的特性,是所有主流 Transformer(翻译、大模型、语音识别)的默认解码方案,生成质量最高,但推理是串行的,速度受序列长度限制。

与之对应的非自回归解码(NAT),是为了解决 AT 串行推理慢的问题,提出的并行解码架构,所有时间步的输入完全相同,都是起始符<BEGIN>,不依赖任何历史生成的 token。模型一次性并行生成所有位置的 token,不需要等待前一个 token 生成,所有位置同时输出。

NAT不依赖历史输出,实现全并行推理,但牺牲了对序列内依赖的建模能力。

AT 的输出长度由模型自回归生成到<END>自然决定,而 NAT 是一次性生成,必须提前确定输出长度,以下给出了两种经典解决方案:

  • 额外添加长度预测器:先训练一个独立的模型 / 模块,根据 Encoder 的输入,直接预测目标序列的长度L;然后让 NAT Decoder 生成L个 token,最后添加<END>,得到最终输出。
  • 生成长序列 + 截断:直接让 NAT 生成一个远大于最大可能长度的序列(比如生成 100 个 token);找到序列中第一个<END> token,将其之后的所有 token 全部截断,得到最终输出。

NAT的优势在于并行推理的快速性以及可控的输出长度,但是它无法建模序列内的依赖关系,在序列生成任务(如机器翻译、语音识别)中,同一个源输入,对应多个合理的目标输出序列(比如同一个中文句子,有多种语法正确、语义通顺的英文翻译;同一段语音,有多种合理的转写),这些目标序列的 token 之间存在强顺序依赖,NAT模型在预测每个位置的 token 时,只能独立预测,可能会导致生成的 token 之间逻辑混乱、不连贯,甚至出现语义矛盾。

为了弥补NAT的缺陷,也出现了很多改进方案,例如迭代 NAT(Iterative NAT)、知识蒸馏(Knowledge Distillation)、GLAT(Glancing Transformer)等等。这里不再展开介绍。

Transformer Decoder的核心是 “自回归生成 + 并行训练”:

  1. Masked Multi-Head Self-Attention保证自回归生成的正确性(只能看到历史输出,不能偷看未来 token)
  2. Encoder-Decoder Attention对齐 Encoder 的输入上下文;
  3. 用全注意力结构替代 RNN,实现训练时的全序列并行计算,解决 RNN 长距离依赖弱、训练慢的问题。

    输入处理层

    (1)Output Embedding(输出嵌入层):将 Decoder 的输入(上一步的输出,如<START>、机、器、学)映射为低维稠密向量,学习 token 的语义表示,和 Encoder 的 Input Embedding 作用一致。

    (2)Positional Encoding(位置编码层):Transformer 自注意力是位置无关的,因此给每个 token 注入位置信息(正弦余弦编码 / 可学习编码),和 Embedding 相加后输入,让模型感知序列顺序,和 Encoder 的位置编码作用一致。

    堆叠 N 个 Decoder Block

    (1)Masked Multi-Head Self-Attention(掩码多头自注意力)

    普通的Self-attention是无掩码的,每次输入token a^{1}\sim a^{4},每个token都能看到所有其他 token(a^{1}能看到a^{2},a^{3},a^{4}a^{2}能看到a^{1},a^{3},a^{4},以此类推),所有 token 之间有完整的连接,建模全局上下文,适合 Encoder 编码输入序列。而Decoder的自注意力是掩码的,掩码(Mask)未来的 token,让每个位置的输出只能依赖于当前位置及之前的 token,不能看到未来的 token,保证自回归生成的正确性。以计算第二个输出token b^{2}为例,每个输入tokena^{1}\sim a^{4}生成q(查询)、k(键)、v(值)向量。普通的Self-attention会计算q^{2}与所有k的乘积来得到相似度分数\alpha '_{2,1},\alpha '_{2,2},\alpha '_{2,3},\alpha '_{2,4},但是掩码操作会将a^{3},a^{4}k^{3},k^{4}(键)给忽略,即只计算a^{2}a^{1}和自身的相关性分数。对所有位置重复操作,b^{1}只能看到a^{1}b^{2}只能看到a^{1},a^{2}b^{3}只能看到a^{1},a^{2},a^{3}b^{4}能看到所有a^{1}\sim a^{4}

    之所以要这样做,是因为Decoder 的任务是自回归生成序列,生成第t个 token 时,只能依赖于已经生成的前t-1个 token,不能看到未来的 token,强制模型学习序列的顺序依赖,符合自然语言、语音等序列的顺序特性,让模型能学习到语言的语法、语义结构。

    Encoder-Decoder Multi-Head Attention(交叉注意力,Encoder-Decoder Attention)

    下图红框部分即为交叉注意力,是Encoder连接到Decoder的桥梁。

    Encoder-Decoder Multi-Head Attention的核心任务是让 Decoder 在生成每一个 token 时,动态地从 Encoder 的输出中 “提取” 与当前生成步骤最相关的信息,从而实现输入序列与输出序列的精准对齐。其计算遵循“Q-K-V 注意力机制”,与普通自注意力一致,但数据来源完全不同:

    • q(Query,查询向量)来自Decoder,代表 “当前 Decoder 正在生成什么”,去 Encoder 里找相关信息
    • k(Key,键向量)来自Encoder,代表 “Encoder 里存储了哪些信息”,供 Decoder 查询
    • v(Value,值向量)来自Encoder,代表 “Encoder 里信息的具体内容”,最终被加权求和输出

    以下图所示的生成序列第一个 token(输出v)时的交叉注意力计算流程为例,说明其步骤:

    1. 生成Query(q):Decoder 的输入(起始符 BEGIN 或上一步生成的 token)经过 Masked Self-Attention处理后,得到当前位置的隐藏状态,将该隐藏状态通过一个线性层(全连接层),映射为 查询向量 q
    2. Encoder 生成 Key (k) 和 Value (v):Encoder将原始输入(如语音波形)编码为包含全局上下文的隐藏序列a^{1},a^{2},a^{3}。Encoder 的每个隐藏状态 a^{i} 分别通过两个独立的线性层,映射为 Key 向量 k_{i}和 Value 向量 v_{i}
    3. 计算注意力分数与权重:计算 q 与 Encoder 中所有 k^{i} 的点积得到\alpha_{1},\alpha_{2},\alpha_{3}。为了防止点积过大导致 Softmax 进入饱和区,通常除以\sqrt{d_{k}}d_{k}k向量维度)(图中未给出此操作)。将分数归一化为概率分布,得到 注意力权重\alpha'_{1},\alpha'_{2},\alpha'_{3},即\alpha '_{i}=softmax(\frac{\alpha _{i}}{\sqrt{d_{k}}})。权重越大,表示 Decoder 当前生成步骤与 Encoder 该位置的信息越相关。
    4. 加权求和与输出:将每个注意力权重 \alpha '_{i} 与对应的 Value 向量 v_{i} 相乘。将所有加权后的 v_{i} 累加,得到融合了 Encoder 全局信息的上下文向量 v。将向量 v 送入 FC(全连接层),映射到最终的隐藏空间,作为 Decoder 当前时间步的输出。

    传统的标准 Transformer 只使用 Encoder 的最后一层输出(Final Layer)来计算 Cross Attention,但这是特定设计选择,而非绝对强制。

    Encoder和Decoder均有很多 Block 堆叠组成,传统Transformer认为Encoder经过 N 层堆叠后,最后一层输出是包含了完整输入语义、语法和上下文信息的最优向量表示。所以Encoder 输出作为 Decoder 每一层 Cross Attention 的 K,V 源,单向传递。但是,Encoder 前几层提取的低级特征(如语音识别中的音素、机器翻译中的词法)被层层过滤,到最后一层可能丢失或难以被 Decoder 直接获取。所以,可以使用其它的连接路径:

    多头注意力机制(Multi-Head Attention):上面介绍的都是单头注意力,而完整的 Transformer 采用 Multi-Head,将 q,k,v 分别线性投影到 h 个不同的子空间,在每个子空间独立计算注意力,计算完 h 个独立的注意力输出后,将它们拼接(Concat)起来,再经过一次线性变换得到最终结果。

    不同的头可以关注不同类型的依赖关系(例如:有的头关注语音识别的音素对齐,有的头关注语义关联),让模型能同时捕捉多种复杂的输入输出映射关系,显著提升模型性能。

    Transformer Input

    在机器翻译、聊天机器人等语言处理任务中,通常输入的是一串语言文字,例如“I love China”、“我爱中国”等。为了让模型能够处理这些文字,会先创建一个词汇表(词汇表内包括所有文字,每一列对应一个文字),然后给这些文字一个唯一标签ID(例如“我”对应ID 1,“爱”对应ID 2),每个ID对应词典中对应列索引。之后将每个文字编码为一个向量,即使用一个向量来表示一个token(词 / 子词),为了方便说明,我们假设一个单词/字用一个向量表示,这个向量称为词嵌入向量(Word Embedding)。将所有token向量拼接到一起就得到了一个矩阵,称为词嵌入矩阵(Embedding Matrix)W_{E},它的每一列对应词汇表(vocabulary)中一个 token(词 / 子词)的嵌入向量,维度为|V|\times d_{model}|V|是词汇表大小(GPT3约 5 万个 token),d_{model}是嵌入维度。当要输入一段文字给模型时,会先在词汇表中找到每个文字对应ID,然后取出ID对应词嵌入向量,之后拼成词嵌入矩阵输入模型。

    词嵌入矩阵(Embedding Matrix)W_{E}的嵌入维度d_{model}是一个超参数,对于小任务/小语料一般d_{model}=128/256;对于BERT/GPT等大模型d_{model}一般是上千维甚至上万维。

    d_{model}维度越高能刻画的语义细节越丰富,但维度太高会使参数量爆炸、训练慢、容易过拟合。

    d_{model}每一维都是一个 “隐式语义特征”,比如某一维可能隐式学到褒义 / 贬义,某一维可能隐式学到动物 / 植物 / 物品,某一维可能学到过去时 / 现在时等等。

    一般的One-hot、ASCII等固定编码是给每个字符 / 单词分配一个唯一的ID 号,其向量数值是人工定义的、固定的。而Transformer 里的编码是语义嵌入(Token Embedding),即给每个 token 分配一个语义特征向量,承载语义、语法、上下文关系,它的向量数值是不固定的,由训练学习得到。这是因为我们需要的不是标识单词,而是理解语义,而语义只能通过数据驱动的训练来学习。

    模型在学习海量文本数据的过程中,不断调整每个 token 的向量数值,这个过程让语义相似的 token,在高维嵌入空间中距离更近(比如cat/dog/pet的向量会被调整到相邻区域),让语义不同的 token,在嵌入空间中距离更远(比如catcar的向量会被推远)。最终让每个 token 的向量都承载语义相似度、句法关系、上下文联系等信息。

    嵌入矩阵的训练是和整个 Transformer 模型端到端(end-to-end)同步完成的,核心是反向传播 + 梯度下降,以输入 “今” 预测 “天” 这个极简任务为例,用具体数据演示词嵌入矩阵的更新过程:

    首先假设词汇表大小V=4,其索引ID[0,1,2,3]分别对应 ["<pad>", “今”, "天", "好"],假设词嵌入维度d_{model}=2。训练开始时会随机初始化的词嵌入矩阵E(如正态分布 N(0,1)、均匀分布),此时向量是无意义的随机数:

    E=\begin{bmatrix} 0.0 &0.2 &0.5 &0.4 \\ 0.0& 0.3& 0.1& 0.6 \end{bmatrix}

    为了简便,我们省略 Decoder 中间层,直接把嵌入向量投影到词表得到 logits

    1. 模型输入:输入token “今” → ID=1。查词汇表得到词向量矩阵x=E[1]=[0.2,0.3]^{T}
    2. 得到输出 logits(词表上的分数):logits=f(E)f(\cdot )表示Decoder整个模型),得到 4 个词的分数logits=[0.0,0.13,0.13,0.26]
    3. 经过softmax转为概率分布:p=\frac{e^{logits_{i}}}{\sum e^{logits_{j}}}p=[0.2186,0.2489,0.2489,0.2835]
    4. 构造标签:真实词是 “天” → ID=2。将标签转为one-hot向量(只有正确位置为 1,其余 0),y=[0,0,1,0]
    5. 计算交叉熵损失:只有标签为 1 的位置有效L=-\sum _{i}y_{i}\cdot log(p_{i})=-log(p_{2})=-log(0.2489)\approx 1.39
    6. 反向传播:\frac{\partial L}{\partial E}=\frac{\partial L}{\partial p}\cdot \frac{\partial p}{\partial logits}\cdot \frac{\partial logits}{\partial E}
    7. 梯度下降更新公式:E_{new}=E_{old}-\eta \frac{\partial L}{\partial E}

    经过 “词嵌入 + 位置编码” 后,最终输入序列向量为:

    X\in \mathbb{R}^{L\times d_{model}}

    该序列向量会与不同的矩阵相乘线性投影得到Q,K,V::

    Q=XW_{Q},K=XW_{K},V=XW_{V}

    其中W_{Q},W_{K},W_{V}\in \mathbb{R}^{d_{model}\times d_{k}}都是可学习参数矩阵。所以

    \frac{\partial L}{\partial X}=\frac{\partial L}{\partial Q}W_{Q}^{T}+\frac{\partial L}{\partial K}W_{K}^{T}+\frac{\partial L}{\partial V}W_{V}^{T}

    Transformer训练与推理过程

    虽然基础的Transformer包括Encoder和Decoder,但并不是所有的模型都同时用到两者。具体使用Encoder、Decoder还是两者都用取决于用的是哪种 Transformer 架构,原始 Seq2Seq 版 Transformer(机器翻译)训练、推理都要同时用 Encoder+Decoder;但现在主流的 BERT、GPT 等变体,只用到其中一半。

    下面我们先详细介绍原始标准Encoder-Decoder Transformer语音识别的训练过程。之后会介绍Encoder-Decoder Transformer机器翻译场景中Encoder和Decoder训练时和推理输入输出、Decoder-only架构中Decoder训练时和推理时输入输出以及Encoder-only架构中Encoder训练时和推理时输入输出。通过不同的输入输出就可以看出三者之间的显著区别,进一步了解为什么只用Encoder或Decoder。

    Encoder-Decoder训练过程

    原始的 Encoder-Decoder Tranformer架构主要用来做机器翻译、语音识别等这种有两个独立序列(英文源句、中文目标句)的任务,这种任务需要需要 Encoder 编码源句来获取整个句子的语义,Decoder 再通过交叉注意力去查 Encoder 的信息来得到输出。

    Encoder-Decoder Transformer训练核心是 “Encoder 编码输入 + Decoder 并行解码 + Teacher Forcing + 交叉熵损失”。先以语音识别任务(输入语音、输出文本 “机器学习”)为例,完整流程如下:

    1.数据与输入

    • Encoder 输入:
      • 原始输入:源序列(语音波形。需要通过特定方式转换成向量)
      • 预处理:输入经过Input Embedding(嵌入层) + Positional Encoding(位置编码),将离散符号 / 语音特征转化为带位置信息的稠密向量,输入 Encoder。
    • Decoder输入:
      • 输入序列:[<BEGIN>, 机, 器, 学, 习]
      • 目标序列(Ground Truth):[机, 器, 学, 习,<END>]
      • Teacher Forcing:训练时 Decoder 的每一步输入,直接使用真实标签(Ground Truth),而非模型上一步生成的 token。

    Teacher Forcing 的作用:

    • 避免自回归生成的误差累积,训练时每一步输入都是正确的 token,模型不会因为早期错误导致后续训练崩溃,大幅提升收敛速度。
    • Transformer 可以一次性输入整个目标序列,并行计算所有时间步的注意力和 FFN,实现大规模快速训练。

      2.前向传播流程

      (1)Encoder 编码阶段:源序列经过 N 层堆叠的 Encoder Block(每层为 “Multi-Head Self-Attention → Add&Norm → FFN → Add&Norm” ),最终输出编码后的上下文向量序列(图中 Encoder 上方的彩色块),该序列完整承载了输入的全局信息,作为 Decoder 的 “交叉注意力” 的 Key 和 Value。

      (2)Decoder 解码阶段:输入序列经过Output Embedding + Positional Encoding,输入N 层堆叠的 Decoder Block。

      (3)输出层:Decoder 的最终输出经过Linear 全连接层,将隐藏维度映射为词表大小V的维度,再经过Softmax 激活函数,得到每个时间步的词表概率分布。

      3.损失计算与反向传播

      每个时间步独立计算交叉熵损失,公式为:

      • y_{t,v}:Ground Truth 标签(如真实 token “机” 对应 1,其他字符为 0)
      • p_{t,v}:模型预测的概率分布(如 “机” 预测概率为0.7)
      • N:目标序列长度
      • V:词表大小

      所有时间步的损失累加 / 取平均,作为整个模型的总损失。

      总损失通过反向传播算法,更新 Encoder 和 Decoder 的所有可训练参数(注意力层、FFN 层、Embedding 层等),重复迭代直到模型收敛。

      Exposure Bias

      Teacher Forcing 虽然让训练高效稳定,但训练阶段Decoder 的输入是100% 正确的 Ground Truth,模型从未接触过错误的输入。而在推理阶段Decoder 是自回归生成,每一步的输入是模型上一步生成的 token,若某一步生成错误(如把 “器” 错生成为 “气”),下一步的输入就是错误的 “气”,模型在训练时从未处理过这种错误输入,导致后续生成持续出错,误差不断累积,最终输出完全偏离预期。Teacher Forcing 让训练快,但训练和推理的输入分布不一致,导致模型在推理时性能大幅下降,这就是 Exposure Bias。

      Scheduled Sampling

      Scheduled Sampling 是经典的缓解 Exposure Bias 的训练策略,核心是在训练时 “混合使用 Ground Truth 和模型生成的输入” ,让模型在训练时就接触到 “自己生成的、可能错误的输入”,学会处理错误,减少推理时的误差累积。其基本过程是以一个随训练轮数动态衰减的概率 \epsilon _{i} ​,随机选择 Decoder 的下一个输入:

      • 首先定义一个随训练 epoch i衰减的概率\epsilon _{i},控制使用 Ground Truth 的概率,常见的方案是线性衰减\epsilon _{i}=max(\epsilon _{i},k-c\cdot i),其中\epsilon _{i}表示最小概率(通常为 0.1,保留少量 Ground Truth 防止训练崩溃),k为初始概率(通常为 1.0,训练初期全用 Ground Truth),c为衰减率(每 epoch 降低的概率,如 0.05)
      • 对 Decoder 的每一个时间步 t 生成一个 0~1 之间的随机数r,如果r<\epsilon _{i}则使用 Ground Truth 真实标签作为下一个时间步的输入(Teacher Forcing),如果r>\epsilon _{i}则使用模型上一步生成的 token作为下一个时间步的输入(模拟推理自回归)

      通过Scheduled Sampling可以做到:

      • 训练初期:\epsilon _{i}接近 1,高概率使用 Ground Truth,保证模型快速收敛,训练稳定。
      • 训练中期:\epsilon _{i}逐渐降低,混合使用 Ground Truth 和模型生成的 token,让模型慢慢适应错误输入。
      • 训练后期:\epsilon _{i}接近 0,高概率使用模型生成的 token,完全模拟推理时的自回归场景,彻底消除分布差距。

      Parallel Scheduled Sampling

      原始 Scheduled Sampling 针对 RNN 设计(串行训练),Transformer 是并行训练,因此有Parallel Scheduled Sampling。其基本过程如下(以目标序列[机, 器, 学, 习] 为例):

      1. 并行贪心前向,生成 “全序列预测 tokens”:给 Decoder 输入纯 Ground Truth 序列(Teacher Forcing 标准输入)模型一次性并行前向传播,算出所有位置 t 的输出概率,对每个位置取 argmax,得到 贪心预测序列 \hat{y}=[\hat{y}_{1},\hat{y}_{2},\hat{y}_{3},\hat{y}_{4}]
      2. 生成采样掩码矩阵:生成一个和序列等长的二进制随机掩码 Mask,以概率\epsilon选 Ground Truth ,以概率 1-\epsilon 选模型预测 \hat{y}。例如\epsilon=0.5,则下一次训练时的输入序列为[GT,\hat{y},GT,\hat{y}]。掩码是随机、逐位置独立的。
      3. 最终混合输入序列为 [机, \hat{y_{2}}, 学, \hat{y_{4}}],将构造好的混合输入送入 Decoder,一次性并行计算所有位置的输出。下一次训练过程同上。


      Scheduled Sampling可以有效缓解 Exposure Bias,提升推理时的生成质量,减少误差累积,但是仍存在一定的分布差距(训练时混合输入,推理时全自回归),现在大模型更多采用强化学习(RLHF)、Speculative Decoding 等更先进的方案,但 Scheduled Sampling 是经典的基线方法。这里不再赘述。

      Transformer “损失 - 评估指标不匹配” 问题及其解决方法

      我们在训练时使用的是逐 token 交叉熵损失计算,而最终的任务评估指标是序列级指标,关注的是生成序列的整体质量。具体解释如下:

      • 标准监督训练(逐 token 优化,交叉熵损失)(左图):Decoder以Teacher Forcing的方式,输入Ground Truth,逐时间步生成每个 token 的概率分布,取概率最大的 token 作为输出,训练的优化目标是逐 token 最小化交叉熵损失,也就是让模型在每一个时间步,都尽可能预测对当前的真实 token。
        • 本质:token 级(词级)的局部优化。优化的是每一步的单 token 预测准确率,而非整个生成序列的最终质量。
        • 核心缺陷:逐 token 最大化概率,不代表最终生成的完整序列是最优的。例如某一步选择次优概率的 token,后续生成的整个序列可能更符合真实标签、BLEU 分数更高,但交叉熵会惩罚这一步的次优选择,导致模型陷入局部最优。
          损失与评估指标完全脱节,任务的最终评估是序列级指标,而交叉熵是 token 级损失,两者的优化目标完全不一致。
      • 序列级优化(直接优化评估指标)(右图):这是我们真正想要的训练目标。Decoder 不再输入 Ground Truth,而是自回归生成完整的输出序列,然后直接计算这个完整序列的评估指标(图中标注BLEU score,即 BLEU 分数,机器翻译 / 生成任务的经典评估指标),目标是最大化整个序列的评估指标,而非逐 token 的概率。
        • 本质:sequence-level(序列级)的全局优化,优化目标和人类评估模型的标准完全对齐,追求最终生成序列的整体质量最优。
        • 核心缺陷:评估指标(如 BLEU)是不可导的离散函数,无法用传统的反向传播(梯度下降)直接优化。

      解决方法一:Beam Search(束搜索)

      目前工业界和学术界,大部分的 Transformer 训练依然直接使用交叉熵损失(Token-level),因为它更简单、收敛更快、算力消耗少。虽然损失函数是 Token 级,但在推理时往往配合 Beam Search(束搜索) 来寻找近似的序列最优解。
      Beam Search是自回归序列生成模型(如 Seq2seq、Transformer)的经典解码(推理)算法,是  贪心搜索(Greedy Decoding)和 穷举搜索(Exhaustive Search) 的折中方案。它的出现是为了解决自回归生成中两个矛盾:

      • 贪心搜索的 局部最优 ≠ 全局最优 :贪心搜索就是我们上面说的标准监督训练逐 token 优化,每一步只选当前概率最高的 token,但这无法保证最终生成的完整序列是全局最优的。例如上图我们假设只有A和B两个token,红色路径第一步选概率 0.6 的 A(局部最优),后续每一步选当前最高概率,最终序列累积概率仅为0.6×0.6×0.6=0.216;绿色路径(全局最优)第一步选概率 0.4 的 B(局部次优),但后续两步概率 0.9,最终累积概率0.4×0.9×0.9=0.324,远高于 Greedy 路径。
      • 穷举搜索的计算爆炸:如果要找真正的全局最优,需要穷举所有可能的序列,计算量为O(V^{L})V为词表大小,L为序列长度)。
        Beam Search 将计算量严格控制在O(k\times V\times L)k为 beam size,通常取 4~10,表示每一步保留 k 个 概率最高的候选序列。),在可接受的算力开销内,找到近似全局最优的序列,平衡了搜索质量和计算效率。

      所以Beam Search的目的是在可控的计算成本内,最大化生成序列的整体质量(如 BLEU 分数、转写准确率),实现局部最优近似全局最优的跨越,让生成的完整序列更符合任务需求(如翻译准确、语音转写正确)。其工作过程如下(以3-token(A/B/C)词表、beam sizek=2,序列长度L=3为例),为了演示,我们假设Decoder 在每个时间步输出的概率如下:

      1. 生成第一个 Token (t_{1}):从词表中,选出 2 个 概率最高的 token,作为初始候选。由于P(A)>P(B)>P(C)所以我们只保留A,B最优候选。
      2. 扩展并筛选第二个 Token (t_{2}​):对每一个保留的候选,分别扩展所有 3 个 token,生成 2×3=6 个新候选,再从中筛选出 2 个最优。
        基于Beam 1(A)扩展:
         序列[A,A]=0.5\times 0.2=0.1, 序列[A,B]=0.35,序列[A,C]=0.05
        基于Beam 2(B)扩展:
        序列[B,A]=0.3\times 0.2=0.06, 序列[A,B]=0.21,序列[A,C]=0.03
        其中序列[A,B],[B,B]概率最高,为最优候选,保留。
      3. 扩展并筛选第三个 Token (t_{3}​):
        基于Beam 1([A,B])扩展:
         序列[A,B,A]=0.14, 序列[A,B,B]=0.035,序列[A,B,C]=0.175
        基于Beam 2([B,B])扩展:
        序列[B,B,A]=0.084, 序列[B,B,B]=0.021,序列[B,B,C]=0.105
        最终Beam Search 选择累积概率最高的序列:[A,B,C]

      实际训练 / 推理中用log(p)替代原始概率,将乘法转为加法,避免浮点下溢,计算更稳定。除此之外,还要注意长序列的累积概率天然低于短序列,因此添加长度惩罚项,避免模型倾向于生成过短的序列。


      Beam Search 并非所有场景都适用,仅在 “追求准确率” 的任务中表现优异,在 “追求多样性 / 创造性” 的开放域生成任务中存在严重缺陷:

      • 追求 “准确率” 的任务:机器翻译(准确对应原文)、语音识别(准确转写语音)、文本摘要(忠实原文),这类任务的核心目标是 “生成内容与参考 / 输入尽可能匹配”,Beam Search 最大化序列的累积概率,能生成最符合模型分布、最准确的序列,直接提升 BLEU、WER 等评估指标,完全匹配任务需求。
      • 追求 “多样性 / 创造性” 的开放域生成任务:对话系统(聊天机器人)、故事创作、诗歌生成、开放域文本生成,Beam Search 为了最大化累积概率,会倾向于生成高频、安全、重复的文本(因为高频词的概率更高,模型会反复选择),Beam Search 是确定性算法,每次生成的序列几乎完全一致,没有创造性。

      解决方法二:强化学习(Reinforcement Learning, RL)

      强化学习把 Seq2seq 的生成过程完全建模为 RL 的标准马尔可夫决策过程(MDP)。针对评估指标不可导的问题,用策略梯度算法实现端到端优化,核心逻辑是通过采样多个模型生成的序列,用序列的奖励(BLEU 分数)加权更新模型参数,让模型更倾向于生成 奖励更高(评估指标更好) 的序列。

      关于强化学习部分,不是这里的重点内容,本文章不做详细介绍。

      (选读)

      Copy Mechanism(复制机制)

      复制机制就是让模型能直接从输入序列中,复制关键的专有名词、实体、低频词到输出序列,保证生成内容的准确性和连贯性,例如用户姓名或者专有名词这种模型没有见过的词语,复制机制可以让模型完整复制到了自己的回复中,避免了把姓名当成未登录词(OOV)、用<UNK>替代或错写的问题,保证了实体的准确性。

      经典实现复制机制的模型是Pointer-Generator Network(指针生成网络),本文章不做介绍。

      Guided Attention(引导注意力)

      Guided Attention(也叫单调注意力 Monotonic Attention / 位置感知注意力 Location-aware Attention),是专门针对输入输出存在严格单调对齐的序列任务(如语音识别、TTS,语音前半段对应文本前几个字,后半段对应后几个字)设计的注意力约束机制。它的逻辑是给标准 Seq2seq/Transformer 的无约束注意力添加 “强制单调右移” 的引导约束,让模型的注意力分布严格符合任务的输入输出顺序对应特性,从根本上避免错误对齐。

      标准无约束注意力(普通 Multi-Head Attention)没有顺序约束(下图红色曲线表示注意力分数):

      • 第 1 个输出:注意力峰(红色曲线最高点)在 a²、a³;
      • 第 2 个输出:注意力峰往左跳到 a¹、a²,位置比第一个输出的注意力峰更靠左;
      • 第 3 个输出:再跳回 a³、a⁴。
      • 上述这种对齐完全违背了语音 / 文本的顺序对应,模型生成时会出现漏字、错字、重复、语义混乱

      符合单调对齐的正确注意力分布:

      • 第 1 个输出:注意力峰在输入的最左侧(a¹、a²),模型关注输入的前部分;
      • 第 2 个输出:注意力峰单调右移到 a²、a³,关注输入的中间部分;
      • 第 3 个输出:注意力峰继续右移到 a³、a⁴,关注输入的后部分。
      • 注意力峰严格从左到右单调移动,完全贴合输入输出的顺序对应,是正确的对齐方式。

      注意要和Masked Multi-Head Self-Attention(掩码多头自注意力,Masked MHSA)做区分,Masked MHSA作用于Decoder内部的自注意力层,保证 Decoder 内部的自回归顺序正确;而Guided Attention作用于Encoder-Decoder之间的交叉注意力(Cross Attention)层,给交叉注意力添加 “强制单调右移” 的约束,惩罚 “注意力回退、错位” 的分布,让模型学习到生成第t个输出时,注意力峰必须在第t-1个输出的右侧。

      Encoder-Decoder(机器翻译场景)输入输出(训练时)

      对于机器翻译任务的Encoder-Decoder,以 “I love China” 翻译为 “我爱中国” 为例:

      • Encoder输入:
        原句子 “I love China”分词为 [I, love, China],在词汇表中找到其对应的词嵌入向量,然后拼成输入矩阵再加上位置编码输入到Encoder中。
        最终Encoder输入为 (序列长度,d_{model})的嵌入张量(矩阵)
      • Encoder输出:
        经过多层 Encoder 后,输出一组源语言上下文语义表示,形状仍为 (序列长度,d_{model}),每一个位置都包含了整个英文句子的双向语义信息,供 Decoder 在生成中文时查询使用。
      • Decoder有两个输入:
        • 来自 Encoder 的 Memory(用于交叉注意力)
        • 目标语言的 “右移” 序列(Teacher Forcing):目标真实句子是 “我爱中国”,训练时不会让它从零生成,而是直接喂标准答案,但要向右错开一位,即 [<begin>, "我", "爱", "中", "国"],同时加上掩码(Mask)(通过掩码多头注意力机制),让每个位置只能看到前面的词,看不到未来的词。
      • Decoder输出:
        Decoder 最终输出一个形状为 (目标序列长度,目标词典大小) 的张量(即每个Decoder的每个输入都对应一个输出,输出为一个大小为词典大小的向量),再经过 Softmax 变成概率分布。它要预测的是每一步的下一个字,例如
        输入  [<begin>]  预测  “我”
        输入  [<begin>, "我"]  预测 “爱”
        输入  [<begin>, "我", "爱"]  预测 “中”
        输入  [<begin>, "我", "爱", "中"] 预测 “国”
        模型用这个输出和真实标签["我", "爱", "中", "国", "end"]计算交叉熵损失。

      Encoder-Decoder(机器翻译场景)输入输出(推理时)

      推理时没有 “标准答案” (label)输入,是自回归生成

      • Encoder输入输出和训练时完全一样。
      • Decoder输入:
        第一步输入 [<begin>]
        第二步输入 [<begin>, "我"]
        第三步输入  [<begin>, "我", "爱"]
        第四步输入  [<begin>, "我", "爱", "中"]
        第五步输入  [<begin>, "我", "爱", "中", "国"]
        每一步都同时使用 Encoder 输出的 Memory
      • Decoder输出:
        每一步输出词典上的概率分布,取概率最大的 token 作为当前生成结果:
        输入 <begin> → 输出概率最大 →
        输入 <begin> → 输出
        输入 <begin> 我 爱 → 输出 中国
        输入 <begin> 我 爱 中国 → 输出 <end>
        遇到 <end> 生成结束,最终翻译结果 “我爱中国”

      Decoder-only输入输出(训练时)

      Chatbot、对话、QA、文本续写等任务使用Decoder而舍弃Encoder,这类任务本质上 “给定上文,不断预测下一个单词” 的任务,基本过程是给定一段上文文本(或问题),输出下一个最合理的 token(字 / 词),把生成的词拼回上文,再继续预测下一个,直到生成结束符,整段回答就出来了,称为因果语言模型(Causal Language Model, CLM)

      Decoder-only的任务只有一个连续序列(上文 + 下文),不存在 “另一组需要单独编码的源文本”,直接用前文信息预测后文,完全不需要额外 Encoder来获得所有上下文信息。

      以给定句子 “今天天气不错” 为例。Decoder-only的训练目标是 “给定前面所有字,预测下一个字”,根据给定的文本来学习语义:

      • Decoder输入:
        先将句子分词 [今, 天, 天, 气, 不, 错] ,然后查找词嵌入向量拼成词嵌入矩阵作为输入(一次性将整个token输入到网络中),即输入是一个 (序列长度,d_{model})的嵌入张量(矩阵)。
        其核心训练机制也是Teaching Forcing(喂标准答案),所以其标签label为[天,天,气,不,错](实际上应该是索引ID值,这里为了便于理解直接用文字代替)
      • 在训练时,由于掩码多头注意力机制,每个位置,只能看到自己及左边的字,看不到右边的字,保证模型是靠前文推理下文。
      • Decoder输出:
        并行计算,同时算:
        看到 “今” 预测 “天”
        看到 “今天” 预测 “天”
        看到 “今天天” 预测“气”
        看到 “今天天气”预测“不”
        看到 “今天天气不”预测“错”
        所以最终输出也是一个 (序列长度,d_{model})的嵌入张量(矩阵)。
      • 最终计算损失时会将“今” 预测 “天”、“今天” 预测 “天”、“今天天” 预测“气”、“今天天气”预测“不”、 “今天天气不”预测“错”的损失全部叠加,一起更新嵌入和所有参数。
      • Decoder-only的训练过程和Encoder-Decoder类似,都是Teacher Forcing一次性输入全部正确标签 token,不使用上一步预测值;都是并行计算,输入 N 个 token,输出 N 个预测,一起算损失;都在学 “上下文→下一个词” 的映射。

      Decoder-only输入输出(推理时)

      推理时没有标准答案喂给模型,只能自回归逐词生成。以预测 “今天天气真好,我要去___”为例:

      • Decoder输入:
        [今, 天, 天, 气, 真, 好, ,, 我, 要, 去]
      • Decoder输出:
        输入序列长度为10,最终输出也有10个向量,最后一个向量是来预测下一个字的,所以只使用最后一个向量,此向量经过变换后得到的概率最大的字是“公”。
      • 把刚生成的 “公” 拼到输入后面 ,此时输入变成[今, 天, 天, 气, 真, 好, ,, 我, 要, 去, 公],此时模型输出11个向量,取出最后一个向量经过变换后得到的概率最大的字是“园”。重复上述过程最后得到“今天天气真好,我要去公园玩”。

      Encoder-only输入输出(训练时)

      只用 Encoder 的模型,典型代表是 BERT、RoBERTa、ALBERT 这类,核心做文本理解类任务,完全不需要 Decoder,比如:

      • 情感分析(正面 / 负面 / 中性)
      • 文本分类(新闻分类、垃圾邮件识别)
      • 命名实体识别 NER(识别人名、地名、机构名)
      • 句子相似度匹配、问答抽取
      • 句法分析、语义理解

      Encoder 用双向自注意力(能看到整个句子的前后文),只做判别 / 分类 / 标注,不做文本生成。

      以 “这部 电影太好看了,强烈推荐!”判断句子情感是正面还是负面为例:

      • Encoder输入:[这, 部, 电, 影, 太, 好,看, 了, ,, 强, 烈, 推, 荐, !]。查找词嵌入向量拼成词嵌入矩阵作为输入,一次性将整个token输入到网络中。输入是一个 (序列长度,d_{model})的嵌入张量(矩阵)
      • Encoder输出:Encoder 会输出每个位置的语义特征向量,形状仍为 (序列长度,d_{model})。Encoder 输出中,第一个位置的向量,被视为整个句子的全局语义表示,后续接一个分类头(线性层 + Softmax)将维度从d_{model}转换为2维,即类别概率分布,如 [正面:0.98,负面:0.02]
      • 把模型输出的概率,和真实标签(正面)计算交叉熵损失,反向传播更新 Encoder 所有参数(Embedding、注意力权重、全连接层)。

      Encoder-only在推理阶段的Encoder输入输出与训练阶段一致,这里不再介绍。

      Logo

      DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

      更多推荐