在前面几章中,我们已经依次介绍了大语言模型的基本背景、从 RNN 到 Transformer 的演进过程,以及 Self-Attention 中 Q、K、V 的具体含义。
到这里,一个非常关键的问题自然出现了:
既然 Transformer 原论文中有 Encoder 和 Decoder 两部分,为什么后来的 GPT、LLaMA、Qwen、DeepSeek 等大语言模型大多选择 Decoder-only 架构?
这个问题非常重要。
因为今天主流的大语言模型,尤其是面向对话、代码、推理和 Agent 的模型,基本都建立在 Transformer Decoder 或其变体之上。理解 Decoder,就等于理解 GPT 类大模型的结构基础。
本文我们重点解释:
-
Transformer Encoder 和 Decoder 有什么区别?
-
GPT 为什么只使用 Decoder?
-
什么是 Causal Language Modeling?
-
Causal Mask 如何保证模型不能偷看未来?
-
GPT 是如何训练和生成文本的?
-
Decoder-only 架构为什么能统一问答、翻译、摘要、代码和推理任务?
一、先回顾 Transformer 的三种基本形态
Transformer 原论文提出的是 Encoder-Decoder 架构。也就是:
输入序列
↓
Encoder
↓
Encoder 输出表示
↓
Decoder
↓
输出序列
这种结构最早主要用于机器翻译。英文句子 → Encoder → 语义表示 → Decoder → 中文句子
但是后来,Transformer 被拆分和改造出了三种常见形态:
Encoder-only
Decoder-only
Encoder-Decoder
对应代表模型如下:
| 架构类型 | 代表模型 | 典型任务 |
|---|---|---|
| Encoder-only | BERT、RoBERTa | 文本分类、阅读理解、命名实体识别 |
| Decoder-only | GPT、LLaMA、Qwen、DeepSeek | 文本生成、对话、代码、推理 |
| Encoder-Decoder | T5、BART、原始 Transformer | 翻译、摘要、Seq2Seq 任务 |
这三类结构的核心差异在于:
模型在处理当前位置时,能看到哪些上下文信息,以及它的训练目标是什么。
二、Encoder:更适合理解任务
Encoder 的特点是:每个 token 可以同时看到左右两侧上下文
例如句子:我今天去学校上课
在 Encoder 中,"学校"这个 token 可以同时关注:
左边:我今天去
右边:上课
这种双向上下文建模非常适合理解任务。
例如:
判断句子情感
判断两个句子是否矛盾
识别文本中的人名、地点、机构名
根据文章回答问题
BERT 就是 Encoder-only 架构的代表。
BERT 的核心预训练任务是 Masked Language Modeling,也就是随机遮住一些词,让模型根据左右上下文预测被遮住的词。
例如:我今天去 MASK 上课。
模型可以同时利用左边的"我今天去"和右边的"上课",预测出:学校
所以 Encoder 的优势是:
上下文理解能力强
适合理解类任务
可以双向建模
但它的问题是:天然不适合从左到右生成文本。
因为生成任务要求模型一个 token 一个 token 地往后生成,不能提前看到未来答案。
三、Decoder:更适合生成任务
Decoder 的核心特点是:当前位置只能看到自己和之前的 token,不能看到未来 token。
例如序列:我 今天 想 去 学校
当模型预测"学校"时,它只能看到:我 今天 想 去
不能提前看到"学校"。这和语言生成任务天然一致。因为人类写句子时,也是从左到右逐步写出来的:
先写第 1 个词
再写第 2 个词
再写第 3 个词
...
GPT 类模型采用的正是这种方式。它的训练目标是:
给定前面的 token,预测下一个 token。
这就是 Causal Language Modeling ,也叫 自回归语言建模。
四、什么是 Causal Language Modeling?
Causal Language Modeling 可以翻译为因果语言建模。
这里的"因果"不是因果推理中的因果,而是指:
当前 token 的预测只能依赖它之前的 token,不能依赖它之后的 token。
假设一个文本序列为:
语言模型要建模整个序列的概率:
根据链式法则,可以分解为:
这个公式的意思是:
第 1 个 token 有自己的概率
第 2 个 token 依赖第 1 个 token
第 3 个 token 依赖前两个 token
第 i 个 token 依赖它之前的所有 token
GPT 类模型训练的就是这个条件概率:
也就是:看到前文,预测下一个 token。
例如训练文本是:大语言模型正在改变人工智能的发展方向
模型训练时会形成很多预测任务:
输入:大
预测:语言
输入:大 语言
预测:模型
输入:大 语言 模型
预测:正在
输入:大 语言 模型 正在
预测:改变
输入:大 语言 模型 正在 改变
预测:人工智能
这就是 next-token prediction。
看起来非常简单,但它是 GPT 类大语言模型最核心的训练目标。
五、为什么 next-token prediction 能训练出强模型?
很多人第一次看到 GPT 的训练目标时,会觉得很疑惑:
只是预测下一个 token,为什么最后模型能写文章、写代码、做翻译、做数学题、回答问题?
原因在于,大规模文本中包含了大量任务模式。
例如,互联网上的文本可能包含:问答、教程、代码、论文、新闻、百科、对话、翻译、数学题、推理过程、表格、JSON、程序注释、错误日志。当模型学习"根据前文预测后文"时,它实际上在学习这些文本模式背后的规律。
例如训练数据中有大量问答形式:
问题:什么是 Transformer?
答案:Transformer 是一种基于注意力机制的神经网络结构。
模型就会学到:看到"问题:..."后,后面通常应该生成"答案:..."
又比如训练数据中有大量代码:
def add(a, b):
return a + b
模型就会学到代码语法、变量使用、函数结构等模式。
再比如训练数据中有大量数学推理:已知 a=2, b=3,则 a+b=5。模型也会学习到某些推理模式。
因此,next-token prediction 表面上只是续写,实际上是在大规模数据中学习语言、知识、格式、代码、推理和任务模式。这也是 GPT 路线非常强大的原因。
六、Transformer Decoder 原始结构是什么?
在原始 Transformer 中,Decoder 不是独立存在的,而是和 Encoder 配合使用。
一个标准 Transformer Decoder layer 包含三个子层:
Masked Multi-Head Self-Attention
Encoder-Decoder Attention
Feed Forward Network
结构如下:
目标序列输入
↓
Masked Self-Attention
↓
Add & Norm
↓
Encoder-Decoder Attention
↓
Add & Norm
↓
Feed Forward Network
↓
Add & Norm
↓
输出
这三个子层分别做不同的事情。
1. Masked Self-Attention
这一层负责建模目标序列内部的上下文关系。
例如机器翻译中,Decoder 已经生成了:我 喜欢
现在要预测下一个词。
Masked Self-Attention 允许当前位置关注:
我
喜欢
但不允许它关注未来还没有生成的词。
2. Encoder-Decoder Attention
这一层负责让 Decoder 关注 Encoder 的输出。
例如源语言句子是:I love machine learning.
目标语言正在生成:我 喜欢
当 Decoder 要生成"机器"时,它可以通过 Encoder-Decoder Attention 关注英文中的:machine
所以 Encoder-Decoder Attention 的作用是:让输出序列在生成时参考输入序列的信息。
3. Feed Forward Network
FFN 对每个位置的表示做非线性变换。它不负责 token 之间的交互,而是增强每个 token 表示的表达能力。
七、GPT 使用的是哪种 Decoder?
GPT 使用的是 Decoder-only Transformer。但要注意,GPT 的 Decoder 和原始 Transformer 中用于机器翻译的 Decoder 并不完全一样。原始 Transformer Decoder 有三部分:
Masked Self-Attention
Encoder-Decoder Attention
Feed Forward Network
而 GPT 没有 Encoder,因此也就不需要 Encoder-Decoder Attention。所以 GPT 的基本 block 更接近:
Masked Multi-Head Self-Attention
Feed Forward Network
再加上:
Residual Connection
LayerNorm
Position Embedding
LM Head
可以简化表示为:
Token Embedding
↓
Position Embedding
↓
Transformer Decoder Block × N
↓
LayerNorm
↓
LM Head
↓
预测下一个 token
其中每个 Decoder Block 包含:
Masked Self-Attention
Feed Forward Network / MLP
Residual Connection
LayerNorm
GPT 不需要 Encoder,因为它不是典型的"输入序列到输出序列"的翻译模型,而是直接把所有内容都放到一个序列中进行自回归建模。
八、为什么 GPT 不需要 Encoder?
这是理解 GPT 的关键。传统 Seq2Seq 任务通常有明确的输入和输出:
输入:英文句子
输出:中文句子
因此很自然地使用:
Encoder 编码输入
Decoder 生成输出
但 GPT 的思路不同。GPT 把任务统一成一个连续文本序列。例如翻译任务可以写成:
把下面英文翻译成中文:I love machine learning.
答案:
然后模型继续生成:
我喜欢机器学习
问答任务可以写成:
问题:Transformer 的核心思想是什么?
答案:
然后模型继续生成:
Transformer 的核心思想是使用注意力机制建模序列中 token 之间的关系。
代码生成任务可以写成:
请写一个 Python 函数,输入两个数,返回它们的和。
代码:
然后模型继续生成:
def add(a, b):
return a + b
也就是说,GPT 不需要单独区分"输入"和"输出"。它把它们都看作同一个文本序列:
prompt + completion
模型只需要根据前面的 prompt,继续生成后面的 completion。这就是 GPT 不需要 Encoder 的根本原因:
GPT 把所有任务都统一成了"给定前文,续写后文"。
九、Prompt + Completion:GPT 的统一任务形式
GPT 类模型的输入可以理解为 prompt。
模型输出可以理解为 completion。
例如:
Prompt:
请解释什么是 Self-Attention。
Completion:
Self-Attention 是一种让序列中每个 token 根据其他 token 更新自身表示的机制。
训练和推理都可以统一为:
但在模型内部,它其实仍然是在做:
也就是一个 token 一个 token 地预测。假设完整文本是:
请解释什么是 Self-Attention。Self-Attention 是一种注意力机制。
模型训练时并不知道哪个部分是 prompt,哪个部分是 completion。它只是在学习整个文本的下一个 token。
后来经过指令微调后,模型才更明确地学会:
用户输入是指令
助手输出是回答
这也是为什么 GPT 类模型可以统一处理很多任务。因为无论任务是什么,都可以转成:
输入一段文本,然后继续生成一段文本。
十、GPT 的训练过程:并不是一个 token 一个 token 慢慢训练
虽然 GPT 的目标是预测下一个 token,但训练时并不是像推理一样一个 token 一个 token 生成。
训练时,给定一个长度为 (n) 的序列:
x1, x2, x3, ..., xn
模型可以并行预测所有位置的下一个 token。输入是:
x1, x2, x3, ..., x_{n-1}
目标是:
x2, x3, x4, ..., x_n
也就是说:
输入序列右移一位就是目标序列。
例如文本:
大 语言 模型 很 强
训练样本可以看作:
| 输入位置 | 模型看到的上下文 | 预测目标 |
|---|---|---|
| 1 | 大 | 语言 |
| 2 | 大 语言 | 模型 |
| 3 | 大 语言 模型 | 很 |
| 4 | 大 语言 模型 很 | 强 |
通过 causal mask,模型虽然一次性输入整段文本,但每个位置只能看到它之前的位置。因此训练可以并行,目标仍然符合自回归生成。这正是 Transformer Decoder 的优势:
训练时可以并行计算
推理时可以逐 token 生成
十一、GPT 的损失函数:交叉熵预测下一个 token
GPT 的输出是一个词表上的概率分布。假设词表大小为:V
模型在第 (t) 个位置输出 logits:
经过 softmax 得到每个 token 的概率:
如果真实下一个 token 是:
那么该位置的交叉熵损失为:
整个序列的训练损失为:
也可以写成平均形式:
这个公式说明:
GPT 训练时,就是让真实下一个 token 的概率尽可能高。
如果模型预测得准,损失就小。如果模型把概率分配给错误 token,损失就大。
十二、Causal Mask:Decoder 的核心限制
Decoder-only 架构最重要的机制之一是 causal mask。没有 causal mask,Self-Attention 会让每个 token 看到整个序列,包括未来 token。这在理解任务中可以接受,但在生成任务中是不允许的。例如训练句子:我 今天 去 学校
当模型在位置 2 预测"去"时,如果它能看到后面的"学校",就相当于偷看了答案。
因此,causal mask 要保证:
第 1 个位置只能看第 1 个位置
第 2 个位置只能看第 1、2 个位置
第 3 个位置只能看第 1、2、3 个位置
第 4 个位置只能看第 1、2、3、4 个位置
对应的可见关系如下:
| 位置 | 可以看到的 token |
|---|---|
| x1 | x1 |
| x2 | x1, x2 |
| x3 | x1, x2, x3 |
| x4 | x1, x2, x3, x4 |
十三、GPT 如何生成文本?
训练完成后,GPT 的推理过程是逐 token 生成。
假设用户输入:
请解释什么是 Transformer。
模型首先把这句话分成 token,然后输入模型。模型输出下一个 token 的概率分布。例如候选 token 概率可能是:
| token | 概率 |
|---|---|
| Transformer | 0.30 |
| 它 | 0.20 |
| 是 | 0.15 |
| 一种 | 0.10 |
| 深度 | 0.05 |
模型根据某种解码策略选择一个 token。例如选择:
Transformer
然后把这个 token 接到原输入后面:
请解释什么是 Transformer。Transformer
再输入模型,预测下一个 token。如此循环:
请解释什么是 Transformer。Transformer 是 一种 基于 注意力 机制 的 神经 网络 结构。
直到生成结束符,或者达到最大长度。
十四、常见解码策略:不是每次都选概率最大
GPT 输出的是下一个 token 的概率分布。如何从概率分布中选择 token,就是解码策略。
常见策略包括:
Greedy Decoding
Beam Search
Sampling
Top-k Sampling
Top-p Sampling
Temperature Sampling
1. Greedy Decoding
每一步都选择概率最高的 token。优点是稳定。缺点是容易生成重复、保守、缺乏多样性的文本。
2. Sampling
按照概率分布随机采样 token。优点是生成更丰富。缺点是可能不稳定,甚至跑偏。
3. Top-k Sampling
只从概率最高的 (k) 个 token 中采样。例如 (k=50),就只考虑最可能的 50 个 token。
4. Top-p Sampling
也叫 nucleus sampling。它选择累计概率达到 (p) 的最小 token 集合,然后从中采样。例如 (p=0.9),模型只在累计概率为 90% 的候选 token 中采样。
5. Temperature
Temperature 控制概率分布的平滑程度。如果 temperature 较低,模型更倾向于选择高概率 token,输出更稳定。如果 temperature 较高,模型会更随机,输出更有创造性,但也更容易出错。所以 GPT 的输出不仅取决于模型本身,也取决于解码策略。
十五、Decoder-only 如何统一多种 NLP 任务?
Decoder-only 架构最强大的地方在于:
它可以把很多任务都统一成文本生成。
下面看几个例子。
1. 文本分类
传统分类模型输出类别 ID。GPT 可以把分类任务写成:
请判断下面句子的情感是 positive 还是 negative。
句子:这部电影非常精彩,我很喜欢。
答案:
模型输出:
positive
2. 翻译任务
请把下面英文翻译成中文:
I love machine learning.
翻译:
模型输出:
我喜欢机器学习。
3. 摘要任务
请总结下面这段文字:
[长文本]
摘要:
模型输出摘要。
4. 问答任务
问题:Transformer 的核心机制是什么?
答案:
模型输出:
Transformer 的核心机制是 Self-Attention。
5. 代码生成
请写一个 Python 函数,判断一个数是否为素数。
模型输出代码:
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
6. 数学推理
小明有 3 个苹果,又买了 5 个,一共有几个?
请一步一步计算。
模型输出:
小明原来有 3 个苹果,又买了 5 个,所以总数是 3 + 5 = 8 个。
这些任务形式不同,但在 GPT 看来,本质上都是:
根据前面的文本,继续生成合理的后续文本。
这就是 Decoder-only 架构强大的地方。
十六、为什么 Decoder-only 成为大语言模型主流?
现在主流 LLM 大多采用 Decoder-only 架构,主要有几个原因。
1. 训练目标简单统一
Decoder-only 模型只需要做 next-token prediction。不需要设计复杂任务标签,也不需要为每个任务单独设计结构。只要有大量文本,就可以训练。
2. 数据来源广泛
互联网上的大部分文本天然就是连续文本。
例如:
网页
书籍
代码
论文
论坛
新闻
百科
对话
说明文档
这些数据都可以直接转成语言建模数据。
3. 推理方式自然
生成文本本来就是从左到右逐步生成。Decoder-only 的 causal language modeling 与推理过程天然一致。
4. 任务接口统一
所有任务都可以通过 prompt 转成文本生成。这让 Decoder-only 模型可以成为通用语言接口。
5. 易于扩展
Decoder-only 结构相对简单。堆叠更多层、增加 hidden size、扩大数据规模,就可以形成更大的语言模型。这也是 GPT-3、LLaMA、Qwen、DeepSeek 等模型选择这一路线的重要原因。
十七、Decoder-only 和 Encoder-Decoder 谁更好?
这个问题不能简单回答。不同架构适合不同任务。
| 架构 | 优势 | 局限 |
|---|---|---|
| Encoder-only | 理解能力强,适合分类和抽取 | 不适合直接生成长文本 |
| Encoder-Decoder | 适合输入输出明确的 Seq2Seq 任务 | 结构较复杂,预训练和推理成本更高 |
| Decoder-only | 生成统一、扩展性强、适合大模型 | 双向理解不如 Encoder 直接,长上下文成本高 |
对于机器翻译、摘要等传统 Seq2Seq 任务,Encoder-Decoder 结构依然非常自然。但是对于今天的大语言模型来说,我们希望模型完成的不只是翻译,而是:
问答
对话
写作
代码
推理
工具调用
任务规划
多轮交互
这些任务都可以统一成文本生成,因此 Decoder-only 更适合作为通用大模型架构。所以不是 Encoder-Decoder 不好,而是 Decoder-only 更适合构建统一的通用生成接口。
GPT 的 Decoder 可以这样理解:
它是一个只能看左边上下文的 Transformer,通过不断预测下一个 token,把几乎所有 NLP 任务统一成文本续写问题。