编码器、解码器与大语言模型
同样是 Transformer,BERT 为什么不能生成文章,GPT 为什么是主流?
先别背名字,先分清它到底在干什么
上几课我们已经搭出了一块通用积木:Transformer Block。可真正把它拿去干活时,你会发现语言任务大致只有两大类, 而且这两类的工作方式差很多。
- 第一类:理解。给模型一句话,让它读懂,再给出判断。比如:「这部电影真的让我很失望」→ 判断为负面。
- 第二类:生成。给模型一个开头,让它往下写。比如:「从前有一只小猫,它每天最喜欢做的事就是」→ 一个词一个词续写后面的故事。
这两类任务看上去都在处理语言,但对模型的要求完全不同。理解任务像考试里的阅读理解:整句都读完了,才能下结论。 生成任务更像接龙:你只能根据已经写出来的内容,决定下一个词写什么。
于是问题就来了:同样是 Transformer,它到底该“前后都看”,还是“只能往左看”?这里有个特别容易糊涂的点,下面说的「前后左右」,参照物都不是整句话, 而是当前正在处理的那个位置。
也就是说,模型不是把整句一起“扫一眼”就完了,而是对句子里的每个位置,分别决定它能看见哪些别的位置。 比如在「猫 / 追 / 球」里,如果当前处理的是中间这个位置「追」:
- 前后都看,意思是「追」既能看左边的「猫」,也能看右边的「球」。
- 只能往左看,意思是这个位置只能看它左边已经出现的内容,不能看右边未来的内容。
一旦把这个参照物说清楚,编码器和解码器的差别就非常具体了:它们不是在“整句层面”不同,而是在“当前位置能看见哪些位置”这件事上不同。
“编码器”和“解码器”这两个名字,其实很好懂
现在再来看名字,就不神秘了。
当模型在做理解时,它做的事情是:把一句自然语言读进去,变成内部的一排表示。 比如一句「这部电影很无聊」,最后会变成一排向量,里面已经揉进了“谁修饰谁”“整体情绪偏负面”这些信息。 这一步像是在把原始文字编码成机器内部更好用的形式,所以叫编码器(Encoder)。
当模型在做生成时,方向反过来:它手里已经有前文和内部表示了,接下来要把这些信息一步步还原成文字, 也就是一个词一个词往外吐。这一步像是在把内部表示解回自然语言,所以叫解码器(Decoder)。
所以不要把它们想成两个很玄的名词。你只要记住:
- 编码器更像“先把一句话读懂”。
- 解码器更像“根据已有内容继续往下写”。
下面我们就分别看:这两台机器在 Transformer 里到底长什么样。
编码器:整句一起看,任务是“读懂”
先看编码器。它最重要的特点只有一句话:对句子里的每一个位置,它都允许这个位置看见整句里的所有位置。 没有遮挡,没有眼罩,左边右边都能看。
这很适合理解类任务。因为你在判断一句话情感时,往往真的需要让某个位置同时参考左边和右边: 前面说“本来我很期待”,后面突然来一句“结果非常失望”,整句语义就翻了。
编码器的输出,不是“下一个词”,而是每个位置一个已经融入上下文的向量。 你可以把它理解成:句子读完之后,模型在每个位置上都做了一份“读后笔记”。
代表模型是 BERT。它的训练方式也很符合这个定位:不是让它续写,而是让它做完形填空。 比如把「巴黎是法国的 [MASK]」里的一个词挖掉,让它同时利用左右两边把缺词猜回来。
所以 BERT 很擅长“读懂一句话以后做判断”,但不擅长“一个词一个词往下写文章”。因为它压根不是按那个方向训练出来的。
解码器:蒙住未来,任务是“往下写”
再看解码器。它和编码器最大的不同,不是 block 长得多么不一样,而是它的注意力上多了一条规矩:当前这个位置不能看右边未来的位置。
为什么必须这样?因为解码器是拿来生成的。假设它正在续写一句话,目标是慢慢写出「它最爱晒太阳」:
- 当它处理第 1 个生成位置时,只能根据输入和已有开头,猜下一个词可能是「它」。
- 当它处理第 2 个生成位置时,只能看见左边已经有的「它」,再猜下一个词可能是「最」。
- 当它处理第 3 个生成位置时,只能看见左边已经有的「它 最」,再猜下一个词可能是「爱」。
这个“当前位置只能根据左边内容预测下一个词”的训练目标,正是 GPT 这类模型的核心。
它还有一个工程上非常漂亮的点:训练时虽然逻辑上是“一个个往后猜”,但因为整句都喂进去了, 模型可以在一次前向计算里同时算出每个位置的“下一个词预测题”。所以它既遵守了单向规则,又能并行训练。
这就是为什么 GPT 擅长写作、对话、代码续写:它从出生那天起,训练目标就是“继续往下写”。
现在再看三种结构,就不会乱了
到这里,其实已经能把三种常见结构一次性理顺了。
- 只有编码器:适合“先读懂,再判断”。代表是 BERT。
- 只有解码器:适合“给个开头,继续往下写”。代表是 GPT。
- 编码器 + 解码器:适合“先把输入读懂,再根据它生成输出”。代表是原始 Transformer、T5。
其中第三种最容易卡住,因为它同时用了两台机器。最通俗的理解方式是:编码器先负责读题,解码器再负责答题。
以翻译为例:
- 编码器先把中文「这只小猫最爱晒太阳」整句读懂。
- 解码器再根据这份读懂后的表示,一个词一个词写出英文。
为什么今天的大模型几乎都偏爱解码器?
既然三种结构都能用,为什么今天最火的大模型大多走的是 GPT 这条纯解码器路线? 核心原因很简单:“生成”非常统一,很多任务都能改写成续写问题。
- 情感分析可以改写成:这条评论是正面还是负面?答:负面
- 翻译可以改写成:把“这只小猫最爱晒太阳”翻成英文:This kitten loves sunbathing.
- 问答可以改写成:法国的首都是:巴黎
- 写代码本来就是续写:写一个快排函数:def quicksort(...)
也就是说,很多看上去不一样的任务,最后都能塞进“给你一段上下文,你把后面补出来”这个统一框架。 这样一来,用一套纯解码器架构、一个训练目标,就能覆盖大部分任务。
当模型把“根据前文继续往下写”练到极致以后,它会顺便学会另一件事: 你只要在提示里先给它几个例子,它就能照着例子的格式继续做下去。 这就是上下文学习。今天我们写 prompt、给 few-shot 示例,本质都在利用这个能力。
所以不是编码器没用,而是纯解码器太通用了。它足够统一,足够简单,又足够适合大规模预训练。
总结
编码器做的事是“先把整句读懂”,所以它是双向的,适合理解任务;解码器做的事是“根据已有内容继续往下写”,所以它必须遮住未来,适合生成任务。 只用编码器,就是 BERT;只用解码器,就是 GPT;两者合起来,就是“先理解、再生成”的编码器-解码器结构。
这一课真正要记住的是
- 先分任务:理解和生成不是一回事,所以对注意力视野的要求不同。
- 编码器:双向,前后都看,目标是把一句话读懂。
- 解码器:单向,遮住未来,目标是一个词一个词往下写。
- 编码器-解码器:先让编码器读懂输入,再让解码器边参考输入边生成输出。
- 今天为何多用解码器:因为很多任务都能统一改写成“续写”。
学习小测验
做完这一课,来检测一下核心知识点。选出你的答案后点击「提交」,即可看到正确选项与讲解。
残差连接与层归一化
解码器能一层一层叠得很深,但怎么保证这么深的网络还能稳稳训练?下一课拆它的两个稳定器。