在“文档处理工作室”里,有两位风格迥异的骨干。小遥是精读分析师:她把整份材料摊开,同时扫视所有句子,从任意词语出发,都能看见它与全篇其他词的关联,然后给出“这段话在讲什么、哪句话可以抽成标签”的结论。小风是接龙作家:他从不翻看桌子那头未写的空白,只盯着已经写下的文字,依靠前文一句一句往下推敲出下一句。同一个工作室,两种本事——在深度学习圈里,这对搭档正是编码器(Encoder)与解码器(Decoder)。 Transformer 大火之后,几乎所有预训练模型都从这两者中选边站:BERT 完全由编码器构成,擅长理解与分类;GPT 完全由解码器构成,擅长续写与生成。理解它们的结构差异、注意力掩码、输出机制与适用任务,你就能在做技术选型时心明眼亮。

岗位关联

对 AI 从业者:无论你是在 BERT、GPT、T5 之间做模型选型,还是构建分类、生成、翻译系统,弄清楚编码器与解码器的分工,能直接指导你确定技术路线、评估成本和预判效果,是 NLP 面试的必考点。

目录
  1. 可视化演示
  2. 1. 结构差异
  3. 2. 注意力掩码
  4. 3. 输出机制
  5. 4. 经典模型
  6. 5. 适用任务
  7. 6. 选型决策
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 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 切成多个子空间并行打分,让不同的注意力头各管一摊活。

一句话总结:小遥的工作方式就是「把全桌材料都读一遍再做判断」。编码器的双向自注意力使其天然适合理解类任务。

Attention(Q,K,V)=softmax(QK⊤dk)V\displaystyle \mathrm{Attention}(Q,K,V)=\mathrm{softmax}\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)V
公式含义:自注意力让每个词按「查询与键的相关性」去加权聚合全句信息,这是编码器双向理解的数学底座。
  1. 查询与键打分把每个位置的 Query 与所有位置的 Key 做点积,得到一个“谁和谁更相关”的分数矩阵。
    QK⊤QK^{\top}
  2. 缩放除以键向量维度的平方根,防止点积值太大导致 softmax 梯度消失。
    1dk\frac{1}{\sqrt{d_k}}
  3. 归一化对每一行做 softmax,让同一行所有分数变成加起来等于 1 的权重。
    softmax(⋅)\mathrm{softmax}(\cdot)
  4. 加权聚合用权重对 Value 向量做加权求和,得到融合上下文的新表示。
    V⋅weightsV \cdot \text{weights}

2. 注意力掩码

作家小风有条古怪规矩:自己的稿纸上只能看到已经写出来的内容。他会用手指压住空白部分,把自己与未来隔离开。这样才能在已知信息的基础上自然接出下一句。这就是解码器的单向前进:写第 7 个字时,只能参考前 6 个字,绝不能偷看后面第 8 个字。

实现这条铁律的部件叫注意力掩码。编码器用全零掩码,所有位置互相可见;解码器用因果掩码(causal mask),让第 t 个 token 只能关注位置 0 到 t。做法是:在注意力的打分矩阵上叠加一个掩码矩阵 M,上三角全部填充负无穷。

负无穷经过 softmax 后会变成零,相当于未来的词被彻底屏蔽。因为生成是逐词进行的,每生成一个词都要保证「只看过去」,这样才能让生成过程符合语言的自然顺序。这种逐个词往后接的范式,就叫自回归生成。

所以掩码不是小技巧,而是解码器「作家只向前看」的结构性约束。这一层差别,直接塑造了两种模型的全部行为。

MaskedAttention(Q,K,V)=softmax(QK⊤+Mdk)V,Mij=0 (i≥j), Mij=−∞ (i<j)\displaystyle \mathrm{MaskedAttention}(Q,K,V)=\mathrm{softmax}\left(\frac{QK^{\top}+M}{\sqrt{d_k}}\right)V ,\quad M_{ij}=0\ (i\ge j),\ M_{ij}=-\infty\ (i<j)
公式含义:编码器的 M 是全零(全可见),解码器的 M 是上三角负无穷(未来不可见),其余数学步骤完全一致。
  1. 掩码矩阵 M下三角和对角线为 0,严格上三角为负无穷,构成“阶梯形”可见域。
    Mij=0 (i≥j),Mij=−∞ (i<j)M_{ij}=0\ (i\ge j),\quad M_{ij}=-\infty\ (i<j)
  2. 叠加操作把 M 加到原始注意力得分上,让未来位置的分值变成负无穷大。
    QK⊤+MQK^{\top}+M
  3. softmax 吞掉负无穷任何包含负无穷的位置,归一化后权重为 0,相当于从未存在。
    softmax(−∞)=0\mathrm{softmax}(-\infty)=0
  4. 因果注意力输出第 i 行的非零权重只落在前 i 个位置,保证了自回归性质。
    MaskedAttention(Q,K,V)\mathrm{MaskedAttention}(Q,K,V)

3. 输出机制

两位专家交付的成果完全不同。小遥交出的是一份「理解档案」:每个词都带着一叠浓缩了上下文的向量坐标,最后还可以把句首标记拎出来,当整句话的总结。小风交出的却是「续写草稿」:每一刻只告诉你「下一个词的概率」。

在真实模型中,编码器输出一串语境化向量。做文本分类时,BERT 取句首的 [CLS] 向量或做池化,再接一层线性分类头,输出各类别的分数。解码器则不同,它每步输出隐藏状态 h_t,通过一个矩阵投影到整个词表上,再做一个 softmax 得到概率分布。

这个输出差异决定了模型的用途。分类、检索、抽取这些「判断型」任务,需要的是紧凑、信息密集的向量;写作、翻译、对话这些「生产型」任务,需要的是一个接一个的词。小风虽然也能输出「我最喜欢哪一类词」的分布,但这份分布的意义是继续生成,不是做最终判决。

理解档案可用于分类、打分、抽取;创作草稿才能向前延伸出新文本。这就是为什么编码器拿来做理解,解码器拿来做生成。

P(wt∣w<t)=softmax(Woht)\displaystyle P(w_t\mid w_{<t})=\mathrm{softmax}(W_o h_t)
公式含义:解码器每一步都在整个词表上算概率,概率最高的词成为下一个输出。
  1. 当前隐藏状态h_t 是解码器在第 t 步的“脑内草稿”,浓缩了前 t-1 个词的信息。
    hth_t
  2. 线性投影用输出矩阵 W_o 把隐藏状态映射到词表维度,得到每个候选词的原始得分。
    WohtW_o h_t
  3. 归一化为概率softmax 把得分变成和为一的概率分布,每个候选词获得一个概率值。
    softmax(Woht)\mathrm{softmax}(W_o h_t)
  4. 选词按概率取 argmax 或采样,把选中的词追加到序列末尾,进入下一步。
    wt∼P(wt∣w<t)w_t \sim P(w_t\mid w_{<t})

4. 经典模型

工作室经过多年发展,沉淀出两条明星生产线。一条把精读能力炼到极致,孵化出 BERT;另一条把文字接龙练成绝活,孵化出 GPT。两者的预训练目标也遵循同一逻辑。

BERT 是纯编码器,预训练时随机遮住 15% 的词,再用左右两个方向的上下文去猜被遮住的词,这叫掩码语言模型(MLM)。GPT 是纯解码器,预训练目标朴素得多:给你前文,预测下一个词。一个是做完形填空,一个是做词语接龙。

后来出现了 BART 和 T5 这类编码器-解码器模型,把两位专家的能力串成流水线:编码器先读懂输入,解码器再生成输出,适合翻译、摘要等序列转换任务。参数规模方面,BERT-base 约 1.1 亿参数,GPT-3 达到 1750 亿参数,解码器阵营在“大力出奇迹”的路线上越走越远。

BERT 与小遥一样,把「读懂」练到极致;GPT 与小风一样,把「会写」练成看家本领。两大家族的分野由此奠定。

LMLM=−∑i∈Mlog⁡P(wi∣x~)\displaystyle \mathcal{L}_{\mathrm{MLM}}=-\sum_{i\in\mathcal{M}}\log P(w_i\mid \tilde{x})
公式含义:BERT 通过预测被遮住的词来学习双向语义,让模型不只理解词本身,还理解词与词之间的关系。
  1. 构造掩码样本从句子中随机选 15% 的词替换成 [MASK],得到残缺句子。
    x~\tilde{x}
  2. 被遮词集合所有被遮住的位置组成集合,模型只需预测这些位置。
    M\mathcal{M}
  3. 预测原词概率模型根据残缺句子的双向上下文,输出每个被遮位置的原词概率。
    P(wi∣x~)P(w_i\mid \tilde{x})
  4. 负对数求和对每个被遮词计算负对数概率并求和,等价于交叉熵损失。
    −∑i∈Mlog⁡P(wi∣x~)-\sum_{i\in\mathcal{M}}\log P(w_i\mid \tilde{x})

5. 适用任务

工作室接单时,经理会按任务性质派活:需要「看完材料给判断」的交给小遥,需要「产出一段文字」的交给小风。任务形态,是比模型参数更优先的选型标准。

编码器擅长理解类任务:文本分类、命名实体识别、关系抽取、语义相似度计算。这些任务都有一个共性——输入是完整的句子或文档,输出是标签、片段或相似度分数。解码器擅长生成类任务:文本续写、对话生成、代码补全、机器翻译。其中机器翻译是典型的混合体:编码器负责理解源语言,解码器负责生成目标语言。

生成任务天然具有序列性,其数学表达遵循链式法则:整个句子的概率等于每个词在其前文条件下的概率连乘。这也解释了为什么解码器必须采用自回归方式——它每一步都只是在为这个连乘公式贡献一个因子。

看清任务是「判断」还是「延续」,就能像经理一样准确派活。判断类任务找编码器,延续类任务找解码器。

P(y∣x)=∏t=1TP(yt∣y<t,x)\displaystyle P(y\mid x)=\prod_{t=1}^{T}P(y_t\mid y_{<t}, x)
公式含义:生成一个句子,等于一步步算出每个词的条件概率再连乘,这正是解码器「逐词生成」的数学本质。
  1. 已生成前缀y_{<t} 表示第 t 步之前已经生成的所有词。
    y<t=(y1,y2,…,yt−1)y_{<t}=(y_1,y_2,\ldots,y_{t-1})
  2. 条件概率每个因子都是“给定上文,预测当前词”的概率。
    P(yt∣y<t,x)P(y_t\mid y_{<t}, x)
  3. 连乘把各步概率相乘,得到整个句子的生成概率。
    ∏t=1TP(yt∣y<t,x)\prod_{t=1}^{T}P(y_t\mid y_{<t}, x)
  4. 解码策略贪心取最大概率、束搜索保留多条路径、采样引入随机性。
    arg⁡max⁡yP(y∣x)\arg\max_y P(y\mid x)

6. 选型决策

真正专业的团队不会每次靠感觉轮流转,而是沉淀出一张「选型检查清单」。工程师拿到 NLP 需求,按清单过一遍,架构草图就出来了。

第一条看任务形态:分类、抽取、情感分析、语义匹配,优先编码器;写作、对话、补全、摘要,优先解码器;既要理解又要生成的长流程,考虑编码器-解码器结构或多模型编排。第二条看数据与成本:编码器微调所需标注数据较少,解码器在大规模语料上预训练成本高;推理阶段,编码器一次前向出结果,解码器生成长度为 T 的输出约等于做了 T 次前向,时延随长度线性上升。

工程实践中,解码器推理还可以用 KV Cache 加速、量化压缩、蒸馏减肥、LoRA 低成本微调。理解编码器与解码器的差异后,这些手段的收益边界也会变得清楚:瓶颈在注意力可见范围,在自回归步数,而不在个别算子。

把这张清单背熟,面对任何 NLP 需求都能快速画出架构草图。理解任务找小遥,生成任务找小风,需要翻译再让两人协作。

L=−1T∑t=1Tlog⁡Pθ(yt∣y<t)\displaystyle \mathcal{L}=-\frac{1}{T}\sum_{t=1}^{T}\log P_\theta(y_t\mid y_{<t})
公式含义:语言模型用整个序列的平均负对数似然作为训练损失,最小化它等于最大化生成概率。
  1. 模型条件概率P_theta 是解码器对第 t 个词给出的预测概率。
    Pθ(yt∣y<t)P_\theta(y_t\mid y_{<t})
  2. 取对数把连乘变成连加,避免极小概率相乘造成数值下溢。
    log⁡Pθ(yt∣y<t)\log P_\theta(y_t\mid y_{<t})
  3. 按步平均对序列长度求平均,让损失不随句子长度变化。
    1T∑t=1T⋅\frac{1}{T}\sum_{t=1}^{T}\cdot
  4. 负号优化最小化负对数似然,等价于最大化整个句子的生成概率。
    −1T∑t=1Tlog⁡Pθ(yt∣y<t)-\frac{1}{T}\sum_{t=1}^{T}\log P_\theta(y_t\mid y_{<t})

AI 应用场景

场景一:电商评论情感分析

阶段:微调(Fine-tuning)与在线推理

解决的问题:传统规则词典只能按关键词匹配,遇到「屏幕很惊艳但电池拉胯」这种先扬后抑的句子经常误判。编码器通过双向注意力让「但」字之后的负面信息主导判断,分类头直接输出正负标签,准确率显著高于关键词方法。

具体案例:某电商平台用 BERT-base-zh 对每天 200 万条用户评论做自动分级,粗粒度正负向准确率从 82% 提升到 94%;后续再配合解码器自动生成回复话术,实现客服闭环。

场景二:代码补全助手

阶段:预训练与自回归推理

解决的问题:IDE 自带的补全只看当前一行,难以补出跨行逻辑。解码器基于因果注意力,把「函数签名 + 注释 + 已有代码」作为前缀,逐 token 生成后续代码,相当于一个懂语法的接龙作家。

具体案例:研发团队在内部代码库上微调 CodeGPT 风格解码器,支持自动生成函数体、方法级注释和单测骨架,代码补全接受率提升明显,显著减少纯机械书写。

场景三:机器翻译中的编码-解码协同

阶段:序列到序列训练与推理

解决的问题:翻译不是简单的「读取」,而是「读懂了再写」。编码器理解源语言语义,解码器按目标语言习惯逐词生成。理解了编码器与解码器的分工,就能明白为什么 MT5、BART 这类结构适合翻译。

具体案例:中英合同翻译服务采用 T5 风格编码器-解码器模型,预处理阶段用编码器抽取合同关键词,生成阶段用解码器配合束搜索产出译文,专业术语一致性明显优于传统的统计机器翻译。

Python 演示

python34 行
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))
目的:用 NumPy 实现一次简化自注意力,直观对比编码器与解码器的注意力可见性差异。
  1. np.triu(np.full((T, T), -1e9), k=1)生成上三角为负无穷、下三角为 0 的因果掩码
  2. enc_scores = q @ k.T / np.sqrt(4)编码器的注意力打分,不添加任何掩码
  3. dec_scores = q @ k.T / np.sqrt(4) + causal_mask(n)解码器把负无穷掩码直接加进打分矩阵
  4. softmax把注意力分数归一化成和为一的权重,负无穷自然变成 0
  5. print(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. 编码器与解码器最核心的结构差异是什么?

单选题 · easy

  • A.编码器层数通常更深
  • B.编码器使用双向注意力← 正确答案
  • C.解码器参数数量更多
  • D.解码器必须依赖卷积

答案:B。编码器通过双向注意力看全句,解码器通过因果掩码只能看历史。层数深浅、参数多少都不是本质差异,卷积更是无关选项。就像小遥能同时看到全桌材料,小风只能看自己已写的稿纸。

Q2. GPT 使用的因果掩码直接实现了哪种生成方式?

单选题 · mid

  • A.从右向左反向生成
  • B.从左向右逐词自回归← 正确答案
  • C.同时生成所有位置的词
  • D.随机打乱全部词再重排

答案:B。因果掩码保证第 t 个词只看前 t-1 个词,从而让生成过程按从左到右的顺序逐步展开。这是自回归生成的定义性特征,其他选项都不符合。

Q3. 以下哪项任务最适合交给编码器模型处理?

单选题 · easy

  • A.客户评价情感分析← 正确答案
  • B.写一篇产品宣传文案
  • C.翻译一份英文合同
  • D.自动生成代码注释

答案:A。情感分析是典型的理解任务,输出是标签,编码器的双向语义最适合。文案、翻译、代码注释都包含生成成分,更适合解码器或编码器-解码器结构。

Q4. 位置编码主要解决什么问题?

单选题 · easy

  • A.让模型感知词语顺序← 正确答案
  • B.防止注意力分数发散
  • C.增大词向量表示维度
  • D.提升训练阶段的吞吐

答案:A。自注意力本身对位置不敏感,把「猫追狗」和「狗追猫」看成同一种词袋。位置编码把词序信息注入表示,让模型知道谁先谁后。

Q5. 编码器做分类任务时,通常如何得到类别判断?

单选题 · mid

  • A.对每个位置随机投票
  • B.取句首向量加分类头← 正确答案
  • C.直接输出词表概率分布
  • D.在解码器末尾采样

答案:B。BERT 这类编码器通常取 [CLS] 句首向量或对序列做池化,再接一个线性分类头输出类别概率。直接输出词表分布是生成任务的逻辑,与分类需求不符。

Q6. 解码器每一步生成时输出的到底是什么?

单选题 · mid

  • A.一个确定的下一个词
  • B.词表上的一个概率分布← 正确答案
  • C.全句的语义表示向量
  • D.下一个位置的隐藏状态

答案:B。解码器先输出一个词表大小的概率分布,再通过 argmax 或采样选词。「确定的下一个词」是选完之后的产物,不是模型的直接输出。

Q7. 训练解码器时若把因果掩码误换成全零矩阵,最可能发生什么?

单选题 · extreme

  • A.模型直接无法反传更新
  • B.训练损失虚低且生成混乱← 正确答案
  • C.注意力权重恒等于零
  • D.训练速度大幅加快

答案:B。全零掩码让当前位置能看到未来词,训练时相当于「先看答案再抄」,损失会异常低;但推理时没有未来可看,生成质量崩盘。这就像作家写开头时偷看了结尾,训练时很顺,真正写出来逻辑却对不上。

Q8. 工程选型时应该重点考虑哪些因素?

多选题 · mid

  • A.任务是理解还是生成← 正确答案
  • B.标注数据的充足程度← 正确答案
  • C.在线推理的时延预算← 正确答案
  • D.词表大小是否一致

答案:ABC。任务形态决定模型家族,数据量决定微调成本,时延决定解码器长度上限。词表大小通常由 tokenizer 决定,不是选型的主要依据。

Q9. 下列哪些说法是正确的?

多选题 · hard

  • A.BERT 适合信息抽取任务← 正确答案
  • B.GPT 适合自由文本生成任务← 正确答案
  • C.BERT 训练时全句互可见← 正确答案
  • D.GPT 生成时只看历史上文← 正确答案

答案:ABCD。BERT 是编码器,双向可见,适合抽取;GPT 是解码器,因果可见,适合生成。四项都准确描述了两种模型的特性。

Q10. 以下哪些场景更倾向选择解码器模型?

多选题 · hard

  • A.自动生成产品摘要← 正确答案
  • B.命名实体识别抽取
  • C.诗歌风格续写生成← 正确答案
  • D.程序代码自动补全← 正确答案

答案:ACD。产品摘要、诗歌续写、代码补全都需要逐词产出新内容,是生成任务,解码器是合适选择。命名实体识别是抽取任务,从输入中找片段,交给双向编码器更稳。