“先付款,再发货”和“先发货,再付款”,用的词差不多,意思却不一样。模型需要分清顺序,但不一定非要给每个 token 附一个位置向量。如果计算本身就按顺序更新,先后关系也可以留在计算结果里。
这就是理解 NoPE(No Position Encoding)的起点。先看下面两个小算例就能抓住区别;想知道 causal mask 到底起什么作用,接着读两层 attention 的例子。Kimi K3 的具体做法放在后半篇。
前置知识:attention 怎样算、RoPE 怎样表示相对位置。这里讨论文本序列的顺序,不把结论直接套到图像的位置编码(positional encoding)上。
换一下顺序,结果就不同
先不管神经网络。我们只维护一个数字,每来一个输入,就把旧数字乘以 0.5,再加上新输入:
$$ h_t=0.5h_{t-1}+x_t,\qquad h_0=0. $$
| 输入顺序 | 第一步 | 第二步 | 最后留下什么 |
|---|---|---|---|
| 先 1,后 2 | $0.5\times0+1=1$ | $0.5\times1+2=2.5$ | 2.5 |
| 先 2,后 1 | $0.5\times0+2=2$ | $0.5\times2+1=2$ | 2 |
没有额外输入“这是第 1 个位置”,结果仍然变了:先来的数多经历了一次衰减。 这只是一个说明顺序的标量例子,不是 KDA 的实现,也不表示一个数字能记住整段话。
把 0.5 换成固定的 $\alpha$,展开就更明显:
$$ h_T=\sum_{j=1}^{T}\alpha^{T-j}x_j. $$
距离越远,要乘的 $\alpha$ 越多。但这里也有代价:$0<\alpha<1$ 时,远处信息逐渐变弱;$\alpha=1$ 时,最终状态变成求和,交换顺序不影响它;$\alpha=0$ 时,只剩最后一个输入。有顺序感、能记很久、能精确找回每条信息,是三件不同的事。
普通 attention 为什么还要考虑位置?
设一个 attention 层没有位置编码,没有 causal mask,也没有距离 bias。每个位置使用相同的投影,计算只依赖 token 内容。在这些条件下,把输入调换顺序,输出也只是按同样方式调换,不会凭空获得“谁原来在前面”的信息。这叫置换等变(permutation equivariance),不是说所有位置的输出都相同。
例如对 [1, 2, 0] 做全局均值,每个位置都得到 1。交换前两个数,结果仍然是 [1, 1, 1]。这可以看作 attention 分数全相同的极简情形。真实 attention 的分数会不同,但在上述条件下,同步重排输入与输出的性质仍成立。
想看推导:为什么只是跟着重排?
把行置换矩阵记为 $\Pi$,$Q=XW_Q$、$K=XW_K$、$V=XW_V$。不加位置相关项时,重排后的投影就是 $\Pi Q,\Pi K,\Pi V$。行 softmax 与相应的行列置换满足:
$$ \operatorname{softmax}(\Pi A\Pi^\top)=\Pi\operatorname{softmax}(A)\Pi^\top. $$
因此
$$ \operatorname{Attn}(\Pi X) =\operatorname{softmax}\!\left(\Pi QK^\top\Pi^\top/\sqrt d\right)\Pi V =\Pi\operatorname{Attn}(X). $$
如果最后再对全部位置求均值,均值连这个重排都看不出来,就成了置换不变(permutation invariant)。这里假定确定性计算、共享投影,且没有其他位置相关操作;不要把这个结论直接套到带 causal mask 的 decoder。
Causal mask 也会改变这个问题
下三角 mask 让第 1 个位置只能看自己,第 2 个位置能看前两个。各个位置能看到的前缀不同,不再是所有位置完全对称。
继续用均值,去掉投影、残差和归一化,只保留“每个位置平均读取可见前缀”。同一个操作连续做两层:
| 输入 | 第一层的全部输出 | 第二层最后一个位置 |
|---|---|---|
[1, 2, 0] |
$[1,1.5,1]$ | $(1+1.5+1)/3=7/6$ |
[2, 1, 0] |
$[2,1.5,1]$ | $(2+1.5+1)/3=1.5$ |
第一层最后一格都是 1;到了第二层,它读到的前面那几格已经不同,所以结果变了。这里特意保留相同的最后一个输入 0,避免把“顺序变了”和“最后一个词变了”混在一起。
这个小例子只能证明:不额外加位置编码,因果计算仍可能区分顺序。 它不能证明任何 NoPE 模型都会学好位置,更不能保证外推到任意长度。Haviv 等人的实验也观察到,无显式位置编码的 causal LM 可以学出位置信息;这是特定训练与评测条件下的证据,不是所有架构的保证。论文
这些工作当时在解决什么?
2022 年的 NoPos 研究面对的是一个基本疑问:显式位置编码很常见,但 causal LM 是否非用不可?作者比较了 learned、sinusoidal 和 ALiBi,实验规模为 125M–1.3B。要理解结论,先看实验设置,再看位置探针和局限,不能把它当作今天超长上下文模型的验证。原文 §3–6、§9 · 作者代码与模型
到 2025 年,Kimi Linear 关注的还有长序列的计算和 KV cache 成本:状态压缩能省资源,但会不会损失表达能力?它把全 MLA 模型和 Gated DeltaNet 混合模型(GDN-H)分别列为对照。读这篇时,把“为什么要混合”和“混合后是否还需要 RoPE”分开看。原文 §4–5 · 官方实现
两篇回答的问题并不完全相同,也不代表各自年份的全部业界实践。下面再看 K3 的具体选择,就不容易把“没有位置编码”误读成一条通用升级路线。
Kimi K3:顺序信息换了来源
Kimi K3 v1 把 KDA 与 Gated MLA 按 3:1 交替堆叠,末尾再加一层 MLA。KDA 提供有序状态更新;MLA 的 Q/K 不加显式位置编码。这里的全局读取仍受因果约束。报告 §2.1
所以它不是“把一个现成 RoPE 模型的旋转函数删掉”。要看完整的 token-mixing 路径。KDA 的矩阵状态也比开头的标量例子复杂;先读 Gated DeltaNet 的按误差写入,再看 Kimi Linear 的通道级遗忘,比直接背缩写容易理解。
报告仍使用长上下文数据与逐步扩长的训练流程。不调整 RoPE 参数,不等于不需要长上下文训练。 本站没有复现 K3 训练或长文本指标。报告 §3.4
继续推一层:矩阵状态里,顺序怎样留下来?
KDA 将标量遗忘扩展为通道级门控(gating),并在 Q/K/V 路径使用短卷积。下面采用 $S\in\mathbb R^{d_k\times d_v}$,与前篇 Gated DeltaNet 的存储方向互为转置;两种写法不要混用。Kimi Linear
$$ D_t=\operatorname{Diag}(\alpha_t),\qquad \bar S_t=D_tS_{t-1}, $$ $$ S_t=\bar S_t+\beta_tk_t(v_t^\top-k_t^\top\bar S_t),\qquad o_t=S_t^\top q_t. $$
$\alpha_t$ 有 $d_k$ 个分量,$k_t,q_t$ 是 $d_k$ 维,$v_t$ 是 $d_v$ 维,$\beta_t$ 控制写入幅度。这个式子仍是“先衰减,再按读取误差修正”,不是直接把新 value 加上去。
取 $S=[2,10]^\top$、$\alpha=[0.5,0.9]^\top$、$k=[1,0]^\top$、$v=6$、$\beta=0.25$:
| 操作 | 结果 |
|---|---|
| 分通道衰减 | $\bar S=[1,9]^\top$ |
| 沿 key 读取 | $k^\top\bar S=1$ |
| 误差 | $6-1=5$ |
| 写回 | $S=[1,9]^\top+0.25[1,0]^\top\times5=[2.25,9]^\top$ |
第二格保留了 9,而不是两个通道都乘 0.5 时的 5。通道级门控提供了不同的保留尺度;至于哪些信息值得保留,仍要由训练学出来。
现在把同一更新写成 $S_t=A_tS_{t-1}+B_t$,其中
$$ A_t=(I-\beta_tk_tk_t^\top)D_t,\qquad B_t=\beta_tk_tv_t^\top. $$
从零状态展开 3 步:
$$ S_3=A_3A_2B_1+A_3B_2+B_3. $$
第一步的写入要先经过 $A_2$,再经过 $A_3$。矩阵通常不交换;即使某些矩阵碰巧交换,写入项的位置也不能随意换。这个展开式比含糊的 $\prod A_t$ 更容易检查乘法顺序。
这和 RoPE 都能通过连续变换引入距离关系,但不是同一个算法:RoPE 的旋转保范数,这里的状态可以衰减、修正和覆盖。Kimi Linear §5.2 的消融支持其混合架构使用 NoPE;作者关于短程偏置的解释,不应升级成“RoPE 一定损害长文本”的定理。
实现上还有个坑:连续衰减的倒数可能太大
K3 对单步 log-decay 设下界,服务于分块计算中的数值范围。报告 §2.1.1
例如 $g_r\in(-5,0)$、$\alpha_r=\exp(g_r)$,连续 16 步的乘积为 $\exp(\sum_r g_r)$,它的倒数小于 $e^{80}\approx5.54\times10^{34}$。若无下界,只要累计 log-decay 到了 $-100$,倒数约为 $2.69\times10^{43}$,就超过 BF16 的有限范围。
这个算例解释为什么要约束中间量,不保证整个 kernel 都稳定,也不是吞吐测试。改变衰减范围还会约束模型能选择的遗忘速度;硬件好算和模型好学需要一起验证。
为什么不能给已有 checkpoint 直接关掉 RoPE?
因为这会改掉模型已经学会使用的相似度。看最小的二维例子:原始 query 和 key 都是 $(1,0)$,不旋转时点积(inner product)是 1。若相对旋转角为 $\pi/2$,点积变成 0。对两个候选(candidate) key,假设有位置时 logits 为 [1, 0],没有位置时为 [1, 1],softmax 第一项就从约 0.731 变成 0.5。
这不是单纯少算一次旋转,而是改了每层怎样读取上下文。能否适配需要训练与验证;某个混合模型的设计成功,不构成另一个 checkpoint 可以直接改配置的证据。旋转公式和配对约定见 RoPE。
取舍:顺序从哪里来,历史又存在哪里?
| 机制 | 能提供什么 | 仍然要付的代价 |
|---|---|---|
| 显式位置编码 | 给读取关系加入位置或相对距离 | checkpoint 与长度扩展的约定要匹配 |
| Causal mask | 让不同位置看到不同前缀 | 不保证模型学会距离或长程依赖;dense attention 成本还在 |
| 循环状态 | 有序更新,固定形状的历史摘要 | 压缩会干扰或遗忘信息,无法逐条保留所有历史 |
| 循环与全局 attention 混合 | 结合状态更新与逐位置读取 | 同时管理循环状态和 KV cache,后者仍随长度增长 |
NoPE 不是一种缓存格式。去掉位置编码,并不会让每个位置的 key/value 自动消失。也别把“固定状态”理解成训练显存恒定:训练还涉及激活、梯度、分块和重计算。
同样,MLA 的压缩投影不会因为不再旋转就失去用途。若同时改 latent 维度、head 形状和缓存布局,那是另外几项改动。想知道收益来自哪里,应分别做对照,而不是把所有差异归因于“去掉位置编码”。
自己跑这三个区别
教学脚本只用 Python 标准库:
python3 00-foundations/code/order_without_positions.py
Recurrent final states: 2.5, 2.0
Causal means, layer 1: 1.0, 1.0
Causal means, layer 2: 1.166667, 1.5
先把衰减改成 1,看最终状态是否还区分顺序;再保持衰减不变,在两组输入末尾都加一个 0,检查差异是否保留。最后把 causal mean 换成全局均值,看第二层还能不能恢复被抹掉的区别。
脚本还支持把一个序列分成两段运行:第二段带上第一段的最终状态,应与连续运行一致。换成独立的新样本时,则应该重置状态。这个边界比“循环状态能记住东西”这句话更值得亲手检查。
矩阵例子对应 channel_delta_step;它只实现一次状态更新,不含可训练投影、ShortConv 或 GPU 分块 kernel。content_attention 则让你检查无 mask 时输出跟着输入重排的性质。前两段循环是线性时间;这份朴素 attention 是二次时间,不用于性能比较。
在真实模型上怎样验证?
小算例解释机制,模型实验回答是否有用。可以先做这样的对照,不必一上来就测最大窗口:
| 想检查什么 | 保持什么不变,改哪一项 | 看什么 |
|---|---|---|
| 是否真的区分事件顺序 | 相同事件、相同查询,只交换发生顺序 | 答案是否按先后改变 |
| 是否只盯着最近一句 | 保留一条有效规则,后面加入相似但无效的旧规则 | 是否仍选对证据,而不是一律信最后一句 |
| 是否能找到远处证据 | 移动证据位置,逐渐增加无关文本 | 按位置和长度分别报告准确率 |
| 是否能联合信息 | 一道题必须结合两处证据 | 不用单点查找成功代替多步理解 |
| 缓存是否算对 | 同一 token 序列,连续运行与分段恢复 | logits / 状态在约定容差内一致 |
先固定 checkpoint、tokenizer、提示与解码,再分开报告质量、首 token 延迟、后续 token 延迟和显存。如果比较两种架构,还要交代各自的训练与计算预算;不能把不同训练配方的差异全算到 NoPE 头上。
核对日期:2026-10-09。本文的手算与脚本用于说明机制,不是 K3 性能复现。想继续深挖历史状态怎么压缩,读 MLA 与稀疏注意力。
本页术语 4
- 位置编码 positional encoding
- 把「第几个 token」的信息注入表示
- 门控 gating
- 用可学习权重控制信息写入、保留或输出
- 点积 inner product
- 两个向量对应分量相乘再求和,双塔的打分方式
- 候选 candidate
- 召回阶段捞出来、等待精排挑选的内容