相对位置编码把注意力分数改写为「内容相关项 + 只依赖距离 的偏置项」,Transformer-XL、T5、DeBERTa 三条路线分别代表了完整分解、极简分桶、显式解耦三种工程取舍。
动机:绝对坐标不是语言需要的东西
绝对位置编码把位置当作加在 token embedding 上的一个向量,模型必须从两个绝对坐标 、 中自行推断它们的差。但语言里真正起作用的几乎总是相对距离:修饰语紧邻中心词、主谓相隔几个 token、共指跨越一个从句。绝对方案还有两个硬伤——训练时见过的位置 id 之外没有任何信号(外推失效),以及同一段文本整体平移后表示完全改变(缺乏平移等变性)。
相对位置编码的共同形式是把位置信息从输入端移到注意力分数内部:
偏置只是距离的函数,与绝对下标无关。这一步同时买到了平移等变性和「未见过的距离可退化处理」的外推余地。
Transformer-XL:把四项分解写全
先看绝对编码下的注意力 logit 展开:
四项分别是内容-内容、内容-位置、位置-内容、位置-位置。Transformer-XL 的做法是逐项替换而非整体抛弃:
三处关键改动:
- 换成相对位置编码 ,仍用正弦函数生成,因此天然支持任意距离;
- key 侧拆出两套投影 (内容)与 (位置),二者语义不同不该共享;
- 原本依赖 的 query 位置项换成两个可学习向量 、。理由很直接:、 描述的是「不管我在哪,我都偏好某类内容 / 某个距离」,query 的绝对位置在这里不该有发言权。
这个分解是 segment-level recurrence 的必要前提——复用上一段的 KV cache 时,缓存里的 token 没有一致的绝对 id,只有相对距离仍然有定义。代价是注意力实现要额外算一次 并做 relative shift 对齐,计算和显存都比原版重。
T5:32 个桶换掉全部向量运算
T5 的判断是 、、 三项的收益不值那些矩阵乘法,偏置退化成一个可学习标量:
距离经 relative_position_bucket 映射到有限个桶,近处逐值一桶、远处按对数合并,超出 max_distance(默认 128)全部落进最后一桶:
def relative_position_bucket(rel_pos, bidirectional=True, num_buckets=32, max_distance=128):
ret = 0
n = -rel_pos
if bidirectional:
num_buckets //= 2 # 正负方向各分一半
ret += (n < 0).to(torch.long) * num_buckets
n = torch.abs(n)
else:
n = torch.clamp(n, min=0) # 单向:未来位置全归 0 桶
max_exact = num_buckets // 2 # 近距离精确编码
is_small = n < max_exact
# 远距离:桶宽随距离对数增长
val_large = max_exact + (
torch.log(n.float() / max_exact) / math.log(max_distance / max_exact)
* (num_buckets - max_exact)
).to(torch.long)
val_large = torch.min(val_large, torch.full_like(val_large, num_buckets - 1))
return ret + torch.where(is_small, n, val_large)分桶的合理性来自一个经验事实:距离 3 和距离 4 该区分开,距离 300 和距离 400 不必。参数量因此只有 num_buckets × num_heads(base 模型 32 × 12 = 384 个标量),而且只在第一层计算、逐层共享。
工程上的吸引力在于侵入性极低:不碰 value 通路、不碰 QKV 投影,只在 softmax 前往 logits 上加一个 gather 出来的表。副作用是分辨率被桶结构锁死,且所有超长距离塌缩到同一个桶——长文外推时远端信息实际是均匀化的。
DeBERTa:解耦注意力
DeBERTa 保留内容与位置两套独立的隐向量,注意力由三项构成(position-to-position 被显式丢掉,因为在相对编码下它退化成与内容无关的常量):
其中 是截断到窗口 的相对距离。三项相加后缩放因子为 而非 。
两个设计细节值得注意。一是位置-内容项不可省:内容-位置回答「我这个词想看多远」,位置-内容回答「站在那个距离上,什么词值得被看」,两者不对称,Transformer-XL 的 项用全局向量 近似了后者,DeBERTa 则给它完整的内容参与。二是纯相对编码会丢掉主谓一致这类需要绝对位置的信息,DeBERTa 用 Enhanced Mask Decoder 在最后几层重新注入绝对位置,只服务 MLM 预测头。
代价是三项注意力使前向计算量和实现复杂度都明显上升,这也是后续大模型没有沿用这条路线的主要原因。
三方案对比
| 方案 | 偏置形式 | 新增参数 | 实现侵入性 | 代表模型 |
|---|---|---|---|---|
| Transformer-XL | 正弦 投影 + 可学习 | 一套投影 + 两个向量 | 高:改 QK 计算与 relative shift | Transformer-XL, XLNet |
| T5 bias | 分桶可学习标量 | 桶数 × 头数(约数百) | 低:logits 加表即可 | T5, mT5, Flan-T5 |
| DeBERTa | 内容/位置双向量三项解耦 | 独立相对位置 embedding | 高:重写注意力为三项 | DeBERTa, DeBERTa-v3 |
局限与后续路线
三者共享同一个结构性成本:位置信息进入了注意力计算内部,无法像输入端加法那样与 attention kernel 解耦。这在 FlashAttention 一类融合算子普及后成了实际障碍——任意形状的加性偏置需要额外的 kernel 支持。Transformer-XL 和 DeBERTa 还额外付出了推理时的矩阵乘开销。
后续两条路线各自做了减法与换向:ALiBi把偏置固化成 的线性斜率,零参数、零额外矩阵乘,把 T5 的极简思路推到尽头;旋转位置编码(RoPE)换了实现维度,通过对 Q、K 施加位置相关旋转,让内积自动只依赖 ,既不加偏置项也不改注意力结构,因而能直接兼容融合算子——这也是它成为现代 LLM 默认选择的原因。三条路线在位置编码的整体谱系里,代表的是同一个相对性目标下逐步降低实现成本的过程。