在“文档处理工作室”里,有两位风格迥异的骨干。小遥是精读分析师:她把整份材料摊开,同时扫视所有句子,从任意词语出发,都能看见它与全篇其他词的关联,然后给出“这段话在讲什么、哪句话可以抽成标签”的结论。小风是接龙作家:他从不翻看桌子那头未写的空白,只盯着已经写下的文字,依靠前文一句一句往下推敲出下一句。同一个工作室,两种本事——在深度学习圈里,这对搭档正是编码器(Encoder)与解码器(Decoder)。 Transformer 大火之后,几乎所有预训练模型都从这两者中选边站:BERT 完全由编码器构成,擅长理解与分类;GPT 完全由解码器构成,擅长续写与生成。理解它们的结构差异、注意力掩码、输出机制与适用任务,你就能在做技术选型时心明眼亮。
对 AI 从业者:无论你是在 BERT、GPT、T5 之间做模型选型,还是构建分类、生成、翻译系统,弄清楚编码器与解码器的分工,能直接指导你确定技术路线、评估成本和预判效果,是 NLP 面试的必考点。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
\u7F16\u7801\u5668 vs \u89E3\u7801\u5668: \u67B6\u6784\u5BF9\u6BD4 \u7F16\u7801\u5668 (Encoder)BERT \u4EE3\u8868\u89E3\u7801\u5668 (Decoder)\u7F16\u7801\u5668 (Encoder)\u7F16\u7801\u5668 (Encoder)BERT \u4EE3\u8868\u89E3\u7801\u5668 (Decoder)\u7F16\...</sp...
1. 结构差异
工作室里最资深的分析师是小遥。接到一篇文章时,她的习惯是先把全文铺在桌面,眼睛在所有位置来回扫视。她看到「苹果」时不会只盯着这个词,而会同时看前面的「手机」「发布会」或后面的「果园」「甜」。这就是编码器的工作方式:整句话同时进入网络,每个词都能与所有其他词交换信息。
在 Transformer 中,编码器是把多层“自注意力 + 前馈网络”叠起来的大厦。输入一个句子,每个位置并行产生一个语境化向量。由于没有任何「视线封锁」,第 3 个词可以直接借鉴第 50 个词的信息,因此它特别擅长捕捉长距离语义。
位置编码在这里必不可少:自注意力本身对位置不敏感,需要用正弦波或可学习向量把词的先后顺序揉进表示中。否则「猫追狗」和「狗追猫」在模型眼里就是同一句话。多头注意力则是把 Q、K、V 切成多个子空间并行打分,让不同的注意力头各管一摊活。
一句话总结:小遥的工作方式就是「把全桌材料都读一遍再做判断」。编码器的双向自注意力使其天然适合理解类任务。
- 查询与键打分把每个位置的 Query 与所有位置的 Key 做点积,得到一个“谁和谁更相关”的分数矩阵。
- 缩放除以键向量维度的平方根,防止点积值太大导致 softmax 梯度消失。
- 归一化对每一行做 softmax,让同一行所有分数变成加起来等于 1 的权重。
- 加权聚合用权重对 Value 向量做加权求和,得到融合上下文的新表示。
2. 注意力掩码
作家小风有条古怪规矩:自己的稿纸上只能看到已经写出来的内容。他会用手指压住空白部分,把自己与未来隔离开。这样才能在已知信息的基础上自然接出下一句。这就是解码器的单向前进:写第 7 个字时,只能参考前 6 个字,绝不能偷看后面第 8 个字。
实现这条铁律的部件叫注意力掩码。编码器用全零掩码,所有位置互相可见;解码器用因果掩码(causal mask),让第 t 个 token 只能关注位置 0 到 t。做法是:在注意力的打分矩阵上叠加一个掩码矩阵 M,上三角全部填充负无穷。
负无穷经过 softmax 后会变成零,相当于未来的词被彻底屏蔽。因为生成是逐词进行的,每生成一个词都要保证「只看过去」,这样才能让生成过程符合语言的自然顺序。这种逐个词往后接的范式,就叫自回归生成。
所以掩码不是小技巧,而是解码器「作家只向前看」的结构性约束。这一层差别,直接塑造了两种模型的全部行为。
- 掩码矩阵 M下三角和对角线为 0,严格上三角为负无穷,构成“阶梯形”可见域。
- 叠加操作把 M 加到原始注意力得分上,让未来位置的分值变成负无穷大。
- softmax 吞掉负无穷任何包含负无穷的位置,归一化后权重为 0,相当于从未存在。
- 因果注意力输出第 i 行的非零权重只落在前 i 个位置,保证了自回归性质。
3. 输出机制
两位专家交付的成果完全不同。小遥交出的是一份「理解档案」:每个词都带着一叠浓缩了上下文的向量坐标,最后还可以把句首标记拎出来,当整句话的总结。小风交出的却是「续写草稿」:每一刻只告诉你「下一个词的概率」。
在真实模型中,编码器输出一串语境化向量。做文本分类时,BERT 取句首的 [CLS] 向量或做池化,再接一层线性分类头,输出各类别的分数。解码器则不同,它每步输出隐藏状态 h_t,通过一个矩阵投影到整个词表上,再做一个 softmax 得到概率分布。
这个输出差异决定了模型的用途。分类、检索、抽取这些「判断型」任务,需要的是紧凑、信息密集的向量;写作、翻译、对话这些「生产型」任务,需要的是一个接一个的词。小风虽然也能输出「我最喜欢哪一类词」的分布,但这份分布的意义是继续生成,不是做最终判决。
理解档案可用于分类、打分、抽取;创作草稿才能向前延伸出新文本。这就是为什么编码器拿来做理解,解码器拿来做生成。
- 当前隐藏状态h_t 是解码器在第 t 步的“脑内草稿”,浓缩了前 t-1 个词的信息。
- 线性投影用输出矩阵 W_o 把隐藏状态映射到词表维度,得到每个候选词的原始得分。
- 归一化为概率softmax 把得分变成和为一的概率分布,每个候选词获得一个概率值。
- 选词按概率取 argmax 或采样,把选中的词追加到序列末尾,进入下一步。
4. 经典模型
工作室经过多年发展,沉淀出两条明星生产线。一条把精读能力炼到极致,孵化出 BERT;另一条把文字接龙练成绝活,孵化出 GPT。两者的预训练目标也遵循同一逻辑。
BERT 是纯编码器,预训练时随机遮住 15% 的词,再用左右两个方向的上下文去猜被遮住的词,这叫掩码语言模型(MLM)。GPT 是纯解码器,预训练目标朴素得多:给你前文,预测下一个词。一个是做完形填空,一个是做词语接龙。
后来出现了 BART 和 T5 这类编码器-解码器模型,把两位专家的能力串成流水线:编码器先读懂输入,解码器再生成输出,适合翻译、摘要等序列转换任务。参数规模方面,BERT-base 约 1.1 亿参数,GPT-3 达到 1750 亿参数,解码器阵营在“大力出奇迹”的路线上越走越远。
BERT 与小遥一样,把「读懂」练到极致;GPT 与小风一样,把「会写」练成看家本领。两大家族的分野由此奠定。
- 构造掩码样本从句子中随机选 15% 的词替换成 [MASK],得到残缺句子。
- 被遮词集合所有被遮住的位置组成集合,模型只需预测这些位置。
- 预测原词概率模型根据残缺句子的双向上下文,输出每个被遮位置的原词概率。
- 负对数求和对每个被遮词计算负对数概率并求和,等价于交叉熵损失。
5. 适用任务
工作室接单时,经理会按任务性质派活:需要「看完材料给判断」的交给小遥,需要「产出一段文字」的交给小风。任务形态,是比模型参数更优先的选型标准。
编码器擅长理解类任务:文本分类、命名实体识别、关系抽取、语义相似度计算。这些任务都有一个共性——输入是完整的句子或文档,输出是标签、片段或相似度分数。解码器擅长生成类任务:文本续写、对话生成、代码补全、机器翻译。其中机器翻译是典型的混合体:编码器负责理解源语言,解码器负责生成目标语言。
生成任务天然具有序列性,其数学表达遵循链式法则:整个句子的概率等于每个词在其前文条件下的概率连乘。这也解释了为什么解码器必须采用自回归方式——它每一步都只是在为这个连乘公式贡献一个因子。
看清任务是「判断」还是「延续」,就能像经理一样准确派活。判断类任务找编码器,延续类任务找解码器。
- 已生成前缀y_{<t} 表示第 t 步之前已经生成的所有词。
- 条件概率每个因子都是“给定上文,预测当前词”的概率。
- 连乘把各步概率相乘,得到整个句子的生成概率。
- 解码策略贪心取最大概率、束搜索保留多条路径、采样引入随机性。
6. 选型决策
真正专业的团队不会每次靠感觉轮流转,而是沉淀出一张「选型检查清单」。工程师拿到 NLP 需求,按清单过一遍,架构草图就出来了。
第一条看任务形态:分类、抽取、情感分析、语义匹配,优先编码器;写作、对话、补全、摘要,优先解码器;既要理解又要生成的长流程,考虑编码器-解码器结构或多模型编排。第二条看数据与成本:编码器微调所需标注数据较少,解码器在大规模语料上预训练成本高;推理阶段,编码器一次前向出结果,解码器生成长度为 T 的输出约等于做了 T 次前向,时延随长度线性上升。
工程实践中,解码器推理还可以用 KV Cache 加速、量化压缩、蒸馏减肥、LoRA 低成本微调。理解编码器与解码器的差异后,这些手段的收益边界也会变得清楚:瓶颈在注意力可见范围,在自回归步数,而不在个别算子。
把这张清单背熟,面对任何 NLP 需求都能快速画出架构草图。理解任务找小遥,生成任务找小风,需要翻译再让两人协作。
- 模型条件概率P_theta 是解码器对第 t 个词给出的预测概率。
- 取对数把连乘变成连加,避免极小概率相乘造成数值下溢。
- 按步平均对序列长度求平均,让损失不随句子长度变化。
- 负号优化最小化负对数似然,等价于最大化整个句子的生成概率。
AI 应用场景
场景一:电商评论情感分析
阶段:微调(Fine-tuning)与在线推理
解决的问题:传统规则词典只能按关键词匹配,遇到「屏幕很惊艳但电池拉胯」这种先扬后抑的句子经常误判。编码器通过双向注意力让「但」字之后的负面信息主导判断,分类头直接输出正负标签,准确率显著高于关键词方法。
具体案例:某电商平台用 BERT-base-zh 对每天 200 万条用户评论做自动分级,粗粒度正负向准确率从 82% 提升到 94%;后续再配合解码器自动生成回复话术,实现客服闭环。
场景二:代码补全助手
阶段:预训练与自回归推理
解决的问题:IDE 自带的补全只看当前一行,难以补出跨行逻辑。解码器基于因果注意力,把「函数签名 + 注释 + 已有代码」作为前缀,逐 token 生成后续代码,相当于一个懂语法的接龙作家。
具体案例:研发团队在内部代码库上微调 CodeGPT 风格解码器,支持自动生成函数体、方法级注释和单测骨架,代码补全接受率提升明显,显著减少纯机械书写。
场景三:机器翻译中的编码-解码协同
阶段:序列到序列训练与推理
解决的问题:翻译不是简单的「读取」,而是「读懂了再写」。编码器理解源语言语义,解码器按目标语言习惯逐词生成。理解了编码器与解码器的分工,就能明白为什么 MT5、BART 这类结构适合翻译。
具体案例:中英合同翻译服务采用 T5 风格编码器-解码器模型,预处理阶段用编码器抽取合同关键词,生成阶段用解码器配合束搜索产出译文,专业术语一致性明显优于传统的统计机器翻译。
Python 演示
import numpy as np def softmax(x, axis=-1): e = np.exp(x - x.max(axis=axis, keepdims=True)) return e / e.sum(axis=axis, keepdims=True) def causal_mask(T): # 严格上三角填 -1e9, 下三角和对角线为 0 return np.triu(np.full((T, T), -1e9), k=1) np.random.seed(42)n = 5q = np.random.randn(n, 4)k = np.random.randn(n, 4)v = np.random.randn(n, 4) # 编码器: 全零掩码, 当前词可以看到全句所有词enc_scores = q @ k.T / np.sqrt(4)enc_w = softmax(enc_scores)print("编码器注意力权重, 第3行:")print(np.round(enc_w[2], 2)) # 解码器: 因果掩码, 第3个词只能看第0-2个词dec_scores = q @ k.T / np.sqrt(4) + causal_mask(n)dec_w = softmax(dec_scores)print("解码器注意力权重, 第3行:")print(np.round(dec_w[2], 2)) # 打印掩码形状, 帮助理解可见范围print("因果掩码矩阵 (-1e9 表示被遮住):")print(causal_mask(n))
np.triu(np.full((T, T), -1e9), k=1)生成上三角为负无穷、下三角为 0 的因果掩码enc_scores = q @ k.T / np.sqrt(4)编码器的注意力打分,不添加任何掩码dec_scores = q @ k.T / np.sqrt(4) + causal_mask(n)解码器把负无穷掩码直接加进打分矩阵softmax把注意力分数归一化成和为一的权重,负无穷自然变成 0print(np.round(dec_w[2], 2))第 3 行只有前 3 个位置有非零权重,未来词被完全屏蔽
常见误区
误区听说 GPT 性能最强,那我做任何 NLP 需求都直接堆最大解码器总没错,编码器已经过时了。
正解解码器在开放生成任务上确实强势,但分类、抽取、语义匹配这类理解任务上,编码器参数更省、推理更快、结果更稳定。就像一位大作家和一位资深分析师,你说谁文笔更好?可让作家去核对 2000 张发票,真的不如分析师顺手。
为何常见:ChatGPT 在大众视野曝光度极高,让很多人产生「解码器 = 强」的错觉,忽略了任务适配性。
误区我以为 BERT 和 GPT 底层结构完全不一样,一个用 CNN 一个用 Transformer,参数也完全不同。
正解两者的骨干都是 Transformer 块,区别只在注意力掩码和输出头。编码器用双向可见,解码器用因果掩码;编码器输出序列向量,解码器输出词表分布。就像分析师和作家用的是同一套词典和语法书,只是阅读规则与产出方式不同。
为何常见:BERT 和 GPT 在 API、训练方式和下游任务上差异太大,容易让人误以为底层是两套不同架构。
误区推理时模型已经学会了,把掩码去掉应该没问题,反正生成的词也不会变。
正解掩码是解码器因果性的定义。如果推理时没有掩码,第 t 步的计算会偷看未来的词,输出逻辑彻底崩溃。就像作家写小说时先看结尾再倒推开篇,写出来的剧情是反的。
为何常见:很多人把 mask 理解成一个训练期的正则化工具,没意识到它塑造了概率分布的结构。
误区反正大模型都能做分类,选编码器还是解码器无所谓,用 prompt 硬解就行。
正解解码器做分类虽然可以,但因果注意力意味着前面的词看不到后面的词,会丢失句子后半段的关键信息;反过来,编码器做生成时没有自回归循环,只能一次性输出全部 token,句子质量很差。选错结构会事倍功半。
为何常见:大模型通过 prompt 能硬解很多任务,掩盖了结构适配性的真实成本。
面试题
Q1. 编码器与解码器最核心的结构差异是什么?
- A.编码器层数通常更深
- B.编码器使用双向注意力← 正确答案
- C.解码器参数数量更多
- D.解码器必须依赖卷积
答案:B。编码器通过双向注意力看全句,解码器通过因果掩码只能看历史。层数深浅、参数多少都不是本质差异,卷积更是无关选项。就像小遥能同时看到全桌材料,小风只能看自己已写的稿纸。
Q2. GPT 使用的因果掩码直接实现了哪种生成方式?
- A.从右向左反向生成
- B.从左向右逐词自回归← 正确答案
- C.同时生成所有位置的词
- D.随机打乱全部词再重排
答案:B。因果掩码保证第 t 个词只看前 t-1 个词,从而让生成过程按从左到右的顺序逐步展开。这是自回归生成的定义性特征,其他选项都不符合。
Q3. 以下哪项任务最适合交给编码器模型处理?
- A.客户评价情感分析← 正确答案
- B.写一篇产品宣传文案
- C.翻译一份英文合同
- D.自动生成代码注释
答案:A。情感分析是典型的理解任务,输出是标签,编码器的双向语义最适合。文案、翻译、代码注释都包含生成成分,更适合解码器或编码器-解码器结构。
Q4. 位置编码主要解决什么问题?
- A.让模型感知词语顺序← 正确答案
- B.防止注意力分数发散
- C.增大词向量表示维度
- D.提升训练阶段的吞吐
答案:A。自注意力本身对位置不敏感,把「猫追狗」和「狗追猫」看成同一种词袋。位置编码把词序信息注入表示,让模型知道谁先谁后。
Q5. 编码器做分类任务时,通常如何得到类别判断?
- A.对每个位置随机投票
- B.取句首向量加分类头← 正确答案
- C.直接输出词表概率分布
- D.在解码器末尾采样
答案:B。BERT 这类编码器通常取 [CLS] 句首向量或对序列做池化,再接一个线性分类头输出类别概率。直接输出词表分布是生成任务的逻辑,与分类需求不符。
Q6. 解码器每一步生成时输出的到底是什么?
- A.一个确定的下一个词
- B.词表上的一个概率分布← 正确答案
- C.全句的语义表示向量
- D.下一个位置的隐藏状态
答案:B。解码器先输出一个词表大小的概率分布,再通过 argmax 或采样选词。「确定的下一个词」是选完之后的产物,不是模型的直接输出。
Q7. 训练解码器时若把因果掩码误换成全零矩阵,最可能发生什么?
- A.模型直接无法反传更新
- B.训练损失虚低且生成混乱← 正确答案
- C.注意力权重恒等于零
- D.训练速度大幅加快
答案:B。全零掩码让当前位置能看到未来词,训练时相当于「先看答案再抄」,损失会异常低;但推理时没有未来可看,生成质量崩盘。这就像作家写开头时偷看了结尾,训练时很顺,真正写出来逻辑却对不上。
Q8. 工程选型时应该重点考虑哪些因素?
- A.任务是理解还是生成← 正确答案
- B.标注数据的充足程度← 正确答案
- C.在线推理的时延预算← 正确答案
- D.词表大小是否一致
答案:ABC。任务形态决定模型家族,数据量决定微调成本,时延决定解码器长度上限。词表大小通常由 tokenizer 决定,不是选型的主要依据。
Q9. 下列哪些说法是正确的?
- A.BERT 适合信息抽取任务← 正确答案
- B.GPT 适合自由文本生成任务← 正确答案
- C.BERT 训练时全句互可见← 正确答案
- D.GPT 生成时只看历史上文← 正确答案
答案:ABCD。BERT 是编码器,双向可见,适合抽取;GPT 是解码器,因果可见,适合生成。四项都准确描述了两种模型的特性。
Q10. 以下哪些场景更倾向选择解码器模型?
- A.自动生成产品摘要← 正确答案
- B.命名实体识别抽取
- C.诗歌风格续写生成← 正确答案
- D.程序代码自动补全← 正确答案
答案:ACD。产品摘要、诗歌续写、代码补全都需要逐词产出新内容,是生成任务,解码器是合适选择。命名实体识别是抽取任务,从输入中找片段,交给双向编码器更稳。