Files
llm-atlas/research/DEEPSEEK_ROUTING_ROLE_MARKER_BLOCK_AUDIT.md
T

14 KiB
Raw Blame History

DeepSeek-V2-Lite 完整角色块 2×2 因子审计

状态:真实官方权重执行(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:a703dddb6d04182b1a608c213bfd341cfc32e1801be42c417dca30a505087e82

0. 一句话先说结论

固定 DeepSeek-V2-Lite base 权重、128 个公开样本、历史、EOS、目标长度、 目标位置和八格 batch 后,把目标前的完整两-token 角色块拆成:

                   delimiter
                   :          x
head User       User:      User x
     Assistant  Assistant: Assistant x

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

User:         .037304
Assistant:    .037015
User x        .037239
Assistant x   .036220

对 system-edge 距离做 2×2 因子分解:

head main          −.000654    9↑ / 15↓
delimiter main     −.000430    8↑ / 16↓
head×delimiter     −.000729    6↑ / 18↓

大多数 95% bootstrap CI 跨零,且跨层跨域存在相反方向。因此:

User/Assistant 词头和冒号/x 分隔符都会直接条件化后续路由,但没有 任何一个因子对 system message 的路由作用形成统一、跨层跨域的调制方向。

更细的一条可见模式是:

在本轮选定的单个分隔符对照中,把冒号换成 x,多数格会让 User-vs-Assistant 的直接路由距离稍微缩小。

但这只是 :↔x 的 one-control 结果,不能泛化成“标点语义”。


1. 为什么上一轮角色词头实验还不够

固定 tokenizer 中:

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

上一轮只替换第一个 ID:

User → Assistant / x

而冒号 ID 25 始终保留。这能识别“词头单 ID 条件化”,却不能回答:

  1. 冒号自身是否参与后续路由;
  2. 词头作用是否依赖冒号;
  3. User:↔Assistant: 的差异能否被称为完整角色块效应。

本轮把两个 token 位置都纳入因子设计,同时保留所有其他序列合同。


2. 角色标记并不是 special token

固定 tokenizer:

文本 token IDs token 数 special
User [5726] 1 否
Assistant [77398] 1 否
: [25] 1 否
x [87] 1 否
User: [5726, 25] 2 否
Assistant: [77398, 25] 2 否
EOS [100001] 1 是

所以“角色标记”是两个普通词元组成的块,而不是一个不可拆的专用 role token。

这也解释了为什么要避免一句含混的话:

我们替换了角色 token。

更准确的是:

我们在固定两-token 角色块中独立操纵词头 ID 与分隔符 ID。

3. 2×2×2 设计

三个二元因子:

  • S:system message 关闭 / 开启;
  • H:head 为 User / Assistant;
  • D:delimiter 为冒号 / x。

四个角色块水平:

水平 token IDs head delimiter 官方
user_colon [5726, 25] User : 是
assistant_colon [77398, 25] Assistant : 否
user_x [5726, 87] User x 否
assistant_x [77398, 87] Assistant x 否

乘上 system 开/关,共八格:

S0/S1 × {User:, Assistant:, User x, Assistant x}

所有修改都发生在目标内容之前。历史 assistant 的官方 EOS 和目标之后的 generation suffix Assistant: 均保持不变。


4. 编辑合同与验证闸门

相对官方 [User, :]:

水平 改动 token 数
user_colon 0
assistant_colon 1
user_x 1
assistant_x 2

正式 renderer 验证:

闸门 结果
source prompts 128
输入变体 1,024
system groups 256
八格同长度 256 / 256
八格同目标位置 256 / 256
official 零改动 256 / 256
单 ID 改动 512 / 512
双 ID 改动 256 / 256
实际 MoE routes 2,044,224

每个 source 的八个条件进入同一个 32-row BF16 batch。正式运行与独立复跑 都是 66,975,110 bytes,完整 JSON byte-exact。


5. 因子分解怎样读

设四种角色块下的 system-edge 距离分别为:

E(U:)  E(A:)  E(Ux)  E(Ax)

5.1 head main

0.5 × [(E(A:) − E(U:)) + (E(Ax) − E(Ux))]

问:平均跨过两个 delimiter,User→Assistant 是否改变 system edge?

5.2 delimiter main

0.5 × [(E(Ux) − E(U:)) + (E(Ax) − E(A:))]

问:平均跨过两个 head,冒号→x 是否改变 system edge?

5.3 head × delimiter

(E(Ax) − E(Ux)) − (E(A:) − E(U:))

问:head 的作用是否依赖 delimiter?

这些是带符号的距离差。它们不是标准 TV,也不是准确率效应。


6. 主结果:没有统一的 system 调制因子

主口径:

scope       = target_content
aggregation = prompt_balanced
metric      = total variation
bootstrap   = source-paired, 2,000 resamples
seed        = 20260729

24 格平均:

量 平均值 点估计方向 CI 全正 / 全负 / 跨零
E(User:) .037304 — —
E(Assistant:) .037015 — —
E(User x) .037239 — —
E(Assistant x) .036220 — —
head main -.000654 9↑ / 15↓ 3 / 3 / 18
delimiter main -.000430 8↑ / 16↓ 1 / 0 / 23
head×delimiter -.000729 6↑ / 18↓ 1 / 1 / 22

可读结论:

  • 四种角色块的平均 system-edge TV 非常接近;
  • 三个因子效应相对原始 system edge 很小;
  • 大多数 CI 跨零;
  • 个别 layer×domain 出现方向明确但互相相反的局部单元;
  • 因此不能把某个局部格子升级成统一规律。

代表性局部单元:

层×域 观察
L2 代码 head main +.004,CI [+.002, +.007]
L3 代码 head main +.005,CI [+.003, +.008]
L4 中文 head main -.005,CI [-.008, -.000]
L4 数学 head main -.006,CI [-.010, -.003]
L5 代码 interaction +.014,CI [+.005, +.023]
L6 中文 interaction -.009,CI [-.017, -.002]
L6 代码 head main +.005,CI [+.001, +.009]

正负局部单元同时存在,恰好是“不存在统一方向”的证据,而不是噪声需要隐藏。


7. CV 也不支持单一均衡故事

目标内容、prompt-balanced 的 system-edge ΔCV 因子:

因子 24 格平均 点估计方向 CI 正 / 负 / 跨零
head main +.001756 17↑ / 7↓ 4 / 3 / 17
delimiter main -.003107 10↑ / 14↓ 1 / 5 / 18
head×delimiter -.001543 11↑ / 13↓ 3 / 2 / 19

CV 是专家负载离散程度,不是“模型质量”:

  • CV 增大不等于能力提高;
  • CV 减小不等于路由更合理;
  • system-edge ΔCV 也不等于 absolute CV。

本轮只能说不同角色块对负载分布变化的调制跨层跨域混合。


8. 直接作用:两个 token 位置都会条件化后续路由

跨 24 格平均 direct target TV:

直接边 S0 S1 S1−S0 点估计方向
head:User:↔Assistant: .022399 .021933 -.000466 10↑ / 14↓
head:User x↔Assistant x .018726 .019973 +.001248 14↑ / 10↓
delimiter:User:↔User x .026560 .025679 -.000881 12↑ / 12↓
delimiter:Assistant:↔Assistant x .024495 .024949 +.000454 12↑ / 12↓

所有四条 direct edge 的 TV 都清晰非零,说明:

  • head 身份能影响后续目标;
  • delimiter 身份也能影响后续目标;
  • 但 system 是否放大它们没有统一方向。

9. head 的直接作用依赖 delimiter 吗

比较:

head@x − head@colon

跨 24 格平均:

system Δ direct TV 点估计方向 CI 正 / 负 / 跨零
S0 -.003673 3↑ / 21↓ 0 / 8 / 16
S1 -.001960 4↑ / 20↓ 1 / 6 / 17
S1−S0 +.001714 13↑ / 11↓ 4 / 0 / 20

因此最窄的描述是:

在本实验选定的 :↔x 对照中,冒号换成 x 后, User-vs-Assistant 的直接路由距离在多数 layer×domain 略微减小。

但 system 对这项依赖的 modulation 仍混合。

不能说:

冒号编码了角色语义,或标点普遍增强角色区分。

要支持这类说法,至少还需多个频率与句法匹配的 delimiter,对 Chat/SFT checkpoint 做同样设计,并接入生成行为。


10. 完整输入为什么出现更明显的 delimiter 效应

full-input、prompt-balanced 的平均 system-edge TV:

User:         .138962
Assistant:    .139096
User x        .141328
Assistant x   .141220

对应因子:

head main          +.000013
delimiter main     +.002246
head×delimiter     −.000242

delimiter main 在 24 格为 20↑ / 4↓,CI 分类 14 正 / 1 负 / 9 跨零。

但完整输入包含被编辑的 delimiter token 本身,因此它无法单独回答“对后续目标 的下游影响”。这就是为什么主结论仍使用精确对齐的 target_content。


11. 路由集合稳定性

head direct edge 的聚合 target top-6 set exact:

层 User:↔Assistant: S0 / S1 User x↔Assistant x S0 / S1
1 79.9% / 81.8% 80.4% / 81.7%
2 81.9% / 82.8% 83.3% / 84.4%
3 81.4% / 79.8% 85.7% / 83.7%
4 76.8% / 74.3% 78.4% / 77.0%
5 71.8% / 73.8% 77.0% / 74.8%
6 69.7% / 70.7% 77.3% / 76.4%

delimiter-at-User 的 set exact 从 L1 的约 83% 下降到 L6 的约 67%。 这表示两-token 块的微小改动可以在深度中逐步传播,但不是所有目标 token 都改变专家集合。


12. batch-content 审计

本轮的 User: / Assistant: 两类条件与上一轮角色词头实验共享:

message hash    512 / 512 exact
rendered hash   512 / 512 exact
token-ID hash   512 / 512 exact
target contract 512 / 512 exact

跨实验共享条件的 target route hash:

层 exact
1 512 / 512
2 368 / 512
3 279 / 512
4 230 / 512
5 178 / 512
6 156 / 512

原因不是 token 合同变化,而是 companion rows 从上一轮的其他角色词头条件换成 本轮的完整两-token 组合;BF16 深层临界 gate 会因此分化。

正式推断规则:

只使用同一次八格 forward 内的比较;跨实验 exact 仅作为执行审计, 不跨 batch 拼接效应值。


13. 可复现入口

正式运行:

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_role_marker_block_factorial.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-role-marker-block-factorial.json \
  --batch-prompts 4 \
  --bootstrap 2000 \
  --seed 20260729

独立复跑只改输出文件名。前端 compact:

npm run build:data:deepseek-role-block
文件 bytes SHA-256
正式运行 JSON 66,975,110 a703dddb…7e82
独立复跑 JSON 66,975,110 a703dddb…7e82

14. 与 prompt sensitivity 文献的关系

角色块同时包含词汇选择与 delimiter 选择,因此与 prompt sensitivity 文献中的 lexical / syntactic / delimiter perturbation 有直接问题关联:

这些工作说明“格式细节值得测”,但没有预先决定本实验的路由结果。本实验也 没有复现它们的行为指标。


15. 允许说什么,不允许说什么

可以说:

  • User: 与 Assistant: 在固定 tokenizer 中都是两个普通 token;
  • head 与 delimiter 的直接替换都能改变后续目标的专家路由;
  • :→x 在多数格略微缩小 head direct TV;
  • head、delimiter 和 interaction 都没有统一调制 system-edge 的方向;
  • 本轮 edit、位置、长度、对齐与复跑闸门通过。

不可以说:

  • 冒号就是角色语义;
  • User / Assistant head 对应固定专家专长;
  • 某种角色块让路由“更好”或负载“更合理”;
  • x 代表全部非标点或全部普通 delimiter;
  • base checkpoint 的路由等价于 Chat/SFT/RL 行为;
  • 路由 TV 可以替代生成准确率、指令遵循或安全评测;
  • 六个 MoE 层的结果可直接外推到完整 27 层。

16. 下一步

本轮完成了两-token 角色块的固定协议因子分解。接下来最有价值的两条线是:

  1. 在 DeepSeek-V2-Lite-Chat 上复现同一 tokenizer 与同一设计,区分 base routing 与对齐后行为;
  2. 下载完整 checkpoint,执行全部 27 层,检查局部模式是否在更深层反转、 消失或增强。

在这两条完成前,网站会把结论停在:

base 权重、layer 1–6、固定公开语料、固定 batch 的路由机制证据。