真实面经题目 · 原创解析
Transformer 中绝对位置编码和相对位置编码如何实现,各自适合什么场景?
这题考 Transformer 位置信息注入方式,重点是绝对位置编码直接表示当前位置,相对位置编码在注意力中建模 token 间距离和方向。
Transformer 的 self-attention 本身对顺序不敏感,所以必须显式加入位置信息。绝对位置编码的做法是给每个位置一个向量,和 token embedding 相加或拼接,让模型知道这是第几个 token。这个向量可以是固定正弦余弦,也可以是可学习 embedding。它实现简单、计算便宜,适合固定最大长度、分类、编码器或 ViT patch 这类场景,但 learned absolute embedding 往往强绑定训练长度,外推到更长序列时不稳定。相对位置编码不只告诉模型 token 在第几个位置,而是告诉注意力里两个 token 相隔多远、方向如何。实现可以是在 attention score 上加相对距离 bias,也可以用相对位置向量参与 Q/K 计算,或者用 RoPE 这类把相对位置信息融入 Q/K 点积的变体。相对位置更适合关注局部距离、平移不变模式、长序列和生成模型,因为很多语言关系取决于相对间隔而不是绝对下标。代价是实现更复杂,长距离通常要 bucket、截断或缩放,并不意味着无限长度都能泛化。面试中要从实现位置、表达内容、长度泛化、计算成本和适用场景五点比较。
Self-attention 会基于 token 间相似度做加权,但如果没有位置输入,交换两个 token 的顺序对注意力结构并没有天然区别。位置编码就是把顺序信息注入模型,让它区分前后、距离和结构。
绝对位置编码给序列中第 i 个位置分配一个向量,并与 token embedding 相加或作为额外输入。正弦余弦编码是固定函数,可学习位置 embedding 则通过训练学到每个位置的表示。实现上最简单,工程成本低。
可学习绝对位置通常只训练到某个最大长度,超过训练长度后没有直接学过的位置向量。即便用固定正弦编码能计算更长位置,模型是否真的会长序列泛化还取决于训练长度、注意力分布和任务。
相对位置编码关注的是 query 位置和 key 位置之间的距离和方向,比如前一个 token、后五个 token、同一窗口内相隔多少。它常在 attention score 中加入相对距离 bias,或让 Q/K 与相对位置表示发生交互。
语言和代码里很多依赖是相对的:邻近词、括号匹配、局部短语、前文引用和一定距离内的上下文。相对编码能让模型更自然地学习距离模式,也更容易在不同起始位置复用同一种关系。
绝对位置编码适合实现简单、长度固定或位置本身有明确含义的任务;相对位置编码适合长序列、生成、局部结构和需要更好长度泛化的任务。RoPE 可作为相关变体提到,但不要把所有相对位置方法都等同于 RoPE。
它作为输入位置向量时属于绝对位置编码,但由于正弦函数性质,模型可以从组合中推断一定相对距离关系。分类时仍可把它放在绝对位置编码范畴。
不一定。相对位置在长序列和局部关系上有优势,但实现更复杂,具体效果取决于任务、训练长度、模型结构和推理成本。固定长度任务用绝对编码也可能足够。
RoPE 可以看作把位置信息通过旋转注入 Q/K,使注意力点积天然依赖相对位置的一类方法。它是相关变体,不等于所有相对位置编码。
ViT 常用可学习绝对位置 embedding 或二维位置插值,让模型知道 patch 在图像中的空间位置。若输入分辨率变化,需要插值或采用更适合空间关系的位置设计。