BERT 和 GPT-2 的位置编码是一个可学习参数矩阵 $P\in\mathbb{R}^{L\times d}$:第 $m$ 行向量 $p_m$ 直接加到词嵌入上。它常被说成"让模型自己学位置表示",好像比正弦 PE 灵活。翻开实现(modeling_bert.py,BERT 2018 年起没改过这块)会发现,它只是一次查表——这正是问题所在。
本质:位置即 one-hot 查表
写 one-hot 向量 $e_m\in\{0,1\}^{L}$,注入位置后的输入是
$$ x_m' = x_m + P^{\top} e_m . $$
这和词嵌入矩阵完全同构:位置就是一个只有 $L$ 个合法取值的特殊"词"。参数量 $L\times d$:BERT-base 是 $512\times768\approx39$ 万,不到总参数的 0.4%。灵活性换来的代价是这张表完全自由——$p_m$ 与 $p_n$ 之间没有任何由距离 $|m-n|$ 决定的结构性关系,它们就是 $L$ 个独立的 $d$ 维点。
为什么训练区间内够用
模型需要的位置信息,主要是让注意力区分"谁在前谁在后、隔了多远"。查表方案把这一切完全交给训练:梯度会自行把常用的相对距离模式编码进 $p_m$ 的分布里。实测上它和正弦 PE 打得不分胜负(BERT 系一路用到底),原因不难想——注意力层多达 12 层以上,位置向量经过第一层后就被后续的线性变换反复重组,编码形式本身反而没那么敏感。
外推:表外位置是分布外输入
这是致命伤。要把上下文从 $L$ 扩到 $L' > L$,就得给表加行。新增的 $p_m$($m \ge L$)是从没见过梯度的自由参数,初始化值(通常全零或随机小值)直接进入残差流。等价于在推理时往网络里注入一批随机输入:模型对"位置 600"的理解和"位置 100"没有任何连续性可言。实测(如后来大量 length extrapolation 工作复现的)困惑度在越过训练边界后立刻跳变式劣化,不是缓慢退化,因为约束根本不存在。
距离泛化:没有结构保证
注意区分两个失败。外推失败是位置超出范围;距离泛化失败更隐蔽:注意力打分依赖的是相对距离 $m-n$,而查表给的是绝对坐标。理想性质是
$$ \mathrm{attn}(i, j) \approx \phi(i-j), $$
即行为对平移不变——上一篇正弦 PE 的"相对位置是线性变换"性质就是为了逼近这一点。可学习嵌入不承诺任何不变性:$i-j=3$ 这个模式要分别在 $(3,0),(100,97),(5000,4997)$ 各处独立学一遍。训练长度内的常见距离被充分覆盖所以不显,一到长上下文、罕见距离组合就露馅。
抢救手段与代价
实践中出现过几类补救,都不优雅:
- 截断重排(short-sequences first / NOPE 变体):超长输入把位置从中间截断重新计数,"位置 5001" 复用 "位置 1" 的向量。不崩,但长程次序信息直接丢弃。
- 外推性插值(后来的 Fourier feature 尝试):把 $p_m$ 用傅里叶基重新参数化,让表值随位置光滑变化,等于手工把正弦 PE 的性质塞回去——绕一圈回到固定编码。
- 换成相对方案:Shaw 的相对偏移、T5 bias、ALiBi、RoPE。这才是历史给出的答案:与其给表打补丁,不如在结构上保证位置只以相对形式进入打分。
小结
可学习位置嵌入的失败可以归结成一句话:它把"位置编码"这个有强结构先验的问题,退化成了无结构的查表问题。训练区间内靠数据量硬学能盖住,区间外和罕见距离上没有任何性质兜底。后续整个相对位置编码谱系——下一篇从 Shaw 到 T5 bias,再到 ALiBi 和 RoPE——都是围绕"在结构上保证相对性、且性质对表外距离自动成立"这两条要求长出来的。