想象你走进一家剧场,剧场工作人员却把所有演员的名字倒进一个大箱子里。你数得清有哪些演员,却不知道谁该站在哪个位置,更不知道谁先出场、谁后出场——“猫追老鼠”和“老鼠追猫”用的演员完全一样,但戏的情节天差地别。Transformer 模型就是这样一个“只看脸、不认站位”的观众:自注意力天生不管词序。为了让模型记住顺序,研究者发明了各种“座位牌”:有的按正弦波印号码,有的把座位号背下来,还有的只记录“隔了几个座位”。这些方法都依赖“预印好的座位牌”,一旦剧场扩建(序列变长),号码不够用或直接失效。 ALiBi 换了一种思路:它干脆不发座位牌,而是在剧场里立一条“物理法则”——声音随距离线性衰减,座位离得越远,听得越不真切。这条法则与剧场大小无关,所以无论舞台加长多少倍,模型都能按同一规则继续“听戏”。这就是“训练短、测试长”也能工作的秘密,也是 ALiBi 成为 BLOOM、MPT 等大模型首选位置方案的原因。
掌握 ALiBi,你就能理解大模型如何以接近零的代价延长推理上下文,并在选择位置编码方案时做出关键决策,这是大模型训练与部署工程师的必修课。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
位置编码困境
假设你走进剧场,座位全部空着,工作人员把剧本和演员名单一起倒进一个大箱子。你能数清有哪些演员,却不知道谁该站哪个位置——“猫追老鼠”和“老鼠追猫”用的演员完全一样,但戏完全不同。Transformer 里的自注意力就是这样一个“只看脸、不看站位”的观众:无论词怎么排列,只要是同一批词,它给出的相似度一模一样。语言是讲究顺序的:“我爱你”和“你爱我”是两种人生,可自注意力根本分不出来。
这个性质在数学上叫“置换不变性”。它让 Transformer 可以并行读词、训练飞快,但也把“先后顺序”这个信息彻底弄丢了。所以研究者必须额外给每个词发一张“座位票”,告诉模型“我是第几个出场的”——这就是位置编码(Positional Encoding)的由来。在标准 Transformer 里,位置编码加到词向量上再送入自注意力;但自注意力公式本身,最初并没有任何与位置有关的项:
所以这时的模型就像手里只有一份演员名单、却不知道出场顺序的剧场观众。要让“猫追老鼠”不被理解成“老鼠追猫”,必须给台词贴上顺序标签。下一节我们就看看,传统方法是怎么贴这些标签的。
- Q与K点积Q 矩阵存放当前查询词的表示,K 矩阵存放所有词的键表示,两者两两点积,算出“这个词和那个词有多相关”。此时的分数只看内容,不看距离。
- 缩放系数点积结果除以 $d_k$ 的平方根,防止维度大时分数爆炸,把 softmax 推向“非 0 即 1”的极端。
- softmax归一化把一行分数变成和为 1 的注意力权重,权重越大,这个词对输出的影响越大。
- 加权求和用权重把 V 矩阵中的值加权合并成输出。整个流程里没有“位置”的身影——词序信息彻底缺席。
传统编码回顾
传统方法相当于在剧场里印发三种不同款式的“座位牌”。第一种是按数学公式印的万能号码牌(正弦编码),号码看似无穷无尽;第二种是请人把每个座位号背下来(可学习编码),背熟哪个剧场就只认哪个剧场;第三种是用完即弃的“相对距离牌”(相对位置编码),只标“前面第三个座位”,不标绝对座号。
其中最著名的是 Transformer 原论文里的正弦位置编码。它给每个位置 $pos$ 生成一组固定不变的向量,频率沿维度递减:偶数维度用 $\sin$,奇数维度用 $\cos$。这样一来,相隔 $k$ 个位置的向量之间存在确定的线性关系,模型理论上可以用它推断相对距离。
三种座位牌的共性缺陷在“换剧场”时暴露。正弦编码理论上能印到任意长度,但实证中外推到训练长度的数倍以上时,困惑度明显反弹——因为高频分量把“具体位置”记得太牢;可学习编码更直接,超出训练长度就没牌可发;相对编码虽灵活,但实现复杂、计算开销大。它们的共同点是:位置信息与注意力彼此脱节,距离没有被明明白白写进打分规则。
你看,无论是印号码、背座位还是记相对距离,大家都在“座位牌”的设计上纠结。有没有可能,干脆不发给任何座位牌,而是让“听声辨位”成为剧场本身的物理定律?这正是 ALiBi 的答案。
- 位置下标$pos$ 表示词在序列中的第几个位置,从 0 开始计。它是这台“印号机”的输入。
- 维度分工$i$ 是向量内部的维度下标;同一个位置,偶数维度用 $\sin$、奇数维度用 $\cos$,相邻维度配对出距离信息。
- 频率分母$10000$ 的 $2i/d$ 次方决定这条频率的“波长”。$i$ 越大,波长越长,变化越慢,负责刻画远距离关系。
- 注入方式把生成的位置向量直接加到词向量上,模型从此“听到”位置信号。
线性偏置原理
ALiBi 的灵感很朴素:剧场里声波天然随距离衰减——离得越远,音量越小。无论剧场修多大、座位加到多少排,这条自然法则都成立。ALiBi 对模型说:别背座位号了,注意力打分时,谁的座位离你远,就自动给它的分数扣掉一点,扣多少与距离成正比。
ALiBi 全称 Attention with Linear Biases(带线性偏置的注意力)。它完全不引入位置嵌入:词向量上不叠加任何位置信号;真正的改动只发生在注意力打分这一步——在 QK 缩放点积的结果上,直接减掉“斜率 × 距离”。偏置项只与相对距离有关,因此矩阵化实现就是在因果掩码之外,再统一叠加一层下三角的负偏置矩阵。
因为偏置项只与 $(i-j)$ 有关,整个模型没有任何位置参数:位置知识零学习、零存储。多头各配各的斜率,从“只看邻座”到“能够远眺”,覆盖不同距离尺度——这就是“零参数免训练”的含义。在训练时,这些斜率是超参数而不是可学习权重,所以模型的计算图和标准注意力几乎一模一样,只是多了一次廉价的加法。
ALiBi 不发座位牌,却给剧场装上了声波衰减的物理定律。没有新增一个可学习参数,模型却第一次真正“知道”了远近——听声辨位,比背座位号优雅得多。
- 查询与键$\mathbf{q}_i$ 是第 $i$ 个词(当前“听众”)的查询向量,$\mathbf{k}_j$ 是第 $j$ 个词(候选“声源”)的键向量,两者的点积衡量内容上的相似程度。
- 缩放除以 $d_k$ 的平方根,保持分数尺度稳定,这一步和标准注意力完全一致。
- 距离差$(i - j)$ 是“听众”相对“声源”的距离。在因果注意力里 $j \le i$,距离非负;距离越大,说明这个词在时间上越久远。
- 斜率定档$m_h$ 是第 $h$ 个头的固定斜率,不参与训练。8 头时取 $1/2$ 到 $1/256$ 的几何级数;头号越大斜率越小,大斜率管近处,小斜率顾远方。
外推性能优势
老戏班在只能坐 512 人的小剧场里排练,演员背熟了座位号。登台一看,新剧场有 2048 个座位——背号码的演员当场呆住,而遵守“距离越远越听不清”这个物理法则的演员,换多大的场子都能立即开演。
这就是“长度外推”:训练时见过最长 $L_{\text{train}}$ 个词,测试时给 $L_{\text{test}} > L_{\text{train}}$ 个词,模型依然能保持低困惑度。在这项考试里,可学习位置编码直接不及格(超出范围没向量可用),正弦编码勉强及格但长距离会“破音”,ALiBi 则表现稳定。在 WikiText-103 等语言建模基准上,用 512 词训练的 ALiBi 测试到 2048 词,困惑度几乎不上升。
其形式化的表达是一个“只扣分”的偏置矩阵:对第 $h$ 个头,第 $i$ 行第 $j$ 列的值等于负的距离乘以斜率,然后整体加到注意力分数上。
为什么 ALiBi 能外推而传统方法不行?根子就在于它只依赖相对距离。序列从 512 长到 8192,“相隔 300 个位置”的惩罚依旧是同一个值;而绝对位置方案里,“位置 3000”的词在训练时从未出现过。物理法则不认剧场大小——这正是外推的秘密。
- 行与列$i$ 是查询词位置(行),$j$ 是历史词位置(列),因果注意力里 $j$ 只遍历到 $i$。
- 距离项$(i - j)$ 把“相隔多远”翻译成纯数字,只和相对位置有关,与序列总长无关。
- 负号与斜率$-m_h$ 保证偏置永远非正——只扣分、不加分;扣分力度由该头的斜率决定。
- 加法注入偏置矩阵与缩放后的点积逐元素相加,再送入 softmax,实现“先扣分,再归一化”。
训练推理差异
彩排受场地租金限制,只能在 1024 人的小排练厅;正式演出的大剧场却能容纳 8192 人。演员们练的不是“第几排第几座”,而是“离我越近听得越清”的法则,所以换了大场子也从容。
训练时,出于显存和算力考虑,序列长度常被截断到 512~2048:注意力矩阵是 $O(n^2)$,序列翻倍,计算量翻四倍。ALiBi 让“训练短、测试长”成为可能——训练阶段的长度只影响内容分布,位置规则本身不受长度限制。这就是论文标题 "Train Short, Test Long" 的含义:短窗口省下训练成本,长窗口享受推理红利。
当然,“外推”不等于“免费”。推理时真正的瓶颈不在位置,而在 KV 缓存:模型要把每个历史词的键和值都存下来,才能继续自回归生成。KV 缓存占用近似为:
所以“训练短、测试长”的真正含义是:位置上的规矩可以无限延用,但硬件上的账单要精打细算。窗口截断控制训练成本,推理加长享受长上下文红利,而 KV 缓存管理则是每一位部署工程师的必修课。
- 序列长度$L$ 是上下文长度,缓存随 $L$ 线性增长,是外推时最直接的“账单”。
- 模型宽度$d_{\text{model}}$ 是隐藏维,每个词都要存一份键和一份值的向量。
- 层数累加$n_{\text{layers}}$ 是 Transformer 层数,每一层的注意力都要独立缓存。
- 双份与字节$2$ 来自“键 + 值”两份张量,$s$ 是一个浮点数的字节数(半精度为 2)。把这两项乘进去,就是一张真实的显存预算表。
大模型应用
现在,BLOOM、MPT、Falcon 这几座“超级大剧院”都把这套声波衰减法则写进了建筑规范。它们不再为位置准备厚厚一摞座位牌,而是让每个注意力头自带一把“距离尺”,把剧场定律直接内建在架构里。
在真实大模型中,ALiBi 往往和另外两招配合使用:Flash Attention 把注意力计算分块,避免整张大矩阵驻留显存;Multi-Query Attention 让多个查询头共享同一份键值,进一步压缩缓存。ALiBi 管“位置”,它们管“内存”——三者不冲突,反而互补。BLOOM(176B)在预训练中直接采用 ALiBi,Falcon 也在因果注意力中加入了偏置,MPT 系列更是把 ALiBi 当作默认位置方案。
一个经常被引用的战绩是 MPT-7B:训练时上下文只有 2K,借助 ALiBi 与滑窗注意力,推理时把窗口推到 65K,用一个普通 GPU 就能写完整本童话书。若只看计算复杂度,结合滑窗后长序列的开销近似为:
从 512 词的老剧场到 65K 词的巨型舞台,演员还是那批演员,词表还是那个词表,只因为剧场多了一条“距离越远越听不清”的建筑规范,千亿参数的大模型就能在超长故事里从容地首尾呼应。ALiBi 用最简单的减法,回答了位置编码最棘手的时代问题。
- 序列总长$L$ 是推理时的总长度,决定任务规模,也是 ALiBi 外推能力的展示舞台。
- 滑窗宽度$W$ 是每个词实际能看到的历史窗口大小,由滑窗注意力控制。
- 复杂度替换把标准注意力的 $O(L^2)$ 替换成 $O(LW)$,当 $L$ 很长时节省巨大。
- 窗口取舍$W \ll L$ 意味着远处的词进不了窗口,但 ALiBi 已经把这些位置的注意力自然压低,两者配合损失很小。
AI 应用场景
长文档智能问答
阶段:模型推理与部署优化
解决的问题:传统位置编码在超出训练长度后注意力混乱,问答系统只能把文档截断成碎片,关键上下文频繁丢失。ALiBi 的零位置参数和线性偏置让推理窗口可以直接开到训练长度的数倍,无需微调。
具体案例:某券商把用 2K 窗口训练的千亿级模型部署为研报问答助手,利用 ALiBi 把推理窗口扩展到 8K,整篇 PDF 研报一次性送入模型,跨章节的财务数据召回率明显提升;部署时配合 KV 缓存管理,单卡 A100 即可稳定服务。
仓库级代码补全
阶段:模型训练与继续预训练
解决的问题:代码文件动辄几千行,传统模型只能滑窗截断,函数跨文件、跨模块的依赖关系难以捕捉。ALiBi 的“训练短、测试长”策略让训练成本可控,推理时却能全文件入窗。
具体案例:算法团队基于 MPT 架构微调代码补全模型,训练窗口固定在 2048,推理时直接输入 16K 的完整文件与头注释,跨函数、跨类的补全准确率显著上升,多行代码生成不再“断片”。
超长上下文的创意写作
阶段:模型评估与调优
解决的问题:长篇小说生成需要数百段的前后呼应,传统模型在 2K token 之后就“失忆”,人物和伏笔无法回扣。ALiBi 让故事线能延续更远。
具体案例:社区开发者用 MPT-7B-StoryWriter 演示了 65K 上下文写作:模型在训练长度仅 2K 的前提下,生成了超过 6 万 token 的童话,开篇埋下的伏笔在结尾得到回收,验证了 ALiBi 在超长文本上的实用性。
Python 演示
import numpy as np def alibi_slopes(num_heads): # 各头斜率按几何级数递减, 8 头时得到 1/2, 1/4, ..., 1/256 return [2.0 ** (-8 * h / num_heads) for h in range(1, num_heads + 1)] def alibi_bias(seq_len, num_heads): # 构造偏置矩阵: bias[h, i, j] = -m_h * (i - j), 未来位置用极大负数掩码 slopes = alibi_slopes(num_heads) bias = np.zeros((num_heads, seq_len, seq_len), dtype=np.float32) for h, m in enumerate(slopes): for i in range(seq_len): for j in range(seq_len): if j > i: bias[h, i, j] = -1e9 else: bias[h, i, j] = -m * (i - j) return bias def alibi_attention(q, k, v, num_heads): # 把线性偏置加进缩放点积注意力, 返回各头输出与注意力权重 d = q.shape[-1] scores = q @ k.T / np.sqrt(d) seq_len = q.shape[0] bias = alibi_bias(seq_len, num_heads) outputs = np.zeros((num_heads, seq_len, v.shape[-1])) probs = np.zeros((num_heads, seq_len, seq_len)) for h in range(num_heads): logits = np.where(bias[h] < -1e8, -1e9, scores + bias[h]) exp = np.exp(logits - logits.max(axis=-1, keepdims=True)) probs[h] = exp / exp.sum(axis=-1, keepdims=True) outputs[h] = probs[h] @ v return outputs, probs def main(): rng = np.random.default_rng(42) d_model, num_heads = 16, 4 train_len, test_len = 8, 24 q = rng.normal(size=(train_len, d_model)) k = rng.normal(size=(train_len, d_model)) v = rng.normal(size=(train_len, d_model)) q2 = rng.normal(size=(test_len, d_model)) k2 = rng.normal(size=(test_len, d_model)) v2 = rng.normal(size=(test_len, d_model)) _, probs_short = alibi_attention(q, k, v, num_heads) _, probs_long = alibi_attention(q2, k2, v2, num_heads) near_short = float(probs_short[0, 7, 6]) far_short = float(probs_short[0, 7, 0]) near_long = float(probs_long[0, 23, 22]) far_long = float(probs_long[0, 23, 0]) print("训练长度8: 近邻权重", round(near_short, 4), "远距权重", round(far_short, 4)) print("外推长度24: 近邻权重", round(near_long, 4), "远距权重", round(far_long, 4)) assert near_short > far_short and near_long > far_long print("线性偏置生效: 距离越远, 注意力越低, 且外推长度无需重训") if __name__ == "__main__": main()
return [2.0 ** (-8 * h / num_heads) for h in range(1, num_heads + 1)]按几何级数生成各头斜率,8 头时恰好是 1/2 到 1/256。bias[h, i, j] = -m * (i - j)核心逻辑:距离每远一格,注意力分数就线性扣掉一个斜率值。if j > i: bias[h, i, j] = -1e9用极大负数实现因果掩码,禁止模型看向未来。logits = np.where(bias[h] < -1e8, -1e9, scores + bias[h])把偏置矩阵加进缩放点积分数,一步完成“先扣分”。exp = np.exp(logits - logits.max(axis=-1, keepdims=True))减去行最大值做数值稳定的 softmax 分子,防止指数溢出。probs[h] = exp / exp.sum(axis=-1, keepdims=True)归一化成和为 1 的注意力权重,近邻权重因此显著高于远距。
常见误区
误区初学者看到“位置编码”就以为 ALiBi 仍然把位置向量加到词向量上,只不过从正弦波换成了线性函数。
正解ALiBi 完全取消了位置嵌入:词向量层面零位置信号,真正的改动只发生在注意力打分环节——在 QK 点积上减掉“斜率 × 距离”。它属于“注意力偏置”而不是“嵌入”。好比剧场不放座位牌(不改座位),而是直接规定“距离越远声音越小”的环境声学。
为何常见:文献都把这类方法统称为“位置方法”,名字里又有 Encoding,很容易让人套用旧范式的“相加注入”直觉。
误区觉得 $m$ 大 = 作用范围大,经常有人把斜率大的头当成“远程头”。
正解斜率大意味着扣分随距离增长快,注意力会迅速聚焦到近邻;恰恰是斜率小的头才愿意给远距离位置保留权重。像“大声喊话”的是小斜率头,它放过了远处的微弱信号;大斜率头只关心邻座。
为何常见:把“偏置强度”误读成“覆盖范围”,看到斜率数值大就以为能量强,忽略了符号是负号。
误区以为用了 ALiBi 就能把窗口无限拉到百万 token,性能和显存都不受任何影响。
正解ALiBi 显著改善外推,但因果注意力的计算仍是 $O(n^2)$,KV 缓存显存随长度线性增长;超出训练分布太远时,困惑度仍会缓慢上升。外推是“可用的加长”,不是“免费的无限加长”。
为何常见:“65K 上下文”这类宣传语让人忽略了背后的滑窗裁剪、KV 缓存复用等工程手段。
误区觉得两者都是“让长序列更好用”的新方法,应该竞争关系,只能选一个用。
正解两者管的根本不是同一件事:ALiBi 解决位置信息与外推,Flash Attention 解决显存占用与 IO 效率。实际模型里它们同时出现,MPT、Falcon 都是“ALiBi 管位置,Flash 管内存”,各司其职。
为何常见:它们经常出现在同一篇长上下文技术博客里,读者很自然地把它们归类为同一层级的替代品。
面试题
Q1. ALiBi 解决的核心问题是?
- A.词太多训练太慢
- B.模型记不住词序← 正确答案
- C.梯度消失太严重
- D.显存占用过高
答案:B。Transformer 的自注意力天然无序,同样的词换一下顺序,分数完全不变。ALiBi 的出发点正是给模型注入“距离感”,让“猫追老鼠”和“老鼠追猫”不再被当成同一句话。
Q2. ALiBi 把位置偏置加在哪个环节?
- A.词向量嵌入之后
- B.注意力分数之上← 正确答案
- C.输出投影之前
- D.损失函数之中
答案:B。ALiBi 不加在词向量上,而是直接加到 QK 缩放点积的注意力分数上。它不发座位牌,而是修改“听觉规则”——在打分时按距离扣分,而不是在入场时贴标签。
Q3. 在因果注意力中,偏置项 $-m(i-j)$ 表示什么?
- A.离得越远扣分越多← 正确答案
- B.离得越近扣分越多
- C.与距离完全无关
- D.只对奇数位置扣分
答案:A。因果注意力里 $i \ge j$,所以 $(i-j)$ 非负,负号保证分数只减不增:距离越大,扣分越多,贴近“声音随距离衰减”的物理直觉。
Q4. ALiBi 各头斜率按什么规律设置?
- A.几何级数递减← 正确答案
- B.等差级数递增
- C.随机初始化训练
- D.全部固定为 1
答案:A。8 头时斜率为 1/2, 1/4, …, 1/256,是典型的几何级数。大斜率头聚焦近邻,小斜率头兼顾远方,两个极端之间由多头协作覆盖。
Q5. 关于长度外推,ALiBi 的表现是?
- A.超长后困惑度快速爆炸
- B.超长后困惑度保持平缓← 正确答案
- C.只能外推到训练两倍
- D.完全无法外推
答案:B。因为偏置只依赖相对距离,ALiBi 在训练长度数倍的序列上困惑度仍能保持平稳,这正是“训练短、测试长”能够成立的原因。
Q6. 为什么正弦编码外推效果不如 ALiBi?
- A.正弦编码参数量太大
- B.高频维度易过拟合位置← 正确答案
- C.正弦编码无法并行计算
- D.它与词向量维度不匹配
答案:B。正弦编码的高频维度变化快,训练时会记住“具体位置”的细节,一旦测试长度超出范围就产生偏差。ALiBi 完全没有可学习的绝对位置记忆,只保留普适的距离法则。
Q7. BLOOM 采用 ALiBi 的主要收益是?
- A.语言建模困惑度更低
- B.无需位置参数即可外推← 正确答案
- C.训练速度直接翻倍
- D.词表大小不再受限
答案:B。BLOOM 选择 ALiBi 的核心是零位置参数 + 长度外推能力。它的困惑度与传统方法相当,并不存在“大幅降低”,收益在于省掉位置参数、推理时能加长上下文。
Q8. 哪些属于传统位置编码方案?
- A.正弦绝对位置编码← 正确答案
- B.可学习位置编码← 正确答案
- C.线性偏置位置编码
- D.相对位置编码方案← 正确答案
答案:ABD。传统方案包括正弦、可学习、相对位置三种,它们的共同点是位置信号与注意力打分脱节。线性偏置编码就是 ALiBi 本身,是这里的“替代方案”,而不是被替代的传统方案。
Q9. ALiBi 具备哪些特性?
- A.零额外位置参数← 正确答案
- B.支持长度外推← 正确答案
- C.替代全部注意力
- D.头间斜率不同← 正确答案
答案:ABD。ALiBi 不学习位置参数、外推能力强、各头斜率按几何级数分层。它只是给注意力分数加偏置,并没有替代注意力本身,C 说“替代全部注意力”是错误的。
Q10. 下列哪些模型使用了 ALiBi?
- A.BLOOM 大模型← 正确答案
- B.MPT 开源模型← 正确答案
- C.Falcon 大模型← 正确答案
- D.LLaMA 体系列
答案:ABC。BLOOM、MPT、Falcon 都在架构中采用 ALiBi;而 LLaMA 系列使用的是旋转位置编码(RoPE)。记住这个清单有助于在面试中区分主流开源大模型的位置编码选型。