Files
llm-atlas/research/DEEPSEEK_ROUTING_SPECIAL_TOKEN_FAMILY_AUDIT.md
T

16 KiB
Raw Blame History

DeepSeek-V2-Lite 特殊 Token 家族控制审计

状态:真实官方权重执行(X)
模型:deepseek-ai/DeepSeek-V2-Lite base checkpoint
revision:604d5664dddd88a0433dbae533b7fe9472482de0
执行边界:layer 0–6;观测 MoE layer 1–6
样本:WikiText-2 / TNEWS / HumanEval / GSM8K 各 32 条
正式运行与独立复跑:byte-exact
完整 JSON SHA-256:c372c1b03a8b15f615b54ded5d9257a8fc2cdb7728001735d3d4c1d8534af5bf

0. 一句话先说结论

固定 DeepSeek-V2-Lite base 权重、128 个公开样本、重复词元历史、角色块、 长度、目标位置和八格 batch 后,只把历史 assistant 后的一个边界 ID 设为 EOS / BOS / x / .:

目标内容 · prompt-balanced · 24 个 layer×domain 平均 system-edge TV

EOS       .037518
BOS       .048018
x         .053975
句点      .055289

相对官方 EOS:

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. 为什么要继续做这一轮

上一轮边界实验比较:

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

因此:

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 中核查。


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 否

序列局部形态:

... 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:

TV(P(S0, b), P(S1, b))

它问:开关 system 时,目标内容的专家份额移动了多少?

5.2 相对 EOS 的 system-edge contrast

TV_system(b) − TV_system(EOS)

它问:把边界 ID 换掉后,system-edge 距离变大还是变小?

5.3 直接替换距离

固定 system 水平 s:

TV(P(s, EOS), P(s, b))

它问:只改这个历史 ID,本身让后续目标路由移动了多少?

直接替换距离非零,不代表 system-edge contrast 必然同方向。这两张账不能相减 之后只保留一个顺眼结论。


6. 主结果:目标内容的 system edge

主口径是:

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 内计算:

special mean          = mean(EOS, BOS)
ordinary-control mean = mean(x, period)
ordinary − special

目标内容、prompt-balanced 的 24 格均值:

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:

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 / 句点三类条件:

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. 可复现入口

正式运行:

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:

npm run build:data:deepseek-special

完整工件:

文件 bytes SHA-256
正式运行 JSON 54,440,827 c372c1b0…4af5bf
独立复跑 JSON 54,440,827 c372c1b0…4af5bf

13. 与已有论文怎样对齐

外部研究已经反复说明 prompt 的词汇、格式与分隔符变化可能显著影响模型输出:

这些论文提供问题背景,但不替本实验背书。尤其不能把:

路由 TV 变化

直接改写成:

准确率、质量、安全性或指令遵循变化

本实验没有生成答案,也没有行为评测。


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,却还没有解决角色块内部结构。固定模板中的:

User:      = [5726, 25]
Assistant: = [77398, 25]

都是两个普通 token。所以下一轮采用完整 2×2:

head      = User / Assistant
delimiter = : / x

用同一个 batch 分离词头主效应、分隔符主效应与二者 interaction。