research: audit reduced AttnRes study

This commit is contained in:
wuyang
2026-07-30 07:15:05 +08:00
parent 5f49906be6
commit d1d9d22bf3
6 changed files with 25838 additions and 0 deletions
+568
View File
@@ -0,0 +1,568 @@
# Kimi K3 第四轮:Attention Residuals 缩小版独立机制实验审计
> 协议:`llm-atlas-k3-attnres-reduced-v1`
>
> 预注册:`research/K3_ATTNRES_REDUCED_PROTOCOL.md`
>
> 数据清单:`experiments/k3/attnres/manifest.json`
>
> 执行日期:2026-07-30
>
> 执行设备:NVIDIA GeForce RTX 5090;PyTorch `2.11.0+cu128`
## 0. 先说结论
这一轮没有伪装成“跑通了 K3”。它做的是一个刻意缩小、从零训练、可公开复查的
Attention Residuals(AttnRes)机制实验:
```text
3 个结构
× 3 个预先冻结的初始化 seed
× 每格 2,000 steps
× 每步 32 × 256 target bytes
= 9 个正式训练格,147,456,000 target bytes
```
三个结构共享完全相同的 16 个 Transformer blocks、32 个残差子层、初始公共参数、
训练窗口、优化器与验证集。唯一设计变量是“前面产生的 residual states 怎样供下一层读取”:
```text
Baseline:只读上一残差状态
Full AttnRes:对全部历史残差状态做按维 softmax 混合
Block AttnRes:每 4 个残差子层形成一个局部块,块间再混合
```
在冻结的 64 个验证窗口上,最终 bits per byte(BPC,越低越好)为:
| seed | Baseline | Full | Block | Full − Base | Block − Base |
|---:|---:|---:|---:|---:|---:|
| 2026073001 | 2.00054 | 1.98454 | 1.94788 | −0.01600 | −0.05266 |
| 2026073002 | 1.99844 | 1.98523 | 1.95709 | −0.01321 | −0.04135 |
| 2026073003 | 1.99842 | 1.98392 | 1.96503 | −0.01450 | −0.03339 |
| 三 seed 均值 | 1.99913 | 1.98457 | 1.95667 | **−0.01457** | **−0.04247** |
按照看结果前冻结的判据——三个 seed 同为负,并且均值不高于 `−0.010 BPC`——Full 与
Block 都得到:
> **directional support in this reduced protocol**
中文应该读成:
> 在这套缩小训练合同中,允许子层重新读取更早的残差状态,方向一致地改善了验证 BPC。
它**不应该**读成:
- 已复现 AttnRes 论文的大模型收益;
- 已运行 Kimi K3 checkpoint;
- 已证明 Block 一般优于 Full;
- 已得到同参数、同 FLOPs 或同 wall time 的优势;
- 三个 seed 可以支持总体显著性、置信区间或 scaling-law 外推。
本轮还有一个同样重要的反结果:预注册的“16 个 Transformer blocks 的核心参数梯度 RMS
变异系数”在本实验中,Baseline 为 `0.3447`,Full 为 `0.5087`,Block 为 `0.6306`。
在这个定义和尺度下,AttnRes **没有**表现出更均匀的跨深度梯度。这个结果与论文的大模型
梯度叙述不能直接对齐,网站必须把它作为边界而不是藏起来。
---
## 1. 为什么不是直接跑 K3
### 1.1 公开 checkpoint 的未决形状冲突
第三轮工件审计在 K3 第一层 KDA 中发现:
| 官方工件 | `A_log` 所要求或实际给出的形状 |
|---|---|
| `config.json` | `num_heads = 96` |
| Hugging Face remote code | 按 `num_heads` 构造,即 `[96]` |
| FlashKDA kernel API | `[H]`,K3 中应为 `[96]` |
| checkpoint safetensors header | `[128]` |
本轮再次检查了当前官方 Hugging Face / GitHub 工件,并额外检查当前 vLLM 与 SGLang
Kimi K3 loader。两者都按 local head 维构造和切分 `A_log`,没有公开 `128 → 96` 的转换规则。
因此,以下做法都会越过证据:
```text
裁掉最后 32 个值
把 128 强行 reshape 成别的语义
把 128 解释成 head_dim
绕过 loader 后把输出叫作“K3 forward”
```
在 Moonshot 给出转换合同、修订权重,或一个官方 loader 明确处理这 32 个额外值之前,
本站不制造“真实 K3 前向结果”。
### 1.2 为什么缩小版仍有价值
不能诚实执行 1.56 TB checkpoint,不等于只能停在架构示意图。AttnRes 的核心问题可以被
缩成一个更小、但仍可被证伪的问题:
> 在相同 Transformer 主干、相同输入窗口与相同初始化下,把“固定单位 residual
> connection”替换成“学习的历史 residual 混合”,短预算训练是否出现一致方向?
这个问题不依赖 KDA、MLA、MoE、MXFP4、视觉塔或完整 K3 参数。它只检验 AttnRes
的局部机制方向,并且可以把全部代码、清单、聚合指标和复现哈希开源。
---
## 2. 先冻结什么
首版协议在正式结果产生前冻结以下项目:
- 数据仓库、revision、config、split 拼接规则与 byte tokenizer;
- 模型层数、宽度、head 数、FFN 宽度、位置编码、RMSNorm 与激活函数;
- Baseline / Full / Block 的精确定义;
- 三个初始化 seed;
- 每格训练步数、batch、context 与总 target bytes;
- AdamW、学习率曲线、weight decay、gradient clipping;
- 验证步、固定验证窗口与主指标;
- 主对比、方向判据和“不能宣称什么”;
- 深度 RMS、混合权重与梯度诊断;
- smoke 与正式独立进程 replay 合同。
正式协议不是从本轮曲线倒推的。关键提交顺序为:
```text
9039de1 research: preregister reduced AttnRes study
e361753 research: lock reduced AttnRes model contract
f998720 research: add reduced AttnRes runner
1f20f81 research: freeze reduced AttnRes corpus
```
### 2.1 一次被公开保留的预训练故障
第一次 smoke 在 step 0 的验证 forward 后停止:
```text
RuntimeError:
view size is not compatible with input tensor's size and stride
```
原因是切片后的 target tensor 不连续,而 loss 路径用了 `.view()`。当时:
- 尚未执行一个 optimizer step;
- 没有正式结果文件;
- 没有任何条件的训练或最终 BPC 可供选择。
修复仅把 `.view()` 改为语义等价且支持非连续输入的 `.reshape()`:
```text
5f49906 fix: flatten noncontiguous AttnRes targets
```
随后三个结构分别完成两次独立 smoke,冻结字段逐字段 exact。这个故障不改变实验设计,
但应留在审计链中,避免“第一次就完美运行”的虚假叙事。
---
## 3. 数据合同:文本怎样变成 byte 任务
### 3.1 固定数据源
| 项目 | 固定值 |
|---|---|
| repository | `Salesforce/wikitext` |
| revision | `b08601e04326c79dfdd32d625aee71d232d685c3` |
| config | `wikitext-2-raw-v1` |
| 行处理 | `(text or "") + "\n"` |
| 编码 | UTF-8 |
| tokenizer | byte ID `0..255` |
| vocabulary | 256 |
拼接后的 split:
| split | bytes | SHA-256 |
|---|---:|---|
| train | 10,951,563 | `0ca7d3e74dbe44564ea5942b85232f1bbcb525c9cd481cd5d28a87ee90e7e9b4` |
| validation | 1,148,008 | `a42356f6a8ff1d25daf25ec9db49e10a537c265581b61c74604bb63231dee719` |
| test | 1,292,014 | `bfe9eb16ab9987fb88bde4ea9a30a00f2a45db01dfc14bad78d05325789c4f12` |
这里的 byte tokenizer 不是为了追求最佳语言模型性能,而是为了移除另一个潜在变量:
不同 BPE 模型、词表和 normalization。BPC 也因此可以直接比较,而不受 tokenization
长度变化影响。
### 3.2 无状态窗口计划
训练窗口不靠进程内 RNG 顺序产生。对每个:
```text
architecture + seed + step + batch row
```
协议用 SHA-256 派生 train start offset。三种结构在同一 seed 下使用相同窗口;结构名不进入
窗口选择的有效随机盐。冻结计划包含 192,000 个起点,SHA-256 为:
```text
81521a70ec61f3717968f160cb711e50c5f52a665a6961538d339360cb695f48
```
固定 64 个验证窗口 tensor hash:
```text
5f71fda757fc75010ed16e7636bc394c69f55b34a3713b3b5a7ef8e03eae3c20
```
固定 16 个诊断窗口 hash:
```text
d970af9b0c656c9826f369b5fe6e3869a6f6cfeccfa5a922fe94ed1d24b86818
```
---
## 4. 模型合同:只改变 residual 读取拓扑
### 4.1 公共主干
| 项目 | 值 |
|---|---:|
| Transformer blocks | 16 |
| residual sublayers | 32(每 block attention + FFN) |
| model width | 192 |
| attention heads | 6 |
| head dimension | 32 |
| SwiGLU hidden | 768 |
| context | 256 bytes |
| dropout | 0 |
| position | learned absolute embedding |
| norm | pre-RMSNorm + final RMSNorm |
| attention softmax | causal, float32 |
| embedding / LM head | tied |
Attention projection 与 SwiGLU 都不使用 bias。三个结构的公共 core 参数均为
`9,541,824`,每个 seed 的公共参数初始化哈希在三种结构间 exact。
### 4.2 Baseline
普通 residual 子层:
```text
x_(l+1) = x_l + F_l(RMSNorm(x_l))
```
它只保留一个随深度持续累积的 residual stream。
### 4.3 Full AttnRes
第 `l` 个子层先对从 embedding 到当前深度的全部 residual states 做学习混合:
```text
α_l = softmax(q_l · RMSNorm(states))
x̃_l = Σ_i α_(l,i) state_i
state_(l+1) = F_l(RMSNorm(x̃_l))
```
`q_l` 是按 hidden dimension 学习的 pseudoquery,初始化为 0,所以初始 softmax 为均匀
读取。最后还有一个 output mixer,把 33 个可见 sources 混成 LM head 的输入。
### 4.4 Block AttnRes
32 个 residual sublayers 被分成 8 块,每块 4 层:
```text
块内:新 branch state 做普通局部累加
块边界:对历史块状态做学习混合,产生下一块输入
```
它保留“可以回读历史”的机制,同时把 Full 随深度增长的状态集合限制在块级。
### 4.5 参数公平与计算不公平
| 结构 | core | mixer | total | 相对 Baseline mixer overhead |
|---|---:|---:|---:|---:|
| Baseline | 9,541,824 | 0 | 9,541,824 | 0 |
| Full | 9,541,824 | 12,672 | 9,554,496 | 0.1328% |
| Block | 9,541,824 | 12,672 | 9,554,496 | 0.1328% |
这是近似同参数,不是同 FLOPs。当前教学实现用 PyTorch eager 保存和混合历史 states,
没有使用论文的大模型优化 kernel,所以它适合机制观察,不适合推断生产吞吐。
---
## 5. 训练与主指标
### 5.1 每格预算
```text
2,000 steps
× batch 32
× context 256 target bytes
= 16,384,000 target bytes / run
```
优化器:
```text
AdamW β=(0.9, 0.95), ε=1e-8
peak LR=3e-4, min LR=3e-5
100-step warmup + cosine decay
weight decay=0.1 for ndim>=2
global grad clip=1.0
BF16 autocast
```
验证发生在 `0, 100, 250, 500, 1000, 1500, 2000` steps。主指标只使用 step 2000
的固定验证 BPC;曲线用于帮助理解,不用于重新选择终点。
### 5.2 判据为什么这么保守
只有三个 seed,不能可靠估计总体方差或给出有意义的 population confidence interval。
所以预注册不用 p-value,而只问两个简单问题:
```text
三个 paired deltas 是否同方向?
mean delta 是否至少达到 0.010 BPC?
```
如果答案都是“是”,只写作本协议内的 directional support / concern。它是一道防止
夸大结论的阈值,不是一个通用显著性标准。
### 5.3 正式结果
Full 的三组配对差:
```text
−0.015996
−0.013207
−0.014498
mean = −0.014567 BPC
```
Block 的三组配对差:
```text
−0.052660
−0.041349
−0.033388
mean = −0.042466 BPC
```
两组都满足预注册的方向支持规则。Block 相对 Full 的均值差为 `−0.027898 BPC`,三个
seed 也同为负;但“Block − Full”不是预注册主判据,而且本实现的计算图与优化效率不同,
所以它只适合描述,不升级成一般性排名。
---
## 6. 它花了多少计算与显存
排除每次前 20 个计时 warmup steps 后,三个 seed 的均值:
| 结构 | mean step | 相对 Baseline | peak allocated | 相对 Baseline |
|---|---:|---:|---:|---:|
| Baseline | 21.62 ms | 1.00× | 3.04 GB | 1.00× |
| Full | 146.81 ms | 6.79× | 14.26 GB | 4.70× |
| Block | 54.63 ms | 2.53× | 6.52 GB | 2.15× |
这张表应该怎样读:
- Full 在教学实现中为每层保留并读取更多历史 states,因此最贵;
- Block 把可见历史限制在块级,成本明显下降;
- 时间与显存是“这份 PyTorch eager 实现 + RTX 5090”的观测;
- 不能把 6.79× / 2.53× 外推到论文 kernel、K3 训练系统或生产推理;
- BPC 改善不能被写成同 FLOPs 改善。
---
## 7. 看 residual stream:Block 为什么呈现锯齿
Baseline 的 stream-state RMS 从平均 `0.0661` 增到 `0.2110`:普通 residual
connection 把分支输出一路累积。
Block 的前 12 个 partial-state RMS 是:
```text
0.0334 0.0598 0.0967 0.1181
0.0509 0.0569 0.0745 0.0815
0.0532 0.0581 0.1079 0.1158
```
每四个值形成一个局部块:
```text
块内:逐层累积,RMS 通常上升
块间:重新从历史块状态混合,partial stream 被重置
```
所以曲线不是训练不稳定造成的随机锯齿,而是 Block 拓扑的直接几何痕迹。完整 32 点向量、
三个 seed 的 min / mean / max 均进入公开 JSON。
Full 的 layer-input RMS 则从 `0.0544` 降到 `0.00866`。这不等于信息“消失”:
每层输入是多个经过 RMSNorm 的历史 states 的学习加权和,混合可以通过方向抵消改变
合成向量的 RMS。只看单个标量不能判断信息保留量。
---
## 8. mixer 权重:一个事后但有解释力的观察
Full 在第 31 个 residual sublayer 的 branch-output RMS 平均达到 `1.4964`,是 32 层中
最大值。但最终 output mixer 给这个 source 的平均权重只有:
```text
observed = 0.002794
uniform = 1 / 33 = 0.030303
ratio = 0.0922× uniform
```
一个直观解释是:输出混合器学会了压低这个幅值突增的 source,而不是被迫把它以单位
residual 权重传到输出。
必须同时保留两个限制:
1. “最大 spike 对应低权重”是看完完整 trace 后挑出的描述;
2. 它不是预注册 endpoint,不能作为独立确认性证据。
网站会明确标注 **post-hoc descriptive callout**,并展示完整深度权重图,让读者看到它
不是从被隐藏的其他 source 中挑出的孤立数字。
---
## 9. 梯度结果没有复现论文叙述
预注册诊断对每个 Transformer block 的公共 core 参数计算 gradient RMS,再求 16 个
block 间的 coefficient of variation:
| 结构 | seed 1 | seed 2 | seed 3 | mean CV |
|---|---:|---:|---:|---:|
| Baseline | 0.3537 | 0.3409 | 0.3396 | **0.3447** |
| Full | 0.4890 | 0.5100 | 0.5272 | **0.5087** |
| Block | 0.6622 | 0.6849 | 0.5448 | **0.6306** |
CV 越低,按这个特定定义才越均匀。因此本轮观察是:
```text
Baseline < Full < Block
```
这和 AttnRes 论文在大模型训练中报告的、更平坦的跨深度梯度幅值叙述不是同一个结果。
合理边界包括:
- 本实验只有 width 192、16 blocks、2,000 steps;
- 本指标是“按 block 汇总的核心参数 gradient RMS”;
- 论文图可能观察 activation / residual-output gradients,聚合对象并不相同;
- byte-level WikiText-2 与论文的大规模训练数据、优化器状态和训练阶段不同。
正确表述是:
> 本缩小实验的主 BPC 对比支持 AttnRes 的方向,但预注册的核心参数梯度均匀性指标不支持
> 论文式叙述;这提示该解释可能依赖尺度、指标定义或训练阶段,需要后续专门实验。
不正确的做法是改换一个看起来更漂亮的梯度统计后,只展示新指标。
---
## 10. 复现链
### 10.1 smoke
三个结构各执行两次独立的 20-step smoke。以下字段对每个结构都 exact:
```text
manifest
model
optimizer
hashes
evaluations
training_history
diagnostic
environment
```
### 10.2 正式独立进程 replay
预先指定:
```text
architecture = block
seed = 2026073001
steps = 2000
```
正式格与 fresh-process replay 的最终 BPC 都是:
```text
1.947877975922777
```
上面的八组冻结字段全部 exact。计时不要求 exact,实际也不相等,因为 wall time 受系统
调度影响。
| 文件 | SHA-256 |
|---|---|
| formal block / seed 1 | `5df870369d9a86ccb4ba4191fbd1d6f3642893dd47a60f8f6d1143006bdfbdaf` |
| fresh replay | `e74d3323e5fe31378bb8aad7a8efa2fb91995cd7224c158cf03006466cdea2a7` |
### 10.3 公开产物
| 产物 | 内容 | SHA-256 |
|---|---|---|
| `src/data/k3-attnres-reduced.json` | 9 个完整 run + 聚合 + 复现记录 | `44f8622654d32485f8d6e698c02ba1365ddffb10cbd73db0294136d0bd93ce88` |
| `src/data/k3-attnres-reduced-compact.json` | 网站所需完整曲线与诊断 | `44864d48eddb2ae5887fba4b74f63b5a3d6a23497886ee307decf5b4f45d9faf` |
| `experiments/k3/attnres/reproduction.json` | smoke、初始化与 replay audit | `545543b7e4a970ca3bc0e6246610a32fb53ec3d9546a98e0f17f38d7121918a2` |
聚合器在同一批只读 run 文件上再次运行后,三个文件 SHA-256 全部不变。
---
## 11. 证据等级
### A. 本轮可直接主张
- 冻结协议下 9 个训练格的最终 BPC 与完整验证曲线;
- Full / Block 相对 Baseline 的三 seed 配对方向;
- 当前实现的参数量、实测 step time 与 peak allocated memory;
- 固定诊断窗口上的 residual RMS、mixer 权重与参数梯度统计;
- smoke 与指定正式格的独立进程 exact replay;
- 数据、窗口、初始化和产物 SHA-256。
### B. 只能作为机制解释
- Block 的四层锯齿与块边界重混合一致;
- Full mixer 可能通过降低权重抑制高 RMS source;
- Full / Block 的短预算优势可能来自更灵活的深度路由。
这些解释与观测相容,但不是唯一因果解释。
### C. 本轮明确不主张
- K3 checkpoint 已成功 forward 或训练;
- 论文表格、Figure 4–8 或 paper-scale scaling 已复现;
- AttnRes 在任意模型、数据和预算上都降低 loss;
- Block 一般优于 Full;
- 梯度在 AttnRes 中更均匀;
- 同 FLOPs、同 wall time 或生产系统的性价比优势;
- 三个 seed 支持总体统计显著性。
---
## 12. 下一步
这个实验把“能运行的独立机制 probe”完成了,但真实 K3 仍有两道门:
1. `A_log [128]` 的官方转换或权重修订;
2. 能加载完整或官方切分 K3 的受支持执行环境。
AttnRes 本身的下一轮也不应只增加 seed。优先级更高的是:
- 对齐论文实际使用的 activation / output-gradient 诊断定义;
- 增加 depth 与训练预算,检验梯度结论是否随尺度翻转;
- 做 mixer 计算的优化实现,再讨论同 wall-time 或近似同-FLOP 对比;
- 冻结一个更强 tokenizer / corpus 后检查 byte-level 结论是否保持;
- 将 Block size 作为预注册变量,而不是看完结果后挑 4。
---
## 13. 一手来源
- [Kimi K3 Technical Report](https://arxiv.org/abs/2607.24653)
- [Kimi K3 official checkpoint](https://huggingface.co/moonshotai/Kimi-K3)
- [Kimi K3 official code repository](https://github.com/MoonshotAI/Kimi-K3)
- [Attention Residuals](https://arxiv.org/abs/2603.15031)
- [Official Attention Residuals implementation](https://github.com/MoonshotAI/Attention-Residuals)
- [WikiText dataset repository](https://huggingface.co/datasets/Salesforce/wikitext)
- [vLLM Kimi K3 implementation](https://github.com/vllm-project/vllm)
- [SGLang Kimi K3 implementation](https://github.com/sgl-project/sglang)
Grok CLI 在协议冻结前只承担一次对抗式方法审阅:它提出锁定参数容量、残差拓扑、数据顺序、
指标定义和复现合同的检查项。所有论文事实和实验结论仍由一手来源、冻结代码与本地运行产物
支持;Grok 输出不作为证据来源。