先把几何推理切成有语义的事件,再问:改掉哪个事件会改变结局?
Code-CoT 把图像事实、构造和推导变成可定位的 event。CE-GRPO 从 event 前的共享 prefix 重采完整 future,用最终结果的差异给这个分叉点及其后果分配 credit。
标准 GRPO 知道哪条完整回答更好,却不知道是哪一步让结果改变
读图、绑定对象、选定理、加辅助线、计算。
一连串 token 与隐含决策,最终答对。
整个回答拿到同一个 group-relative advantage。
要定位 credit,推理轨迹里先得有能被稳定寻址的语义单元
Representation gap
自由文本把对象绑定、角度判断、辅助构造等决定埋在句子里。token 边界不等于几何决策边界。
Credit gap
训练只看到最终正确与否,同一 advantage 覆盖整条 response,无法比较“同一前缀后的不同结构决定”。
代码不能代替图像;图像与外部生成代码一起输入时,六个模型都更好
Diagram only, I
模型直接读图。六个模型的平均准确率范围从 45.5 到 92.3。
Image + external code, I+C
六个模型全部提升,绝对增益为 0.7 到 18.4 个百分点。
Self-generated code only
三个开源模型比 external-code-only 低 11.7 到 16.6 个百分点,说明可靠生成代码本身就是瓶颈。
所以 Code-CoT 保留原图,让同一个模型自己生成代码,并用 SFT 明确教会这种协议。只写一个 prompt 的平均分反而从 67.95 降到 49.26。
Code-CoT 把一次回答写成固定协议,而不是让模型自由发挥格式
Event 类型决定它对当前几何状态做什么,也决定 checker 检查什么
| Event | 作用 | 主要 validity condition |
|---|---|---|
think | 根据当前图、代码和前序事件推导 | 有完整起止 tag;不直接作为 action-validity rate 的分子或分母 |
reference | 第一次使用视觉事实前,取回 perception 代码行 | 行号存在、内容逐行匹配、最多 8 行 |
auxiliary | 添加连线、延长线、中点、圆或变量 | 对象已存在;新对象有具体可执行代码;操作类型受支持 |
coordinate | 建立坐标系并给对象赋坐标 | 调用 set_frame;没有省略号;坐标是具体值 |
结构有效的 response 至少有两个 action,因此 action-validity rate 的分母不会是 0。
18,302 条 SFT trace 不是人工逐步标注,而是两台强模型合成后过 checker
去除与评测集在 question 和 image 层面的重叠。
把图转成行号化 Matplotlib perception code。
结合问题和 code 生成 plan、events 与 answer;reference answer 只做静默一致性检查。
结构、执行、grounding、action validity、最终答案全部通过才保留。
Reward 同时看最终答案、action 有效率和行为惩罚;协议结构坏了直接记 -1
R = clip(correct + 0.3 × valid_actions / all_actions − penalties, -1, 1.3)
Correctness
选择题 exact option match;数值题允许 1% relative tolerance。
Action validity
reference、auxiliary、coordinate 分别由确定性规则检查。
Penalties
duplicated actions、repetitive generation 与 answer leakage。
最高 1.3:答案正确、所有 action 有效、没有触发行为惩罚。
Selector 不提前断言哪个 event 关键,只挑两个值得试着分叉的位置
Think candidate
默认第一个完整 think。只有另一个 think 的 type-normalized entropy 高出 1 个标准差以上,才替换。
Action candidate
在所有 action 中选 type-normalized entropy 最高者。15% 概率把一个候选换成随机 event,保留探索覆盖。
局部 credit 不是局部打分:它从局部位置分叉,仍用完整 future 的终局 reward
固定 prefix zc
保留 image、question,以及 candidate event 开始前的全部 response。prefix 作为 assistant prefill,只做条件,不进入 loss。
→
↘
G=4 个 future 共享同一状态。它们的标准化 reward 只更新重新生成的 event 与 suffix。reward 全相同则方差为 0,本组不更新。
现有工作通常只解决“结构化表示”或“细粒度 credit”中的一边
| 路线 | 推理单元 | credit / supervision | 本文声称的差异 |
|---|---|---|---|
| PAL / ToRA | 程序或 tool call | 主要优化完整解题行为 | Code-CoT 的 event 同时成为分支和 credit 单元。 |
| AlphaGeometry / GDP / GeoTikzBridge | 形式语言或解析结果 | 常见为外部或两阶段表示 | CE-GRPO 在单次 response 内保留图像、生成代码并继续推理。 |
| CodePlot-CoT / MathCanvas | 代码生成图像或视觉 action | 用于增强中间推理 | 本文额外把 typed event 接到 RL grouping state。 |
| VinePPO / SPO / high-entropy token | state、segment 或 token | 细粒度 advantage | 本文先用几何语义结构定边界,再用 type-normalized entropy 排预算。 |
| GPO / SRPO / CFPO / GRPO-MA | critical step、reset 或 branch | 反事实 future / thought advantage | CE-GRPO 不需要 process label、critic 或 task-specific reward;边界由 Code-CoT tag 确定。 |
九项 benchmark 用各自固定 test set;headline 是九项 accuracy 的无权平均
测试规模
MathVerse 3,940;VisOnlyQA 485/295;GPS 216;Geometry3K 589;PGPS9K 1,000;GeoQA 754;GeoLaux-mini 330;MM-Math 996。
答案 judge
Gemini-3.1-Pro-Preview 与 Gemini-2.5-Pro 独立判断 prediction 是否等价于 reference;分歧时重复,直到一致。
严格成功
Code-CoT response 必须恰好有一个非空 <answer>;未闭合或格式无效直接算错。主结果使用 greedy decoding。
结构找到“哪里分叉”,entropy 让同样预算更有效;但证据主要是离线统计与最佳 checkpoint
最值得带走的是“表示与 credit 共用同一种边界”;最需要补的是可复现性和独立评测
证据支持到这里
- CE-GRPO 平均 76.04,比 trajectory GRPO 高 3.43 pp。
- GeoLaux-mini、MM-Math 这类长依赖任务增益更大。
- code fidelity 从 55.21 提升到 80.43,render success 到 99%。
- 推理仍是一条单次 response,没有 test-time branching。
目前不能确认
- 官方仓库只有 README,没有代码、数据、checker 或 checkpoint。
- 主结果没有 run-to-run 方差;训练硬件与 rollout 数并非全线一致。
- SFT trace 与 code fidelity judge 都依赖强闭源模型。
- 只在几何任务验证,能否迁移到一般多模态或 coding reasoning 尚未证明。