05 Transformer Decoder 详解:GPT 为什么使用 Decoder?

在前面几章中,我们已经依次介绍了大语言模型的基本背景、从 RNN 到 Transformer 的演进过程,以及 Self-Attention 中 Q、K、V 的具体含义。

到这里,一个非常关键的问题自然出现了:

既然 Transformer 原论文中有 Encoder 和 Decoder 两部分,为什么后来的 GPT、LLaMA、Qwen、DeepSeek 等大语言模型大多选择 Decoder-only 架构?

这个问题非常重要。

因为今天主流的大语言模型,尤其是面向对话、代码、推理和 Agent 的模型,基本都建立在 Transformer Decoder 或其变体之上。理解 Decoder,就等于理解 GPT 类大模型的结构基础。

本文我们重点解释:

  1. Transformer Encoder 和 Decoder 有什么区别?

  2. GPT 为什么只使用 Decoder?

  3. 什么是 Causal Language Modeling?

  4. Causal Mask 如何保证模型不能偷看未来?

  5. GPT 是如何训练和生成文本的?

  6. 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 包含三个子层:

  1. Masked Multi-Head Self-Attention

  2. Encoder-Decoder Attention

  3. 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 任务统一成文本续写问题。

相关推荐
戴西软件14 小时前
AICrash智能行人保护:CAxWorks.VPG 如何让汽车安全仿真快人一步
人工智能·深度学习·汽车
独隅14 小时前
PyTorch 新手从零搭建深度学习环境实战指南
人工智能·pytorch·深度学习
keineahnung234514 小时前
在 Google Colab 中安裝 PyTorch 2.2.0
人工智能·pytorch·python·深度学习
牧鸯人15 小时前
基于yolov8的课堂行为检测系统——主要功能检测睡觉、手机、人数
python·深度学习·yolo·学生行为统计
蓦然回首却已人去楼空15 小时前
深度学习进阶:自然语言处理|6.1.4 QA|L2 范数、梯度裁剪与 L1/L2 正则化详解
人工智能·深度学习·自然语言处理
AI算法沐枫15 小时前
机器学习经典小项目1:鸢尾花分类
人工智能·pytorch·深度学习·神经网络·机器学习·分类·数据挖掘
维度攻城狮15 小时前
【高性价比】个人深度学习电脑配置
人工智能·深度学习·深度学习工作站
z小猫不吃鱼15 小时前
06 Tokenizer 详解:BPE、WordPiece、SentencePiece 有什么区别?
人工智能·语言模型·自然语言处理·transformer
weixin_4684668515 小时前
PyTorch 深度学习框架核心能力与实战评测
人工智能·pytorch·深度学习·神经网络·计算机视觉·动态图·模型训练