Transformer 的编码器输出为什么不是一句话向量
围绕编码器输出、源序列记忆和 Encoder-Decoder Attention 的描述,解释为什么模型要保留每个源位置的表示,而不是压成一个句向量。
相关工具
编码器输出首先是一组按位置排列的向量
在 Transformer 的 Encoder-Decoder 结构中,编码器接收源序列,解码器负责生成目标序列。资料 在介绍解码器之前明确提到:最后一个编码器的输出是一组注意力向量 Key 和 Value,这些向量会被解码器的 Encoder-Decoder Attention 使用。
因此,编码器输出不是把整句话压缩成一个向量,而是保留源序列每个位置的一组隐藏表示。源句有多少个有效位置,输出通常就有多少个对应位置。每个位置的表示已经经过多层 Self-Attention 和 FFN 加工,包含当前位置和上下文的综合信息。

源序列经过编码器堆叠后,形成一组按位置排列的上下文向量,供解码器逐步查询。
为什么不能只保留一个句子向量
如果编码器把整句话压成一个向量,解码器每次生成目标词时都只能从同一个整体表示里读取信息。源句中的地点、人物、动作和修饰关系会被迫挤在一起,解码器很难根据当前目标位置选择更具体的源内容。
机器翻译尤其需要保留位置差异。目标句的不同位置可能分别对应源句中的不同词或短语,某个目标词还可能同时需要参考源句的多个位置。如果所有源信息都只有一个入口,交叉注意力就失去了按位置分配权重的空间。
每个源位置的表示已经不再是孤立词向量
保留位置并不代表编码器输出只是 Embedding 的原样复制。Self-Attention 会让当前位置读取其他位置的信息,因此经过多层处理后,一个源位置的向量可以同时包含词义、顺序、局部关系和更远距离的上下文。
例如,某个代词所在位置的表示可能吸收它所指向的名词信息;一个动词所在位置的表示可能保留主语、宾语或时间相关概念。位置仍然存在,但位置向量已经从“这个词是什么”发展成“这个词在这句话里处于什么关系中”。
解码器为什么要逐个 Query 源记忆
解码器生成不同目标位置时,当前隐藏状态不同,因此会产生不同的 Query。编码器输出的每个源位置提供对应的 Key 和 Value,Query 与这些 Key 计算相关性,再按权重汇总 Value。这样,同一份源序列记忆可以被不同目标位置以不同方式读取。
资料 把 Encoder-Decoder Attention 描述成帮助解码器关注输入句子相关部分的机制。它的关键不只是“读取编码器输出”,而是允许当前目标位置在源序列各位置之间做有条件的选择。保留一组位置向量,正是这种动态查询能够成立的前提。

不同目标位置产生不同 Query,对编码器保留的源位置 Key 和 Value 分配不同权重。
源序列长度决定记忆有多少列
假设源序列长度为 S,编码器输出就可以看成 S 个位置向量。交叉注意力中,源端的 Key 和 Value 数量都由 S 决定;当前目标前缀长度为 T 时,目标端会产生 T 个 Query,注意力关系矩阵的主要形状可以理解为 T×S。
这说明编码器输出的“按位置保留”会直接反映到矩阵形状上。源句越长,解码器可查询的源位置越多;目标端越长,产生的查询行越多。两侧长度可以不同,但每个源位置仍然有机会参与相关目标位置的计算。

交叉注意力矩阵的行对应目标位置,列对应编码器保留的源位置。
Padding 位置不会成为有效记忆
批量处理不同长度的源句时,较短句子通常需要 Padding 对齐。张量形状因此可能统一为相同长度,但 Padding 并不是真实内容。交叉注意力在计算源端 Key 和 Value 时,需要用 Padding Mask 屏蔽这些无效位置,避免目标 Query 把权重分给空位。
所以,“保留每个源位置”不等于“把所有位置都当成有意义的词”。有效源位置形成真正的记忆,Padding 位置只是为了批量计算而存在的占位符。掩码把张量形状和语义有效范围区分开。
编码器输出与句向量并不是完全互斥
在某些分类或检索任务中,模型确实可能进一步对整段序列做池化,得到一个句子级向量。但那是任务头为了完成特定目标做的额外汇总,不能直接替代 Encoder-Decoder 结构中的位置化源记忆。
机器翻译或需要精确读取输入位置的任务,通常更依赖一组保留位置的表示。是否压缩成一个向量,要看后续任务需要什么信息:只判断整句类别时,整体摘要可能足够;要逐步生成目标文本时,解码器通常需要访问更细粒度的源位置。
把编码器输出放回完整数据流
源文本先被切分成词元,经过 Embedding 和位置编码进入编码器。每一层通过 Self-Attention 建立位置之间的关系,再由 FFN 逐位置加工,最终形成一组源序列隐藏表示。解码器的当前状态生成 Query,编码器输出提供 Key 和 Value,交叉注意力把两侧连接起来。
这样理解后,编码器输出为什么不是一个句向量就很清楚了:它要承担的是“可被查询的源序列记忆”,而不是只给出一句话的总摘要。保留位置,才能让每个目标位置根据自己的生成状态读取不同的源内容。
用三个问题检查编码器输出
第一,输出是否仍然对应源序列的各个有效位置?第二,每个位置的表示是否已经融合上下文,而不是孤立的词向量?第三,解码器的 Query 是否可以在这些位置的 Key 和 Value 之间分配权重?
这三个问题分别对应位置保留、上下文加工和交叉查询。只要抓住这条主线,就能把编码器输出、源序列记忆和交叉注意力放在同一个结构里理解,也不会把“句向量”和“位置化隐藏状态”混成一回事。
常见问题
编码器输出的每个位置还是原来的词吗?
位置仍然对应源序列中的一个位置,但向量已经经过多层注意力和 FFN 加工,通常包含该位置与上下文的关系信息,不是原始 Embedding 的简单复制。
为什么交叉注意力需要保留源序列多个位置?
不同目标位置可能需要读取源句中的不同内容。保留位置后,每个目标 Query 才能对源端各位置的 Key 和 Value 分配不同权重。
所有源位置都会被解码器使用吗?
不一定。每个位置可以参与计算,但 Padding 等无效位置会被掩码屏蔽;有效位置的权重也会因当前目标 Query 不同而变化。