Decoder-only 架构全景:任务统一、信息交互与表示更新

Decoder-only 架构全景:任务统一、信息交互与表示更新

Decoder-only 将任务描述、输入内容和生成历史组织成一条连续的 Token序列,并以自回归方式预测下一个 Token。自然语言理解、问答、摘要、代码生成和部分逻辑推理任务都可以转换为这种序列形式,进而使用统一的训练目标和主要计算路径。

在模型内部,因果自注意力按照序列顺序整合已有信息,前馈网络更新每个位置的表示,多层结构则持续重复这两类计算。统一的结构使不同来源的数据能够共同训练一套模型参数,因果掩码也明确限制了每个位置可以读取的信息范围。

本文先介绍 Decoder-only 的自回归任务定义,再比较它与 Encoder--Decoder 的计算路径,随后说明注意力机制、前馈网络、网络深度和训练目标在统一序列生成中的作用。


一、自回归语言建模是 Decoder-only 的基础

自回归语言模型对一个 Token 序列建立如下概率模型:

\x_1,x_2,\\ldots,x_T \\

根据概率的链式法则,整个序列的联合概率可以写成:

\P(x_1,x_2,\\ldots,x_T) = \\prod_{t=1}\^{T}P(x_t\\mid x_{\

在每一个位置上,模型估计的条件概率为:

\P(x_{t+1}\\mid x_{\\le t}) \\

这个概率表示:模型根据当前位置之前的内容,计算下一个 Token 的概率分布。

GPT 系列沿用了这种生成式预训练方式 2。GPT-2 的实验显示,在大规模、多来源文本上使用下一 Token 预测目标进行训练,模型能够初步处理问答、摘要和翻译等任务 3。GPT-3 则把任务说明和少量示例直接放入上下文,并展示了模型在不更新参数的情况下完成多种任务的能力 5

在上述自回归任务中,Transformer 将已有序列转换为当前位置的上下文表示:

\\[x_1,x_2,\\ldots,x_t \longrightarrow h_t \]

其中,\(h_t\) 是结合了历史信息的上下文表示。语言模型输出层再将它映射到词表空间:

\h_t \\longrightarrow z_t\\in\\mathbb{R}\^{V} \\

\(V\) 表示词表大小,\(z_t\) 中的每一项对应一个候选 Token 的分数。

Decoder-only 可以据此概括为一种面向自回归语言建模的上下文表示系统。


二、从 Encoder--Decoder 到 Decoder-only:任务接口和计算路径的变化

1. Encoder--Decoder 与机器翻译的信息结构

2017 年提出的 Transformer 主要面向机器翻译等序列到序列任务 1。这类任务通常可以写成:

\X\\rightarrow Y \\

例如:

\X=\\text{I love Beijing} \\

\Y=\\text{我爱北京} \\

在开始生成时,输入 \(X\) 和输出 \(Y\) 的可见范围不同:

  • 输入 \(X\) 在开始生成之前已经完整给出;
  • 输出 \(Y\) 需要按照顺序逐个生成。

因此,原始 Transformer 将计算分为两个阶段:

\X \\xrightarrow{\\text{Encoder}} H_X \\

\Y_{\

Encoder 通过双向自注意力处理完整输入,得到输入表示 \(H_X\)。Decoder 先通过带因果掩码的自注意力处理已经生成的内容,再通过交叉注意力(Cross-Attention)读取 \(H_X\),最后预测下一个输出 Token。

这种结构与机器翻译中输入完整可见、输出逐步生成的特点一致。

2. 两种架构的信息融合路径不同

设输入为:

\X=\[x_1,x_2,x_3 \]

已经生成的输出为:

\Y=\[y_1,y_2 \]

在 Encoder--Decoder 中,计算过程可以简化为:

\X \\xrightarrow{\\text{Encoder 自注意力}} H_X \\

\Y \\xrightarrow{\\text{Decoder 自注意力}} H_Y \\xrightarrow{\\text{Cross-Attention}(H_X)} H'_Y \\

也就是说,Decoder 先形成输出序列内部的表示,再使用这份表示查询输入信息。自注意力和交叉注意力通常使用不同的参数,因此模型可以分别学习输出内部的关系,以及输出与输入之间的关系。

Decoder-only 则把输入和输出拼接为一条序列:

\Z=\[x_1,x_2,x_3,y_1,y_2 \]

并统一使用带因果掩码的自注意力:

\Z \\xrightarrow{\\text{因果自注意力}} H \\

当序列末尾是 \(y_2\)、模型准备预测下一个 Token 时,当前位置可以读取排在它之前的全部输入和输出。输入信息与输出历史在同一个自注意力模块中参与计算,不再设置单独的交叉注意力层。

两种架构都能让输出读取输入,但信息融合方式不同。Encoder--Decoder 分阶段处理输入和输出,并分别建立对应表示;Decoder-only 按一条连续序列处理二者,共享主要计算路径。

3. 因果掩码带来的边界

Encoder 的自注意力通常不使用因果掩码,因此每个输入位置都可以读取输入序列中的其他位置,并结合完整输入形成表示。标准 Decoder-only 使用因果掩码,每个位置只能读取它自己及之前的 Token,不能读取后面的 Token。

例如,在序列:

\\[x_1,x_2,x_3,y_1,y_2 \]

中,\(y_2\) 可以读取 \(x_1,x_2,x_3,y_1\);但 \(x_1\) 不能读取 \(x_2\) 和 \(x_3\)。所以,把输入和输出拼接后进行因果自注意力,与 Encoder 对输入进行完整的双向编码并不等价。

这一差异也说明,两种架构各有适用范围:

  • Encoder--Decoder 能够先对完整输入进行双向编码,并让自注意力与交叉注意力分别学习不同关系;
  • Decoder-only 结构更统一,可以直接把指令、对话历史、示例、文档和输出组织成连续上下文;
  • 具体效果仍取决于任务特点、训练数据、模型规模和实现方式,不能只根据架构名称判断优劣。

4. 从统一文本任务到统一自回归接口

T5 已经把分类、问答、摘要和翻译等任务统一为"文本输入到文本输出"的形式 4。例如,分类任务可以输出类别名称,问答任务可以输出答案文本。虽然任务形式得到了统一,T5 内部仍然采用 Encoder--Decoder 结构。

与 T5 不同,Decoder-only 还把指令、输入、示例和输出历史放入同一条序列,并通过统一的因果自注意力进行处理。

例如,下列内容都可以转换为 Token 序列:

  • 系统指令;
  • 用户问题;
  • 历史对话;
  • 少样本示例;
  • 检索到的资料;
  • 工具返回结果;
  • 已经生成的内容。

模型始终执行同一个计算目标:

\P(x_{t+1}\\mid x_{\\le t}) \\

这种统一有两方面意义。

第一,它减少了任务专用结构。分类任务不一定需要单独的分类头,问答、摘要和代码补全也不必分别设计完全不同的输出层。

第二,不同来源和不同形式的数据可以共同训练同一套模型参数。来自语言理解、问答、代码和推理任务的训练信号,都可以更新同一套 Token 嵌入、注意力层、前馈网络和语言模型输出层。模型因而有机会在任务之间复用语言表示、事实知识和处理信息的方法。

规模定律研究表明,语言模型的交叉熵损失与模型规模、数据量和训练计算之间存在较稳定的幂律关系 6。GPT-3 的实验还显示,扩大模型规模能够改善多项任务中的少样本表现 5。统一接口为不同任务共同更新模型参数提供了条件,但不能单独解释零样本学习(zero-shot learning)、少样本学习(few-shot learning)和上下文学习(in-context learning)的形成。

模型能力还受到数据覆盖范围与质量、参数规模、训练计算、优化方法和后训练方式等因素影响。参数共享有时也会造成任务之间相互干扰。

Decoder-only 统一了任务描述方式、主要计算路径和训练目标,使来自不同任务的数据能够共同更新同一套参数,并在生成时通过统一的上下文格式指定任务。

图 1:Encoder--Decoder 分阶段处理输入和输出;Decoder-only 将指令、输入、示例和已生成内容组织在同一条自回归序列中。


三、注意力机制:根据当前表示整合上下文信息

经过分词、Token 嵌入和位置处理后,输入可以表示为:

\X\\in\\mathbb{R}\^{T\\times D} \\

其中,\(T\) 是序列长度,\(D\) 是隐藏层维度。每个位置的初始表示包含 Token 信息和位置信息。

模型需要根据当前表示,动态计算当前位置与前文各位置的相关程度。同一个词在不同句子中的含义可能不同。例如,"苹果"可以表示水果,也可以表示公司。固定的位置依赖无法覆盖这种随上下文变化的关系。

自注意力(Self-Attention)通过查询向量(Query)、键向量(Key)和值向量(Value)完成这一计算:

\Q=XW_Q,\\quad K=XW_K,\\quad V=XW_V \\

其中,\(Q\)、\(K\) 和 \(V\) 都是由输入表示 \(X\) 经过线性变换得到的矩阵。矩阵中的每一行对应一个位置:\(Q\) 用于发起查询,\(K\) 用于计算位置间的匹配分数,\(V\) 提供随后参与加权求和的内容。

注意力计算为:

\\\operatorname{Attention}(Q,K,V) = \\operatorname{softmax} \\left( \\frac{QK\^T}{\\sqrt{d_k}}+M \\right)V \\

\(QK^T\) 计算位置之间的匹配分数,Softmax 将分数转换为权重,再对 \(V\) 做加权求和。\(M\) 表示注意力掩码。在标准 Decoder-only 中,当键位置 \(j\) 位于查询位置 \(i\) 之后时,\(M_{ij}=-\infty\);其余合法位置取 \(0\)。Softmax 之后,未来位置的注意力权重为 \(0\)。

注意力机制由此根据当前位置和上下文内容,动态确定要读取哪些历史信息,以及各部分信息所占的权重。

经过注意力机制处理后,张量形状通常仍然是:

\T\\times D \\longrightarrow T\\times D \\

形状没有改变,但每个位置的表示已经结合了与它相关的上下文。这个过程产生的表示通常称为上下文化表示(Contextualized Representation)。

多头注意力会在多个表示子空间中并行完成上述计算。不同注意力头可以学习不同的关系,但这些关系由训练过程形成,并不是人工预先规定的。它们也不一定能够被简单解释为某一种固定的语言关系。

多头注意力使模型能够从多个表示子空间同时整合上下文信息。在 Decoder-only 中,各注意力头仍受同一因果方向约束,只能利用当前位置及其之前的表示。

图 2:\(Q\) 与 \(K\) 计算匹配分数,Softmax 得到注意力权重,再对 \(V\) 提供的内容向量进行加权汇总。


四、FFN:对每个位置的表示进行非线性变换

注意力机制负责从上下文中整合信息,FFN 随后对每个位置的表示继续进行变换。

这一步由前馈网络(Feed-Forward Network,FFN)完成。经典形式为:

\\\operatorname{FFN}(x)=W_2\\sigma(W_1x) \\

其中,\(\sigma\) 是非线性激活函数。如果去掉非线性部分:

\W_2W_1x \\

两次线性变换仍然可以合并为一次线性变换,无法提供同等的非线性表示能力。

SwiGLU 是部分现代大语言模型采用的门控 FFN 形式,PaLM 和 Llama 3 都使用了这一结构 910。相关研究在对应实验设置中观察到,Transformer 的 FFN 子层采用部分 GLU 变体时,效果优于 ReLU 或 GELU 7

注意力机制负责整合不同位置之间的信息,FFN 负责对每个位置的表示进行非线性变换。二者在 Transformer 层中依次执行,使模型既能利用上下文关系,也能继续更新每个位置的表示。

同一层 FFN 的位置参数共享

在一个标准 Transformer 层中,同一套 FFN 参数会应用到序列的所有位置:

\\\operatorname{FFN}(h_1), \\operatorname{FFN}(h_2), \\ldots, \\operatorname{FFN}(h_T) \\

这里的"共享"是指同一层内的不同位置共享参数;不同 Transformer 层通常各自拥有独立的 FFN 参数。

自然语言中的绝对位置通常没有固定语义。第 17 个位置可能是人名、代码、数字或标点,因此没有必要仅根据位置为每个 Token 配置独立的 FFN。

不同内容也可以使用不同的处理参数。混合专家模型(Mixture of Experts,MoE)通过分配器(Router)选择参与计算的专家网络:

\\\text{Token} \\longrightarrow \\text{分配器} \\longrightarrow \\text{专家网络}_k \\

分配器根据当前 Token 的表示选择一个或少数几个专家网络进行计算。Switch Transformer 采用稀疏激活的专家选择方式,使不同输入可以调用不同参数,同时避免每次前向计算都激活全部专家 8

参数是否共享应当根据数据中的稳定结构来决定:

  • 如果不同位置没有固定语义角色,共享位置参数通常更合适;
  • 如果输入内容存在稳定差异,可以根据内容动态选择不同参数;
  • 在用户、商品、场景等角色明确的推荐系统中,也可以按字段或角色设计不同的处理模块。

这部分内容属于参数共享方式的延伸。对于 Decoder-only 主线而言,关键点是:标准 FFN 在同一层的所有序列位置共享参数,而 MoE 可以根据当前内容动态选择部分参数。


五、Transformer 的深度:逐层更新上下文表示

单层注意力机制已经能够整合上下文信息,但一层计算通常不足以形成复杂表示。

第 \(l+1\) 层接收的不是原始 Token 表示,而是第 \(l\) 层的输出:

\X\^{(l)} \\

新一层会基于这组表示重新计算:

\Q\^{(l)},K\^{(l)},V\^{(l)} \\

并再次更新位置之间的注意力权重和每个位置的表示。整个过程可以写成:

\X\^{(0)} \\rightarrow X\^{(1)} \\rightarrow X\^{(2)} \\rightarrow \\cdots \\rightarrow X\^{(L)} \\

每一层都会根据当前表示整合上下文信息,并通过 FFN 更新各位置表示。

因为上一层已经改变了输入表示,下一层计算出的注意力关系也可能不同。因此,多层 Transformer 不是简单重复完全相同的计算结果,而是在前一层结果的基础上继续更新表示。

残差连接和归一化为深层网络训练提供了重要支持。

残差连接的一般形式可以写成:

\X_{l+1}=X_l+\\Delta X_l \\

它让子层在已有表示的基础上学习更新量,同时为信息传播和梯度传播提供较短路径。

归一化用于调节隐藏表示的数值尺度,改善深层网络的训练稳定性。具体模型可能采用 LayerNorm、RMSNorm,以及 Pre-Norm 或 Post-Norm 等不同方案,但目标都是使多层计算更容易优化。

现代大语言模型仍然采用这一基本结构。例如,PaLM 是大规模稠密 Transformer 语言模型 9,Llama 3 的最大模型也使用稠密 Transformer 主干 10。这些实例说明,由注意力机制、FFN、残差连接和归一化组成的多层结构仍被用于超大规模模型。

在 Decoder-only 中,每一层都沿因果方向继续更新上下文表示。网络深度增加了连续更新表示的次数,但不会改变只能读取当前位置及其之前内容的约束。


六、下一 Token 预测目标驱动自回归预训练

经过多层 Transformer 后,位置 \(t\) 得到隐藏表示:

\h_t\\in\\mathbb{R}\^{D} \\

语言模型输出层将它映射到词表空间:

\z_t=h_tW_{\\text{vocab}} \\in\\mathbb{R}\^{V} \\

经过 Softmax 后,模型得到下一个 Token 的概率分布。在自回归预训练中,训练标签通常是原序列中紧随其后的 Token,单个位置的交叉熵损失为:

\L_t = -\\log P(x_{t+1}\\mid x_{\\le t}) \\

从数学形式上看,每个位置都在完成一次词表范围内的分类。但整个语言模型并不只是一个普通分类器,因为它学习的是序列的条件概率,而且生成阶段会把已经生成的 Token 继续加入上下文。

预训练时,因果掩码允许模型并行计算一个训练序列中多个位置的损失。生成时,后一个 Token 依赖前面已经生成的结果,因此通常需要按顺序生成。监督微调和偏好训练可能采用不同的数据组织方式与损失函数,不属于本节讨论的下一 Token 预训练目标。

在自回归预训练阶段,模型不会直接收到"这个注意力头应当学习指代关系"或"这一层应当完成逻辑推理"的人工标签。训练过程主要提供两类约束:

  • 模型结构规定信息参与计算的方式;
  • 下一 Token 的预测损失判断输出是否符合训练数据。

模型内部的表示方式和计算模式由数据、目标函数、模型结构和优化过程共同形成。


结语:Decoder-only 的整体认识

Decoder-only 将指令、输入、示例和生成历史组织在同一条 Token 序列中,并始终计算下一个 Token 的条件概率。因果自注意力负责在可见历史范围内整合信息,FFN 更新各位置表示,多层结构则在相同因果约束下持续完成这两类计算。

统一的任务接口使自然语言理解、问答、摘要、代码生成和部分逻辑推理任务能够使用相同的输入输出形式,并共同更新一套模型参数。这种共享为跨任务迁移提供了基础,但不会消除任务差异,也不能单独保证零样本学习、少样本学习和上下文学习等能力形成。

因此,Decoder-only 的主要特点是统一自回归任务定义、上下文组织方式和主要计算路径。模型的最终表现仍由架构、训练数据、参数规模、计算量、优化方法和后训练方式共同决定。


参考论文与资料

1 Vaswani, A., et al. (2017). Attention Is All You Need . NeurIPS. arXiv:1706.03762

2 Radford, A., et al. (2018). Improving Language Understanding by Generative Pre-Training . OpenAI. 论文 PDF

3 Radford, A., et al. (2019). Language Models are Unsupervised Multitask Learners . OpenAI. 论文 PDF

4 Raffel, C., et al. (2020). Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer . JMLR. arXiv:1910.10683

5 Brown, T. B., et al. (2020). Language Models are Few-Shot Learners . NeurIPS. arXiv:2005.14165

6 Kaplan, J., et al. (2020). Scaling Laws for Neural Language Models . arXiv:2001.08361

7 Shazeer, N. (2020). GLU Variants Improve Transformer . arXiv:2002.05202

8 Fedus, W., Zoph, B., & Shazeer, N. (2022). Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity . JMLR. arXiv:2101.03961

9 Chowdhery, A., et al. (2022). PaLM: Scaling Language Modeling with Pathways . arXiv:2204.02311

10 Grattafiori, A., et al. (2024). The Llama 3 Herd of Models . arXiv:2407.21783