编程与 AI13 分钟阅读更新于 2026-08-03

为什么编码器可以看完整句子,解码器却必须限制未来

围绕编码器、解码器和两类 Mask 的介绍,解释源序列双向理解与目标序列因果生成为何需要不同的可见范围。

相关工具

先看两套序列承担的任务

Transformer 的 Encoder-Decoder 结构同时处理源序列和目标序列。源序列是已经给定、需要被理解的内容;目标序列是模型要根据已有条件逐步生成的内容。机器翻译中,源句已经完整出现,目标句却要从起始状态开始一点点产生。

这两个任务看起来都在处理文本,信息条件却不一样。编码器可以利用源句中前后位置的内容,帮助每个位置形成完整上下文;解码器在预测目标位置时,不能提前看到尚未生成的目标词,否则训练时就会得到推理阶段不存在的答案。

Transformer 编码器双向理解源序列与解码器因果生成目标序列的对比图
源序列理解与目标序列生成

编码器整理完整源序列,解码器根据已有目标前缀逐步生成目标序列。

编码器为什么可以读取前后文

编码器接收的源序列在进入模型前就已经完整给出。处理句子中的某个词时,前面的词和后面的词都属于当前输入的一部分。Self-Attention 可以让当前位置与整段源序列建立关系,再由 FFN 对已经融合的结果做逐位置加工。

例如理解一个代词时,后文可能提供必要线索;理解一个动词时,前后名词也可能共同决定它的语义。编码器如果只允许向左看,就会主动丢掉一部分已经存在的源句信息。对于需要整体理解输入的任务,这种限制通常没有必要。

Transformer 编码器位置读取完整源序列前后文的可见范围示意图
编码器的双向可见范围

源序列已经完整给出,编码器中的位置可以根据任务读取前后文位置。

解码器为什么不能照搬编码器的做法

解码器的目标是预测下一个词,而不是复述一段已经存在的目标答案。假设目标序列是“我 喜欢 学习”,预测“喜欢”时,输入可以包含“我”,但不能包含“喜欢”或它后面的词。预测“学习”时,可以使用“我 喜欢”,仍然不能提前读取答案本身。

如果解码器像编码器一样同时看到完整目标句,当前位置就能直接从未来输入中找到要预测的词。模型训练得到的损失可能很好看,但推理时这些未来词根本还没有生成,训练和使用的条件就不一致了。

Transformer 解码器通过因果掩码限制目标未来信息的示意图
解码器的未来信息必须被遮住

目标位置只能读取当前位置及其左侧前缀,右侧尚未生成的词元不能参与注意力。

Sequence Mask 保护的是生成顺序

Transformer 相关概念 把 Sequence Mask 用来限制 Decoder 的 Self-Attention。它通常表现为一个上三角区域被屏蔽:当前位置可以看到自己以及左侧已经出现的位置,右侧未来位置不可见。这样,所有目标位置虽然可以在训练时一起计算,却仍然遵守从左到右的条件关系。

这里的关键不是把未来词从张量中删除,而是在注意力分数进入 Softmax 前,把不可见位置的分数压到极低。Softmax 后,这些位置的权重接近于零,当前位置就无法从未来 Value 中获得有效信息。

训练时并行不等于可以偷看答案

训练阶段知道完整目标句,所以可以把右移后的目标输入一次性组织成矩阵,让多个位置同时计算。并行处理提高的是计算效率,不代表每个位置可以访问整句目标。因果掩码会为每个位置保留不同的可见范围。

例如第一行只能使用起始标记,第二行可以使用起始标记和第一个真实前缀,第三行可以再多看一个位置。多个位置在同一批矩阵运算中完成,但每一行仍然遵守自己的信息边界。并行发生在执行方式上,因果关系保留在注意力结构里。

Padding Mask 与因果 Mask 不是一回事

Padding Mask 处理的是批次对齐产生的无效位置。不同长度的序列放在同一个矩阵里时,短序列后面需要补齐占位符;这些位置没有真实内容,注意力不应该给它们分配有效权重。

因果 Mask 处理的是目标生成顺序。一个位置即使对应真实词元,只要它位于当前位置右侧,也不能被当前 Query 读取。前者回答“这个位置有没有真实内容”,后者回答“这个位置在当前时刻是否已经允许被看见”。在解码器自注意力中,两种限制可能同时存在。

交叉注意力为什么通常只需要源端屏蔽

解码器的交叉注意力连接目标 Query 和编码器源 Key、Value。源序列在编码阶段已经完整给出,因此目标位置可以查询源序列的前后位置,不需要对源端施加目标式的未来掩码。源端真正需要处理的是 Padding:如果源序列为了批量对齐而补了空位,这些列必须被屏蔽。

目标端的未来限制属于 Decoder Self-Attention,因为它约束的是目标前缀之间的关系。交叉注意力的源内容不是解码器未来会生成的答案,而是任务开始时就已经提供的输入。把两种 Mask 混用,容易把源端的完整信息错误地截断。

Transformer 解码器自注意力与交叉注意力使用不同信息边界的示意图
解码器中的两种注意力边界

目标自注意力限制未来目标位置,交叉注意力主要屏蔽源端 Padding,源序列有效位置可以被完整查询。

为什么这种差异不会破坏两侧连接

编码器和解码器虽然使用不同的可见范围,但它们最终都在统一的隐藏表示空间中工作。编码器输出保留源序列各位置的上下文向量,作为交叉注意力的 Key 和 Value;解码器当前目标状态生成 Query,按自己的目标前缀条件查询源记忆。

因此,双向理解和因果生成不是互相矛盾的规则。编码器负责把已经给定的输入整理充分,解码器负责在不泄露未来的前提下逐步形成输出。交叉注意力把两种状态连接起来,但不会把目标端的未来答案提前带回当前计算。

阅读 Transformer 结构图时的四个检查点

第一,确认当前注意力处理的是源序列、目标序列,还是源目标交叉关系;第二,确认 Query、Key、Value 分别来自哪一侧;第三,检查当前是否需要 Padding Mask 或因果 Mask;第四,判断被屏蔽的是无效位置,还是尚未允许出现的未来位置。

只要先回答这四个问题,就不容易把“编码器能看完整句子”误解成“整个模型都可以看完整答案”。Transformer 的信息边界是按子层和序列角色划分的:源端可以完整理解,目标端必须遵守生成顺序,交叉注意力则在两者之间传递当前允许使用的源信息。

常见问题

编码器的 Self-Attention 一定是双向的吗?

在经典 Encoder-Decoder Transformer 的源序列编码场景中,编码器通常可以读取源序列的前后有效位置;具体变体也可能设置额外的局部或稀疏限制。

训练时一次输入完整目标句,会不会泄露答案?

右移目标输入配合因果 Mask 后,每个位置只能看到允许的目标前缀,完整目标句虽然存在于批次中,但未来位置不会参与当前预测。

交叉注意力为什么不使用目标未来 Mask?

交叉注意力查询的是已经给出的源序列记忆,目标未来限制属于目标端自注意力;交叉注意力仍可能需要屏蔽源端 Padding。