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
+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;
}