这篇论文研究的不是“让模型多写几步”,而是怎样找出真正改变答案的那一步。作者先用 Code-CoT 把图形识别、辅助构造、坐标化和推导写成带类型的 event,再从某个 event 之前固定完整 prefix,采样多个直到最终答案的 future。只要这些 future 的 reward 不同,这个分叉点就提供了局部 credit。
Q1. 这篇论文真正想解决什么?
它想让推理时出现的语义单元,同时成为训练时比较 future 和分配 credit 的位置。 作者把这条原则叫作 credit-addressable reasoning。
“可寻址”有明确含义。假设一条回答已经完成图像转代码、写好 plan,并生成了若干 <think> 和 <action>。训练器可以精确找到某个完整 event 的起点,把此前的 image、question 和 response 全部固定为 prefix,再让模型从这里重新生成。这样比较的是“同一状态下换一种决定,会不会改变终局”。
这比直接找 high-entropy token 多了一层语义约束。token 的不确定性可能来自措辞;一个完整的 <reference>、<auxiliary> 或 <coordinate> event 则对应真实几何操作。反过来,只有结构也不够,因为并非每个 event 都值得花四条 rollout。论文让结构决定哪些位置允许分叉,让按 event type 归一化后的 entropy 决定优先级。
为什么先做 diagram + code 的对照实验
作者在 MathVerse 的五种视觉依赖版本上比较了四种输入:只给图像 I、只给外部模型生成的代码 C、图像与代码一起给 I+C,以及只给模型自己生成的代码 C_self。
六个开源或闭源模型里,I+C 都是最好:相对只给图像提升 0.7 到 18.4 个百分点。对三个开源模型,C_self 又比 external-code-only 低 11.7 到 16.6 个百分点。这两个结果合起来说明:代码应当补充图像,而不是替代图像;可靠地产生代码也不能只靠一句 prompt。
这个判断被后续主实验再次印证。Qwen3-VL-8B 直接套 Code-CoT prompt,九项平均准确率从 67.95 掉到 49.26;经过 SFT 后才回到 69.55。
Q2. 它与程序推理和细粒度 credit 方法差在哪里?
最清楚的比较方式,是同时看“推理用什么结构”和“训练在哪里比较替代方案”。CE-GRPO 的特点是两者共用 Code-CoT event。
| 路线 | 推理表示 | credit 或监督位置 | 与本文的边界 |
|---|---|---|---|
| PAL / ToRA | 程序或 tool call | 主要围绕完整解题轨迹 | 它们让计算可执行;本文进一步让 typed event 成为 RL 的分支状态。 |
| AlphaGeometry / GDP / GeoTikzBridge | 形式语言、符号关系或解析结果 | 通常是外部表示或两阶段 pipeline | Code-CoT 保留原图,在一次 response 内生成 perception code 并继续推理。 |
| CodePlot-CoT / MathCanvas | 代码生成图像、视觉 action 或动态构造 | 中间表示帮助模型继续思考 | 本文把结构化 event 明确接入 candidate selection、prefix branching 和 policy loss。 |
| VinePPO / SPO / high-entropy token | state、segment 或 token | 用 value、固定 segment 或 token statistics 细分 advantage | CE-GRPO 先用几何语义结构确定边界,再在同类型 event 内比较 entropy。 |
| GPO / SRPO / CFPO / GRPO-MA | critical step、reset state 或 thought branch | 反事实 future 或 thought advantage | 这是最近的一组。本文不使用 process label、learned critic 或 task-specific reward,event 边界直接来自 Code-CoT tag。 |
这里需要保留一个措辞边界:上表的差异主要来自本文 Related Work 和 baseline adaptation 的定位。官方仓库没有公开这些 baseline 的适配代码,因此无法检查每种方法是否获得了同等程度的工程优化。
Q3. Code-CoT 怎样把一条几何解题过程变成可检查的事件?
一次 Code-CoT 回答包含 perception code、一个 plan、若干完整的 reasoning/action event 和最终答案。Parser 依赖 tag 切 event,checker 依赖代码与行号检查 action。
一条 response 的固定协议
它从恰好一个 <perception> 开始。这里是带行号的可执行 Matplotlib code,记录点、线、标签、角度和长度。后面是一行 PLAN:,再交替生成 <think> 与三类 action,最后用恰好一个非空 <answer> 结束。
三类 action 的职责不同:
reference在第一次使用某个视觉事实前,引用 perception block 中的原始代码行。Checker 要求行号存在、复制内容一致,而且不超过 8 行。auxiliary添加连线、延长线、中点、角平分线、圆、变量等工作对象。新对象必须有具体可执行代码,引用的旧对象必须已存在。coordinate建立可执行坐标系,必须调用set_frame,不能使用省略号,所有坐标都要给出具体值。
结构有效的 response 至少要有两个 action。设总 action 数为 n(Y),通过各自类型检查的数量为 v(Y),action-validity rate 是 v(Y) / n(Y)。
训练数据不是人工逐步标注
SFT 数据来自八个几何数据集。作者先在 question 和 image 两层去除与评测集的重叠,再让 Gemini-3.1-Pro 把图转成 perception code;DeepSeek-V4-Pro 根据问题和 code 合成 plan、events 与 answer。Reference answer 只在合成时做静默一致性检查,不作为 student 输入。
最终保留 18,302 条 trace。每条都要通过结构、代码执行、reference grounding、action validity 和答案正确性检查。论文没有报告人工复核、抽检比例或合成模型之间的一致率,因此这里应理解为 programmatically filtered synthetic supervision,而不是人工标注的 process data。
| 来源 | 保留样本 | 来源 | 保留样本 |
|---|---|---|---|
| MultiMath-Geo | 4,974 | FormalGeo7K | 1,931 |
| UniGeo | 2,313 | GeoAux | 240 |
| Geo170K | 816 | GeoSym127K | 1,183 |
| MultiMath-300K | 4,227 | PGPS9K | 2,618 |
RL pool 是 11,450 道去重后的原始问题,不带预先合成的 Code-CoT trace。当前 policy 必须在线生成 perception code、events 和答案。它由 GeoSym127K 的 hard/expert、未用于 SFT 的 PGPS9K training samples,以及一个较小的 GeoQA subset 组成。
Reward 到底怎样算
结构无效直接得到 -1。结构有效时:
Ω 包括 duplicated action、repetitive generation 和 answer leakage 三类惩罚。选择题要求 exact option match,数值题容许 1% relative tolerance。答案正确、所有 action 有效且没有惩罚时,reward 达到 1.3。这里没有 learned reward model,但也不能说它完全只靠最终答案,因为 action checker 提供了逐 action 的辅助信号。
3.5 CE-GRPO 怎样找出“改变结局”的 event?
它先挑一个语义上合法、统计上值得试的 event,再固定 event 之前的完整状态,采样四个直到答案的 continuation。只有 sibling futures 的 reward 出现差异,这个位置才产生非零局部 credit。
先选 candidate,不提前贴 critical 标签
每个 event 先计算 token entropy 的均值。由于不同 event type 的熵尺度差异很大,论文在 batch 内按类型做 z-score;采集到的 trace 中,think 的平均 raw entropy 大约是 reference 的 7.7 倍,直接混排会偏向 think。
Selector 默认选择第一个完整 <think>。只有另一条 think 的 type-normalized entropy 高出 1 个标准差以上时,才替换它。第二个候选是 entropy 最高的 action。15% 的概率会把一个候选换成随机 event。离线 selector validation 同时评估这两个候选,正式训练只使用返回的第一个。
固定 prefix,再重采完整 future
设候选 event 从位置 s_c 开始,prefix 是 z_c = y[:s_c]。训练器保留原图、问题和全部 prefix,把它作为 assistant prefill,然后采样 G=4 个 continuation。每个 continuation 都必须重新写出候选 event,并一直生成到最终答案。
Prefix 只是条件,不进入 policy loss。Advantage 会更新重新生成的 event 和全部后续 token。若四条 future 得到相同 reward,标准差为 0,这个 group 不提供更新。一次选错位置的主要代价是浪费 rollout,而不是制造一条虚假的局部标签。
正式训练把 11,450 条普通 RL problem 与 11,450 条 counterfactual-prefix row 按 1:1 混合。后者来自 3,270 个固定 prefix,每个最多重复四次。这些 prefix 在 RL 开始前由初始 SFT policy 一次性采集,训练过程中不会随着 policy 更新而刷新。
真实 case:错误不是算错,而是把对称性用过了头
题目给出等腰三角形 AB = AC = 13、BC = 10,点 D 在 BC 上且 BD = 2,要求 AD。正确答案是 3√17。
从同一 prefix 出发的两条 future
- 共享状态。模型已经识别 `ABC` 是等腰三角形,并准备求 cevian `AD`。Cevian 指从顶点连到对边任意一点的线段,`D` 并不是中点。
- 错误分支。模型把等腰三角形的对称性过度推广,直接假设 `AD ⟂ BC`。随后按半底边 5 计算,得到 `√(13²-5²)=12`。后面的勾股计算没问题,错在最初的结构假设。
- 正确分支。模型保留 `BD=2`、`DC=8`,用 Stewart 定理:`13²×8 + 13²×2 = 10(AD² + 2×8)`,得到 `AD²=153`,所以 `AD=3√17`。
- 怎样形成 credit。这两条 continuation 共享错误发生前的全部 prefix,却拿到不同终局 reward。CE-GRPO 因此强化能保留 `D` 真实位置的 decision,压低无依据的垂直线或角平分线假设。
下面这段是依据论文公开公式写的说明性伪代码,不是官方实现。官方仓库目前没有训练代码。
# explanatory pseudocode, adapted from Equations 5-7
def ce_group(image, question, prefix, policy, reward, group_size=4):
futures = [
policy.complete(image=image, question=question, assistant_prefill=prefix)
for _ in range(group_size)
]
rewards = [reward(prefix + future) for future in futures]
scale = std(rewards) + 1e-6
advantages = [(r - mean(rewards)) / scale for r in rewards]
return [(future, advantage) for future, advantage in zip(futures, advantages)]
# prefix tokens are context only; policy loss starts at each regenerated future
如果想验证这道题的几何关系,可以直接运行下面的 Python 3 + Matplotlib 示例。代码由本文根据公开题设编写,不来自作者未公开的 benchmark 或 checker。
import numpy as np
import matplotlib.pyplot as plt
A = np.array([0.0, 12.0])
B = np.array([-5.0, 0.0])
C = np.array([5.0, 0.0])
D = np.array([-3.0, 0.0]) # BD = 2, DC = 8
for p, q in [(A, B), (A, C), (B, C), (A, D)]:
plt.plot([p[0], q[0]], [p[1], q[1]], "k-")
print(np.linalg.norm(A-B), np.linalg.norm(A-C)) # 13.0, 13.0
print(np.linalg.norm(A-D)) # 12.369..., = 3*sqrt(17)
plt.axis("equal")
plt.show()
Q4. 实验怎样评,结果能支持什么?
主结果支持“event-localized credit 对长依赖几何推理更有效”,但没有给出重复运行的方差,也没有做到完全等算力比较。
九项 test set 与 judge
论文覆盖四类任务:视觉 grounding、平面几何、辅助构造和 process-level multimodal reasoning。各固定 test set 的样本量是:MathVerse 3,940,VisOnlyQA-Syn 485,VisOnlyQA-Real 295,MathVista-GPS 216,Geometry3K 589,PGPS9K 1,000,GeoQA 754,GeoLaux-mini 330,MM-Math 996。Headline Avg. 是九项 accuracy 的无权平均,不按样本量加权。
答案由 Gemini-3.1-Pro-Preview 与 Gemini-2.5-Pro 独立判断 prediction 是否与 reference 等价。两者不一致时重复评审,直到结论一致。Code-CoT 模型只把 <answer> 内容交给 judge,其他 baseline 则提交完整 response。论文没有报告初始一致率、重复次数或人工 adjudication。
推理配置也不完全相同。Code-CoT SFT 使用 temperature 0.6、top-p 0.95 和 top-k 20;CE-GRPO 与其他作者训练的 post-training 方法使用 greedy decoding。
主结果不能只看 76.04
CE-GRPO 的九项无权平均是 76.04,比 native Qwen3-VL-8B 高 8.09 个百分点,比 Code-CoT SFT 高 6.49,比 trajectory-level GRPO 高 3.43,也比作者实现的最强细粒度 baseline 高 6.73。
增益并不平均。GeoLaux-mini 从 trajectory GRPO 的 75.45 升到 90.61,增加 15.16 个百分点;MM-Math 从 70.88 升到 80.32,增加 9.44。两项更常规的任务下降:VisOnlyQA-Syn 低 0.72,Geometry3K 低 2.89。这个分布与作者的机制解释一致:中间 construction 或 decision 会影响很多后续步骤时,定位 event 更有价值。
与两阶段系统比较时,CE-GRPO 比 GDP-4B-RL → Qwen3-VL-8B 的九项平均高 3.07,七项胜出;但 Geometry3K 低 4.42,PGPS9K 低 7.30。单次调用不等于所有任务都更强,关系解析占主导时,专门的第一阶段 parser 仍有优势。
三组机制证据
第一,selector ablation 中,random prefix、entropy only、structure only、structure + entropy 的平均分依次为 72.48、72.83、74.26、76.04。组合方法的 unclosed rate 也最低,为 4.73%。不过每个 variant 报的是最佳 validation checkpoint,主表没有误差条。
第二,300 道题的离线 selector validation 共检查每种 selector 的 1,998 个 event。Random 的 Crit.@2 是 0.222;structure 是 0.289;structure + entropy 是 0.287。组合方法没有提高命中率,却把每个 critical event 的生成成本从 structure-only 的 85.0k tokens 降到 75.0k,并把平均绝对 reward change 从 0.405 提到 0.409。这更像“结构负责定位,entropy 负责节省预算”,不是 entropy 独自发现关键步骤。
第三,作者把九项任务的平均 event 数与相对 SFT 的增益做回归。CE-GRPO 相对 trajectory GRPO 的 margin 每多一个 event 增加 3.77 个百分点,r=0.866,exact p=0.0016;leave-one-benchmark-out 的 p≤0.028。样本单位只有九个 benchmark,这是一条支持性相关证据,不是因果证明。
Code 质量也提高了,但 judge 仍是闭源模型
作者从 100 道 MathVerse-TD 问题抽取 perception block。Gemini-3.1-Pro-Preview 先为每张图列一组可见几何事实,再由不知道模型条件的 judge 对每条事实给 1、0.5 或 0 分;渲染失败整题 macro recall 记 0。
Base + prompt、Code-CoT SFT、CE-GRPO 的 macro recall 分别是 55.21、70.16、80.43;render success 是 89%、95%、99%。结果说明训练不只修了 answer tag,也提高了代码可执行性与覆盖几何事实的能力。限制是事实抽取和评分依赖闭源 Gemini,论文没有公开 judge prompt 或人类校准结果。
训练成本和公平性边界
CE-GRPO 使用 64 张 A100-80GB、每个 prompt 4 条 rollout;trajectory-level GRPO 使用 8 张 MI300X、每个 prompt 8 条 rollout。二者都做 full-parameter update,学习率都是 1e-6,但硬件和每组 rollout 数不同。DPO 与 GPO 只训练 LoRA。论文列出了配置,却没有报告总 token、总 GPU-hours 或 wall-clock,因此无法比较样本效率和训练成本。
Q5. 对其他推理任务有什么启发?
方法上的核心贡献很清楚:不要先在 token 上猜“哪一步关键”,先让模型用任务语义写出稳定 event,再让 RL 从 event boundary 比较 future。 这条设计原则比某个几何 prompt 更有迁移价值。
对其他领域,关键不是照搬 Matplotlib,而是找出能同时满足三件事的表示:推理时自然出现,程序能稳定解析,训练器能在边界处安全截断并继续生成。例如 coding agent 可以把 test、patch、tool call、verification block 定义成 event;科学推理可以把 measurement、assumption、calculation 和 conclusion 定义成 event。之后再验证从这些边界分叉是否真的更容易改变 outcome。
Q6. 这篇论文该怎样评价?
a6b03dcc 只有 README。没有训练代码、parser、checker、数据构造脚本、prefix 集合、checkpoint 或 task-level predictions。我会优先做三项后续实验。第一,公开 parser、reward、prefix rows 和逐题 prediction,跑至少三个 training seeds。第二,用相同 rollout token budget 比较 CE-GRPO、trajectory GRPO 和随机 prefix,避免把计算量差异混进方法增益。第三,让 prefix 随 policy 定期刷新,再测静态 prefix 是否在训练后期失配。
最终判断是:这篇论文给出了一个值得继续做的 credit assignment 接口,也提供了相当完整的论文内实验;但当前公开 artifact 远未达到可复现这些结果的程度。 如果后续代码补齐,它很适合作为“结构化 reasoning trace + outcome-based RL”的基础工作继续扩展。
留言