feat: publish reasoning deep dive

This commit is contained in:
wuyang
2026-07-29 00:40:09 +08:00
parent 3db826dd4a
commit dce94b283f
18 changed files with 3449 additions and 33 deletions
+18 -9
View File
@@ -1,16 +1,17 @@
# 持续进度
最后更新:2026-07-28
最后更新:2026-07-29
## 总体状态
| 工作流 | 状态 | 完成度 | 下一检查点 |
|---|---:|---:|---|
| 研究框架与规范 | 进行中 | 76% | 给 130 篇索引补充逐篇精读层级 |
| 研究框架与规范 | 进行中 | 82% | 给推理专题补逐篇图表/实验精读层级 |
| 网站设计系统 | 进行中 | 89% | 打印样式与更多通用可视化组件 |
| Kimi K3 深读 | 进行中 | 55% | 扩写 scaling / infra 逐图笔记 |
| Kimi K3 深读 | 进行中 | 64% | 扩写 scaling / pre-training / infra 逐图笔记 |
| Transformer 基础 | 进行中 | 52% | 矩阵形状动画与手算练习 |
| DeepSeek 专题 | 进行中 | 61% | GRPO 完整公式与训练轨迹推导 |
| DeepSeek 专题 | 进行中 | 71% | 补 R1 / DAPO 的逐图训练轨迹与复现对照 |
| 推理与测试时扩展 | 完成首版 | 76% | 真实模型采样曲线、PRM 案例与逐篇图表精读 |
| 稀疏计算与 MoE | 完成首版 | 74% | 真实负载 traces 与专家特化案例 |
| 长上下文专题 | 完成首版 | 72% | 真实模型配置、内核细节与失败案例 |
| 引用与事实检查 | 进行中 | 54% | 自动化外链复查与来源等级扩展 |
@@ -26,14 +27,18 @@
- [x] 提炼参考网站的编辑设计语言。
- [x] 确认 `git.k1412.top` 为 Gitea/Forgejo 兼容服务且本机 HTTPS 凭据可用于既有仓库。
- [x] 使用 Grok CLI 检索并形成约 95 篇一手论文的补充路线,主代理已回查关键来源。
- [x] 完成首批 130 篇关键论文索引,覆盖 12 个专题与 Kimi/DeepSeek 聚光主线。
- [x] 完成 146 篇关键论文索引,覆盖 12 个专题与 Kimi/DeepSeek 聚光主线。
- [x] 完成可检索、可按专题筛选的论文库页面。
- [x] 完成 K3、Transformer 基础、DeepSeek 谱系、长上下文MoE 篇首版长文。
- [x] 完成 K3 三轴架构、Self-Attention 实验、DeepSeek 谱系、长上下文成本与 MoE 路由实验室五张原创交互图。
- [x] 完成 K3、Transformer 基础、DeepSeek 谱系、长上下文MoE 与推理六篇首版长文。
- [x] 完成 K3 三轴架构、Self-Attention、DeepSeek 谱系、长上下文MoE 路由与推理专题三页签等八个原创交互图。
- [x] 完成长上下文首版:五张成本账、26 篇一手论文、10+ 机制图与 8 策略交互实验室。
- [x] 核验 FlashAttention、DeepSeek-V2/V3.2/V4、Kimi Linear/K3 等六份论文原文,并建立长上下文研究账本。
- [x] 核验 Switch、ST-MoE、DeepSeekMoE、Loss-Free、V3、LatentMoE 与 K3 原文,并建立 MoE 研究账本。
- [x] 完成 MoE 首版:六张账、19 篇一手论文、完整 DeepSeek/K3 主线与路由—容量—通信实验室。
- [x] 为推理专题缓存并核验 23 份一手论文,另复用 K3 原报告,建立 24 份来源的研究账本。
- [x] 明确 CoT / verifier / test-time compute、PPO → GRPO、DeepSeek-R1 与 Kimi k1.5 → K3 四条主线。
- [x] 分清 K3 partial rollout 的 off-policy 稳定化与 MOPD 的 student on-policy 逐 Token 蒸馏。
- [x] 完成推理首版:八张账、30 篇一手论文链、DeepSeek/Kimi 双主线与预算—GRPO—MOPD 三页签实验室。
- [x] Astro 类型检查、生产构建、9 个内部路由和桌面/移动端视觉检查通过。
- [x] 创建 `wuyang/llm-atlas` 公开仓库,匿名 API 确认 `private: false`
- [x] 本地生产镜像通过健康检查与全部 9 个页面路由烟雾测试。
@@ -41,7 +46,8 @@
## 正在进行
- [ ] 推理模型与测试时扩展:CoT、verifier、GRPO、R1、Kimi k1.5 与 K3 MOPD
- [ ] 大规模训练系统:ZeRO / Megatron → Expert/Context Parallel → DualPipe / MoonEP
- [ ] 推理专题二轮:真实 pass@k 曲线、PRM 失败案例与逐篇图表精读。
- [ ] 长上下文专题的真实模型配置对比、内核细节与失败案例二轮深化。
- [ ] MoE 专题的真实集群 traces、专家特化案例与二轮外部证据。
@@ -53,13 +59,16 @@
| 2026-07-28 | K3 作为“汇流点”,不是课程起点 | 初学者可以先学基础,高阶读者可以从 K3 反向跳转 |
| 2026-07-28 | 优先重绘论文图并标明“简化/改绘” | 图可缩放、可交互,也减少脱离上下文复制论文图片 |
| 2026-07-28 | Grok 只用于线索扩展与交叉检查 | 正文事实必须回到论文、官方仓库或正式文档 |
| 2026-07-28 | 首批论文库收录 130 篇,按问题与专题多标签组织 | 论文库承担发现入口,专题正文承担深度精读与机制复核 |
| 2026-07-28 | 首批论文库按问题与专题多标签组织,推理研究后扩充至 146 篇 | 论文库承担发现入口,专题正文承担深度精读与机制复核 |
| 2026-07-28 | 源码公开到 `git.k1412.top/wuyang/llm-atlas` | 路线、进度、研究方法和内容变更均可追踪 |
| 2026-07-28 | 站点使用不可变镜像与 Compose Manager 部署 | 每次发布保留明确版本、健康检查和回滚点 |
| 2026-07-28 | 长上下文按计算、缓存、位置、状态容量、系统五张账单组织 | 避免把 FlashAttention、位置外推和“记住更久”混成同一个问题 |
| 2026-07-28 | 交互缓存数字统一标记为教学估算 | 展示增长规律,不冒充任一模型的真实线上显存基准 |
| 2026-07-28 | MoE 按六张账组织,路由算法与集群执行分开核算 | 避免用“稀疏所以便宜”跳过容量、负载、通信与权重读取 |
| 2026-07-28 | “aux-loss-free”保留论文真实边界 | 区分 selection bias、mixture weight、z-loss 与 V3 的极小 sequence-wise loss |
| 2026-07-29 | 推理专题按结果、覆盖、选择、过程、预算、优化、分布、系统八张账组织 | 避免把 pass@1、pass@k、搜索收益、RL 能力增长与系统吞吐混成“会思考” |
| 2026-07-29 | K3 partial rollout RL 与 MOPD 在正文中强制并排 | 前者显式容忍跨迭代 stale trajectory,后者由当前 student 采样并接收稠密 teacher signal |
| 2026-07-29 | 推理首版用 30 篇一手论文和三页签实验闭环 | 分开演示预算分配、GRPO 聚合偏置和 K3 九教师 MOPD,不合成伪“总分” |
## 未决问题
+1 -1
View File
@@ -17,7 +17,7 @@
- 持续进度:[PROGRESS.md](./PROGRESS.md)
- 证据与写作规范:[research/METHODOLOGY.md](./research/METHODOLOGY.md)
当前里程碑包含 16 专题学习地图、130 篇关键论文索引、Kimi K3 完整导读、
当前里程碑包含 16 专题学习地图、146 篇关键论文索引、Kimi K3 完整导读、
Transformer 基础、DeepSeek 技术谱系、长上下文与 MoE 深度专题,以及五张原创交互可视化。
其余专题按进度账本持续扩建。
+2 -1
View File
@@ -10,7 +10,8 @@
"preview": "astro preview --host 0.0.0.0",
"check": "astro check",
"check:site": "node scripts/check-site.mjs",
"check:moe-browser": "node scripts/check-moe-browser.mjs"
"check:moe-browser": "node scripts/check-moe-browser.mjs",
"check:reasoning-browser": "node scripts/check-reasoning-browser.mjs"
},
"dependencies": {
"@astrojs/sitemap": "3.7.3",
+898
View File
@@ -0,0 +1,898 @@
# 推理模型与测试时扩展研究账本
状态:原始论文核验中,正文尚未发布
研究截止:2026-07-28
本轮本地缓存:23 份一手 PDF / 文本,另复用 Kimi K3 官方技术报告
线索发现:K3 references、论文引用网络、作者/机构页面、Grok CLI
结论依据:原论文正文、附录、官方技术报告;Grok 只用于扩大检索覆盖
## 0. 这一章真正要回答什么
“模型会推理”不是一个单一指标。至少要把下面八张账分开:
1. **结果账**:第一次回答是否正确,通常看 pass@1
2. **覆盖账**:多采样以后,至少有一个正确答案的概率,通常看 pass@k
3. **选择账**:如果正确答案已经在候选里,投票、ORM、PRM 或 verifier 能否选出来。
4. **过程账**:中间步骤是否有效、可检查,以及写出来的 CoT 是否真是模型决策的因果解释。
5. **预算账**:额外计算花在更长的单条轨迹、更多并行样本、树搜索,还是工具调用。
6. **优化账**PPO、GRPO、DAPO、Dr.GRPO 与 Kimi 的目标函数究竟改变了哪个梯度。
7. **分布账**:训练是在发现新解法,还是把已有正确解法的概率质量推到前面,同时牺牲多样性。
8. **系统账**:长尾 rollout、KV 状态、沙箱、验证器和教师 prefill 让训练吞吐付出什么代价。
本章核心问题不是“哪篇论文赢了 benchmark”,而是:
> 给定一个模型、一个问题和一笔有限预算,
> 如何产生候选、分配计算、评价过程、选择答案,并知道能力到底来自哪里?
## 1. 贯穿全章的三条因果链
### 1.1 从“写步骤”到“分配测试时计算”
```text
直接回答
→ Chain-of-Thought:把计算摊到更多串行 Token
→ Self-Consistency:对多条 CoT 做并行采样与投票
→ ORM / PRM:不只投票,而是学习判断结果或中间步骤
→ Tree of Thoughts:主动展开、评价、回溯
→ ReAct:把内部推理与外部行动/观察交错
→ compute-optimal allocation:按问题难度在串行、并行、搜索之间分预算
→ reasoning effort:训练一个模型在 low / high / max 下改变推理预算
```
### 1.2 从“人类偏好 RL”到“可验证奖励 RL”
```text
PPOactor + critic + clipped surrogate
→ RLHF:偏好奖励模型给标量奖励
→ DeepSeekMath GRPO:同题成组采样,用组内相对奖励代替 critic
→ DeepSeek-R1-Zero:规则奖励直接驱动长 CoT
→ DeepSeek-R1cold start + reasoning RL + rejection/SFT + general RL
→ DAPOClip-Higher、Dynamic Sampling、token-level loss、overlong shaping
→ Dr.GRPO:去掉长度与组标准差归一化,揭示原始 GRPO 的两类偏置
→ RLVR 边界争论:pass@1 上升是否伴随大 k 覆盖下降
```
### 1.3 Kimi 的长轨迹与能力整合线
```text
Kimi k1.5
128K RL context + partial rollout + online mirror-descent surrogate
+ long2shortmerge / RS / DPO / RL
→ Kimi K2
verifiable rewards gym + self-critique rubric reward
+ budget control + PTX + temperature decay
→ Kimi K2.5
token-level off-policy clipping + Toggle 预算训练
+ unified agentic RL + 100K concurrent tasks
→ Kimi K3
3 domains × 3 reasoning efforts = 9 RL teachers
+ extreme off-policy partial rollout stabilization
+ Multi-Teacher On-Policy Distillation
+ million-token agentic RL / AgentENV
```
## 2. 指标词典:先统一“正确率”口径
### 2.1 pass@1
从指定采样策略抽一个答案时正确的概率。很多论文为了降低方差,会对同一题生成多次,再使用无偏估计汇总成 pass@1;它不一定等于“贪心解码一次”的准确率。
必须同时记录:
- temperature / top-p
- 最大输出长度;
- 是否有工具;
- prompt template
- 重复运行次数;
- 是否使用 grader / verifier。
### 2.2 pass@k
`k` 次候选中至少出现一个正确答案的概率。若一共采样 `n` 个,其中 `c` 个正确,无偏估计为:
```text
pass@k = 1 - C(n-c, k) / C(n, k)
```
它近似回答“这个分布里还覆盖着正确解法吗”,但不是能力的完美真值:
- 有限 `k` 只能看到有限尾部;
- temperature 会改变覆盖;
- prompt 与答案解析器会改变 `c`
- 高 pass@k 不代表实际系统能找到并选中正确答案。
### 2.3 majority@k / consensus@k
采样 `k` 条推理,把最终答案归一化后多数投票。它依赖“正确答案形成稳定簇”的假设:
- 多样错误彼此抵消时很有效;
- 同一种系统性错误占多数时会一起错;
- 自由文本任务难以稳定抽取等价答案。
### 2.4 best-of-N
先生成 `N` 个候选,再由 verifier / reward model 选择最高分答案。最终成功率拆成两部分:
```text
候选覆盖:正确答案有没有生成
×
选择可靠性:评分器有没有把正确答案排到前面
```
因此 best-of-N 的提升不能全部归功于生成模型,也不能只报告 verifier 分数而不报告候选覆盖。
### 2.5 训练时计算与测试时计算
| 口径 | 花在哪里 | 常见混淆 |
|---|---|---|
| 预训练计算 | 更多数据、参数、训练 Token | 与 inference scaling 不是同一条轴 |
| 后训练计算 | SFT、RL rollout、reward、teacher prefill | 训练变贵不代表单次推理变贵 |
| 串行测试时计算 | 更长 CoT、反思、修订 | Token 多不必然更正确 |
| 并行测试时计算 | 多采样、self-consistency、best-of-N | 可并行但总 Token 大 |
| 搜索计算 | 分支、评价、回溯 | verifier 错误会被搜索放大 |
| 工具计算 | 搜索、代码执行、环境交互 | 延迟和成本不只来自模型 Token |
## 3. 八张教学账
### 3.1 结果账:它最后答对了吗
最适合规则可验证任务,例如数学最终答案、单元测试、棋局合法性。优势是奖励便宜且客观;局限是:
- 最终答案对,不保证过程可靠;
- 奖励函数有漏洞时,模型会学会利用漏洞;
- 二元奖励在极难或极易题上几乎不给区分信号;
- 开放式写作、研究与复杂代理任务没有唯一 verifier。
### 3.2 覆盖账:正确路径还在分布里吗
pass@1 上升可能来自两种完全不同的变化:
```text
A. 真正扩展:新增原先几乎不会出现的解法模式
B. 分布锐化:把原先低概率的正确模式推到更高概率
```
DeepSeekMath 已在 2024 年报告:RL 提升 Maj@K,却没有改善 Pass@K;作者谨慎解释为输出分布更稳健、正确答案从 Top-K 被推向前面,而不是已经证明基础能力扩展。
2025 年的 RLVR capacity-limit 工作把这一问题扩大到多个数学、代码和视觉设置:当前测试中的 RLVR 模型常在小 `k` 更强,但基础模型会在大 `k` 追上或超过。它是对一组当前算法的实证边界,不是“RL 永远不能创造能力”的定理。
### 3.3 选择账:如何从候选里找到对的
选择器的主要分支:
1. **答案投票**:不训练 verifier,只看答案频次。
2. **Outcome Reward ModelORM**:整条解答得到一个分数。
3. **Process Reward ModelPRM**:每一步得到分数,再聚合。
4. **规则 verifier**:执行代码、比较数学答案、检查约束。
5. **Generative Reward ModelGRM**:先生成评价过程/rubric,再给分。
选择器不是免费 oracle。它可能:
- 偏爱格式、长度或表面完整性;
- 在分布外候选上失准;
- 把局部错误一路传播到树搜索;
- 被策略模型共同训练后产生共谋式 reward hacking。
### 3.4 过程账:步骤好看、有效、忠实是三回事
必须分开:
- **有效性**:这一步是否有助于得到正确答案;
- **可验证性**:外部规则或 PRM 能否判断这一步;
- **可读性**:人是否容易理解;
- **忠实性**:公开写出的步骤是否真反映模型产生答案的因果过程。
Turpin 等人的偏置提示实验显示,模型能给出听起来合理但隐瞒偏置影响的解释;“正确/流畅的 CoT”不能自动当作模型内部因果证词。这不是说所有 CoT 都不可信,而是说明公开推理文本必须接受独立 faithfulness 检查。
### 3.5 预算账:四种测试时扩展不是一回事
#### 串行深度
同一条轨迹继续写、检查、修订。适合一个局部错误可以被后续发现的题;风险是错误前提越写越深。
#### 并行宽度
从同一问题采样多个独立候选。适合模型有多种可行路径、错误较分散的题;风险是样本高度相关,新增候选边际收益迅速下降。
#### 显式搜索
在“状态—候选思路—评价—回溯”树上分配预算。适合步骤可局部评价的问题;风险是搜索控制和 verifier 本身消耗大量计算。
#### 工具/环境
让模型通过搜索、代码执行、浏览器或软件环境获得新观察。它不只是“想更久”,而是改变信息集。对 agentic RL 来说,这也是最可能超越单轮静态提示能力边界的路径。
Snell 等人的 compute-optimal 工作在专门训练的 PaLM 2 模型与 MATH 设置中表明:
- 最优策略依题目难度和模型而变;
- 其最优分配在特定实验中可用约 4 倍更少计算超过 best-of-N
- 在一些 FLOPs 匹配条件下,小模型可超过约 14 倍大的模型;
- 但最难题常从当前测试时计算中获益很少,继续预训练更有效。
这些数字不能外推成“推理计算总能替代参数规模”。
### 3.6 优化账:每个目标函数到底改了什么
#### PPO
PPO 使用 actor 产生动作、critic 估计价值/优势,并通过 clipped surrogate 限制单次策略更新。用于 LLM RLHF 时还常加入 reference KL、reward model 和 GAE。它的工程代价包括:
- 额外价值网络或 value head
- rollout、reference、reward、critic 多模型协调;
- 长序列信用分配;
- 训练/推理引擎概率不一致。
#### DeepSeekMath GRPO
对同一问题 `q`,从旧策略采样一组 `G` 个输出。用组内奖励均值作为 baseline,并以组内标准差归一化:
```text
A_i = (r_i - mean(r_1...r_G)) / std(r_1...r_G)
```
Outcome supervision 时,同一输出的每个 token 共用 `A_i`。原始 DeepSeekMath GRPO
- 不训练 critic
- 对每个回答先做 token 平均,再对组平均;
- 把 KL 直接加入目标,而不是先从 reward 中扣;
- 使用论文给出的正值 KL 估计器;
- 只对“组内有奖励差异”的问题产生相对信号。
DeepSeekMath-RL 的报告设置包括:约 144K 个 GSM8K/MATH CoT 问题、每题 64 个输出、最大 1024 tokens、KL 系数 0.04。该模型在报告中 MATH 从 46.8 提升到 51.764-sample self-consistency 为 60.9;只能按论文设置解释。
#### DAPO
DAPO 不是简单“把 GRPO 再跑大一点”,而是修复实际训练中的四个断点:
1. **Clip-Higher**:上下裁剪范围解耦,给低概率 token 更大上升空间,缓解熵坍缩。
2. **Dynamic Sampling**:过滤组内全对或全错的 prompt,因为相对优势全为零。
3. **Token-level Policy Gradient Loss**:整批 token 等权聚合,改变长短回答的梯度权重。
4. **Overlong Reward Shaping**:在长度上限附近平滑惩罚,避免硬截断制造噪声。
DAPO 在其 Qwen2.5-32B Base、数据、系统和评测设置中达到 AIME 2024 平均 50;论文对比的 naive GRPO 为 30、引用的 R1-Zero-Qwen-32B 为 47。由于复现数据与系统并不完全相同,不能写成无条件“DAPO 超过 R1”。
#### Dr.GRPO
Dr.GRPO 指出原始 GRPO 的两个潜在偏置:
1. **response-level length bias**:每条回答除以自己的长度,会让短正确答案获得更强正梯度、长错误答案获得更弱负梯度。
2. **question-level difficulty bias**:再除以组内 reward 标准差,会使某些难度的题获得不同权重。
其改法是去掉回答长度与组标准差归一化,用固定全局最大 token 数作为实现中的分母。论文还展示 DeepSeek-V3 Base 在 RL 前已经会出现 “aha”/反思式表达,因此不能仅凭训练后出现 “wait/aha” 就断言 RL 从零发明了反思。
这是一个有明确假设和实验范围的批判,不代表所有 GRPO 结果无效。
#### Kimi k1.5 的 mirror-descent surrogate
k1.5 从迭代参考策略采样 `k` 条回答,使用组均值奖励 baseline,并优化“奖励 − 与迭代参考策略的 KL 正则”对应的 surrogate。论文强调:
- 不使用 value network
- 每轮重置优化器;
- 允许使用 off-policy 数据;
- 128K context 与 partial rollout 让一条超长轨迹跨训练迭代;
- 局部错误之后仍可能恢复,因此不在本文框架里依赖 PRM/value/MCTS。
“不依赖 PRM/MCTS”只描述 k1.5 的选择,不能泛化为搜索与过程监督无效。
#### Kimi K2 的统一 RL
K2 延续 k1.5 的组相对奖励与 squared log-ratio 正则,并扩展任务/奖励:
- 数学、STEM、逻辑、代码、软件工程、复杂指令等 verifiable gym
- 对开放任务使用 self-critique rubric reward
- critic 用可验证任务的 on-policy rollout 持续校准;
- 分任务 token budget,超预算截断并惩罚;
- 高质量 PTX loss 防遗忘;
- temperature decay 从探索过渡到稳定利用。
K2 的“self-critique”不是模型随口说“我觉得好”,而是 pairwise 比较,结合 core、prescriptive 和人工 rubric;它仍可能受 judge 偏差与 reward hacking 影响。
#### Kimi K2.5 的 token-level off-policy clipping
K2.5 对每个 token 的新旧策略比率做 `[α, β]` 区间裁剪。正文明确说明:
- 区间内正常计算 policy gradient
- 区间外梯度屏蔽;
- 只依据 log-ratio 是否越界;
- 不像标准 PPO 那样根据 advantage 正负决定截哪一边;
- 目的是约束训练引擎与推理引擎差异放大的 off-policy drift。
K2.5 同时提出 **Toggle**
- Phase 0:当同题平均正确率超过阈值时,才按正确样本长度分位数施加预算;
- Phase 1:恢复最大长度,继续学习利用更多推理计算;
- 两阶段每 `m` 轮交替。
直觉是避免只做“越短越好”以后失去向上扩展预算的能力。
### 3.7 分布账:pass@1 上升不等于能力空间变大
教学时固定画两张分布:
```text
基础模型:正确模式概率低,但模式覆盖较宽
RL 模型:正确模式概率高,但部分低概率模式消失
```
需要同时问:
- pass@1 是否上升;
- pass@k 曲线在多大 `k` 后交叉;
- entropy 是否下降;
- 相同 temperature 还是 entropy-matched temperature
- 训练 prompt 和测试 prompt 是否相同;
- distillation 是否从更强教师引入了基础模型原本没有的模式。
RLVR capacity-limit 论文观察到,蒸馏模型的 pass@k 可以超过基础模型,并据此把“从更强教师转入新模式”与“当前 on-policy RL 对已有模式重加权”区分开。但这仍依赖有限采样与具体教师。
### 3.8 系统账:长推理不是只把 max_tokens 改大
长轨迹训练带来的系统问题:
- 一批 rollout 中少数极长样本拖住全部 GPU;
- 长序列 KV cache 占用巨大;
- 工具/浏览器/沙箱在模型思考时空闲,在环境运行时 GPU 又可能空闲;
- 策略更新后,未完成轨迹变成 stale/off-policy
- 训练引擎与高吞吐推理引擎可能给出不同 log-prob;
- verifier、teacher prefill 和环境执行形成新的流水线。
Kimi 的演化正好提供一条系统线:
- k1.5partial rollout、replay buffer、长轨迹分段;
- K2.5:每个 agent task 是异步 coroutineRollout Manager 支持最多 100K concurrent tasks
- K3:几百张 GPU 上的 co-located RL、外部 CPU DRAM KV pool、NVMe 状态卸载、自动节流与 AgentENV。
## 4. DeepSeek 高亮主线
### 4.1 DeepSeekMathGRPO 先是一种“去 critic”的工程/统计选择
不能把 GRPO 缩成一句“PPO 不要 value model”。它同时改变了:
- baseline:同题组均值;
- advantage normalization:组内标准差;
- loss aggregation:先回答内 token 平均;
- KL 放置与估计;
- 可学习 prompt:全对/全错组没有相对信号。
还要把论文自己的保守结论放在正文:RL 提升 Maj@K 而非 Pass@K,作者当时已没有把它夸张成必然创造新能力。
### 4.2 R1-Zero:规则奖励能让长 CoT 自组织,但现象不等于机制证明
R1-Zero
- 从 DeepSeek-V3 Base 直接开始 RL,没有先做 reasoning SFT
- 使用 GRPO
- 使用规则 accuracy reward 与 format reward
- 不使用神经 ORM/PRM 作为 reasoning reward,理由包括 reward hacking 与复杂训练管线;
- 随训练出现更长回答、反思、验证和被称为 “aha moment” 的行为;
- 同时存在可读性差、语言混合等问题。
应把“观察到长推理/反思”写成训练现象,而不是断言某个单一 token 或表达就是能力涌现的因果标志。Dr.GRPO 对基础模型的检查尤其提醒这一点。
### 4.3 R1:完整管线不是“纯 RL”
R1 的公开管线:
```text
少量高质量 cold-start reasoning data
→ reasoning-oriented RL
→ rejection sampling
→ reasoning + non-reasoning SFT
→ broader RLhelpfulness / safety 等)
```
边界:
- R1-Zero 才是“base 直接 RL”的主要实验;
- R1 使用 SFT、rejection sampling 和多阶段 RL
- reasoning 阶段偏向规则奖励,后续 general RL 仍有 reward models
- 扩展版报告记载 model preference reward 只在最后约 400 steps 使用,过久会 reward hack
- 报告对 AIME/GPQA 常采样 64 次、MATH/Codeforces 16 次,再估计 pass@1;consensus 另列,不能把两者混用。
### 4.4 R1 蒸馏:小模型得到的是强教师轨迹
六个 1.5B70B distilled 模型使用约 800K 由 R1 产生/筛选的数据进行 SFT,本身没有再做该报告中的 RL。附录对比显示在小模型上蒸馏更有效,但报告同时认为 RL 仍是继续突破更强能力的必要方向。
所以:
- “小模型只靠 SFT 就会推理”缺了强教师数据来源;
- “蒸馏证明 RL 不需要”也不成立,因为教师本身来自更重的训练管线。
### 4.5 DAPO 与 Dr.GRPO:从复现失败反推算法细节
这两篇论文最适合作为“研究如何进步”的案例:
```text
R1 给出强结果与简要 GRPO 配方
→ naive reproduction 明显落后
→ DAPO 暴露熵、无信号组、长序列聚合、截断四个工程断点
→ Dr.GRPO 再追问长度增长和 aha 是否可能来自目标函数偏置/基础模型
```
这不是互相推翻,而是把“RL 有效”拆成更可审计的机制。
## 5. Kimi 高亮主线
### 5.1 Kimi k1.5:把 RL 的序列长度本身当作 scaling axis
关键配置/结论:
- 最大 RL context 128K
- long-CoT 报告 AIME 77.5、MATH 500 96.2、Codeforces 94th percentile、MathVista 74.9
- partial rollout 让长回答跨迭代继续;
- replay buffer 保存旧片段,当前轮只对可用部分做 on-policy 计算,并可把旧片段排除出 loss;
- 长度惩罚在初期能力增长后再 warm up。
数字只能按论文的模型、采样与评测协议使用。
### 5.2 long2short 不是一种蒸馏算法
k1.5 的 long2short 是四类方法:
1. **weight averaging**:合并长 CoT 与短模型;
2. **shortest rejection sampling**:每题采样 8 条,选最短正确答案;
3. **DPO**:最短正确为正样本,较长错误或超过 1.5 倍的正确回答为负样本;
4. **long2short RL**:加强长度惩罚并降低最大 rollout 长度。
报告中 long2short RL 在 AIME 2024 的 8 次运行 pass@1 为 60.8、平均约 3,272 tokens。它说明可以优化“正确率—长度”前沿,不说明短思维总能保留全部长思维能力。
### 5.3 K2:把可验证推理扩展到一般任务
K2 的新意不是继续拉长数学 CoT,而是建立从规则奖励到 subjective rubric 的闭环:
```text
可验证任务的 on-policy rollout
→ 用客观信号持续校准 critic
→ critic 对开放任务做 pairwise rubric evaluation
→ actor 学习更一般的偏好
```
这是一种把 verifier 能力迁移到开放任务 judge 的尝试;开放任务奖励仍不是客观真值。
### 5.4 K2.5:训练效率与推理预算要一起控制
K2.5 的两项关键桥梁:
- token-level probability-ratio clipping(用于约束 log-ratio drift),处理大规模异步 rollout 的 off-policy 偏移;
- Toggle 在 budget-limited 与 standard scaling 间交替,保留模型继续使用更多推理计算的能力。
其 unified agentic RL 还把 text、vision、parallel-agent RL 放进同一异步环境,说明“reasoning model”已从单轮数学走向多模态、工具与并行代理控制。
### 5.5 K3:九个专家怎样合成一个可控模型
K3 post-training 有三阶段:
```text
Stage 1: SFT
Stage 2: domain × reasoning effort RL
Stage 3: Multi-Teacher On-Policy Distillation
```
Stage 2 的三个领域:
1. general:经验、视觉、推理、faithfulness、search、knowledge work
2. general agentlong-horizon assistant、deep research、paragraph writing
3. coding agentSWE、coding experience、kernel、web development。
每个领域再训练 `low / high / max` 三档 reasoning effort,共 9 个教师。
#### reasoning effort RL
对每题先估计初始预算 `b0(x)`。如果回答长度 `T(y)` 超过 `τ · b0(x)`,任务奖励被覆盖为 `-1`
```text
max effort:先用较大的 τ 学会充分计算
→ high / low:逐步 anneal τ,压缩可用预算
```
它不是推理时简单截断,而是在训练时改变“超预算回答”的奖励。
#### Agentic GRM
K3 要求生成式奖励模型遵循:
```text
outcome → rubric → score → scorepad
```
为缓解模型通过冗长回答骗取分数,候选长度超过阈值 `σ · l0` 时会在二元比较中自动失败。这里控制的是 judge 的 verbosity 偏好,不等于 reasoning effort 的长度奖励。
## 6. K3 最容易混淆的两种训练
### 6.1 partial rollout RL:允许长轨迹跨迭代,显式处理 stale/off-policy
`N` 个 prompt、每题 `K` 条轨迹:
1. 并行生成 `N×K` 条 rollout
2. 当其中 `λNK` 条完成,就暂停 generation
3. 已完成轨迹进入本轮 policy optimization
4. 未完成轨迹排队,后续迭代恢复;
5. 一条超长轨迹因此可能横跨多个 policy 版本。
K3 使用 per-token regularization,把更新限制在局部邻域,以容忍这种“极端 off-policy”状态。这里解决的是长尾吞吐与旧策略轨迹问题。
### 6.2 MOPD:学生 on-policy,教师给逐 token 稠密信号
对领域 `d`、effort `e`
1. 学生 `πθ` 自己生成轨迹;
2. 路由到对应冻结教师 `πteacher(d,e)`
3. 教师对学生已经走过的前缀做 prefill;
4. 每个学生采样 token 得到教师—学生 log-prob 差;
5. clip 后作为 dense token reward / advantage。
K3 报告中的形式可简写为:
```text
r_opd,t =
clip(
stop_gradient[
log π_teacher(y_t | e, x, y_<t)
- log π_student(y_t | e, x, y_<t)
],
-R_max,
R_max
)
```
独立 MOPD 论文把它推导为 student-to-teacher reverse KL 的 policy-gradient 实现:
```text
A_MOPD,t =
stop_gradient[
log π_teacher(y_t | x, y_<t)
- log π_student(y_t | x, y_<t)
]
```
再做双边 advantage clipping。
关键区别:
| 机制 | 谁生成轨迹 | 为什么需要稳定化 | 信号密度 |
|---|---|---|---|
| K3 partial rollout RL | 跨多个旧/新 policy 的未完成任务 | 轨迹 stale、极端 off-policy | 通常 outcome / GRM 为主 |
| K3 MOPD | 当前 student | student 与 teacher 分布差异 | 每个 token 都有 teacher signal |
不得把 “partial rollout 是 off-policy” 和 “MOPD 是 on-policy” 写成矛盾;它们是不同阶段/目标。
### 6.3 为什么强调 same-origin teacher
独立 MOPD 论文验证:
- 每个领域教师从同一 SFT checkpoint 经过领域 RL 得到;
- student 也从该 SFT checkpoint 初始化;
- teacher/student 分布接近时,policy-gradient 和 top-k 形式都较稳定;
- 换成绝对能力更强但分布更远的外部教师,训练可能不稳定,entropy 收缩。
“教师越强越好”因此不成立;教师与学生的分布距离也是关键变量。
### 6.4 为什么 K3 没有采用更细的 top-k 教师分布
独立 MOPD 给出两种实现:
- 只使用学生实际采样 token 的 policy-gradient 形式;
- 传输教师 top-k token 分布的低方差形式。
K3 报告称在其设置中,更细粒度 top-k distillation 没有改善收敛或最终性能。必须写成“在 K3 的同源教师与具体基础设施设置中”,不能推广成 top-k 蒸馏普遍无用。
## 7. K3 百万 Token agentic RL 的系统闭环
### 7.1 co-located RL
K3 在几百张 GPU 规模做 co-located training。策略训练与 rollout 共享设备,配套:
- partial rollout 减少长尾等待;
- KV 写回外部 CPU DRAM pool
- KDA recurrent state 与 MLA KV cache 统一生命周期;
- train state 在阶段间卸载到 NVMe
- 根据 active/queued requests 与 KV utilization 自动 throttle
- reference / non-policy 权重可从 CPU 流入 policy FP32 gradient buffer。
这些机制回答的是“如何让百万 Token agent trajectory 实际跑得动”,不是新推理算法本身。
### 7.2 AgentENV
K3 的沙箱系统使用 Firecracker microVM,支持:
- pause / resume
- incremental checkpoint
- fork / snapshot
- 暂停时不消耗 memory/CPU
- checkpoint 最低 133 ms、resume 最低 49 ms
- 真实负载最高 6.5× memory overcommit。
K3 报告称训练与评测共创建 51,219,741 个 sandboxes、跨 1,505,678 个 images。它们是该项目报告的规模数据,不是通用性能保证。
AgentENV 已开源:
- https://github.com/kvcache-ai/AgentENV
## 8. 过程监督与验证器主线
### 8.1 Uesato 2022outcome/process 不是简单二选一
在 GSM8K 设置中,该工作比较 outcome-based 与 process-based feedback,并指出若追求低 trace error,通常需要过程反馈,或一个能近似过程反馈的 reward model。
不能外推为“所有任务 PRM 都优于 ORM”;生成模型、标注预算和搜索规模都不同。
### 8.2 PRM800K / Lets Verify Step by Step
关键事实:
- 约 800K step-level labels
- 来自约 75K solutions、12K problems
- 在代表性 500 道 MATH 子集上,process-supervised reward model 配合 best-of-1860 选择达到 78.2%
- 生成器与 reward model 来自内部 GPT-4-base 系列;
- 4,500 道 MATH test problems 用于训练,只评估剩余 500;
- 主要研究 reward-model reliability 与 best-of-N,不是 generator RL。
网站不能写“PRM 解出 78.2% MATH”,必须保留:
```text
500-problem subset + best-of-1860 + reward-model selection
```
### 8.3 verifier 与搜索的反馈回路
搜索不是自动纠错器:
```text
生成器提出候选
→ verifier 给局部排序
→ 搜索把高分分支分配更多预算
→ verifier 的系统性偏差被反复放大
```
因此互动实验要允许单独调:
- 基础候选正确率;
- 候选相关性/多样性;
- verifier true-positive / false-positive
- branching factor
- depth
- 总 token budget。
## 9. s1:极少数据、预算强制与蒸馏边界
s1 的关键设置:
- 从候选池筛出 1,000 个问题组成 s1K;
- 共约 4.7M tokens
- traces 来自 Gemini 2.0 Flash Thinking,后续 s1.1 改用 R1
- SFT Qwen2.5-32B-Instruct
- 训练约 7 个 H100 GPU-hours
- 用 “Wait” 继续生成或强制结束,实现 budget forcing。
论文中的 AIME 2024 无 budget forcing 为 50,特定扩展运行约到 56.7/57。教学边界:
- 这是强教师轨迹蒸馏,不是 1,000 个原始问题让基础模型无中生有;
- 59K 全量数据未超过精选 1K,说明 difficulty/diversity/quality 很重要;
- “超过 o1-preview”是特定 benchmark、prompt、预算与评测协议下的比较。
## 10. 首版互动实验设计
### 10.1 Reasoning Budget Lab(主交互)
固定一笔总预算,例如 16K / 64K / 256K tokens,让读者分给四种策略:
1. 单轨串行深度;
2. 并行采样数量;
3. verifier/search
4. 工具调用。
输入:
- base pass@1
- 独立样本相关性;
- 深度收益曲线;
- verifier 准确率;
- search branching/depth
- tool success / latency
- reasoning effort
- 总 token/latency budget。
输出:
- 估计 pass@1
- pass@k / coverage
- majority@k
- verifier-selected success
- 串行关键路径 latency
- 总 token
- “能力扩展”与“选择改进”的分解。
所有数值必须标注为 deterministic teaching simulation,不得伪装成模型 benchmark。
预设:
- Direct / CoT
- Self-Consistency
- Best-of-N + ORM
- PRM search
- DeepSeek-R1 风格;
- Kimi k1.5 long-CoT
- K3 low / high / max
- tool-using agent。
### 10.2 GRPO Bias Lab(第二交互或主交互第二页签)
给定同题 8 条 rollout
- reward
- token length
- old/new token probability ratio
- 是否 overlong
- 是否全对/全错组。
并排显示:
- DeepSeekMath GRPO
- DAPO token-level aggregation
- Dr.GRPO
- K2.5 log-ratio gradient mask。
读者可以直接看到:
- 组内全同奖励为何梯度为零;
- response-length normalization 如何改变长短样本权重;
- std normalization 如何改变题目难度权重;
- ratio 越界时 K2.5 如何屏蔽 token
- hard overlong penalty 与 soft shaping 的差别。
### 10.3 MOPD Capability Mixer
画 3×3 教师矩阵:
```text
low high max
general ● ● ●
agent ● ● ●
coding ● ● ●
```
选择 prompt domain / effort 后:
- student rollout
- router 选择 teacher
- 每 token 显示 student prob、teacher prob、clipped advantage
- 可切换 same-origin / distant teacher
- 显示 entropy、teacher-student KL 和稳定性提示。
## 11. 正文可视化清单
首版至少需要:
1. 八账总览:结果、覆盖、选择、过程、预算、优化、分布、系统。
2. 四种 test-time compute:串行、并行、搜索、工具。
3. pass@1 / pass@k / majority@k / best-of-N 的同一候选池示意。
4. CoT → self-consistency → verifier → search → agent 时间线。
5. PPO → GRPO → DAPO / Dr.GRPO 公式差异图。
6. DeepSeekMath → R1-Zero → R1 → distill 因果链。
7. “能力扩展 vs 概率重排”的双分布图。
8. PRM 的逐步评分与 best-of-N 选择图。
9. Kimi k1.5 partial rollout 的跨迭代时间线。
10. k1.5 long2short 四方法对照。
11. K2 verifiable gym → critic → subjective rubric 闭环。
12. K2.5 Toggle 两阶段预算训练。
13. K3 3 domains × 3 efforts → MOPD 的九教师矩阵。
14. K3 partial rollout RL 与 MOPD 并排图。
15. K3 co-located RL、外部 KV pool、AgentENV 流水线。
16. CoT correctness / plausibility / faithfulness 三圆图。
## 12. 本地一手材料
PDF 与文本只作研究缓存,受 `.gitignore` 排除;公开仓库提交本账本与 canonical URL。
| ID | 来源 | 页数 | 本章用途 |
|---|---|---:|---|
| `1707.06347` | Proximal Policy Optimization Algorithms | 12 | PPO 起点 |
| `2110.14168` | Training Verifiers to Solve Math Word Problems | 22 | GSM8K、verifier、采样 |
| `2201.11903` | Chain-of-Thought Prompting | 43 | 串行推理起点 |
| `2203.11171` | Self-Consistency Improves Chain of Thought Reasoning | 24 | 并行采样与投票 |
| `2205.10625` | Least-to-Most Prompting | 61 | 分解式推理 |
| `2210.03629` | ReAct | 33 | 推理与行动交错 |
| `2211.14275` | Solving Math Word Problems With Process- and Outcome-Based Feedback | 29 | PRM/ORM 早期比较 |
| `2305.04388` | Language Models Dont Always Say What They Think | 32 | CoT faithfulness |
| `2305.10601` | Tree of Thoughts | 14 | 显式搜索 |
| `2305.20050` | Lets Verify Step by Step | 29 | PRM800K / best-of-1860 |
| `2402.03300` | DeepSeekMath | 30 | GRPO |
| `2408.03314` | Scaling LLM Test-Time Compute Optimally | 37 | compute-optimal allocation |
| `2411.15124` | Tülu 3 | 82 | RLVR / 开放 post-training 配方 |
| `2412.16720` | OpenAI o1 System Card | 51 | reasoning model 评测/安全边界 |
| `2501.12599` | Kimi k1.5 | 25 | long-CoT、partial rollout、long2short |
| `2501.12948` | DeepSeek-R1 | 86 | R1-Zero、R1、distillation |
| `2501.19393` | s1 | 46 | budget forcing、精选蒸馏数据 |
| `2503.14476` | DAPO | 16 | GRPO 复现与四项修正 |
| `2503.20783` | Understanding R1-Zero-Like Training: A Critical Perspective | 20 | Dr.GRPO、长度/难度偏置 |
| `2504.13837` | Does RL Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model? | 31 | RLVR coverage 边界 |
| `2507.20534` | Kimi K2 | 32 | verifiable + self-critique RL |
| `2602.02276` | Kimi K2.5 | 30 | token clipping、Toggle、agentic RL |
| `2606.30406` | MOPD | 15 | multi-teacher on-policy distillation |
| `2607.24653` | Kimi K3 | 47 | reasoning effort、MOPD、agentic infra |
首版时间线另补 6 个桥接节点。其 canonical 页面、标题与摘要已核对;后续二轮再加入本地逐页笔记:
| ID | 来源 | 首版用途 |
|---|---|---|
| `2203.14465` | STaR | 迭代生成、筛选与训练成功 rationale |
| `2205.11916` | Large Language Models are Zero-Shot Reasoners | 从 few-shot CoT 到统一零样本触发 |
| `2206.14858` | Minerva | 技术内容继续训练与定量推理 |
| `2211.12588` | Program of Thoughts | 把语言推理与外部数值执行分开 |
| `2303.17651` | Self-Refine | 无额外训练的反馈—修订串行扩展 |
| `2403.09629` | Quiet-STaR | 从任务 CoT 走向一般文本内部 rationale |
## 13. 一手来源 canonical URLs
- PPO — https://arxiv.org/abs/1707.06347
- GSM8K / Verifiers — https://arxiv.org/abs/2110.14168
- Chain-of-Thought — https://arxiv.org/abs/2201.11903
- Self-Consistency — https://arxiv.org/abs/2203.11171
- STaR — https://arxiv.org/abs/2203.14465
- Least-to-Most — https://arxiv.org/abs/2205.10625
- Zero-Shot Reasoners — https://arxiv.org/abs/2205.11916
- Minerva — https://arxiv.org/abs/2206.14858
- ReAct — https://arxiv.org/abs/2210.03629
- Process vs Outcome Feedback — https://arxiv.org/abs/2211.14275
- Program of Thoughts — https://arxiv.org/abs/2211.12588
- Self-Refine — https://arxiv.org/abs/2303.17651
- CoT Unfaithfulness — https://arxiv.org/abs/2305.04388
- Tree of Thoughts — https://arxiv.org/abs/2305.10601
- Lets Verify Step by Step — https://arxiv.org/abs/2305.20050
- DeepSeekMath — https://arxiv.org/abs/2402.03300
- Quiet-STaR — https://arxiv.org/abs/2403.09629
- Scaling LLM Test-Time Compute Optimally — https://arxiv.org/abs/2408.03314
- Tülu 3 — https://arxiv.org/abs/2411.15124
- OpenAI o1 System Card — https://arxiv.org/abs/2412.16720
- Kimi k1.5 — https://arxiv.org/abs/2501.12599
- DeepSeek-R1 — https://arxiv.org/abs/2501.12948
- s1 — https://arxiv.org/abs/2501.19393
- DAPO — https://arxiv.org/abs/2503.14476
- Dr.GRPO — https://arxiv.org/abs/2503.20783
- RLVR Capacity Limits — https://arxiv.org/abs/2504.13837
- Kimi K2 — https://arxiv.org/abs/2507.20534
- Kimi K2.5 — https://arxiv.org/abs/2602.02276
- MOPD — https://arxiv.org/abs/2606.30406
- Kimi K3 — https://arxiv.org/abs/2607.24653
- Thinking Machines: On-Policy Distillation — https://thinkingmachines.ai/blog/on-policy-distillation/
- AgentENV — https://github.com/kvcache-ai/AgentENV
## 14. 高风险表述检查表
- [x] 不把 pass@1、pass@k、majority@k、best-of-N 混写。
- [x] 不把训练计算、串行推理、并行采样、搜索与工具成本混写。
- [x] 不把可读 CoT 当作忠实因果解释。
- [x] 不把 PRM800K 的 78.2% 写成单次 MATH 准确率。
- [x] 不把 R1 完整管线写成“纯 RL、零 SFT”。
- [x] 不把 R1-Zero 的 “aha” 当作 RL 从零创造能力的单一证据。
- [x] 不把 R1 distilled 小模型写成只用 1K/800K 原始题自主学会推理。
- [x] 不把 DAPO 的同 base 对比写成完全同数据/同系统的严格赛跑。
- [x] 不把 Dr.GRPO 写成已经推翻所有 GRPO。
- [x] 不把当前 RLVR pass@k 结果写成关于 RL 的不可能定理。
- [x] 不把 s1 的 1K 写成没有强教师轨迹。
- [x] 不把 k1.5 不使用 PRM/MCTS 写成这些方法普遍无效。
- [x] 不把 K2 self-critique reward 当作客观 verifier。
- [x] 不把 K2.5 probability-ratio clipping / log-ratio drift 约束当作标准 PPO clipping。
- [x] 不把 K3 partial rollout 的 off-policy 稳定化与 MOPD 的 on-policy student rollout 混写。
- [x] 不把更强但远分布教师写成 MOPD 必然更好。
- [x] 不把 K3 报告中的系统规模数字写成第三方复现结果。
- [x] 所有 benchmark 数字同时带模型、采样、选择与数据边界。
## 15. 首版正文完成闸门
- [x] 把八张账做成一张可导航总图。
- [x] 建立不少于 30 篇的关键论文时间线,并逐项核对 canonical URL。
- [x] 完整解释 CoT、self-consistency、verifier、PRM、search、tool use 的桥接关系。
- [x] 用统一候选池讲清 pass@1 / pass@k / consensus / best-of-N。
- [x] 画出 PPO → GRPO → DAPO / Dr.GRPO 的目标函数差异。
- [x] 单独写 DeepSeekMath → R1-Zero → R1 → distillation 高亮主线。
- [x] 单独写 Kimi k1.5 → K2 → K2.5 → K3 高亮主线。
- [x] 并排画 K3 partial rollout RL 与 MOPD,明确 off-policy / on-policy。
- [x] 讲清 reasoning effort、budget forcing、long2short 与 Toggle 的差异。
- [x] 讲清 RLVR pass@1 / pass@k 能力边界争论及其局限。
- [x] 加入 CoT faithfulness 的独立警示与实验。
- [x] 完成 Reasoning Budget Lab。
- [x] 完成 GRPO Bias Lab 或等价交互页签。
- [x] 完成 MOPD 九教师可视化。
- [x] 论文链全部指向一手来源。
- [ ] 类型、链接、anchor、交互、桌面/移动端、容器与生产 Chrome 检查通过。
+1 -1
View File
@@ -177,7 +177,7 @@ if (layout.documentOverflow > 0 || mobile.documentOverflow > 0 || home.documentO
}
if (layout.navGap < 0) failures.push(`桌面导航碰撞:${layout.navGap}px`);
if (!mobile.menuVisible) failures.push("移动端菜单按钮未显示");
if (home.releaseCards !== 2) failures.push(`首页新章卡数量异常:${home.releaseCards}`);
if (home.releaseCards !== 3) failures.push(`首页新章卡数量异常:${home.releaseCards}`);
if (exceptions.length) failures.push(`浏览器脚本异常:${exceptions.join("; ")}`);
socket.close();
+299
View File
@@ -0,0 +1,299 @@
import { writeFileSync } from "node:fs";
const cdpPort = process.env.CDP_PORT ?? "9224";
const baseUrl = process.env.SITE_URL ?? "http://127.0.0.1:4323";
const pages = await fetch(`http://127.0.0.1:${cdpPort}/json/list`).then((response) => response.json());
const page = pages.find((entry) => entry.type === "page");
if (!page) throw new Error(`CDP ${cdpPort} 没有可用页面`);
const socket = new WebSocket(page.webSocketDebuggerUrl);
await new Promise((resolve, reject) => {
socket.addEventListener("open", resolve, { once: true });
socket.addEventListener("error", reject, { once: true });
});
let nextId = 0;
const pending = new Map();
const exceptions = [];
socket.addEventListener("message", (event) => {
const message = JSON.parse(event.data);
if (message.id && pending.has(message.id)) {
const { resolve, reject } = pending.get(message.id);
pending.delete(message.id);
if (message.error) reject(new Error(message.error.message));
else resolve(message.result);
}
if (message.method === "Runtime.exceptionThrown") {
exceptions.push(message.params.exceptionDetails.text);
}
});
const command = (method, params = {}) => new Promise((resolve, reject) => {
const id = ++nextId;
pending.set(id, { resolve, reject });
socket.send(JSON.stringify({ id, method, params }));
});
const pause = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
const evaluate = async (expression) => {
const result = await command("Runtime.evaluate", {
expression,
returnByValue: true,
awaitPromise: true,
});
if (result.exceptionDetails) throw new Error(result.exceptionDetails.text);
return result.result.value;
};
const navigate = async (path) => {
await command("Page.navigate", { url: `${baseUrl}${path}` });
for (let attempt = 0; attempt < 40; attempt += 1) {
await pause(100);
if (await evaluate("document.readyState === 'complete'")) return;
}
throw new Error(`${path} 加载超时`);
};
const screenshot = async (path, full = false) => {
const params = { format: "png", captureBeyondViewport: full };
if (full) {
const metrics = await command("Page.getLayoutMetrics");
params.clip = {
x: 0,
y: 0,
width: metrics.cssContentSize.width,
height: metrics.cssContentSize.height,
scale: 1,
};
}
const result = await command("Page.captureScreenshot", params);
writeFileSync(path, Buffer.from(result.data, "base64"));
};
await command("Page.enable");
await command("Runtime.enable");
await command("Emulation.setDeviceMetricsOverride", {
width: 1440,
height: 1100,
deviceScaleFactor: 1,
mobile: false,
});
await navigate("/reasoning/");
await screenshot("/tmp/llm-atlas-reasoning-desktop.png");
const budget = await evaluate(`(() => {
const root = document.querySelector("[data-reasoning-lab]");
const correlation = root.querySelector("[data-correlation]");
correlation.value = "0";
correlation.dispatchEvent(new Event("input", { bubbles: true }));
const independent = {
coverage: root.querySelector("[data-metric-coverage]").textContent,
effective: root.querySelector("[data-effective]").textContent,
};
correlation.value = "95";
correlation.dispatchEvent(new Event("input", { bubbles: true }));
const correlated = {
coverage: root.querySelector("[data-metric-coverage]").textContent,
effective: root.querySelector("[data-effective]").textContent,
};
root.querySelector('[data-budget-preset="agent"]').click();
return {
independent,
correlated,
preset: root.querySelector("[data-budget-name]").textContent,
buys: root.querySelector("[data-budget-buys]").textContent,
metrics: root.querySelectorAll(".budget-metrics > article").length,
};
})()`);
const grpo = await evaluate(`(() => {
const root = document.querySelector("[data-reasoning-lab]");
root.querySelector('[data-lab-tab="grpo"]').click();
root.querySelector('[data-rollout-profile="all-right"]').click();
const allRight = {
signal: root.querySelector("[data-group-signal]").textContent,
note: root.querySelector("[data-group-note]").textContent,
};
root.querySelector('[data-rollout-profile="rare"]').click();
const ratio = root.querySelector("[data-ratio-window]");
ratio.value = "10";
ratio.dispatchEvent(new Event("input", { bubbles: true }));
return {
allRight,
rareSignal: root.querySelector("[data-group-signal]").textContent,
masks: root.querySelector("[data-mask-count]").textContent,
rows: root.querySelectorAll("[data-gradient-row]").length,
};
})()`);
const mopd = await evaluate(`(() => {
const root = document.querySelector("[data-reasoning-lab]");
root.querySelector('[data-lab-tab="mopd"]').click();
root.querySelector('[data-teacher="coding-max"]').click();
const distance = root.querySelector("[data-distance]");
const clip = root.querySelector("[data-clip]");
distance.value = "90";
clip.value = "10";
distance.dispatchEvent(new Event("input", { bubbles: true }));
clip.dispatchEvent(new Event("input", { bubbles: true }));
return {
teacher: root.querySelector("[data-teacher-name]").textContent,
warning: root.querySelector("[data-mopd-warning]").textContent,
clipped: root.querySelector("[data-mopd-clipped]").textContent,
density: [...root.querySelectorAll(".mopd-metrics > article b")].at(-1).textContent,
tokens: root.querySelectorAll("[data-mopd-token]").length,
};
})()`);
const layout = await evaluate(`(() => {
const nav = document.querySelector(".top-nav");
const meta = document.querySelector(".header-meta");
const viewport = document.documentElement.clientWidth;
const overflowers = [...document.querySelectorAll("*")]
.map((node) => {
const rect = node.getBoundingClientRect();
return {
tag: node.tagName,
className: typeof node.className === "string" ? node.className : "",
parentClass: typeof node.parentElement?.className === "string" ? node.parentElement.className : "",
text: (node.textContent ?? "").trim().replace(/\\s+/g, " ").slice(0, 70),
left: Number(rect.left.toFixed(1)),
right: Number(rect.right.toFixed(1)),
width: Number(rect.width.toFixed(1)),
scrollWidth: node.scrollWidth,
};
})
.filter((item) => item.right > viewport + 1 || item.left < -1)
.sort((a, b) => Math.max(b.right - viewport, -b.left) - Math.max(a.right - viewport, -a.left))
.slice(0, 12);
const scrollNodes = [...document.querySelectorAll("*")]
.map((node) => ({
tag: node.tagName,
className: typeof node.className === "string" ? node.className : "",
parentClass: typeof node.parentElement?.className === "string" ? node.parentElement.className : "",
delta: node.scrollWidth - node.clientWidth,
clientWidth: node.clientWidth,
scrollWidth: node.scrollWidth,
overflowX: getComputedStyle(node).overflowX,
}))
.filter((item) => item.delta > 1)
.sort((a, b) => b.delta - a.delta)
.slice(0, 12);
return {
documentOverflow: document.documentElement.scrollWidth - document.documentElement.clientWidth,
navGap: Number((meta.getBoundingClientRect().left - nav.getBoundingClientRect().right).toFixed(1)),
navLinks: document.querySelectorAll(".top-nav a").length,
articleSections: document.querySelectorAll(".article-section").length,
paperLinks: document.querySelectorAll(".paper-chain a").length,
overflowers,
};
})()`);
await evaluate(`(() => {
document.documentElement.style.scrollBehavior = "auto";
document.querySelector("[data-reasoning-lab]").scrollIntoView({ block: "start", behavior: "instant" });
})()`);
await pause(150);
await screenshot("/tmp/llm-atlas-reasoning-lab-desktop.png");
await command("Emulation.setDeviceMetricsOverride", {
width: 390,
height: 844,
deviceScaleFactor: 1,
mobile: true,
});
await navigate("/reasoning/");
await screenshot("/tmp/llm-atlas-reasoning-mobile-closed.png");
const mobile = await evaluate(`(() => {
const toggle = document.querySelector("#menu-toggle");
toggle.click();
const viewport = document.documentElement.clientWidth;
const overflowers = [...document.querySelectorAll("*")]
.map((node) => {
const rect = node.getBoundingClientRect();
return {
tag: node.tagName,
className: typeof node.className === "string" ? node.className : "",
parentClass: typeof node.parentElement?.className === "string" ? node.parentElement.className : "",
text: (node.textContent ?? "").trim().replace(/\\s+/g, " ").slice(0, 70),
left: Number(rect.left.toFixed(1)),
right: Number(rect.right.toFixed(1)),
width: Number(rect.width.toFixed(1)),
scrollWidth: node.scrollWidth,
};
})
.filter((item) => item.right > viewport + 1 || item.left < -1)
.sort((a, b) => Math.max(b.right - viewport, -b.left) - Math.max(a.right - viewport, -a.left))
.slice(0, 12);
const scrollNodes = [...document.querySelectorAll("*")]
.map((node) => ({
tag: node.tagName,
className: typeof node.className === "string" ? node.className : "",
parentClass: typeof node.parentElement?.className === "string" ? node.parentElement.className : "",
delta: node.scrollWidth - node.clientWidth,
clientWidth: node.clientWidth,
scrollWidth: node.scrollWidth,
overflowX: getComputedStyle(node).overflowX,
}))
.filter((item) => item.delta > 1)
.sort((a, b) => b.delta - a.delta)
.slice(0, 12);
return {
documentOverflow: document.documentElement.scrollWidth - document.documentElement.clientWidth,
menuVisible: getComputedStyle(toggle).display !== "none",
menuOpen: toggle.getAttribute("aria-expanded"),
title: document.querySelector("h1").innerText,
overflowers,
scrollNodes,
};
})()`);
await screenshot("/tmp/llm-atlas-reasoning-mobile.png");
await command("Emulation.setDeviceMetricsOverride", {
width: 1440,
height: 1100,
deviceScaleFactor: 1,
mobile: false,
});
await navigate("/");
await evaluate("scrollTo(0, 0)");
const home = await evaluate(`({
documentOverflow: document.documentElement.scrollWidth - document.documentElement.clientWidth,
releaseCards: document.querySelectorAll(".release-card").length,
firstRelease: document.querySelector(".release-card h2").textContent,
navLinks: document.querySelectorAll(".top-nav a").length,
})`);
await evaluate(`document.querySelector("#new-chapters").scrollIntoView({ block: "start", behavior: "instant" })`);
await pause(100);
await screenshot("/tmp/llm-atlas-home-reasoning-release.png");
const report = { budget, grpo, mopd, layout, mobile, home, exceptions };
console.log(JSON.stringify(report, null, 2));
const numeric = (value) => Number.parseFloat(value);
const failures = [];
if (numeric(budget.independent.coverage) <= numeric(budget.correlated.coverage)) {
failures.push("候选相关性没有降低 coverage");
}
if (numeric(budget.independent.effective) <= numeric(budget.correlated.effective)) {
failures.push("候选相关性没有降低有效独立样本");
}
if (!budget.preset.includes("TOOL AGENT") || !budget.buys.includes("新观察")) failures.push("Tool Agent 预设未生效");
if (budget.metrics !== 4) failures.push(`预算指标数量异常:${budget.metrics}`);
if (!grpo.allRight.signal.includes("零") || !grpo.allRight.note.includes("Dynamic Sampling")) {
failures.push("全对组零优势解释缺失");
}
if (grpo.rows !== 8 || numeric(grpo.masks) < 1) failures.push("GRPO 行数或 K2.5 mask 异常");
if (!mopd.teacher.includes("CODING · MAX") || !mopd.warning.includes("高风险")) failures.push("MOPD 远教师预设未生效");
if (mopd.tokens !== 12 || mopd.density.trim() !== "12 / 12") failures.push("MOPD 稠密 token 信号异常");
if (layout.articleSections !== 15 || layout.paperLinks !== 30) failures.push("章节或论文链数量异常");
if (layout.documentOverflow > 0 || mobile.documentOverflow > 0 || home.documentOverflow > 0) {
failures.push("页面存在横向溢出");
}
if (layout.navGap < 0) failures.push(`桌面导航碰撞:${layout.navGap}px`);
if (!mobile.menuVisible || mobile.menuOpen !== "true") failures.push("移动端菜单不可用");
if (home.releaseCards !== 3 || !home.firstRelease.includes("多想一会儿")) failures.push("首页推理新章入口异常");
if (exceptions.length) failures.push(`浏览器脚本异常:${exceptions.join("; ")}`);
socket.close();
if (failures.length) {
failures.forEach((failure) => console.error(`- ${failure}`));
process.exit(1);
}
+974
View File
@@ -0,0 +1,974 @@
---
const budgetPresets = [
{ id: "direct", label: "Direct", serial: 0.15, parallel: 1, verifier: 0, search: 0, tool: 0 },
{ id: "cot", label: "Long CoT", serial: 0.82, parallel: 1, verifier: 0, search: 0, tool: 0 },
{ id: "sc", label: "Self-Consistency", serial: 0.22, parallel: 12, verifier: 0.45, search: 0, tool: 0 },
{ id: "bon", label: "Best-of-N", serial: 0.18, parallel: 16, verifier: 0.82, search: 0, tool: 0 },
{ id: "search", label: "PRM Search", serial: 0.28, parallel: 8, verifier: 0.9, search: 0.62, tool: 0 },
{ id: "agent", label: "Tool Agent", serial: 0.38, parallel: 4, verifier: 0.76, search: 0.2, tool: 0.68 },
{ id: "k3max", label: "K3 · MAX", serial: 0.7, parallel: 6, verifier: 0.84, search: 0.35, tool: 0.52 },
];
const rolloutProfiles = [
{
id: "mixed",
label: "5 对 / 3 错",
rewards: [1, 0, 1, 1, 0, 1, 0, 1],
lengths: [640, 2860, 980, 1740, 4280, 1220, 3560, 760],
ratios: [1.02, 0.89, 1.11, 1.04, 1.36, 0.96, 0.72, 1.08],
},
{
id: "all-right",
label: "全对组",
rewards: [1, 1, 1, 1, 1, 1, 1, 1],
lengths: [620, 880, 1340, 1760, 2110, 2640, 3180, 4020],
ratios: [1.02, 1.06, 0.96, 1.12, 0.91, 1.2, 0.84, 1.28],
},
{
id: "rare",
label: "1 对 / 7 错",
rewards: [0, 0, 0, 1, 0, 0, 0, 0],
lengths: [760, 1260, 2060, 3480, 4420, 2860, 5180, 1640],
ratios: [0.94, 1.08, 0.82, 1.14, 1.42, 0.7, 1.52, 0.88],
},
];
const mopdDomains = [
["general-low", "GENERAL", "LOW"],
["general-high", "GENERAL", "HIGH"],
["general-max", "GENERAL", "MAX"],
["agent-low", "AGENT", "LOW"],
["agent-high", "AGENT", "HIGH"],
["agent-max", "AGENT", "MAX"],
["coding-low", "CODING", "LOW"],
["coding-high", "CODING", "HIGH"],
["coding-max", "CODING", "MAX"],
];
const tokenLabels = ["先", "拆", "约束", "", "再", "验证", "关键", "步骤", "", "最后", "调用", "工具"];
---
<section class="reasoning-lab" data-reasoning-lab>
<div class="lab-header">
<div>
<p>INTERACTIVE / REASONING COMPUTE LAB</p>
<h3>“多想一会儿”至少有三套完全不同的账</h3>
</div>
<p>
下面所有概率都是确定性教学模拟,不是任何真实模型跑分。它用同一界面拆开测试时预算、GRPO 梯度和 K3 MOPD
让概念差异可以被操作,而不是只靠背术语。
</p>
</div>
<div class="mode-tabs" role="tablist" aria-label="选择推理实验">
<button type="button" role="tab" data-lab-tab="budget" aria-selected="true">
<span>01</span><b>预算怎样分</b><small>serial / parallel / search / tools</small>
</button>
<button type="button" role="tab" data-lab-tab="grpo" aria-selected="false">
<span>02</span><b>梯度怎样变</b><small>GRPO / DAPO / Dr.GRPO / K2.5</small>
</button>
<button type="button" role="tab" data-lab-tab="mopd" aria-selected="false">
<span>03</span><b>九教师怎样合</b><small>K3 multi-effort MOPD</small>
</button>
</div>
<div class="lab-view" data-lab-view="budget">
<div class="view-intro">
<div>
<p class="panel-kicker">TEST-TIME COMPUTE</p>
<h3>固定总 Token,不同策略买到的不是同一种计算</h3>
</div>
<p>
串行深度增加单条轨迹可做的工作;并行宽度增加覆盖;verifier 负责选择;工具改变模型能看到的信息。
把四者只写成 “thinking tokens” 会掩盖真正瓶颈。
</p>
</div>
<div class="budget-presets" role="group" aria-label="预算策略预设">
{budgetPresets.map((preset) => (
<button
type="button"
data-budget-preset={preset.id}
data-serial={preset.serial}
data-parallel={preset.parallel}
data-verifier={preset.verifier}
data-search={preset.search}
data-tool={preset.tool}
aria-pressed={preset.id === "sc" ? "true" : "false"}
>
{preset.label}
</button>
))}
</div>
<div class="budget-workbench">
<div class="budget-controls">
<label>
<span>总预算 <output data-budget-output>64K tokens</output></span>
<input data-budget type="range" min="16" max="256" value="64" step="16" />
<small>16K <i></i> 256K</small>
</label>
<label>
<span>基础单次正确率 <output data-base-output>34%</output></span>
<input data-base type="range" min="8" max="72" value="34" step="2" />
<small>弱基础模型 <i></i> 强基础模型</small>
</label>
<label>
<span>候选相关性 <output data-correlation-output>55%</output></span>
<input data-correlation type="range" min="0" max="95" value="55" step="5" />
<small>独立探索 <i></i> 重复同类错误</small>
</label>
<label>
<span>Verifier 可靠度 <output data-verifier-output>45%</output></span>
<input data-verifier type="range" min="0" max="98" value="45" step="2" />
<small>近似随机 <i></i> 接近 oracle</small>
</label>
</div>
<div class="allocation-panel">
<div class="panel-label"><span>BUDGET ALLOCATION</span><b data-budget-name>SELF-CONSISTENCY</b></div>
<div class="allocation-bar" aria-label="测试时计算预算分配">
<i data-alloc="serial"><span>串行</span></i>
<i data-alloc="parallel"><span>并行</span></i>
<i data-alloc="search"><span>搜索</span></i>
<i data-alloc="tool"><span>工具</span></i>
</div>
<div class="allocation-readout">
<div><span>单轨长度</span><b data-serial-tokens>7.0K</b></div>
<div><span>并行候选</span><b data-candidates>9</b></div>
<div><span>有效独立样本</span><b data-effective>4.6</b></div>
<div><span>关键路径</span><b data-latency>14.1s</b></div>
</div>
<div class="trajectory-strip" aria-label="并行推理轨迹示意">
{Array.from({ length: 16 }, (_, index) => (
<i data-trajectory={index}><span></span><b></b></i>
))}
</div>
</div>
</div>
<div class="metric-grid budget-metrics">
<article><span>SINGLE TRAJECTORY</span><b data-metric-single>47.2%</b><p>串行思考后的单条成功率</p></article>
<article><span>COVERAGE / PASS@K</span><b data-metric-coverage>91.3%</b><p>候选里至少出现一个正确解</p></article>
<article><span>MAJORITY@K</span><b data-metric-majority>42.8%</b><p>不训练选择器的答案投票</p></article>
<article><span>VERIFIER SELECTED</span><b data-metric-selected>69.5%</b><p>覆盖 × 选择可靠度的合成结果</p></article>
</div>
<div class="interpretation">
<div><span>现在主要买到</span><b data-budget-buys>覆盖,而不是更深的单条推理</b></div>
<p data-budget-note>
候选相关性会让 nominal N 高估真实探索宽度;继续加样本以前,先问它们是否只是重复同一种错误。
</p>
</div>
</div>
<div class="lab-view" data-lab-view="grpo" hidden>
<div class="view-intro">
<div>
<p class="panel-kicker">POLICY OPTIMIZATION</p>
<h3>同一组 rollout,四种聚合方法会把力用在不同地方</h3>
</div>
<p>
每行是一条同题回答。条形图不是完整训练梯度,而是把 reward、长度归一化和 ratio mask
压缩成可比较的教学权重,专门暴露“为什么实现细节会改变训练行为”。
</p>
</div>
<div class="grpo-toolbar">
<div role="group" aria-label="选择 rollout 奖励分布">
{rolloutProfiles.map((profile) => (
<button
type="button"
data-rollout-profile={profile.id}
data-rewards={profile.rewards.join(",")}
data-lengths={profile.lengths.join(",")}
data-ratios={profile.ratios.join(",")}
aria-pressed={profile.id === "mixed" ? "true" : "false"}
>
{profile.label}
</button>
))}
</div>
<label>
<span>K2.5 ratio 区间 <output data-ratio-output>0.801.25</output></span>
<input data-ratio-window type="range" min="10" max="45" value="25" step="5" />
</label>
</div>
<div class="gradient-table">
<div class="gradient-head">
<span>ROLLOUT</span><span>REWARD</span><span>LENGTH</span><span>GRPO</span><span>DAPO</span><span>Dr.GRPO</span><span>K2.5 MASK</span>
</div>
{Array.from({ length: 8 }, (_, index) => (
<div class="gradient-row" data-gradient-row={index}>
<span><b>y{index + 1}</b><small data-ratio-label>ratio 1.00</small></span>
<span data-reward>1</span>
<span data-length>640</span>
<span><i data-gradient="grpo"><b></b></i><em data-gradient-label="grpo">+0.00</em></span>
<span><i data-gradient="dapo"><b></b></i><em data-gradient-label="dapo">+0.00</em></span>
<span><i data-gradient="dr"><b></b></i><em data-gradient-label="dr">+0.00</em></span>
<span data-mask><i></i><b>KEEP</b></span>
</div>
))}
</div>
<div class="grpo-summary">
<article>
<span>GROUP SIGNAL</span>
<b data-group-signal>有相对奖励</b>
<p data-group-note>同题组里既有对也有错,组均值 baseline 能产生正负 advantage。</p>
</article>
<article>
<span>LENGTH EFFECT</span>
<b data-length-effect>GRPO 偏向短正确</b>
<p>回答内 token 平均会改变长短样本的总贡献;DAPO 与 Dr.GRPO 选择不同的聚合口径。</p>
</article>
<article>
<span>OFF-POLICY TOKENS</span>
<b data-mask-count>2 / 8 被屏蔽</b>
<p>K2.5 只看 token ratio 是否越界;这里不模拟标准 PPO 的 advantage-aware clipping。</p>
</article>
</div>
<div class="formula-comparison">
<article><span>GRPO</span><b>(r μ) / σ,再按回答长度平均</b><p>去 critic,但引入组标准差和 response length 两层归一化。</p></article>
<article><span>DAPO</span><b>全 batch token-level 聚合</b><p>配合 dynamic sampling、Clip-Higher 和 overlong shaping。</p></article>
<article><span>Dr.GRPO</span><b>r μ,固定全局长度分母</b><p>移除论文指出的长度与题目难度归一化偏置。</p></article>
<article><span>K2.5</span><b>ratio ∉ [α,β] → gradient mask</b><p>用于约束训练—推理 mismatch 放大的 off-policy drift。</p></article>
</div>
</div>
<div class="lab-view" data-lab-view="mopd" hidden>
<div class="view-intro">
<div>
<p class="panel-kicker">K3 / MULTI-TEACHER ON-POLICY DISTILLATION</p>
<h3>不是把九个模型参数平均,而是让学生在自己的路上逐 Token 问老师</h3>
</div>
<p>
先选 prompt 的领域和 reasoning effortstudent 生成当前轨迹,再由对应冻结 teacher 对相同前缀打分。
这与跨迭代 partial rollout 的 off-policy RL 是两套不同机制。
</p>
</div>
<div class="mopd-grid">
<div class="teacher-matrix">
<div class="matrix-head"><span>DOMAIN ↓ / EFFORT →</span><b>LOW</b><b>HIGH</b><b>MAX</b></div>
<span class="row-name">GENERAL</span>
<span class="row-name">AGENT</span>
<span class="row-name">CODING</span>
{mopdDomains.map(([id, domain, effort]) => (
<button
type="button"
data-teacher={id}
data-domain={domain}
data-effort={effort}
aria-pressed={id === "agent-high" ? "true" : "false"}
>
<i></i><b>{effort}</b><small>{domain}</small>
</button>
))}
</div>
<div class="mopd-controls">
<div>
<span>ROUTED TEACHER</span>
<b data-teacher-name>AGENT · HIGH</b>
<p data-teacher-story>长程助手、deep research 与段落写作教师;在 high effort 下兼顾探索与预算。</p>
</div>
<label>
<span>Teacherstudent 分布距离 <output data-distance-output>28%</output></span>
<input data-distance type="range" min="5" max="90" value="28" step="1" />
<small>同源且接近 <i></i> 更强但远分布</small>
</label>
<label>
<span>Advantage clip ± <output data-clip-output>2.5</output></span>
<input data-clip type="range" min="10" max="50" value="25" step="5" />
<small>更强裁剪 <i></i> 更少裁剪</small>
</label>
</div>
</div>
<div class="token-prefill">
<div class="panel-label"><span>STUDENT ROLLOUT → TEACHER PREFILL</span><b>DENSE TOKEN SIGNAL</b></div>
<div class="token-flow">
{tokenLabels.map((token, index) => (
<div data-mopd-token={index}>
<b>{token}</b>
<span><i data-student-prob></i><small data-student-label>S .42</small></span>
<span><i data-teacher-prob></i><small data-teacher-label>T .61</small></span>
<em data-token-advantage>+0.37</em>
</div>
))}
</div>
<div class="prob-legend"><span><i class="student"></i>student probability</span><span><i class="teacher"></i>teacher probability</span><span>Â = clip(log T log S)</span></div>
</div>
<div class="metric-grid mopd-metrics">
<article><span>MEAN REVERSE-KL PROXY</span><b data-mopd-kl>0.081</b><p>越远不代表越好,分布错配会增加训练压力</p></article>
<article><span>CLIPPED TOKENS</span><b data-mopd-clipped>0 / 12</b><p>超出 ±Amax 的 token 不再继续放大 advantage</p></article>
<article><span>ENTROPY PROXY</span><b data-mopd-entropy>0.79</b><p>远分布教师可能让 student 向少数模式收缩</p></article>
<article><span>SIGNAL DENSITY</span><b>12 / 12</b><p>不同于只在轨迹结束时给一个 outcome reward</p></article>
</div>
<div class="mopd-pipeline">
<article><span>01</span><b>Student samples</b><p>当前学生在自己的推理分布上生成。</p></article>
<i>→</i>
<article><span>02</span><b>Prompt routes</b><p>按领域与 effort 选择 9 个教师之一。</p></article>
<i>→</i>
<article><span>03</span><b>Teacher prefills</b><p>教师读取学生前缀,返回逐 token 概率。</p></article>
<i>→</i>
<article><span>04</span><b>Student updates</b><p>clipped log-prob 差进入 policy-gradient。</p></article>
</div>
<div class="interpretation">
<div><span>稳定性提示</span><b data-mopd-warning>同源教师分布接近,信号强且仍可控</b></div>
<p>
独立 MOPD 论文发现,绝对能力更强但分布更远的外部教师不一定更好;这里用距离滑杆显示这种风险,不把它当作真实训练预测器。
</p>
</div>
</div>
<div class="lab-footnote">
<b>如何读这套实验</b>
<p>
预算页只讲概率结构;梯度页只讲聚合方向;MOPD 页只讲 teacher signal。三页故意不合并成一个“总分”,
因为真实 reasoning system 的能力、选择、训练稳定性与运行成本没有可诚实相加的单一单位。
</p>
</div>
</section>
<script is:inline>
(() => {
const root = document.querySelector("[data-reasoning-lab]");
if (!root) return;
const clamp = (value, min = 0, max = 1) => Math.min(max, Math.max(min, value));
const percent = (value) => `${(100 * clamp(value)).toFixed(1)}%`;
const setText = (selector, value) => {
const node = root.querySelector(selector);
if (node) node.textContent = value;
};
const tabs = [...root.querySelectorAll("[data-lab-tab]")];
const views = [...root.querySelectorAll("[data-lab-view]")];
tabs.forEach((tab) => tab.addEventListener("click", () => {
const id = tab.dataset.labTab;
tabs.forEach((item) => item.setAttribute("aria-selected", String(item === tab)));
views.forEach((view) => { view.hidden = view.dataset.labView !== id; });
}));
const budgetInput = root.querySelector("[data-budget]");
const baseInput = root.querySelector("[data-base]");
const correlationInput = root.querySelector("[data-correlation]");
const verifierInput = root.querySelector("[data-verifier]");
const budgetButtons = [...root.querySelectorAll("[data-budget-preset]")];
let budgetPreset = budgetButtons.find((button) => button.getAttribute("aria-pressed") === "true");
const chooseBudgetPreset = (button) => {
budgetPreset = button;
budgetButtons.forEach((item) => item.setAttribute("aria-pressed", String(item === button)));
if (verifierInput) verifierInput.value = String(Math.round(Number(button.dataset.verifier) * 100));
updateBudget();
};
const combination = (n, k) => {
if (k < 0 || k > n) return 0;
let result = 1;
for (let i = 1; i <= Math.min(k, n - k); i += 1) result = result * (n - i + 1) / i;
return result;
};
const majorityProbability = (n, p) => {
const size = Math.max(1, Math.min(31, Math.round(n)));
const threshold = Math.floor(size / 2) + 1;
let total = 0;
for (let k = threshold; k <= size; k += 1) {
total += combination(size, k) * (p ** k) * ((1 - p) ** (size - k));
}
return clamp(total);
};
function updateBudget() {
if (!budgetPreset || !budgetInput || !baseInput || !correlationInput || !verifierInput) return;
const budget = Number(budgetInput.value) * 1024;
const base = Number(baseInput.value) / 100;
const correlation = Number(correlationInput.value) / 100;
const verifier = Number(verifierInput.value) / 100;
const serialShare = Number(budgetPreset.dataset.serial);
const requestedParallel = Number(budgetPreset.dataset.parallel);
const search = Number(budgetPreset.dataset.search);
const tool = Number(budgetPreset.dataset.tool);
const overheadShare = clamp(search * 0.24 + tool * 0.2, 0, 0.42);
const available = budget * (1 - overheadShare);
const candidates = Math.max(1, Math.min(32, Math.round(requestedParallel * (budget / 65536) ** 0.48)));
const serialTokens = Math.max(768, available * serialShare / Math.max(1, candidates * 0.32 + 0.68));
const serialGain = 0.25 * (1 - Math.exp(-serialTokens / 11500));
const searchGain = search * verifier * 0.12;
const toolGain = tool * (1 - base) * 0.2;
const single = clamp(base + (1 - base) * serialGain + searchGain + toolGain, 0.01, 0.96);
const effective = 1 + (candidates - 1) * ((1 - correlation) ** 0.78);
const coverage = clamp(1 - ((1 - single) ** effective));
const majority = majorityProbability(effective, single);
const selectorLift = verifier * (0.42 + 0.45 * search) + tool * 0.08;
const selected = clamp(single + (coverage - single) * selectorLift);
const waves = Math.ceil(candidates / Math.max(1, 8 - Math.round(tool * 3)));
const latency = serialTokens / 720 + waves * (0.32 + tool * 1.8) + search * 2.4;
setText("[data-budget-output]", `${Math.round(budget / 1024)}K tokens`);
setText("[data-base-output]", `${Math.round(base * 100)}%`);
setText("[data-correlation-output]", `${Math.round(correlation * 100)}%`);
setText("[data-verifier-output]", `${Math.round(verifier * 100)}%`);
setText("[data-budget-name]", budgetPreset.textContent.trim().toUpperCase());
setText("[data-serial-tokens]", `${(serialTokens / 1024).toFixed(1)}K`);
setText("[data-candidates]", String(candidates));
setText("[data-effective]", effective.toFixed(1));
setText("[data-latency]", `${latency.toFixed(1)}s`);
setText("[data-metric-single]", percent(single));
setText("[data-metric-coverage]", percent(coverage));
setText("[data-metric-majority]", percent(majority));
setText("[data-metric-selected]", percent(selected));
const allocations = {
serial: serialShare,
parallel: clamp(1 - serialShare - overheadShare, 0.05, 0.8),
search: search * 0.24,
tool: tool * 0.2,
};
const allocationTotal = Object.values(allocations).reduce((sum, value) => sum + value, 0);
Object.entries(allocations).forEach(([key, value]) => {
const node = root.querySelector(`[data-alloc="${key}"]`);
if (node) node.style.width = `${100 * value / allocationTotal}%`;
});
[...root.querySelectorAll("[data-trajectory]")].forEach((node, index) => {
const active = index < candidates;
node.hidden = !active;
if (!active) return;
const deterministic = ((index * 37 + Math.round(single * 100)) % 100) / 100;
const correct = deterministic < single;
node.dataset.correct = String(correct);
node.style.setProperty("--length", `${44 + ((index * 29 + Math.round(serialTokens / 200)) % 54)}%`);
});
let buys = "单条轨迹深度";
let note = "预算主要沿一条串行轨迹展开;如果前提错误,继续写更久也可能只是把错误推得更深。";
if (tool > 0.45) {
buys = "新观察与环境反馈";
note = "工具调用改变信息集,但环境延迟、失败恢复和结果验证不会被模型 Token 账自动覆盖。";
} else if (search > 0.45) {
buys = "由 verifier 引导的分支探索";
note = "搜索会重复使用 verifier;系统性评分偏差可能随分支扩展被放大。";
} else if (candidates >= 5) {
buys = "候选覆盖,而不是更深的单条推理";
note = "候选相关性会让 nominal N 高估真实探索宽度;继续加样本以前,先问它们是否只是重复同一种错误。";
}
setText("[data-budget-buys]", buys);
setText("[data-budget-note]", note);
}
budgetButtons.forEach((button) => button.addEventListener("click", () => chooseBudgetPreset(button)));
[budgetInput, baseInput, correlationInput, verifierInput].forEach((input) => input?.addEventListener("input", updateBudget));
const profileButtons = [...root.querySelectorAll("[data-rollout-profile]")];
const ratioInput = root.querySelector("[data-ratio-window]");
let profileButton = profileButtons.find((button) => button.getAttribute("aria-pressed") === "true");
const signed = (value) => `${value >= 0 ? "+" : ""}${value.toFixed(2)}`;
function updateGradients() {
if (!profileButton || !ratioInput) return;
const rewards = profileButton.dataset.rewards.split(",").map(Number);
const lengths = profileButton.dataset.lengths.split(",").map(Number);
const ratios = profileButton.dataset.ratios.split(",").map(Number);
const mean = rewards.reduce((sum, value) => sum + value, 0) / rewards.length;
const variance = rewards.reduce((sum, value) => sum + ((value - mean) ** 2), 0) / rewards.length;
const std = Math.sqrt(variance);
const meanLength = lengths.reduce((sum, value) => sum + value, 0) / lengths.length;
const width = Number(ratioInput.value) / 100;
const low = 1 - width;
const high = 1 + width;
let masked = 0;
rewards.forEach((reward, index) => {
const row = root.querySelector(`[data-gradient-row="${index}"]`);
if (!row) return;
const centered = reward - mean;
const normalized = std > 1e-8 ? centered / std : 0;
const grpo = normalized * meanLength / lengths[index];
const dapo = normalized * lengths[index] / meanLength;
const dr = centered;
const values = { grpo, dapo, dr };
row.querySelector("[data-reward]").textContent = reward ? "✓ 1" : "× 0";
row.querySelector("[data-reward]").dataset.correct = String(Boolean(reward));
row.querySelector("[data-length]").textContent = `${(lengths[index] / 1000).toFixed(2)}K`;
row.querySelector("[data-ratio-label]").textContent = `ratio ${ratios[index].toFixed(2)}`;
Object.entries(values).forEach(([key, value]) => {
const bar = row.querySelector(`[data-gradient="${key}"]`);
const label = row.querySelector(`[data-gradient-label="${key}"]`);
bar.dataset.sign = value >= 0 ? "positive" : "negative";
bar.querySelector("b").style.width = `${Math.min(100, Math.abs(value) * 52)}%`;
label.textContent = signed(value);
});
const keep = ratios[index] >= low && ratios[index] <= high;
const mask = row.querySelector("[data-mask]");
mask.dataset.keep = String(keep);
mask.querySelector("b").textContent = keep ? "KEEP" : "MASK";
if (!keep) masked += 1;
});
const hasSignal = std > 1e-8;
setText("[data-ratio-output]", `${low.toFixed(2)}${high.toFixed(2)}`);
setText("[data-group-signal]", hasSignal ? "有相对奖励" : "零相对优势");
setText(
"[data-group-note]",
hasSignal
? "同题组里既有对也有错,组均值 baseline 能产生正负 advantage。"
: "组内 reward 完全相同,减去组均值后全部为零;DAPO 的 Dynamic Sampling 会过滤这类 prompt。",
);
setText("[data-length-effect]", hasSignal ? "三种聚合给长短回答不同权重" : "没有 reward 差异,长度也救不回信号");
setText("[data-mask-count]", `${masked} / 8 被屏蔽`);
}
profileButtons.forEach((button) => button.addEventListener("click", () => {
profileButton = button;
profileButtons.forEach((item) => item.setAttribute("aria-pressed", String(item === button)));
updateGradients();
}));
ratioInput?.addEventListener("input", updateGradients);
const teacherButtons = [...root.querySelectorAll("[data-teacher]")];
const distanceInput = root.querySelector("[data-distance]");
const clipInput = root.querySelector("[data-clip]");
let teacherButton = teacherButtons.find((button) => button.getAttribute("aria-pressed") === "true");
const teacherStories = {
GENERAL: "经验、视觉、推理、faithfulness、search 与 knowledge work 教师。",
AGENT: "长程助手、deep research 与段落写作教师。",
CODING: "SWE、coding experience、kernel 与 web development 教师。",
};
function updateMopd() {
if (!teacherButton || !distanceInput || !clipInput) return;
const domain = teacherButton.dataset.domain;
const effort = teacherButton.dataset.effort;
const distance = Number(distanceInput.value) / 100;
const clip = Number(clipInput.value) / 10;
const effortFactor = { LOW: 0.82, HIGH: 1, MAX: 1.18 }[effort];
const domainOffset = { GENERAL: 0.03, AGENT: 0.08, CODING: -0.02 }[domain];
let clipped = 0;
let kl = 0;
let entropy = 0;
setText("[data-teacher-name]", `${domain} · ${effort}`);
setText("[data-teacher-story]", `${teacherStories[domain]}${effort === "LOW" ? "低 effort 强调预算效率。" : effort === "MAX" ? "最大 effort 允许最长的探索预算。" : "high effort 在探索与预算之间折中。"}`);
setText("[data-distance-output]", `${Math.round(distance * 100)}%`);
setText("[data-clip-output]", clip.toFixed(1));
[...root.querySelectorAll("[data-mopd-token]")].forEach((node, index) => {
const wave = Math.sin(index * 1.71 + domainOffset * 11) * 0.11;
const student = clamp(0.28 + ((index * 17 + effort.length * 9) % 29) / 100 + wave, 0.08, 0.78);
const direction = Math.sin(index * 0.93 + domainOffset * 7) > -0.15 ? 1 : -1;
const teacher = clamp(student * Math.exp(direction * distance * effortFactor * (0.9 + (index % 4) * 0.24)), 0.02, 0.94);
const rawAdvantage = Math.log(teacher) - Math.log(student);
const advantage = clamp(rawAdvantage, -clip, clip);
if (Math.abs(rawAdvantage) > clip) clipped += 1;
kl += Math.abs(rawAdvantage) * student;
entropy += -(student * Math.log(student) + (1 - student) * Math.log(1 - student));
node.querySelector("[data-student-prob]").style.width = `${student * 100}%`;
node.querySelector("[data-teacher-prob]").style.width = `${teacher * 100}%`;
node.querySelector("[data-student-label]").textContent = `S ${student.toFixed(2)}`;
node.querySelector("[data-teacher-label]").textContent = `T ${teacher.toFixed(2)}`;
const advantageNode = node.querySelector("[data-token-advantage]");
advantageNode.textContent = signed(advantage);
advantageNode.dataset.sign = advantage >= 0 ? "positive" : "negative";
});
kl /= 12;
entropy = entropy / 12 * (1 - Math.max(0, distance - 0.45) * 0.62);
setText("[data-mopd-kl]", kl.toFixed(3));
setText("[data-mopd-clipped]", `${clipped} / 12`);
setText("[data-mopd-entropy]", entropy.toFixed(2));
let warning = "同源教师分布接近,信号强且仍可控";
if (distance > 0.68) warning = "教师虽可能更强,但分布距离已进入高风险区";
else if (distance > 0.42) warning = "分布差异开始放大 punitive gradient 与熵收缩风险";
setText("[data-mopd-warning]", warning);
}
teacherButtons.forEach((button) => button.addEventListener("click", () => {
teacherButton = button;
teacherButtons.forEach((item) => item.setAttribute("aria-pressed", String(item === button)));
updateMopd();
}));
[distanceInput, clipInput].forEach((input) => input?.addEventListener("input", updateMopd));
updateBudget();
updateGradients();
updateMopd();
})();
</script>
<style>
.reasoning-lab {
color: var(--ink);
background:
linear-gradient(135deg, color-mix(in srgb, var(--paper) 92%, var(--blue-pale)), var(--paper) 48%),
var(--paper);
border: 1px solid var(--line-strong);
box-shadow: 0 28px 80px rgb(35 45 60 / 10%);
}
.lab-header,
.view-intro {
display: grid;
grid-template-columns: minmax(0, 1.1fr) minmax(320px, 0.9fr);
gap: 48px;
align-items: end;
padding: 34px 38px;
border-bottom: 1px solid var(--line);
}
.lab-header > div > p,
.panel-kicker,
.panel-label span,
.teacher-matrix span,
.mopd-controls > div > span {
color: var(--copper);
font: 0.64rem/1.3 var(--mono);
letter-spacing: 0.11em;
}
.lab-header h3,
.view-intro h3 {
margin-top: 11px;
max-width: 760px;
font-size: clamp(1.35rem, 2.5vw, 2.25rem);
line-height: 1.12;
}
.lab-header > p,
.view-intro > p {
color: var(--muted);
font-size: 0.78rem;
line-height: 1.85;
}
.mode-tabs {
display: grid;
grid-template-columns: repeat(3, 1fr);
border-bottom: 1px solid var(--line-strong);
}
.mode-tabs button {
display: grid;
grid-template-columns: 36px 1fr;
gap: 5px 12px;
padding: 20px 24px;
color: var(--muted);
text-align: left;
background: transparent;
border: 0;
border-right: 1px solid var(--line);
cursor: pointer;
}
.mode-tabs button:last-child { border-right: 0; }
.mode-tabs button[aria-selected="true"] {
color: var(--ink);
background: var(--blue-pale);
box-shadow: inset 0 -3px 0 var(--blue);
}
.mode-tabs span { grid-row: 1 / 3; color: var(--copper); font: 0.68rem/1 var(--mono); }
.mode-tabs b { font-size: 0.88rem; }
.mode-tabs small { font: 0.58rem/1.4 var(--mono); }
.lab-view[hidden] { display: none; }
.view-intro { padding-block: 30px; }
.view-intro h3 { font-size: clamp(1.25rem, 2vw, 1.75rem); }
.budget-presets,
.grpo-toolbar {
display: flex;
flex-wrap: wrap;
gap: 8px;
padding: 22px 38px;
border-bottom: 1px solid var(--line);
}
.budget-presets button,
.grpo-toolbar button {
padding: 10px 13px;
color: var(--muted);
font: 0.64rem/1 var(--mono);
background: var(--paper);
border: 1px solid var(--line-strong);
cursor: pointer;
}
.budget-presets button[aria-pressed="true"],
.grpo-toolbar button[aria-pressed="true"] {
color: white;
background: var(--blue);
border-color: var(--blue);
}
.budget-workbench {
display: grid;
grid-template-columns: minmax(260px, 0.72fr) minmax(0, 1.28fr);
border-bottom: 1px solid var(--line);
}
.budget-controls {
display: grid;
gap: 24px;
padding: 28px 38px;
border-right: 1px solid var(--line);
}
label > span {
display: flex;
justify-content: space-between;
gap: 18px;
margin-bottom: 12px;
font-size: 0.72rem;
}
label output { color: var(--copper); font: 0.65rem/1 var(--mono); }
input[type="range"] { width: 100%; accent-color: var(--blue); }
label > small {
display: flex;
align-items: center;
gap: 10px;
margin-top: 8px;
color: var(--muted);
font: 0.55rem/1 var(--mono);
}
label > small i { flex: 1; height: 1px; background: var(--line-strong); }
.allocation-panel { padding: 28px 38px; }
.panel-label { display: flex; justify-content: space-between; gap: 24px; }
.panel-label b { font: 0.68rem/1 var(--mono); }
.allocation-bar { display: flex; height: 76px; margin-top: 23px; overflow: hidden; background: var(--warm-gray); }
.allocation-bar i {
display: flex;
align-items: flex-end;
min-width: 3px;
padding: 10px;
color: white;
font-style: normal;
transition: width 240ms ease;
}
.allocation-bar i:nth-child(1) { background: var(--navy); }
.allocation-bar i:nth-child(2) { background: var(--blue); }
.allocation-bar i:nth-child(3) { background: var(--copper); }
.allocation-bar i:nth-child(4) { background: var(--sage); }
.allocation-bar span { font: 0.56rem/1 var(--mono); }
.allocation-readout {
display: grid;
grid-template-columns: repeat(4, 1fr);
margin-top: 20px;
border-top: 1px solid var(--line);
border-left: 1px solid var(--line);
}
.allocation-readout div { padding: 14px; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); }
.allocation-readout span { display: block; color: var(--muted); font-size: 0.6rem; }
.allocation-readout b { display: block; margin-top: 8px; font: 0.78rem/1 var(--mono); }
.trajectory-strip { display: flex; align-items: end; gap: 5px; height: 82px; margin-top: 22px; }
.trajectory-strip i { position: relative; flex: 1; height: var(--length); min-width: 3px; background: color-mix(in srgb, var(--blue) 18%, var(--paper)); }
.trajectory-strip i::after { content: ""; position: absolute; inset: auto 0 0; height: 5px; background: var(--blue); }
.trajectory-strip i[data-correct="true"]::after { background: var(--sage); }
.metric-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
border-bottom: 1px solid var(--line);
}
.metric-grid article { min-height: 150px; padding: 24px; border-right: 1px solid var(--line); }
.metric-grid article:last-child { border-right: 0; }
.metric-grid span { color: var(--copper); font: 0.56rem/1.3 var(--mono); }
.metric-grid b { display: block; margin: 15px 0 10px; font: 1.28rem/1 var(--mono); }
.metric-grid p { color: var(--muted); font-size: 0.64rem; line-height: 1.6; }
.interpretation {
display: grid;
grid-template-columns: 0.75fr 1.25fr;
gap: 36px;
padding: 24px 38px;
background: color-mix(in srgb, var(--blue-pale) 62%, var(--paper));
border-bottom: 1px solid var(--line);
}
.interpretation span { display: block; color: var(--copper); font: 0.58rem/1 var(--mono); }
.interpretation b { display: block; margin-top: 9px; font-size: 0.86rem; }
.interpretation p { color: var(--muted); font-size: 0.72rem; line-height: 1.75; }
.grpo-toolbar { justify-content: space-between; align-items: center; }
.grpo-toolbar > div { display: flex; gap: 8px; }
.grpo-toolbar label { width: min(330px, 100%); }
.gradient-table { padding: 24px 38px 32px; overflow-x: auto; border-bottom: 1px solid var(--line); }
.gradient-head,
.gradient-row {
display: grid;
grid-template-columns: 98px 72px 74px repeat(3, minmax(105px, 1fr)) 92px;
min-width: 880px;
}
.gradient-head { color: var(--muted); font: 0.55rem/1 var(--mono); border-bottom: 1px solid var(--line-strong); }
.gradient-head span { padding: 10px 8px; }
.gradient-row { align-items: center; min-height: 62px; border-bottom: 1px solid var(--line); }
.gradient-row > span { padding: 8px; font-size: 0.65rem; }
.gradient-row > span:first-child b { font: 0.74rem/1 var(--mono); }
.gradient-row > span:first-child small { display: block; margin-top: 5px; color: var(--muted); font: 0.5rem/1 var(--mono); }
[data-reward][data-correct="true"] { color: var(--sage); }
[data-reward][data-correct="false"] { color: var(--red); }
[data-gradient] { display: block; width: 70%; height: 6px; background: var(--warm-gray); }
[data-gradient] b { display: block; height: 100%; background: var(--sage); transition: width 180ms ease; }
[data-gradient][data-sign="negative"] b { background: var(--red); }
[data-gradient-label] { margin-left: 7px; color: var(--muted); font: 0.5rem/1 var(--mono); }
[data-mask] { display: flex; align-items: center; gap: 7px; font: 0.54rem/1 var(--mono); }
[data-mask] i { width: 8px; height: 8px; border-radius: 50%; background: var(--sage); }
[data-mask][data-keep="false"] { color: var(--red); }
[data-mask][data-keep="false"] i { background: var(--red); }
.grpo-summary,
.formula-comparison {
display: grid;
grid-template-columns: repeat(3, 1fr);
border-bottom: 1px solid var(--line);
}
.grpo-summary article,
.formula-comparison article { padding: 25px 30px; border-right: 1px solid var(--line); }
.grpo-summary article:last-child,
.formula-comparison article:last-child { border-right: 0; }
.grpo-summary span,
.formula-comparison span { color: var(--copper); font: 0.56rem/1 var(--mono); }
.grpo-summary b,
.formula-comparison b { display: block; margin: 12px 0; font-size: 0.82rem; }
.grpo-summary p,
.formula-comparison p { color: var(--muted); font-size: 0.66rem; line-height: 1.7; }
.formula-comparison { grid-template-columns: repeat(4, 1fr); background: var(--warm-gray); }
.mopd-grid { display: grid; grid-template-columns: 1.2fr 0.8fr; border-bottom: 1px solid var(--line); }
.teacher-matrix {
position: relative;
display: grid;
grid-template-columns: 90px repeat(3, 1fr);
grid-template-rows: 42px repeat(3, 100px);
gap: 1px;
padding: 28px 38px;
background: var(--line);
border-right: 1px solid var(--line);
}
.matrix-head { display: contents; }
.matrix-head span,
.matrix-head b,
.row-name { display: grid; place-items: center; background: var(--paper); }
.matrix-head b { font: 0.58rem/1 var(--mono); }
.row-name { color: var(--muted) !important; writing-mode: vertical-rl; font-size: 0.54rem !important; }
.row-name:nth-of-type(1) { grid-column: 1; grid-row: 2; }
.row-name:nth-of-type(2) { grid-column: 1; grid-row: 3; }
.row-name:nth-of-type(3) { grid-column: 1; grid-row: 4; }
.teacher-matrix button {
position: relative;
display: grid;
place-items: center;
gap: 5px;
color: var(--muted);
background: var(--paper);
border: 0;
cursor: pointer;
}
.teacher-matrix button i { width: 13px; height: 13px; border: 1px solid var(--blue); border-radius: 50%; }
.teacher-matrix button b { font: 0.66rem/1 var(--mono); }
.teacher-matrix button small { font: 0.48rem/1 var(--mono); }
.teacher-matrix button[aria-pressed="true"] { color: white; background: var(--blue); }
.teacher-matrix button[aria-pressed="true"] i { background: white; border-color: white; }
.teacher-matrix button:nth-of-type(1) { grid-column: 2; grid-row: 2; }
.teacher-matrix button:nth-of-type(2) { grid-column: 3; grid-row: 2; }
.teacher-matrix button:nth-of-type(3) { grid-column: 4; grid-row: 2; }
.teacher-matrix button:nth-of-type(4) { grid-column: 2; grid-row: 3; }
.teacher-matrix button:nth-of-type(5) { grid-column: 3; grid-row: 3; }
.teacher-matrix button:nth-of-type(6) { grid-column: 4; grid-row: 3; }
.teacher-matrix button:nth-of-type(7) { grid-column: 2; grid-row: 4; }
.teacher-matrix button:nth-of-type(8) { grid-column: 3; grid-row: 4; }
.teacher-matrix button:nth-of-type(9) { grid-column: 4; grid-row: 4; }
.mopd-controls { display: grid; align-content: center; gap: 30px; padding: 34px 38px; }
.mopd-controls > div > b { display: block; margin: 11px 0; font-size: 1.15rem; }
.mopd-controls > div > p { color: var(--muted); font-size: 0.7rem; line-height: 1.7; }
.token-prefill { padding: 28px 38px; border-bottom: 1px solid var(--line); overflow-x: auto; }
.token-flow { display: grid; grid-template-columns: repeat(12, minmax(68px, 1fr)); gap: 8px; min-width: 900px; margin-top: 25px; }
.token-flow > div { padding: 12px 9px; background: var(--warm-gray); }
.token-flow > div > b { display: block; min-height: 30px; font-size: 0.7rem; text-align: center; }
.token-flow > div > span { position: relative; display: block; height: 7px; margin-top: 8px; background: var(--paper); }
.token-flow > div > span i { display: block; height: 100%; background: var(--blue); }
.token-flow > div > span:nth-of-type(2) i { background: var(--copper); }
.token-flow small { position: absolute; top: 10px; left: 0; color: var(--muted); font: 0.45rem/1 var(--mono); }
.token-flow em { display: block; margin-top: 22px; color: var(--sage); font: 0.55rem/1 var(--mono); font-style: normal; text-align: center; }
.token-flow em[data-sign="negative"] { color: var(--red); }
.prob-legend { display: flex; gap: 20px; margin-top: 24px; color: var(--muted); font: 0.54rem/1 var(--mono); }
.prob-legend span { display: flex; align-items: center; gap: 7px; }
.prob-legend i { width: 14px; height: 5px; background: var(--blue); }
.prob-legend i.teacher { background: var(--copper); }
.mopd-pipeline { display: grid; grid-template-columns: 1fr 30px 1fr 30px 1fr 30px 1fr; align-items: stretch; border-bottom: 1px solid var(--line); }
.mopd-pipeline article { padding: 24px; }
.mopd-pipeline > i { display: grid; place-items: center; color: var(--copper); font-style: normal; }
.mopd-pipeline span { color: var(--copper); font: 0.56rem/1 var(--mono); }
.mopd-pipeline b { display: block; margin: 10px 0; font-size: 0.78rem; }
.mopd-pipeline p { color: var(--muted); font-size: 0.64rem; line-height: 1.55; }
.lab-footnote { display: grid; grid-template-columns: 180px 1fr; gap: 28px; padding: 24px 38px; background: var(--navy); color: white; }
.lab-footnote b { font-size: 0.8rem; }
.lab-footnote p { color: rgb(255 255 255 / 70%); font-size: 0.7rem; line-height: 1.7; }
@media (max-width: 900px) {
.lab-header,
.view-intro,
.budget-workbench,
.mopd-grid,
.interpretation { grid-template-columns: 1fr; }
.mode-tabs { grid-template-columns: 1fr; }
.mode-tabs button { border-right: 0; border-bottom: 1px solid var(--line); }
.budget-controls,
.teacher-matrix { border-right: 0; border-bottom: 1px solid var(--line); }
.metric-grid,
.grpo-summary,
.formula-comparison { grid-template-columns: repeat(2, 1fr); }
.metric-grid article:nth-child(2),
.grpo-summary article:nth-child(2),
.formula-comparison article:nth-child(2) { border-right: 0; }
.mopd-pipeline { grid-template-columns: 1fr; }
.mopd-pipeline > i { transform: rotate(90deg); min-height: 26px; }
}
@media (max-width: 620px) {
.lab-header,
.view-intro,
.budget-controls,
.allocation-panel,
.gradient-table,
.mopd-controls,
.token-prefill { padding-inline: 20px; }
.budget-presets,
.grpo-toolbar { padding-inline: 20px; }
.allocation-readout,
.metric-grid,
.grpo-summary,
.formula-comparison { grid-template-columns: 1fr 1fr; }
.allocation-readout div:nth-child(2),
.metric-grid article:nth-child(2n),
.grpo-summary article:nth-child(2),
.formula-comparison article:nth-child(2n) { border-right: 0; }
.teacher-matrix { grid-template-columns: 60px repeat(3, 1fr); padding-inline: 20px; }
.teacher-matrix button small { display: none; }
.mopd-pipeline article { padding: 20px; }
.lab-footnote { grid-template-columns: 1fr; padding-inline: 20px; }
.prob-legend { flex-wrap: wrap; }
}
</style>
+1
View File
@@ -7,6 +7,7 @@
<a href="/roadmap/">学习地图</a>
<a href="/moe/">MoE 专题</a>
<a href="/long-context/">长上下文专题</a>
<a href="/reasoning/">推理专题</a>
<a href="/progress/">研究进度</a>
<a href="https://git.k1412.top/wuyang/llm-atlas" rel="noreferrer">开放源码</a>
<a href="https://github.com/MoonshotAI/Kimi-K3" rel="noreferrer">K3 官方报告</a>
+1
View File
@@ -12,6 +12,7 @@ const items = [
{ id: "foundations", href: "/foundations/", label: "基础原理" },
{ id: "moe", href: "/moe/", label: "MoE" },
{ id: "long-context", href: "/long-context/", label: "长上下文" },
{ id: "reasoning", href: "/reasoning/", label: "推理" },
{ id: "papers", href: "/papers/", label: "论文库" },
{ id: "progress", href: "/progress/", label: "进度" },
];
+3 -3
View File
@@ -165,9 +165,9 @@ export const chapters: Chapter[] = [
kicker: "REASONING",
question: "模型如何学会多想一会儿,并检查自己的答案?",
summary: "从 CoT、搜索与验证器,到 GRPO、DeepSeek-R1、Kimi k1.5 和 multi-effort RL。",
status: "researching",
progress: 25,
papers: 21,
status: "published",
progress: 76,
papers: 30,
prerequisites: ["10"],
highlights: ["GRPO", "R1-Zero", "On-policy 蒸馏"],
},
+133 -5
View File
@@ -760,6 +760,30 @@ export const papers: Paper[] = [
contribution: "用中间推理示例显著提升大模型复杂任务表现。",
verified: true,
},
{
year: 2022,
title: "Large Language Models are Zero-Shot Reasoners",
url: "https://arxiv.org/abs/2205.11916",
topics: ["推理"],
contribution: "用统一的 step-by-step 触发语句,在不提供 few-shot rationale 时激发多任务零样本 CoT。",
verified: true,
},
{
year: 2022,
title: "Solving Quantitative Reasoning Problems with Language Models",
url: "https://arxiv.org/abs/2206.14858",
topics: ["推理", "Scaling"],
contribution: "Minerva 以技术内容继续训练语言模型,系统推进数学与科学定量推理。",
verified: true,
},
{
year: 2021,
title: "Training Verifiers to Solve Math Word Problems",
url: "https://arxiv.org/abs/2110.14168",
topics: ["推理", "后训练"],
contribution: "建立 GSM8K,并系统展示多采样后由学习式 verifier 选择答案的收益。",
verified: true,
},
{
year: 2022,
title: "Self-Consistency Improves Chain of Thought Reasoning in Language Models",
@@ -768,6 +792,14 @@ export const papers: Paper[] = [
contribution: "采样多条推理路径并对最终答案聚合。",
verified: true,
},
{
year: 2022,
title: "Least-to-Most Prompting Enables Complex Reasoning in Large Language Models",
url: "https://arxiv.org/abs/2205.10625",
topics: ["推理"],
contribution: "先把难题分解成子问题,再按顺序利用已解结果组合答案。",
verified: true,
},
{
year: 2022,
title: "STaR: Bootstrapping Reasoning With Reasoning",
@@ -776,6 +808,30 @@ export const papers: Paper[] = [
contribution: "迭代生成、筛选并训练成功 rationale。",
verified: true,
},
{
year: 2022,
title: "Solving Math Word Problems With Process- and Outcome-Based Feedback",
url: "https://arxiv.org/abs/2211.14275",
topics: ["推理", "后训练"],
contribution: "在 GSM8K 中比较过程与结果反馈,揭示最终正确率和推理轨迹错误率的不同需求。",
verified: true,
},
{
year: 2022,
title: "Program of Thoughts Prompting: Disentangling Computation from Reasoning for Numerical Reasoning Tasks",
url: "https://arxiv.org/abs/2211.12588",
topics: ["推理", "Agent"],
contribution: "让模型用程序表达推理,把数值计算交给外部执行器。",
verified: true,
},
{
year: 2023,
title: "Self-Refine: Iterative Refinement with Self-Feedback",
url: "https://arxiv.org/abs/2303.17651",
topics: ["推理"],
contribution: "由同一模型循环生成、反馈与修订,在不追加训练的情况下扩展串行测试时计算。",
verified: true,
},
{
year: 2023,
title: "Tree of Thoughts: Deliberate Problem Solving with Large Language Models",
@@ -784,12 +840,20 @@ export const papers: Paper[] = [
contribution: "显式搜索多个 thought 分支并评估中间状态。",
verified: true,
},
{
year: 2023,
title: "Language Models Don't Always Say What They Think: Unfaithful Explanations in Chain-of-Thought Prompting",
url: "https://arxiv.org/abs/2305.04388",
topics: ["推理", "评测"],
contribution: "用偏置提示实验表明,流畅的公开 CoT 可能合理化答案而不忠实披露影响因素。",
verified: true,
},
{
year: 2023,
title: "Let's Verify Step by Step",
url: "https://arxiv.org/abs/2305.20050",
topics: ["推理", "后训练"],
contribution: "过程奖励模型在数学推理中优于只看最终答案。",
contribution: "发布 PRM800K;在 500 题 MATH 子集的 best-of-1860 选择中验证过程监督优势。",
verified: true,
},
{
@@ -809,12 +873,36 @@ export const papers: Paper[] = [
spotlight: "DeepSeek",
verified: true,
},
{
year: 2024,
title: "Scaling LLM Test-Time Compute Optimally can be More Effective than Scaling Model Parameters",
url: "https://arxiv.org/abs/2408.03314",
topics: ["推理", "Scaling"],
contribution: "按模型与题目难度在修订、并行采样和 PRM 搜索之间分配测试时计算。",
verified: true,
},
{
year: 2024,
title: "Tülu 3: Pushing Frontiers in Open Language Model Post-Training",
url: "https://arxiv.org/abs/2411.15124",
topics: ["后训练", "推理"],
contribution: "开放从数据策展、SFT、偏好学习到 RLVR 的完整 post-training 配方。",
verified: true,
},
{
year: 2024,
title: "OpenAI o1 System Card",
url: "https://arxiv.org/abs/2412.16720",
topics: ["推理", "评测"],
contribution: "记录 reasoning model 的能力、安全评测与测试时推理边界。",
verified: true,
},
{
year: 2025,
title: "DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning",
url: "https://arxiv.org/abs/2501.12948",
topics: ["推理", "后训练"],
contribution: "R1-Zero 纯 RL 涌现推理R1 冷启动、多阶段训练与蒸馏。",
contribution: "R1-Zero 从 base 直接做规则奖励 RLR1 再加入冷启动、SFT、多阶段 RL 与蒸馏。",
spotlight: "DeepSeek",
verified: true,
},
@@ -823,10 +911,50 @@ export const papers: Paper[] = [
title: "Kimi k1.5: Scaling Reinforcement Learning with LLMs",
url: "https://arxiv.org/abs/2501.12599",
topics: ["推理", "后训练"],
contribution: "扩展长 CoT 强化学习和测试时计算。",
contribution: "用 128K RL context、partial rollout 与 long2short 扩展长 CoT 和测试时计算。",
spotlight: "Kimi",
verified: true,
},
{
year: 2025,
title: "s1: Simple test-time scaling",
url: "https://arxiv.org/abs/2501.19393",
topics: ["推理", "后训练"],
contribution: "从强教师精选 1K 道推理题蒸馏,并用 budget forcing 控制思考长度。",
verified: true,
},
{
year: 2025,
title: "DAPO: An Open-Source LLM Reinforcement Learning System at Scale",
url: "https://arxiv.org/abs/2503.14476",
topics: ["推理", "后训练"],
contribution: "用 Clip-Higher、Dynamic Sampling、token-level loss 与 overlong shaping 稳定长 CoT RL。",
verified: true,
},
{
year: 2025,
title: "Understanding R1-Zero-Like Training: A Critical Perspective",
url: "https://arxiv.org/abs/2503.20783",
topics: ["推理", "后训练"],
contribution: "提出 Dr.GRPO,分析 response-length 与 question-difficulty 两种优化偏置。",
verified: true,
},
{
year: 2025,
title: "Does Reinforcement Learning Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model?",
url: "https://arxiv.org/abs/2504.13837",
topics: ["推理", "后训练", "评测"],
contribution: "用 pass@k 检查当前 RLVR 是扩展解法覆盖,还是主要重排已有正确路径。",
verified: true,
},
{
year: 2026,
title: "MOPD: Multi-Teacher On-Policy Distillation for Capability Integration in LLM Post-Training",
url: "https://arxiv.org/abs/2606.30406",
topics: ["推理", "后训练", "Agent"],
contribution: "让学生在自己的 rollout 上接收同源领域教师的稠密逐 Token 信号,整合多项 RL 能力。",
verified: true,
},
{
year: 2021,
title: "WebGPT: Browser-assisted Question-Answering with Human Feedback",
@@ -927,8 +1055,8 @@ export const papers: Paper[] = [
year: 2025,
title: "Kimi K2: Open Agentic Intelligence",
url: "https://arxiv.org/abs/2507.20534",
topics: ["MoE", "Agent", "后训练"],
contribution: "开放 1T MoE Agent 模型,强调工具调用数据合成与 joint RL。",
topics: ["MoE", "Agent", "后训练", "推理"],
contribution: "开放 1T MoE Agent 模型,以 verifiable gym 与 self-critique rubric 做 joint RL。",
spotlight: "Kimi",
verified: true,
},
+1
View File
@@ -313,6 +313,7 @@ const toc = [
增加推理计算可以转化为能力;不是“输出越长越聪明”。
</p>
</div>
<a class="button primary" href="/reasoning/#deepseek">进入推理专题:从 DeepSeekMath、R1 到 DAPO / Dr.GRPO 的完整推导 →</a>
</section>
<section class="article-section" id="v32">
+32 -1
View File
@@ -9,6 +9,7 @@ const routes: Record<string, string> = {
foundations: "/foundations/",
moe: "/moe/",
"long-context": "/long-context/",
reasoning: "/reasoning/",
};
const paths = [
@@ -78,6 +79,7 @@ const paths = [
<a class="button" href="/deepseek/">DeepSeek 专题</a>
<a class="button" href="/moe/">MoE 专题</a>
<a class="button" href="/long-context/">长上下文专题</a>
<a class="button" href="/reasoning/">推理专题</a>
</div>
</div>
<aside class="hero-aside" aria-label="项目统计">
@@ -87,7 +89,7 @@ const paths = [
<div class="hero-stats">
<div><b>16</b><span>核心专题</span></div>
<div><b>151</b><span>K3 报告来源</span></div>
<div><b>130</b><span>关键论文索引</span></div>
<div><b>146</b><span>关键论文索引</span></div>
<div><b>47p</b><span>K3 技术报告</span></div>
</div>
</aside>
@@ -101,6 +103,22 @@ const paths = [
<section class="section compact release-section" id="new-chapters">
<div class="release-grid">
<a class="release-card reasoning-release" href="/reasoning/">
<div>
<p class="eyebrow"><span>NEW / CHAPTER 11</span> REASONING & TEST-TIME SCALING</p>
<h2>“多想一会儿”,到底把计算花到了哪里?</h2>
<p>
把推理拆成结果、覆盖、选择、过程、预算、优化、分布与系统八张账,
从 CoT、verifier 与 GRPO 一路走到 DeepSeek-R1、Kimi k1.5 与 K3 MOPD。
</p>
</div>
<dl>
<div><dt>LINEAGE</dt><dd>2021 → 2026</dd></div>
<div><dt>PAPERS</dt><dd>30 篇一手来源</dd></div>
<div><dt>LAB</dt><dd>预算 · GRPO · 九教师</dd></div>
</dl>
<span class="release-arrow" aria-hidden="true">进入推理专题 →</span>
</a>
<a class="release-card moe-release" href="/moe/">
<div>
<p class="eyebrow"><span>NEW / CHAPTER 06</span> SPARSE EXPERTS</p>
@@ -366,6 +384,15 @@ const paths = [
transition: transform 180ms ease, border-color 180ms ease;
}
.reasoning-release {
grid-column: 1 / -1;
min-height: 510px;
background:
radial-gradient(circle at 82% 18%, rgba(56, 91, 128, 0.17), transparent 30%),
radial-gradient(circle at 63% 72%, rgba(150, 93, 58, 0.11), transparent 28%),
var(--paper-raised);
}
.release-card:hover {
transform: translateY(-3px);
border-color: var(--copper);
@@ -428,6 +455,10 @@ const paths = [
padding-bottom: 76px;
}
.reasoning-release {
grid-column: auto;
}
.release-card dl {
margin: 0;
}
+1
View File
@@ -378,6 +378,7 @@ const toc = [
On-policy distillation 让学生自己生成当前前缀,再在这个前缀上比较教师和学生对下一个 Token 的概率,
形成稠密 reward。这样训练分布更贴近学生真正会访问的状态,也能自然结合 partial rollout。
</p>
<a class="button primary" href="/reasoning/#k3">进入推理专题:并排理解 partial rollout、reasoning effort 与 MOPD →</a>
<h3>部署约束直接进入后训练</h3>
<p>
+1 -1
View File
@@ -683,7 +683,7 @@ const paperChain = [
<div class="next-links">
<a class="button primary" href="/k3/#moe">回到 K3:在整机架构中定位 Stable LatentMoE →</a>
<a class="button" href="/deepseek/">DeepSeek 完整论文谱系</a>
<a class="button" href="/papers/">搜索全部 130 篇论文</a>
<a class="button" href="/papers/">搜索全部 146 篇论文</a>
</div>
</section>
</article>
+13 -10
View File
@@ -7,11 +7,12 @@ const published = chapters.filter((chapter) => chapter.status === "published").l
const researching = chapters.filter((chapter) => ["researching", "drafting"].includes(chapter.status)).length;
const workstreams = [
{ label: "研究框架与规范", value: 76, next: "给 130 篇索引补充逐篇精读层级" },
{ label: "研究框架与规范", value: 82, next: "给推理专题补逐篇图表/实验精读层级" },
{ label: "网站设计系统", value: 89, next: "打印样式与更多通用可视化组件" },
{ label: "Kimi K3 深读", value: 55, next: "扩写 scaling / infra 逐图笔记" },
{ label: "Kimi K3 深读", value: 64, next: "扩写 scaling / pre-training / infra 逐图笔记" },
{ label: "Transformer 基础", value: 52, next: "加入矩阵形状动画与手算练习" },
{ label: "DeepSeek 专题", value: 61, next: "GRPO 完整公式与训练轨迹推导" },
{ label: "DeepSeek 专题", value: 71, next: "补 R1 / DAPO 的逐图训练轨迹与复现对照" },
{ label: "推理与测试时扩展", value: 76, next: "真实模型采样曲线、PRM 案例与逐篇图表精读" },
{ label: "稀疏计算与 MoE", value: 74, next: "补充真实集群 traces 与专家特化案例" },
{ label: "长上下文专题", value: 72, next: "加入更多论文逐图笔记与真实模型配置对比" },
{ label: "引用与事实检查", value: 54, next: "自动化外链复查与来源等级扩展" },
@@ -38,7 +39,7 @@ const workstreams = [
<div><dt>OVERALL</dt><dd>专题平均 {average}%</dd></div>
<div><dt>READABLE</dt><dd>{published} 个首版可读专题</dd></div>
<div><dt>ACTIVE</dt><dd>{researching} 个研究/写作中</dd></div>
<div><dt>UPDATED</dt><dd>2026-07-28 23:24 CST</dd></div>
<div><dt>UPDATED</dt><dd>2026-07-29 00:38 CST</dd></div>
<div><dt>MODE</dt><dd>持续迭代,不锁死版本</dd></div>
</dl>
</div>
@@ -48,7 +49,7 @@ const workstreams = [
<div class="section-heading">
<div>
<p class="eyebrow"><span>01</span> WORKSTREAMS</p>
<h2>条工作流同时推进,但不混淆“有页面”和“已核验”</h2>
<h2>条工作流同时推进,但不混淆“有页面”和“已核验”</h2>
</div>
<p class="section-lead">
内容首版优先打通全局脉络;随后每轮迭代选择一个专题推进到论文/工程层,并做独立事实复核。
@@ -85,11 +86,12 @@ const workstreams = [
<article><span>✓</span><h3>K3 报告已结构化拆解</h3><p>47 页报告目录、151 条参考来源和架构/后训练/系统主线已经提取。</p></article>
<article><span>✓</span><h3>16 专题知识图</h3><p>从语言模型基础到评测安全,包含先修依赖和三条贯穿案例。</p></article>
<article><span>✓</span><h3>编辑式网站系统</h3><p>响应式导航、章节模板、侧栏、进度、论文链和证据提示组件。</p></article>
<article><span>✓</span><h3>五张原创交互图</h3><p>K3 三轴架构、Self-Attention Query、DeepSeek 谱系、长上下文成本与 MoE 路由实验。</p></article>
<article><span>✓</span><h3>篇首版长文</h3><p>K3 导读、Transformer 基础、DeepSeek 谱系、长上下文MoE 专题。</p></article>
<article><span>✓</span><h3>八个原创交互图</h3><p>K3、注意力、DeepSeek、长上下文、MoE,以及推理预算/GRPO/MOPD 三页签实验。</p></article>
<article><span>✓</span><h3>篇首版长文</h3><p>K3 导读、Transformer 基础、DeepSeek 谱系、长上下文MoE 与推理专题。</p></article>
<article><span>✓</span><h3>长上下文深度专题</h3><p>五张成本账、26 篇一手论文、10+ 机制图与 8 策略交互实验室。</p></article>
<article><span>✓</span><h3>MoE 深度专题</h3><p>六张账、19 篇一手论文、DeepSeek/K3 主线与路由—容量—通信交互实验室。</p></article>
<article><span>✓</span><h3>130 篇关键论文索引</h3><p>覆盖 12 个专题,支持全文搜索、标签筛选与 Kimi/DeepSeek 聚光主线。</p></article>
<article><span>✓</span><h3>推理深度专题</h3><p>八张账、30 篇一手论文链、DeepSeek/Kimi 双主线与三页签互动实验室。</p></article>
<article><span>✓</span><h3>146 篇关键论文索引</h3><p>覆盖 12 个专题,支持全文搜索、标签筛选与 Kimi/DeepSeek 聚光主线。</p></article>
<article><span>✓</span><h3>公开仓库与自托管发布</h3><p>源码公开到 git.k1412.top,网站由不可变镜像、Compose Manager 与 HTTPS 交付。</p></article>
</div>
</section>
@@ -104,10 +106,10 @@ const workstreams = [
</div>
<div class="queue-table">
<div class="head"><b>优先级</b><b>专题</b><b>本轮交付</b><b>完成闸门</b></div>
<div><span>P0</span><strong>推理模型与测试时扩展</strong><p>CoT → verifier → GRPO → R1 → k1.5 → K3 MOPD</p><em>奖励/预算交互图</em></div>
<div><span>P0</span><strong>大规模训练系统</strong><p>ZeRO / Megatron → Expert/Context Parallel → DualPipe / MoonEP</p><em>显存与通信计算器</em></div>
<div><span>P1</span><strong>长上下文二轮深化</strong><p>真实模型配置 → 内核细节 → 长上下文评测与失败案例</p><em>配置比较器 + 逐图论文笔记</em></div>
<div><span>P1</span><strong>MoE 二轮深化</strong><p>真实负载 traces → 专家特化可解释性 → 共享专家语义</p><em>案例库 + 集群证据</em></div>
<div><span>P1</span><strong>大规模训练系统</strong><p>ZeRO/Megatron → Expert/Context Parallel → DualPipe/MoonEP</p><em>显存与通信计算器</em></div>
<div><span>P1</span><strong>推理二轮深化</strong><p>真实 pass@k 曲线 → PRM 失败案例 → 逐篇图表精读</p><em>案例库 + 真实 traces</em></div>
<div><span>P2</span><strong>原生多模态</strong><p>ViT/CLIP → connector VLM → Kimi-VL/MoonViT-V2</p><em>视觉 Token 流程图</em></div>
</div>
</section>
@@ -147,6 +149,7 @@ const workstreams = [
<div><time>2026-07-28</time><b>优先原创重绘</b><p>架构图做成可缩放 SVG/HTML,明确简化与来源。</p></div>
<div><time>2026-07-28</time><b>双重开放许可</b><p>代码 MIT,原创文字与图 CC BY-SA 4.0。</p></div>
<div><time>2026-07-28</time><b>自托管交付</b><p>源码公开到 git.k1412.top,网站部署到 k1412 私有基础设施。</p></div>
<div><time>2026-07-29</time><b>推理按八张账组织</b><p>把答案、覆盖、选择、过程、预算、优化、分布与系统证据分开核算。</p></div>
</div>
</section>
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -128,7 +128,9 @@
.reading-progress {
position: fixed;
z-index: 100;
inset: 0 0 auto;
inset: 0 auto auto 0;
width: 100vw;
max-width: 100%;
height: 3px;
overflow: hidden;
}