Transformer 解码器是什么:如何一步步生成目标序列
从编码器—解码器结构出发,理解解码器如何读取源序列表示、使用掩码自注意力处理已生成前缀,并通过概率分布逐步产生下一个词。
相关工具
解码器负责把表示变成序列
在 Transformer 的编码器—解码器结构中,编码器先读取源序列,把它变成一组包含上下文的表示;解码器再根据这组表示和已经生成的目标前缀,预测下一个词。翻译、摘要和许多序列到序列任务,都可以沿着这条路径理解。
编码器更像是在回答“源序列表达了什么”,解码器则继续回答“目标序列接下来应该怎样展开”。它不是一次性把整段目标句子全部吐出来,而是不断利用当前已有的信息,生成一个词,再把这个词纳入下一轮预测。
因此,解码器既要看源序列,也要看目标序列已经生成的部分。两类信息分别来自编码器输出和解码器自身的输入。

解码器结合编码器输出和已经生成的目标前缀,通过输出投影得到下一个词的概率分布。
解码器的输入不是完整目标句子
开始生成时,解码器通常先接收一个起始标记,表示目标序列即将开始。生成第一个词后,目标前缀变成“起始标记+第一个词”;再预测下一个词时,输入前缀继续变长。这个过程不断重复,直到生成结束标记或达到长度上限。
训练阶段的输入形式会有所不同。为了提高效率,训练可以把完整的目标序列右移一位后一次性送进解码器,让每个位置学习预测它后面的词。虽然输入看起来包含整段目标序列,但掩码会阻止每个位置读取未来词。
所以“逐步生成”和“训练时并行计算”并不矛盾。生成阶段必须按顺序得到前一个结果,训练阶段则利用已知目标序列和掩码,同时计算多个位置的预测。
第一层是带掩码的自注意力
解码器的第一类注意力是掩码自注意力。它和编码器自注意力一样,都让序列内部的位置交换信息,但多了一条限制:当前位置只能看自己以及之前的位置,不能看未来的目标词。
如果预测第 3 个词时可以直接读取真实的第 4 个词,模型就会获得本不该知道的答案,训练出来的生成过程也会失去意义。掩码把未来位置遮住,使每个位置只能依据当时可用的前缀进行判断。
掩码通常作用在注意力分数上。对于不允许访问的位置,先加上一个极小值,经过 Softmax 后对应权重就接近 0。它不会删除输入向量,而是限制信息在注意力计算中的流动。

注意力矩阵保留当前位置及之前的位置,未来位置被屏蔽,因此生成过程不会偷看答案。
编码器—解码器注意力连接两段序列
解码器的第二类注意力通常称为编码器—解码器注意力,也叫交叉注意力。它的 Query 来自解码器当前状态,而 Key 和 Value 来自编码器输出。这样,目标序列中的每个位置就能根据当前要生成的内容,去源序列里寻找相关信息。
例如在翻译任务中,解码器准备生成目标语言中的某个词时,可以通过 Query 表达当前生成需求,再用 Key 与源序列表示比较,确定应该重点读取源句中的哪些位置,最后用 Value 汇总这些内容。
它和掩码自注意力的区别可以这样记:掩码自注意力主要整理“目标前缀内部已经说了什么”,编码器—解码器注意力主要寻找“源序列中还有哪些内容需要参考”。
解码器还包含前馈网络
完成两次注意力后,解码器仍然会使用逐位置前馈网络。前馈网络对每个位置的上下文表示进行两次线性变换和非线性加工,帮助模型把已经交换过的信息重新组织起来。
掩码自注意力、编码器—解码器注意力和前馈网络通常都配有残差连接与层归一化。不同实现的 Pre-LN、Post-LN 顺序可能不同,但它们共同组成了解码器层的主要计算骨架。
因此,一个标准解码器层可以概括为三个子层:掩码自注意力、编码器—解码器注意力、前馈网络。每个子层都解决不同问题,不能把它们合成一个笼统的“解码”步骤。

目标前缀先经过掩码自注意力,再读取编码器输出,最后通过前馈网络得到新的解码器表示。
输出投影如何变成下一个词
解码器顶层会为目标序列中的每个位置输出一个隐藏表示。通过一个线性层,模型把这个表示映射到词表大小的向量,每个分量对应一个候选词的分数。再经过 Softmax,就得到下一词的概率分布。
推理时可以选择概率最高的词,也可以按照一定策略从概率分布中采样。无论采用哪一种选择方式,选出的词都会被追加到目标前缀中,作为下一轮解码器输入。
输出层并不直接生成一段文字,它先产生词表上的分布。文字是许多轮“预测一个词—追加一个词”之后,由词元解码过程还原出来的结果。
训练阶段和生成阶段为什么不同
训练时,真实目标序列通常已知,模型可以把右移后的目标序列一次性输入,利用因果掩码同时计算每个位置的预测。这种方式充分利用并行硬件,训练效率较高。
生成时,未来目标词未知,模型只能从起始标记开始,得到一个预测后再继续。第 t 轮的输入包含前 t 个已确定词,下一步的结果依赖前一步的选择,因此存在天然的顺序依赖。
训练与生成之间的差异也带来一个常见现象:训练时模型看到的前缀往往是真实词,生成时却要面对自己前面预测出来的词。理解这一点,有助于解释为什么训练损失很低并不等于每次长序列生成都稳定。
自回归生成是怎样循环的
自回归的意思是,当前输出依赖已经生成的输出。一次完整生成可以拆成几个动作:准备源序列的编码器表示;初始化目标前缀;运行解码器得到当前位置的词表分布;选择一个词并追加到前缀;检查是否结束。
如果没有生成结束标记,就继续下一轮。每一轮都需要遵守同样的掩码规则,不能因为前缀变长就读取未来位置。实际系统通常会缓存已经计算过的 Key 和 Value,减少重复计算,但这属于效率优化,不改变解码器的逻辑。
生成策略会影响结果。贪心选择每次取最高概率词,束搜索会保留多条候选路径,采样则允许低概率但合理的词进入结果。解码器负责提供概率分布,具体怎样从分布中选词是另一层策略。
如何区分三种注意力
编码器自注意力:Q、K、V 都来自源序列,通常可以看到源序列的全部位置。它的任务是把源序列内部的上下文整理充分。
解码器掩码自注意力:Q、K、V 都来自目标前缀,但未来位置被遮挡。它的任务是整理已经生成的内容,并保持自回归约束。
编码器—解码器注意力:Q 来自解码器状态,K 和 V 来自编码器输出。它的任务是让当前生成位置有选择地读取源序列信息。三者公式相似,输入来源和可见范围不同。
把解码器放回 Transformer 全局结构
编码器把源序列变成上下文表示,解码器一边读取这组表示,一边整理目标前缀,再把每个位置映射成词表概率。这个结构把“理解源内容”和“生成目标序列”分成了两个可以配合的部分。
注意力、位置编码、前馈网络、残差和层归一化在解码器中都会继续发挥作用,只是掩码和跨序列注意力增加了新的约束。理解编码器层后,再把解码器看成“增加两个特殊机制的生成层”,会比从头背一张大结构图更容易。
下一步继续学习输出概率、训练目标和解码策略,就可以把 Transformer 从内部模块连接到实际的翻译、摘要和文本生成流程。
常见问题
解码器生成时为什么不能一次生成整句话?
因为后面的词依赖前面已经生成的内容,生成阶段通常需要先确定前一个词,再把它加入前缀预测下一个词。
掩码自注意力和编码器—解码器注意力有什么区别?
掩码自注意力的 Q、K、V 都来自目标前缀,并且屏蔽未来位置;编码器—解码器注意力的 Query 来自解码器,Key 和 Value 来自编码器输出。
训练时可以并行,生成时为什么又要逐步进行?
训练时真实目标序列已知,可以用掩码同时计算多个位置;生成时未来词未知,只能根据已经确定的前缀逐步预测。