Files
llm-atlas/research/DEEPSEEK_ROUTING_HISTORY_FACTORIAL_AUDIT.md
T

15 KiB
Raw Blame History

DeepSeek-V2-Lite 路由的消息历史 2×2 因子审计

状态:真实官方 BF16 权重、本机 RTX 5090、layer 0–6 连续 forward。 固定模型 revision:604d5664dddd88a0433dbae533b7fe9472482de0。 研究单位:上一轮同一批 128 条公开 source prompt 的四种消息历史。 结论身份:消息历史组成敏感性探针,不是能力评测、角色语义、训练分布或线上流量。

1. 为什么上一轮之后还要做这一轮

上一轮已经把相同内容放入三种输入:

RAW → OFFICIAL USER → OFFICIAL USER + Assistant:

它回答了两个问题:

  1. User: 前缀会不会改变后续内容 token 的路由?会,而且方向随层与域改变。
  2. 只在未来追加 Assistant: 会不会反向改写过去?不会,21,852 / 21,852 个共享前缀 ordered top-6 完全一致。

但真实对话通常不只有一个 user message。目标请求之前还可能有:

  • system instruction;
  • 一轮或多轮示例;
  • assistant 历史;
  • EOS 与角色边界。

如果只做“有 system / 无 system”两组,system 的结果还可能取决于它是否直接贴近目标。 如果只做“有示例 / 无示例”两组,也无法知道示例的作用是否依赖 system。

所以本轮使用最小完整设计:

system × one-shot 的 2×2 因子实验。

它能同时计算:

  • system 主效应;
  • one-shot 主效应;
  • 两者是否可以简单相加;
  • system 在“直接贴近目标”和“先经过一轮示例”时是否表现相同。

2. 四个条件

固定文本:

SYSTEM
Answer accurately and concisely. 请准确、简洁地回答。

DEMO USER
Reply with OK. 只回复 OK。

DEMO ASSISTANT
OK

目标 user 内容来自四个公开域,每条固定为 23 个 regular-tokenizer tokens。 四个条件全部使用官方 apply_chat_template(..., add_generation_prompt=True):

条件 System One-shot 官方消息序列
S0F0 0 0 target user → Assistant:
S1F0 1 0 system → target user → Assistant:
S0F1 0 1 demo user → demo assistant + EOS → target user → Assistant:
S1F1 1 1 system → demo user → demo assistant + EOS → target user → Assistant:

这里的 S 表示 system factor,F 表示 few-shot factor。

2.1 为什么称为正交长度增量

四格的输入 token 总数:

条件 输入 tokens 相对 S0F0 每条 source 的固定增量
S0F0 3,898 — —
S1F0 5,946 +2,048 +16 system tokens
S0F1 6,074 +2,176 +17 one-shot tokens
S1F1 8,122 +4,224 +16 + 17 tokens

因此:

S1F0 − S0F0 = S1F1 − S0F1 = 每条 +16 tokens
S0F1 − S0F0 = S1F1 − S1F0 = 每条 +17 tokens

这并没有把“角色、文本、距离和长度”彼此拆开,但它保证 system 与 one-shot 两个处理的 token 增量互不偷换。

3. Cohort 完全复用,而不是重新抽样

选样 salt 继续固定为:

llm-atlas-deepseek-routing-template-control-v1

四域仍为:

域 来源 字段 数量
英文百科 WikiText-2 raw validation text 32
中文新闻 CLUE TNEWS public test sentence 32
Python 代码 OpenAI HumanEval prompt 32
小学数学 OpenAI GSM8K test question 32

本轮 128 个 (source ID, content SHA-256) 与上一轮模板探针逐项完全相同。 答案不输入,HumanEval 代码不执行。

这让两个实验可以连续阅读:

上一轮:RAW / USER / GENERATION
本轮:USER 条件内部继续展开 system × one-shot 历史

4. 目标内容如何精确对齐

四个条件的目标 user 前都有同一个字面前缀 User: ,因此没有重新引入 RAW 条件的 首 token BPE 边界差异。

脚本仍不依赖这一经验假设,而是为每个目标 token 记录:

(相对目标内容字符起点, 相对终点, token ID)

只有四个条件都存在的三元组才进入 target_content。

条件 目标范围 tokens 四条件精确交集
S0F0 2,874 2,874
S1F0 2,874 2,874
S0F1 2,874 2,874
S1F1 2,874 2,874

因此本轮目标内容对照没有丢弃任何一个条件特有的目标 token。

5. 执行账

对象 数量
source prompts 128
prompt variants 512
输入 tokens 24,040
执行层 layer 0–6
测量 MoE 层 layer 1–6
每 token routed experts top-6
S0F0 routes 140,328
S1F0 routes 214,056
S0F1 routes 218,664
S1F1 routes 292,392
本轮真实 routes 865,440

与前四个真实语料实验合计:

488,880  长度三 cohort
+382,032 RAW / USER / GENERATION
+865,440 system × one-shot
=1,736,352 次真实 top-6 路由

四个条件的同一 source prompt 在同一个 padded batch 中执行;层、checkpoint、dtype、 attention implementation 和 bootstrap source indices 都保持一致。

6. 因子统计到底怎么算

每个 layer × scope × aggregation × domain,先得到四格统计:

m00 = metric(S0F0)
m10 = metric(S1F0)
m01 = metric(S0F1)
m11 = metric(S1F1)

然后定义:

system main effect
= 0.5 × [(m10 − m00) + (m11 − m01)]

few-shot main effect
= 0.5 × [(m01 − m00) + (m11 − m10)]

interaction
= (m11 − m01) − (m10 − m00)

若 interaction 为 0,system 在 F0 和 F1 下的增量相同;若不为 0,两个处理不能简单相加。

6.1 Bootstrap

  • 每域 32 条 source prompt;
  • 有放回重采样 2,000 次;
  • 四格使用完全相同的 source indices;
  • 固定 seed 20260729;
  • 主要结果使用 prompt-balanced 聚合;
  • 同时保留 token-weighted;
  • 报告 percentile 95% 区间;
  • 不做假设检验;
  • 不做多重比较校正。

7. 目标内容 CV:四格、主效应与交互

下表均为 target_content / prompt_balanced。 四格顺序是 S0F0 / S1F0 / S0F1 / S1F1。

层 域 四格 CV System main [95%] Few-shot main [95%] Interaction [95%]
L1 英文 .596 / .810 / .779 / .737 +.086 [.057,.114] +.055 [.023,.088] -.256 [-.300,-.208]
L1 中文 .621 / .426 / .621 / .575 -.121 [-.144,-.090] +.074 [.046,.099] +.150 [.100,.192]
L1 代码 .882 / .949 / .972 / .972 +.034 [.017,.049] +.057 [.034,.079] -.068 [-.101,-.036]
L1 数学 .793 / .937 / .912 / .867 +.050 [.023,.075] +.025 [-.009,.057] -.188 [-.234,-.137]
L2 英文 .403 / .339 / .346 / .337 -.037 [-.049,-.018] -.029 [-.041,-.012] +.056 [.023,.080]
L2 中文 .353 / .316 / .323 / .319 -.021 [-.027,-.010] -.014 [-.023,-.001] +.034 [.011,.050]
L2 代码 .617 / .652 / .658 / .667 +.022 [.011,.031] +.028 [.012,.043] -.027 [-.045,-.010]
L2 数学 .455 / .414 / .433 / .412 -.031 [-.043,-.016] -.012 [-.028,.005] +.021 [-.007,.048]
L3 英文 .423 / .399 / .393 / .379 -.019 [-.033,-.002] -.025 [-.040,-.008] +.010 [-.013,.034]
L3 中文 .469 / .452 / .455 / .446 -.013 [-.021,-.002] -.010 [-.024,.005] +.007 [-.013,.028]
L3 代码 .813 / .827 / .835 / .843 +.011 [.001,.020] +.019 [.007,.032] -.006 [-.022,.010]
L3 数学 .548 / .536 / .540 / .532 -.010 [-.020,.000] -.006 [-.019,.007] +.004 [-.018,.025]
L4 英文 .558 / .423 / .441 / .413 -.082 [-.099,-.054] -.064 [-.073,-.046] +.107 [.068,.133]
L4 中文 .851 / .611 / .719 / .683 -.138 [-.153,-.117] -.030 [-.051,-.013] +.204 [.171,.228]
L4 代码 1.037 / 1.034 / 1.045 / 1.019 -.015 [-.023,-.006] -.003 [-.015,.011] -.024 [-.038,-.007]
L4 数学 .647 / .550 / .589 / .580 -.053 [-.074,-.031] -.014 [-.031,.006] +.088 [.052,.118]
L5 英文 .453 / .437 / .412 / .414 -.007 [-.021,.008] -.032 [-.044,-.015] +.018 [-.008,.037]
L5 中文 .503 / .469 / .483 / .488 -.014 [-.025,-.001] -.001 [-.012,.012] +.040 [.017,.057]
L5 代码 .852 / .839 / .851 / .834 -.015 [-.026,-.004] -.003 [-.014,.008] -.004 [-.017,.010]
L5 数学 .781 / .825 / .828 / .831 +.023 [.005,.038] +.026 [.006,.046] -.041 [-.065,-.013]
L6 英文 .566 / .489 / .514 / .485 -.053 [-.070,-.032] -.028 [-.042,-.010] +.048 [.014,.076]
L6 中文 .543 / .539 / .549 / .540 -.006 [-.017,.006] +.003 [-.009,.014] -.005 [-.027,.014]
L6 代码 .907 / .940 / .921 / .912 +.012 [.002,.024] -.007 [-.017,.003] -.041 [-.061,-.023]
L6 数学 .775 / .845 / .839 / .836 +.033 [.013,.051] +.028 [.010,.045] -.073 [-.097,-.047]

7.1 不能写成单向规律

24 个 layer × domain 中:

效应 区间完全正 区间完全负 跨 0
system main 8 13 3
few-shot main 7 7 10
interaction 8 8 8

所以不能写:

  • “system 总会让路由更集中”;
  • “few-shot 总会让路由更均衡”;
  • “system 与 few-shot 总是互相增强”。

所有三个方向都随层和域改变。

8. 最清晰的模式:one-shot 历史缓冲了 system 扰动

比较两条 system 边:

system at F0: S0F0 → S1F0
system at F1: S0F1 → S1F1

两条边都给目标绝对位置增加相同的 16 tokens。区别是:

  • F0:system 后直接进入目标 user;
  • F1:system 后先经过 demo user、demo assistant、EOS,再进入目标 user。

8.1 目标路由分布 TV

各层四域平均:

Layer System TV at F0 System TV at F1
L1 .107 .022
L2 .059 .017
L3 .051 .015
L4 .085 .019
L5 .061 .020
L6 .079 .022
24 格平均 .073 .019

结果:

  • 24 / 24 个 layer × domain 的 TV 都变小;
  • 平均 TV 下降约 74%;
  • system 边的绝对 CV 变化在 21 / 24 格变小;
  • 绝对 CV 变化均值从 .068 降至 .016。

8.2 这能否叫“few-shot 稳定路由”

不能直接这样写。

本实验固定的是一整段处理:

demo 文本 + user/assistant 角色 + assistant EOS + 更长历史 + 更远的 system

因此当前最强且不越界的表述是:

在这组固定消息中,让 system 的影响先穿过一轮 one-shot 历史后, 目标内容的聚合路由分布对 system toggle 更不敏感。

要拆开“示例语义、距离、EOS、角色转换和长度”,仍需新的等长正交控制。

9. 逐 token top-6 也看到相同缓冲模式

下表把四域 2,874 个目标 token 合并;每格为:

top-6 set exact rate / mean Jaccard
Layer System at F0 System at F1 Few-shot at S0 Few-shot at S1
L1 .317 / .756 .789 / .939 .318 / .751 .454 / .820
L2 .458 / .820 .815 / .946 .473 / .825 .536 / .857
L3 .477 / .830 .828 / .951 .517 / .845 .589 / .875
L4 .388 / .783 .793 / .940 .480 / .825 .535 / .857
L5 .435 / .798 .788 / .938 .500 / .827 .537 / .857
L6 .389 / .771 .755 / .928 .473 / .814 .530 / .851

system-at-F1 的 top-6 set exact 在六层均大幅高于 system-at-F0。 这说明聚合 TV 的下降不是只有少数专家份额抵消后的表象。

但 set exact 不等于 hidden state exact,也不等于输出答案相同。

10. 完整输入与目标内容是两个问题

target_content 只问:

相同目标 token 在不同左侧历史下如何路由?

full_input 还把 system、demo、EOS、角色前缀与 Assistant: 自己都计入:

这四种实际协议流量整体会如何路由?

完整输入的 CV 主效应点估计如下,顺序为:

system main / few-shot main / interaction
Layer 英文 中文 代码 数学
L1 -.015 / +.186 / -.243 -.129 / +.182 / +.020 -.062 / +.084 / -.092 -.053 / +.139 / -.212
L2 -.003 / +.128 / -.060 +.022 / +.125 / -.071 -.009 / +.094 / -.088 +.004 / +.124 / -.057
L3 +.035 / +.092 / -.035 +.027 / +.089 / -.037 -.058 / -.012 / +.048 +.012 / +.065 / +.011
L4 -.057 / +.110 / -.027 -.125 / +.003 / +.041 -.095 / +.022 / -.056 -.074 / +.111 / -.004
L5 -.003 / +.114 / +.011 +.038 / +.139 / -.037 -.014 / +.067 / -.057 -.030 / +.063 / +.049
L6 +.012 / +.138 / +.009 +.061 / +.184 / -.071 +.010 / +.066 / -.037 +.017 / +.117 / -.021

完整输入中,one-shot main 大多使 CV 上升;但这包含新增示例 token 本身,不能拿来替代 目标内容的上下文条件化结论。

11. 分布效应不是普通 TV

对 system / few-shot 主效应和 interaction,脚本同时保存 64 维 expert-share effect vector。

其强度定义为:

0.5 × L1 norm(effect vector)

对两组普通概率分布,这个形式等于 TV;但主效应与 interaction vector 可能含正负抵消, 所以账本明确称为 half_l1_magnitude,不冒充两分布之间的标准 TV。

普通四条边仍单独报告:

  • total variation;
  • JSD;
  • expert-share delta;
  • paired 95% 区间。

12. 独立复跑

正式运行与第二次完整运行:

SHA-256
5765fbf85fa6fd948cca90f11e2237254fd58c32f373670f44530cff0a70c1fb

两份约 28 MiB JSON:

byte-for-byte identical

一致内容包含:

  • corpus identity;
  • 四种官方模板渲染的 token IDs 与 hashes;
  • layer 0–6 权重与环境身份;
  • 每 prompt × condition 的 64-expert loads;
  • 每个目标 token 的 top-6 route hashes;
  • 四条因子边的 route alignment;
  • 两种 scope;
  • 两种 aggregation;
  • 2,000 次 paired bootstrap 后的全部区间;
  • system / few-shot / interaction vectors。

13. 解释边界

本轮可以说:

  • 官方模板下,system 与 one-shot 都会改变目标内容路由;
  • 变化随层和域不同;
  • system 与 one-shot 存在明显非加性交互;
  • 在这组固定示例中,system 先经过 one-shot 历史后,目标路由对 system toggle 更稳定;
  • 这个模式同时出现在聚合 TV 与逐 token top-6 set/Jaccard。

本轮不能说:

  • “system 专家”或“few-shot 专家”被识别出来;
  • one-shot 的语义本身因果地稳定了路由;
  • 结果能代表完整 27 层;
  • 结果能代表线上多轮对话;
  • 路由更稳定就意味着答案更好;
  • CV 更低就意味着模型能力更强;
  • 2,000 次 bootstrap 是 2,000 次模型运行;
  • 区间是经过多重比较校正的显著性结论。

14. 下一步

这轮已经把 system 与 one-shot 的 token 增量做成正交 2×2。 最自然的后续控制是继续拆解“历史缓冲”:

  1. 距离控制:用等长无语义 filler 把 system 推到相同距离;
  2. EOS 控制:保留相同文本,只切换 assistant EOS / role boundary;
  3. 角色控制:相同 token 文本放入 system / user / assistant 不同角色;
  4. 示例内容控制:固定长度,替换正确示例、无关示例与冲突示例;
  5. 完整模型:获得其余 shards 后扩到全部 27 层;
  6. 能力联结:生成答案并用独立任务指标检查路由变化是否与行为相关。

在这些控制完成之前,“历史缓冲”保持为这组固定官方协议下的描述性实证模式。