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

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 为什么只使用 Decoder3. 什么是 Causal Language Modeling4. Causal Mask 如何保证模型不能偷看未来5. GPT 是如何训练和生成文本的6. Decoder-only 架构为什么能统一问答、翻译、摘要、代码和推理任务一、先回顾 Transformer 的三种基本形态Transformer 原论文提出的是 Encoder-Decoder 架构。也就是输入序列↓Encoder↓Encoder 输出表示↓Decoder↓输出序列这种结构最早主要用于机器翻译。英文句子 → Encoder → 语义表示 → Decoder → 中文句子但是后来Transformer 被拆分和改造出了三种常见形态Encoder-onlyDecoder-onlyEncoder-Decoder对应代表模型如下架构类型代表模型典型任务Encoder-onlyBERT、RoBERTa文本分类、阅读理解、命名实体识别Decoder-onlyGPT、LLaMA、Qwen、DeepSeek文本生成、对话、代码、推理Encoder-DecoderT5、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 ModelingCausal Language Modeling 可以翻译为因果语言建模。这里的“因果”不是因果推理中的因果而是指当前 token 的预测只能依赖它之前的 token不能依赖它之后的 token。假设一个文本序列为语言模型要建模整个序列的概率根据链式法则可以分解为这个公式的意思是第 1 个 token 有自己的概率第 2 个 token 依赖第 1 个 token第 3 个 token 依赖前两个 token第 i 个 token 依赖它之前的所有 tokenGPT 类模型训练的就是这个条件概率也就是看到前文预测下一个 token。例如训练文本是大语言模型正在改变人工智能的发展方向模型训练时会形成很多预测任务输入大预测语言输入大 语言预测模型输入大 语言 模型预测正在输入大 语言 模型 正在预测改变输入大 语言 模型 正在 改变预测人工智能这就是 next-token prediction。看起来非常简单但它是 GPT 类大语言模型最核心的训练目标。五、为什么 next-token prediction 能训练出强模型很多人第一次看到 GPT 的训练目标时会觉得很疑惑只是预测下一个 token为什么最后模型能写文章、写代码、做翻译、做数学题、回答问题原因在于大规模文本中包含了大量任务模式。例如互联网上的文本可能包含问答、教程、代码、论文、新闻、百科、对话、翻译、数学题、推理过程、表格、JSON、程序注释、错误日志。当模型学习“根据前文预测后文”时它实际上在学习这些文本模式背后的规律。例如训练数据中有大量问答形式问题什么是 Transformer答案Transformer 是一种基于注意力机制的神经网络结构。模型就会学到看到“问题...”后后面通常应该生成“答案...”又比如训练数据中有大量代码def add(a, b):return a b模型就会学到代码语法、变量使用、函数结构等模式。再比如训练数据中有大量数学推理已知 a2, b3则 ab5。模型也会学习到某些推理模式。因此next-token prediction 表面上只是续写实际上是在大规模数据中学习语言、知识、格式、代码、推理和任务模式。这也是 GPT 路线非常强大的原因。六、Transformer Decoder 原始结构是什么在原始 Transformer 中Decoder 不是独立存在的而是和 Encoder 配合使用。一个标准 Transformer Decoder layer 包含三个子层1. Masked Multi-Head Self-Attention2. Encoder-Decoder Attention3. 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 NetworkFFN 对每个位置的表示做非线性变换。它不负责 token 之间的交互而是增强每个 token 表示的表达能力。七、GPT 使用的是哪种 DecoderGPT 使用的是Decoder-only Transformer。但要注意GPT 的 Decoder 和原始 Transformer 中用于机器翻译的 Decoder 并不完全一样。原始 Transformer Decoder 有三部分Masked Self-AttentionEncoder-Decoder AttentionFeed Forward Network而 GPT 没有 Encoder因此也就不需要 Encoder-Decoder Attention。所以 GPT 的基本 block 更接近Masked Multi-Head Self-AttentionFeed Forward Network再加上Residual ConnectionLayerNormPosition EmbeddingLM Head可以简化表示为Token Embedding↓Position Embedding↓Transformer Decoder Block × N↓LayerNorm↓LM Head↓预测下一个 token其中每个 Decoder Block 包含Masked Self-AttentionFeed Forward Network / MLPResidual ConnectionLayerNormGPT 不需要 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 CompletionGPT 的统一任务形式GPT 类模型的输入可以理解为 prompt。模型输出可以理解为 completion。例如Prompt请解释什么是 Self-Attention。CompletionSelf-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 的损失函数交叉熵预测下一个 tokenGPT 的输出是一个词表上的概率分布。假设词表大小为V模型在第 (t) 个位置输出 logits经过 softmax 得到每个 token 的概率如果真实下一个 token 是那么该位置的交叉熵损失为整个序列的训练损失为也可以写成平均形式这个公式说明GPT 训练时就是让真实下一个 token 的概率尽可能高。如果模型预测得准损失就小。如果模型把概率分配给错误 token损失就大。十二、Causal MaskDecoder 的核心限制Decoder-only 架构最重要的机制之一是 causal mask。没有 causal maskSelf-Attention 会让每个 token 看到整个序列包括未来 token。这在理解任务中可以接受但在生成任务中是不允许的。例如训练句子我 今天 去 学校当模型在位置 2 预测“去”时如果它能看到后面的“学校”就相当于偷看了答案。因此causal mask 要保证第 1 个位置只能看第 1 个位置 第 2 个位置只能看第 1、2 个位置 第 3 个位置只能看第 1、2、3 个位置 第 4 个位置只能看第 1、2、3、4 个位置对应的可见关系如下位置可以看到的 tokenx1x1x2x1, x2x3x1, x2, x3x4x1, x2, x3, x4十三、GPT 如何生成文本训练完成后GPT 的推理过程是逐 token 生成。假设用户输入请解释什么是 Transformer。模型首先把这句话分成 token然后输入模型。模型输出下一个 token 的概率分布。例如候选 token 概率可能是token概率Transformer0.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 Sampling1. Greedy Decoding每一步都选择概率最高的 token。优点是稳定。缺点是容易生成重复、保守、缺乏多样性的文本。2. Sampling按照概率分布随机采样 token。优点是生成更丰富。缺点是可能不稳定甚至跑偏。3. Top-k Sampling只从概率最高的 (k) 个 token 中采样。例如 (k50)就只考虑最可能的 50 个 token。4. Top-p Sampling也叫 nucleus sampling。它选择累计概率达到 (p) 的最小 token 集合然后从中采样。例如 (p0.9)模型只在累计概率为 90% 的候选 token 中采样。5. TemperatureTemperature 控制概率分布的平滑程度。如果 temperature 较低模型更倾向于选择高概率 token输出更稳定。如果 temperature 较高模型会更随机输出更有创造性但也更容易出错。所以 GPT 的输出不仅取决于模型本身也取决于解码策略。十五、Decoder-only 如何统一多种 NLP 任务Decoder-only 架构最强大的地方在于它可以把很多任务都统一成文本生成。下面看几个例子。1. 文本分类传统分类模型输出类别 ID。GPT 可以把分类任务写成请判断下面句子的情感是 positive 还是 negative。 句子这部电影非常精彩我很喜欢。 答案模型输出positive2. 翻译任务请把下面英文翻译成中文 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 True6. 数学推理小明有 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 任务统一成文本续写问题。