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

Transformer 为什么只有最底层编码器接收 Embedding

围绕词嵌入、编码器堆叠和统一模型维度的描述,解释为什么词元只在底层转成向量,上层直接接收上一层的表示。

相关工具

先把编码器堆叠看成一条表示加工链

Transformer 的编码组件不是把同一个输入反复重新读入,而是由多层结构首尾连接。底层接收词元经过 Embedding 得到的向量,上层接收前一层输出的向量。每一层都继续加工同一批位置的表示,只是表示中的上下文信息越来越丰富。

资料 在介绍张量流动时强调,嵌入只发生在最底层编码器。所有编码器都接收大小一致的向量列表,底部编码器接收词嵌入,其他编码器接收前一层编码器的输出。理解这条链路,首先要分清“把离散词元变成向量”和“继续加工已有向量”是两件事。

Transformer 词元经过底层 Embedding 再进入多层编码器的结构示意图
从词元到编码器堆叠

词元先在底层完成 Embedding,随后经过多层编码器逐步形成上下文表示。

Embedding 做的是第一次表示转换

词元是离散编号,编码器中的注意力和 FFN 需要处理的是连续向量。Embedding 可以理解为一张可学习的查找表:每个词元编号对应一个 d_model 维向量。资料 以 512 维词嵌入作为示例,说明一个词经过查表后会变成可以进入模型主干的向量。

这一步只需要发生一次。对于同一个输入位置,底层拿到的是词元对应的初始语义表示;后面的编码器不再需要把这个向量重新查表,而是直接使用上一层已经加工过的结果。重复查表不会自动增加理解能力,因为它并没有提供新的上下文关系。

Transformer 词元通过词表 Embedding 形成底层编码器输入的示意图
Embedding 的一次性入口

词元编号经过词表查找变成模型宽度向量,再作为底层编码器的输入。

底层编码器先把词向量放进上下文

刚完成 Embedding 的向量主要表达当前位置对应的词元,还没有充分吸收句子中其他位置的信息。底层编码器的 Self-Attention 会让每个位置读取序列中相关位置,再把这些关系写回当前位置的表示。之后,FFN 对每个位置做非线性加工。

因此,底层输出已经不再是单纯的词表向量。它仍然对应原来的位置,但其中可以包含指代、修饰、局部语法和更远距离关系。上层编码器接收的正是这组带有上下文的表示,而不是再次从词元编号开始。

上层编码器加工的是上一层的结果

当底层编码器完成 Self-Attention 和 FFN 后,输出会作为下一层的输入。下一层仍然执行相似的子层顺序,但它面对的表示已经不同:当前位置不再只是一个词的初始向量,而是带有前一层上下文的信息。重复结构让模型有机会逐步调整和组合这些关系。

这可以类比成逐层阅读同一句话。第一遍先建立词语之间较直接的联系,后续层在这些联系上继续处理更复杂的关系。每一层的权重参数不同,所以“结构相同”不等于“计算结果相同”,更不等于把同一层简单复制若干遍。

Transformer 底层编码器输出传递到上层编码器的隐藏表示流程图
编码器层之间传递隐藏表示

底层输出进入上层,上层继续使用注意力和 FFN 加工同一组位置的隐藏表示。

为什么每层都要保持同一个 d_model

如果底层输出是 512 维,而下一层输入突然变成另一种宽度,残差连接就无法直接相加,注意力和 FFN 的输入接口也需要额外改造。经典 Transformer 因此让嵌入层、编码器子层和解码器子层保持统一的模型宽度。资料 明确指出,统一维度是残差连接能够工作的前提。

统一 d_model 并不意味着每个内部计算都只能使用这一维度。多头注意力可以把模型宽度拆成多个头,FFN 也可以先扩大隐藏维度再投影回来。关键是每个子层对外的输入和输出形状要对齐,这样层与层之间才能自然连接。

位置编码也只需要在进入主干时加入

词嵌入表达“是什么”,位置编码表达“在哪里”。两者在底层输入处相加后,得到同时包含词元信息和顺序信息的表示。这个结果进入编码器堆叠,后续各层会在 Self-Attention 和 FFN 中继续使用它。

如果每一层都重新把同一份位置编码加一次,位置信号可能被重复注入,层与层之间的表示变化也会变得难以区分。经典结构把位置编码作为输入阶段的一部分,让顺序信息随着隐藏表示向上流动,而不是把每层都当成新的输入入口。

Transformer 词嵌入和位置编码相加后进入编码器堆叠的示意图
词嵌入与位置编码进入主干

词嵌入和位置编码在底层相加,形成带有词义与顺序的初始表示,再进入编码器堆叠。

上层不重新 Embedding,信息反而更容易累积

每一层都从上一层结果开始,意味着模型可以保留已经建立的关系,再在其上添加新的变换。残差连接还会让输入表示有一条直接路径继续向前,避免每个子层都必须重新构造全部信息。这样,层堆叠表现为逐步加工,而不是一次次把内容清空后重做。

如果上层重新查词表,得到的仍然主要是词元级初始向量,还需要重新建立前面已经建立过的上下文关系。那会削弱层堆叠的意义,也无法自然解释为什么编码器层可以逐步形成更高层的表示。

为什么编码器的底层输入和上层输入要分开记

阅读结构图时,可以把底层输入记成三步:词元编号先查 Embedding,位置编码加入向量,然后进入第一层编码器。上层输入则只有一步:接收上一层输出。这个区别能帮助我们准确判断某个向量来自哪里。

最后形成的编码器输出仍然是一组按位置排列的向量,供解码器的交叉注意力作为 Key 和 Value 使用。它不是词表中的词,也不是某一层重新查表得到的向量,而是多层 Self-Attention、FFN、残差和归一化共同加工后的源序列记忆。

把这条数据流记成四个问题

第一个问题,离散词元怎样变成连续向量?由底层 Embedding 完成。第二个问题,顺序信息在哪里进入?由位置编码在输入阶段加入。第三个问题,上层编码器拿什么继续计算?拿前一层输出的隐藏表示。第四个问题,为什么层与层之间能连接?因为各子层保持统一的 d_model,并配合残差和归一化。

这样看,Embedding 不是每一层都要重复执行的“基础动作”,而是进入 Transformer 表示空间的入口。编码器堆叠的价值,在于对这份初始表示持续加入上下文和特征加工,直到它成为可以被解码器查询的源序列记忆。

常见问题

为什么上层编码器不能直接接收词元编号?

词元编号是离散值,注意力和 FFN 需要连续向量。底层 Embedding 先把编号转换为 d_model 维表示,上层则继续加工前一层已经形成的隐藏表示。

每层编码器的结构相同,是否说明它们共享参数?

经典 Transformer 的各层结构相同,但使用不同的权重参数。相同的是计算框架,不是每层都使用同一份参数。

位置编码为什么通常只在输入阶段加入?

它负责把顺序信息注入初始表示,后续层通过隐藏状态继续传递和加工。是否在其他位置加入,要以具体模型结构为准,不能把所有模型都一概而论。