From c9eddd5be81ee1e221248195f0ff09ff7caeb61a Mon Sep 17 00:00:00 2001 From: iomgaa Date: Sat, 18 Jul 2026 02:23:49 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20=E4=BF=AE=E6=AD=A3=20=CF=80=CC=82=20det?= =?UTF-8?q?ach=20=E5=A4=B1=E8=B4=A5=E6=9C=BA=E5=88=B6=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E5=90=91=E6=80=A7=E9=94=99=E8=AF=AF=EF=BC=88=E5=8E=8B=E4=BD=8E?= =?UTF-8?q?=E5=85=88=E9=AA=8C=E9=80=83=E9=80=B8=E8=80=8C=E9=9D=9E=E6=8A=AC?= =?UTF-8?q?=E9=AB=98=E8=87=AA=E6=88=91=E5=BC=BA=E5=8C=96=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=8E=A8=E5=AF=BC=E8=A6=81=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- CLAUDE.md | 2 +- docs/01-paper-code-map.md | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 8947373..b23fcee 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -58,7 +58,7 @@ conda activate ars-opd && ruff check ars_opd/ --fix && ruff format ars_opd/ | 类型 | 要求 | 示例 | |------|------|------| | 论文锚点 | 实现论文公式/机制的函数,docstring 首行标出处;关键行旁给公式本体 | `# 式(5): π̂ = (k_sem + α·π̄) / (N + α)` | -| 非显然约束 | 只解释"为什么必须这样"及违反后果,不解释"这行在干什么";load-bearing 的反直觉点必须写 | `# π̂ 必须 detach:否则学生通过抬高自身先验自我强化,训练塌缩` | +| 非显然约束 | 只解释"为什么必须这样"及违反后果,不解释"这行在干什么";load-bearing 的反直觉点必须写 | `# π̂ 必须 detach:否则优化器会压低学生自身概率把乘子 π̂ 推向 0 以逃逸惩罚,teacher 否定的 chunk 最先塌缩` | | 差异标注 | 凡有意偏离论文或参考实现处,注明对方做法与我们的理由 | `# 参考实现(trainer:2205)对 chunk 内取 mean,论文式(8)为 sum,此处从论文` | **类型与 shape**: diff --git a/docs/01-paper-code-map.md b/docs/01-paper-code-map.md index d10f108..9341624 100644 --- a/docs/01-paper-code-map.md +++ b/docs/01-paper-code-map.md @@ -24,6 +24,19 @@ flowchart LR $$\mathcal{L}_{\text{OmniOPD}}(\theta) = -\mathbb{E}_{\hat y\sim\pi_\theta}\Big[\sum_{c=1}^{M}\hat\pi^{(c)}_{\text{teacher}}\sum_{t\in c}\log\pi_\theta(y_t\mid x,y_{ 0,消灭了"teacher 全不匹配 ⇒ 梯度归零"的监督塌缩。 ## 2. 参考实现的真实形态:一个 trainer,三代方法 @@ -74,7 +87,7 @@ $$\bar\pi_\theta^{(c)} = \Big(\prod_{t\in c}\pi_\theta(y_t\mid\cdot)\Big)^{1/C} 代码在 `_compute_chunk_ebopd_loss` 内 L2194-2202:先验 `pi_bar = exp(mean(chunk_lps.detach()))`(几何均值,与式 4 严格一致),`pi_hat = (k + chunk_alpha·pi_bar)/(chunk_mc_samples + chunk_alpha)`,随后 clamp 到 [1e-8, 1] 并 detach。 -> **detach 是命门**:先验和 π̂ 都必须切断梯度,否则学生会通过抬高自己的先验来自我强化(reward hacking 式塌缩)。配置里 `mc_nll_weight`(L246)的注释明确警告开启会塌缩,默认 0。这一点论文只隐含在"π̂ 是目标而非变量"里,代码把它变成了硬约束。 +> **detach 是命门**:先验和 π̂ 都必须切断梯度(L2196、L2201)。若留梯度通路,损失 π̂·|Σlog π_θ| 中 π̂ 也随 θ 可动,最速下降方向变成**压低**学生对自己 token 的概率、把乘子 π̂ 推向 0(p·ln(1/p)→0,指数快过对数)——在 teacher 全否定(k≈0)的 chunk 上损失可一路逃逸到 0,贝叶斯安全底 α·π̄ 被优化器亲手拆除,Theorem 4.1(a) 的梯度有界性也随之失效(多出的 ∇π̂ 项与惊讶度成正比)。相邻的另一个陷阱:`mc_nll_weight`(config L246-252)给非 MC 位置加自身 NLL 正则,帮助文本明确警告 "non-zero values cause self-reinforcement collapse"(无条件复读自己→熵塌缩),默认 0——两者是方向相反的两种自指失败。论文只隐含在"π̂ 是目标而非变量"里,代码把它变成了硬约束。 对应理论:Theorem 4.1(b) 下界 π̂ ≥ α·π̄/(N+α) > 0;4.1(c) 偏差-方差分解,α 是噪声-偏移旋钮;Theorem 4.2 证明 N=10 是方差收益的甜点。 @@ -146,3 +159,5 @@ KL 锚(`mc_kl_weight` = 论文的 β,config L284,**默认 0**)实现与 4. 实现的 KL 锚与论文式(8)有哪三处差异? 5. API teacher 路径为什么强制 char 级编辑距离?分叉点为什么要对齐词边界? 6. `no_bayesian` 消融等价于论文里的哪个估计器?§4.1 预言它会怎么失败? + +