Files
llm-atlas/research/DEEPSEEK_ROUTING_SPECIAL_TOKEN_FAMILY_AUDIT.md

514 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DeepSeek-V2-Lite 特殊 Token 家族控制审计
> 状态:真实官方权重执行(X)<br />
> 模型:`deepseek-ai/DeepSeek-V2-Lite` **base checkpoint**<br />
> revision:`604d5664dddd88a0433dbae533b7fe9472482de0`<br />
> 执行边界:layer 0–6;观测 MoE layer 1–6<br />
> 样本:WikiText-2 / TNEWS / HumanEval / GSM8K 各 32 条<br />
> 正式运行与独立复跑:byte-exact<br />
> 完整 JSON SHA-256:`c372c1b03a8b15f615b54ded5d9257a8fc2cdb7728001735d3d4c1d8534af5bf`
## 0. 一句话先说结论
固定 DeepSeek-V2-Lite base 权重、128 个公开样本、重复词元历史、角色块、
长度、目标位置和八格 batch 后,只把历史 assistant 后的一个边界 ID 设为
`EOS / BOS / x / .`:
```text
目标内容 · prompt-balanced · 24 个 layer×domain 平均 system-edge TV
EOS .037518
BOS .048018
x .053975
句点 .055289
```
相对官方 EOS:
```text
BOS − EOS +.010500 22↑ / 2↓
x − EOS +.016457 24↑ / 0↓
句点 − EOS +.017771 24↑ / 0↓
```
这说明:
> 在本实验的固定协议中,边界的具体 token 身份会改变后续目标内容对 system
> 开关的路由距离;BOS 不能简单复现 EOS 的作用。
但是它**不能**推出:
> “特殊 token 普遍让 system effect 更小”。
原因非常具体:固定 tokenizer 的 special inventory 只有 EOS 和 BOS,
所以二者确实被完全枚举;但普通词元空间接近十万个 ID,本实验只挑了 `x`
和句点两个对照。`mean(x, .) − mean(EOS, BOS) = +.011864` 是四个 ID 内的
描述性 2-vs-2 汇总,不是对“普通 token 总体”的抽样推断。
---
## 1. 为什么要继续做这一轮
上一轮边界实验比较:
```text
EOS ↔ x / 句点 / 换行
```
结果表明,三个普通单 token 替换都能改变后续目标路由,而且多数格子的
system-edge TV 大于 EOS 条件。但它仍留下一个关键混淆:
- EOS 是特殊 token;
- 三个替换项都不是特殊 token;
- 因此差异可能来自 EOS 的具体身份,也可能来自“specialness”。
本轮加入 BOS,因为 BOS:
- 与 EOS 一样是 tokenizer 官方声明的 special token;
- 与 EOS 一样只有一个 token ID;
- 可以在不改变长度、目标位置和 batch shape 的前提下进行单 ID 替换。
问题随之变成:
1. BOS 能否复现 EOS 的 system-edge 路由模式?
2. EOS/BOS 与两个选定普通对照的描述性均值是否不同?
3. 这种差异是否在直接替换、CV、完整输入等口径下也同向?
---
## 2. 固定 tokenizer 的完整特殊词元库存
固定 revision 的真实 tokenizer 合同:
| 项目 | token / ID |
|---|---|
| `vocab_size` | `100000` |
| tokenizer 总长度 | `100002` |
| BOS | `<|begin▁of▁sentence|>` / `100000` |
| EOS | `<|end▁of▁sentence|>` / `100001` |
| PAD | `100001`,与 EOS 同 ID |
| `all_special_ids` | `[100000, 100001]` |
| `all_special_tokens` 数量 | `2` |
因此:
```text
special inventory = {BOS, EOS}
```
本轮确实穷尽了 special inventory,而不是只挑两个看起来特殊的字符串。
四个实验 ID:
| 水平 | token ID | special | 官方历史边界 |
|---|---:|---:|---:|
| `eos` | `100001` | 是 | 是 |
| `bos` | `100000` | 是 | 否,反事实 |
| `x` | `87` | 否 | 否,反事实 |
| `period` | `13` | 否 | 否,反事实 |
需要特别注意:
- PAD 与 EOS 共用 ID,所以不能把 PAD 当作第五个独立 special control;
- `x` 和句点不是从普通词元总体随机抽样;
- 普通词元还有不同频率、脚本、空白、标点和语义类别,本实验没有覆盖。
官方合同可在固定 revision 的
[tokenizer_config.json](https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite/blob/604d5664dddd88a0433dbae533b7fe9472482de0/tokenizer_config.json)
中核查。
---
## 3. 2×4 实验设计
两个因子:
- `S`:system message 关闭 / 开启;
- `B`:边界 ID 为 EOS / BOS / `x` / 句点。
八格:
| 条件 | system | 边界 ID | 官方模板序列 |
|---|---:|---|---:|
| `S0 / EOS` | 0 | `100001` | 是 |
| `S1 / EOS` | 1 | `100001` | 是 |
| `S0 / BOS` | 0 | `100000` | 否 |
| `S1 / BOS` | 1 | `100000` | 否 |
| `S0 / X` | 0 | `87` | 否 |
| `S1 / X` | 1 | `87` | 否 |
| `S0 / PERIOD` | 0 | `13` | 否 |
| `S1 / PERIOD` | 1 | `13` | 否 |
序列局部形态:
```text
... Assistant : x [BOUNDARY_ID] User : TARGET ...
```
所有替换发生在官方 renderer 完成之后。除 EOS 外,其余三格是明确的
token-ID counterfactual,不是官方模板会自然渲染出的聊天。
---
## 4. 什么被严格固定
每个 source 的八格共同固定:
- 同一 checkpoint、revision、tokenizer 与 remote code;
- 同一 system 文本;
- 同一重复词元 user/assistant 历史;
- 同一 `User:` / `Assistant:` 角色块;
- 同一目标文本和 canonical 23-token span;
- 同一序列长度;
- 同一目标绝对起止位置;
- 同一 attention mask 和 right-padding;
- 同一个 32-row BF16 forward。
正式验证:
| 闸门 | 结果 |
|---|---:|
| source prompts | 128 |
| 输入变体 | 1,024 |
| system groups | 256 |
| 八格同长度 | 256 / 256 |
| 八格同目标位置 | 256 / 256 |
| 官方 EOS 零 ID 改动 | 256 / 256 |
| 三类反事实恰好一 ID 改动 | 768 / 768 |
| 实际 MoE routes | 2,044,224 |
正式运行与独立复跑都是 54,440,827 bytes,完整 JSON byte-exact。
---
## 5. 统计量回答的是三个不同问题
### 5.1 system edge
固定边界 `b`:
```text
TV(P(S0, b), P(S1, b))
```
它问:开关 system 时,目标内容的专家份额移动了多少?
### 5.2 相对 EOS 的 system-edge contrast
```text
TV_system(b) − TV_system(EOS)
```
它问:把边界 ID 换掉后,system-edge 距离变大还是变小?
### 5.3 直接替换距离
固定 system 水平 `s`:
```text
TV(P(s, EOS), P(s, b))
```
它问:只改这个历史 ID,本身让后续目标路由移动了多少?
直接替换距离非零,不代表 system-edge contrast 必然同方向。这两张账不能相减
之后只保留一个顺眼结论。
---
## 6. 主结果:目标内容的 system edge
主口径是:
```text
scope = target_content
aggregation = prompt_balanced
metric = total variation
bootstrap = source-paired, 2,000 resamples
seed = 20260729
```
24 格 system-edge TV:
| 层 | 域 | EOS | BOS | x | 句点 | BOS−EOS [95% CI] |
|---:|---|---:|---:|---:|---:|---:|
| 1 | 英文 | .056 | .108 | .084 | .081 | +.052 [.040, .061] |
| 1 | 中文 | .028 | .057 | .051 | .052 | +.030 [.022, .037] |
| 1 | 代码 | .057 | .071 | .080 | .081 | +.014 [.007, .022] |
| 1 | 数学 | .078 | .125 | .107 | .105 | +.047 [.039, .053] |
| 2 | 英文 | .030 | .039 | .044 | .043 | +.009 [.002, .017] |
| 2 | 中文 | .020 | .026 | .027 | .029 | +.005 [.001, .013] |
| 2 | 代码 | .033 | .044 | .054 | .050 | +.011 [.005, .019] |
| 2 | 数学 | .041 | .049 | .052 | .055 | +.008 [.003, .016] |
| 3 | 英文 | .030 | .042 | .043 | .044 | +.012 [.005, .017] |
| 3 | 中文 | .023 | .027 | .032 | .028 | +.004 [.000, .013] |
| 3 | 代码 | .041 | .049 | .047 | .044 | +.008 [.002, .014] |
| 3 | 数学 | .032 | .039 | .035 | .036 | +.006 [.001, .014] |
| 4 | 英文 | .034 | .040 | .050 | .052 | +.006 [.001, .014] |
| 4 | 中文 | .030 | .032 | .041 | .042 | +.003 [-.001, .010] |
| 4 | 代码 | .041 | .048 | .061 | .075 | +.007 [.001, .015] |
| 4 | 数学 | .051 | .057 | .069 | .070 | +.006 [.000, .015] |
| 5 | 英文 | .034 | .039 | .050 | .052 | +.006 [-.000, .013] |
| 5 | 中文 | .026 | .030 | .037 | .045 | +.004 [.001, .013] |
| 5 | 代码 | .039 | .039 | .051 | .051 | +.000 [-.005, .008] |
| 5 | 数学 | .044 | .042 | .055 | .053 | -.002 [-.008, .006] |
| 6 | 英文 | .031 | .038 | .056 | .060 | +.007 [.001, .014] |
| 6 | 中文 | .026 | .029 | .044 | .048 | +.003 [.000, .011] |
| 6 | 代码 | .032 | .043 | .061 | .062 | +.011 [.006, .018] |
| 6 | 数学 | .045 | .039 | .066 | .070 | -.006 [-.011, .002] |
把 24 格作为描述性层×域单元汇总:
| contrast | 平均 ΔTV | 点估计方向 | CI 全正 / 全负 / 跨零 |
|---|---:|---:|---:|
| BOS−EOS | +.010500 | 22↑ / 2↓ | 19 / 0 / 5 |
| x−EOS | +.016457 | 24↑ / 0↓ | 23 / 0 / 1 |
| 句点−EOS | +.017771 | 24↑ / 0↓ | 22 / 0 / 2 |
可读结论:
- BOS 在多数格比 EOS 产生更大的 system-edge 路由距离;
- 但 L5/L6 数学已经出现反向点估计;
- `x` 和句点的差异更大、更一致;
- 因此“BOS 是特殊 token”并不足以复现 EOS 的模式。
---
## 7. 四 ID 的描述性 family summary
只在同一 shared-source bootstrap 内计算:
```text
special mean = mean(EOS, BOS)
ordinary-control mean = mean(x, period)
ordinary − special
```
目标内容、prompt-balanced 的 24 格均值:
```text
special mean .042768
ordinary-control mean .054632
ordinary − special +.011864
```
24 / 24 点估计为正;95% CI 分类为 20 全正、0 全负、4 跨零。
正确表述:
> 在这四个具体 ID 中,两个选定普通对照的 system-edge TV 均值高于完整
> special inventory 的均值。
错误表述:
> 普通 token 普遍比特殊 token 产生更大的 system effect。
后一句需要对普通 token 总体定义抽样框、抽取更多频率与类别匹配 ID,并进行
层级推断;本轮没有做。
---
## 8. 直接替换没有给出同样简单的故事
跨 24 格平均 direct target TV:
| EOS→替换项 | S0 | S1 | S1−S0 | 点估计方向 |
|---|---:|---:|---:|---:|
| BOS | .043479 | .040793 | -.002686 | 7↑ / 17↓ |
| x | .036428 | .044132 | +.007704 | 20↑ / 4↓ |
| 句点 | .036296 | .045606 | +.009310 | 22↑ / 2↓ |
其中:
- BOS direct interaction 的 CI 分类为 3 正 / 4 负 / 17 跨零;
- `x` 为 10 正 / 0 负 / 14 跨零;
- 句点为 12 正 / 0 负 / 12 跨零。
所以本轮不是“所有替换都被 system 统一放大”。BOS 与两个普通对照在
直接作用的 system modulation 上呈现不同方向。
CV 也没有形成简单类别规律。BOS−EOS 的 system-edge ΔCV 跨 24 格平均
`+.009904`,点估计 `13↑ / 11↓`,CI `7 / 3 / 14`。
---
## 9. 为什么完整输入只能作稳健性账
完整输入会把被编辑的边界 token 自己也计入聚合,因此它混合:
1. 边界 ID 自身的路由;
2. 后续角色块;
3. 对齐目标内容的下游传播。
full-input、prompt-balanced 的平均 system-edge TV:
```text
EOS .138988
BOS .137253
x .141592
句点 .140312
```
BOS−EOS 平均为 `-.001735`,点估计 `6↑ / 18↓`;方向与目标内容主结果不同。
四 ID family summary 为 `+.002831`,也远小于目标内容的 `+.011864`。
这不是矛盾,而是统计对象不同。因果主张只落在:
> **边界 token 之后、精确对齐的目标内容路由。**
---
## 10. 路由集合稳定性
以 EOS↔BOS 的直接替换为例,聚合后的 target top-6 set exact:
| 层 | S0 | S1 | mean Jaccard S0 / S1 |
|---:|---:|---:|---:|
| 1 | 40.9% | 45.4% | .795 / .817 |
| 2 | 52.8% | 53.2% | .851 / .853 |
| 3 | 60.4% | 57.4% | .880 / .870 |
| 4 | 59.8% | 54.8% | .878 / .862 |
| 5 | 59.5% | 58.6% | .875 / .874 |
| 6 | 58.9% | 57.9% | .872 / .870 |
这说明一个历史单 ID 的变化可以传播到后续专家集合,但并非每个 token 都换
专家;路由变化是部分、分层且受内容影响的。
---
## 11. batch-content 审计
当前实验与上一轮边界实验共享 EOS / `x` / 句点三类条件:
```text
message hash 768 / 768 exact
rendered hash 768 / 768 exact
token-ID hash 768 / 768 exact
target contract 768 / 768 exact
```
然而把同一行放入不同 companion rows 的 32-row BF16 batch 后,深层临界
gate 决策不必 byte-exact。把三个共享水平合计:
| 层 | target route hash exact | target integer load exact |
|---:|---:|---:|
| 1 | 768 / 768 | 768 / 768 |
| 2 | 610 / 768 | 667 / 768 |
| 3 | 477 / 768 | 572 / 768 |
| 4 | 368 / 768 | 496 / 768 |
| 5 | 269 / 768 | 437 / 768 |
| 6 | 244 / 768 | 402 / 768 |
因此:
> BF16 的 batch content 是执行合同的一部分。正式统计只比较本轮同一个
> 八格 batch 内的 source-paired 条件,不跨实验拼接深层数值。
---
## 12. 可复现入口
正式运行:
```bash
PYTHONPATH=/tmp/deepseek-v2-lite-pydeps.6ZJAH3:/usr/lib/python3/dist-packages \
/home/wuyang/.pyenv/versions/navi-router-cu128/bin/python \
experiments/deepseek/v2_lite_routing_special_token_family_control.py \
--artifact-dir /tmp/deepseek-v2-lite-artifacts.OEjfce \
--human-eval /tmp/llm-atlas-routing-corpus/human-eval/data/HumanEval.jsonl.gz \
--gsm8k /tmp/llm-atlas-routing-corpus/gsm8k/grade_school_math/data/test.jsonl \
--tnews /tmp/llm-atlas-routing-corpus/tnews/test.json \
--tnews-archive /tmp/llm-atlas-routing-corpus/tnews_public.zip \
--wikitext /tmp/llm-atlas-routing-corpus/wikitext-2-raw-v1-validation.parquet \
--output src/data/deepseek-v2-lite-routing-special-token-family-control.json \
--batch-prompts 4 \
--bootstrap 2000 \
--seed 20260729
```
独立复跑只改输出文件名。确定性前端 compact:
```bash
npm run build:data:deepseek-special
```
完整工件:
| 文件 | bytes | SHA-256 |
|---|---:|---|
| 正式运行 JSON | 54,440,827 | `c372c1b0…4af5bf` |
| 独立复跑 JSON | 54,440,827 | `c372c1b0…4af5bf` |
---
## 13. 与已有论文怎样对齐
外部研究已经反复说明 prompt 的词汇、格式与分隔符变化可能显著影响模型输出:
- [Lexical Sensitivity of Language Models](https://aclanthology.org/2024.emnlp-main.295/)
研究词汇变化对任务表现的影响;
- [Prompt Sensitivity Prediction](https://aclanthology.org/2024.naacl-long.325/)
讨论模型与任务对 prompt 变化的敏感性;
- [PROMPTPRISM](https://aclanthology.org/2026.findings-eacl.61.pdf)
在 taxonomy 中明确区分 delimiter、prefix、suffix 与 special-token 修改;
- [URIAL](https://proceedings.iclr.cc/paper_files/paper/2024/file/6bcbb4a501dbad0eba1b660c1a55318c-Paper-Conference.pdf)
展示 base model 对格式化与对齐样式的利用;
- [LIMA](https://arxiv.org/abs/2305.11206)
是理解对话格式、回合边界与少量高质量对齐数据的背景材料。
这些论文提供问题背景,但不替本实验背书。尤其不能把:
```text
路由 TV 变化
```
直接改写成:
```text
准确率、质量、安全性或指令遵循变化
```
本实验没有生成答案,也没有行为评测。
---
## 14. 允许说什么,不允许说什么
可以说:
- 固定 tokenizer 的 special inventory 只有 BOS 和 EOS;
- 在固定协议里,BOS 不复现 EOS 的目标 system-edge 路由模式;
- `x`/句点相对 EOS 在 24 格中表现出更大的目标 system-edge TV;
- 四 ID 的 2-vs-2 family summary 是描述性结果;
- 单 ID 边界变化能传播到后续目标的 MoE routing;
- 正式运行与独立复跑 byte-exact。
不可以说:
- 普通 token 普遍比 special token 更有效;
- EOS 让模型更懂回合或让回答更好;
- BOS/EOS 具有已识别的专家语义;
- 结果适用于所有 27 层、Chat/SFT/RL 权重或线上流量;
- 路由差异等于性能差异;
- 24 个 layer×domain 单元是 24 个独立随机样本。
---
## 15. 下一步
这一轮解决了 special inventory,却还没有解决角色块内部结构。固定模板中的:
```text
User: = [5726, 25]
Assistant: = [77398, 25]
```
都是两个普通 token。所以下一轮采用完整 2×2:
```text
head = User / Assistant
delimiter = : / x
```
用同一个 batch 分离词头主效应、分隔符主效应与二者 interaction。