编程与 AI11 分钟阅读更新于 2026-07-31

Encoder、Decoder、Decoder-only 有什么区别:看懂 Transformer 的三种用法

从信息流向、注意力掩码和输入输出关系出发,理解 Encoder、Decoder、Encoder-Decoder 与 Decoder-only 的结构差异和应用场景。

相关工具

先别把 Decoder-only 当成另一种完全不同的模型

Encoder 和 Decoder 原本是 Transformer 论文里的一对组件。Encoder 负责读取输入,把每个位置编码成包含上下文的信息;Decoder 负责根据已经生成的内容逐步输出结果。后来 GPT 采用了只保留 Decoder 堆叠的方案,大家就常把它叫作 Decoder-only。

三者的区别主要在信息怎么流动。Encoder 可以让输入中的位置互相查看,适合把一段文本整体读懂;Decoder 在生成时只能利用当前之前的内容,适合按顺序写下去;Encoder-Decoder 则先用 Encoder 读完输入,再让 Decoder 结合输入表示和已生成内容输出目标序列。

所以,Encoder、Decoder 和 Decoder-only 不是简单的三个等级。它们是三种不同的结构选择,分别适合不同的输入输出关系。理解这点后,BERT、GPT、T5 等模型的架构差异会清楚很多。

Encoder、Decoder 和 Encoder-Decoder 三种 Transformer 架构的信息流向对比图
三种 Transformer 结构

Encoder 读取完整输入,Decoder 逐步生成,Encoder-Decoder 先读输入再生成输出。

Encoder:把输入当成一整段材料来理解

Encoder 的输入通常是已经完整给出的文本。自注意力层会计算输入位置之间的关系,让每个 Token 结合其他位置的信息形成上下文表示。句子前面的词可以关注后面的词,后面的词也可以反过来参考前面的词,这就是常说的双向注意力。

双向不等于模型预知未来。这里的未来,是指输入句子里已经存在、但在当前词左边或右边的位置。因为整段输入在送入 Encoder 前已经准备好,模型可以利用完整句子判断词义和关系。BERT 就是典型的 Encoder-only 模型。

这种结构很适合分类、语义匹配、命名实体识别和抽取式问答。模型先把文本读成表示,再由任务层判断类别、计算相似度,或者标记答案在原文中的起止位置。任务输出通常依赖输入的整体理解,而不是让模型自由写很长的文本。

Decoder:生成时必须遵守因果顺序

Decoder 的自注意力通常带有因果掩码。生成第一个位置时,它不能看到后面的 Token;生成第二个位置时,只能看到已经存在的前文,以此类推。注意力矩阵因此呈现下三角形,当前位置能够关注自己和左侧位置,但不能偷看右侧内容。

这个限制和语言生成的实际过程一致。模型不可能先看到完整答案再假装逐字写出来,而是每生成一个 Token,才能把它放回上下文,继续预测下一个 Token。自回归语言模型正是用这种方式训练和推理。

Decoder 层还可以通过交叉注意力读取 Encoder 的输出。这样一来,Decoder 生成每个目标 Token 时,既能参考已经生成的目标前缀,也能访问完整的输入表示。翻译、摘要和语音转文本等序列到序列任务经常采用这种 Encoder-Decoder 组合。

Encoder 全可见、Decoder 只能看前文、Encoder-Decoder 通过交叉注意力访问输入的掩码矩阵图
注意力的可见范围

Encoder 的输入位置全可见,Decoder 只能看前文,Encoder-Decoder 还可以通过交叉注意力访问全部输入。

Decoder-only:把输入和输出接成一条序列

Decoder-only 模型保留 Decoder 的自回归结构,但通常去掉了单独的 Encoder 和跨注意力模块。用户问题、指令、示例和模型回答可以拼成同一条 Token 序列,模型只需要按照从左到右的方式继续生成。GPT 及其后来的许多大语言模型都采用了这条路线。

这种设计的好处是形式统一。聊天、改写、摘要、翻译和代码生成,看起来是不同任务,但都可以表达成‘给定前面的上下文,请继续生成目标内容’。指令微调之后,模型会根据输入内容判断这次要做什么,再用同一个生成过程输出结果。

代价是输入和输出共享一条因果信息流。模型不能像 Encoder 那样在同一时刻双向读取整段输入,而是按序处理上下文;生成长答案时还需要逐 Token 推理。现代推理优化、KV Cache 和批处理技术,正是为了降低这种自回归生成的成本。

三种结构的训练目标并不一样

Encoder 常用遮盖语言模型或其他理解型目标。训练时把输入中的一部分 Token 遮住,让模型结合左右上下文恢复它们。模型需要理解整句里的关系,所以双向注意力很有价值。BERT 的预训练就包含这类任务。

Decoder 和 Decoder-only 常用自回归语言建模。模型根据前文预测下一个 Token,不能看到待预测位置后面的真实内容。大量文本训练之后,模型不仅学到词语接续,也会在文本结构里学到解释、问答、代码和推理的模式。

Encoder-Decoder 的目标通常是把一个序列转换成另一个序列。Encoder 负责读源序列,Decoder 负责生成目标序列。T5 把许多任务都改写成文本到文本的形式,翻译、摘要、分类都可以用统一的输入到输出框架表示。

应该怎样按任务选择架构

如果任务主要是理解和判断一段输入,Encoder 往往更直接。搜索排序、文本分类、向量检索、实体识别和相似度计算,都可以先得到输入的上下文表示,再交给后续模块处理。它不需要为每个结果自由生成一大段文本。

如果任务需要开放式输出,Decoder-only 通常更方便。对话、文章续写、代码生成和结构化文本输出,都可以从一段提示开始,按顺序生成回答。统一的输入形式也便于用指令微调和偏好优化训练成通用助手。

如果输入和输出是两段关系清晰的序列,Encoder-Decoder 仍然很合适。翻译就是先读源语言,再生成目标语言;摘要是先读原文,再生成摘要。具体选择还要考虑模型规模、延迟、上下文长度、训练数据和部署成本。

Encoder、Decoder-only 和 Encoder-Decoder 分别对应分类检索、对话生成和翻译转换任务的图示
架构与任务的对应关系

Encoder 偏向分类与检索,Decoder-only 偏向对话与生成,Encoder-Decoder 偏向翻译与序列转换。

为什么现在很多通用大模型采用 Decoder-only

Decoder-only 的核心吸引力,在于它把大量任务统一成了语言生成问题。只要能把任务说明、输入材料和期望格式放进上下文,模型就可以用同一套自回归过程完成输出。这让预训练、指令微调、对话推理和产品接入之间的边界更简单。

但‘通用’不代表所有组件都被它取代。现实系统里仍然经常使用 Encoder 模型做向量表示和检索,再把召回内容交给 Decoder-only 模型组织答案;也可以使用专门的排序或分类模型做前置判断。结构选择往往是系统组合,而不是非此即彼。

学习 Transformer 时,可以先问三个问题:输入是否已经完整给出,输出是否需要逐步生成,输入与输出是否属于两条不同序列。答案基本就能帮助你判断应该优先理解 Encoder、Decoder-only,还是 Encoder-Decoder。

可以这样记住三种结构

Encoder 负责把完整输入读懂,双向注意力让每个位置都能利用上下文;Decoder 负责按顺序生成,并用因果掩码避免看到未来内容;Encoder-Decoder 把两者接起来,先编码输入,再解码输出;Decoder-only 则只保留 Decoder,用一条因果序列统一处理输入和生成。

一句话概括:看输入流向,再看输出形式。理解这两个问题,通常比背模型名称更容易分清 Transformer 的结构。

常见问题

Decoder-only 是不是没有 Encoder?

通常是的。Decoder-only 主要由 Decoder 堆叠组成,把输入和输出放在同一条因果序列中处理,不再使用独立 Encoder 和跨注意力模块。

Encoder 为什么能使用双向注意力?

因为它处理的是已经完整给出的输入,当前位置可以同时参考左右两侧的 Token。生成时不能偷看未来的限制主要属于自回归 Decoder。

翻译任务一定要用 Encoder-Decoder 吗?

不一定。Decoder-only 也能通过提示完成翻译,但 Encoder-Decoder 的输入编码和目标生成分工更明确,适合传统的序列到序列任务。