引言

多模态大语言模型(MLLM)在 STEM 视觉推理上的表现长期不尽如人意。面对一张立体几何截面图或函数图像,模型往往能给出看似合理的推理步骤,却在关键的空间关系、数量属性上犯下低级错误——根本没"看准"图。

这引出了一个根本性问题:瓶颈到底在感知还是推理?

当前主流的改进路径几乎都在卷推理——更长的思维链、更强的推理模型、更多的强化学习。但 CVPR 2026 论文 CodePercept 给出了一个反直觉的答案:扩展感知始终优于扩展推理。当感知模块从 4B 扩展到 32B 时,带来的性能提升远超将推理模块做同样扩展。基于这一发现,论文提出了一种全新范式——用可执行代码替代自然语言作为感知媒介,构建百万级三元组数据集 ICC-1M,仅 8B 参数的模型即可超越 72B 的 Qwen2.5-VL。


一、感知 vs 推理:谁才是瓶颈?

1.1 Captioner-Solver 解耦框架

要回答"瓶颈在哪",首先需要将感知和推理从端到端的黑盒中拆解出来。CodePercept 采用了 Captioner-Solver 框架:

Captioner(x)t,Solver(t,q)a\text{Captioner}(x) \to t, \quad \text{Solver}(t, q) \to a

其中 Captioner 负责将图像 xx 转化为文本描述 tt(感知阶段),Solver 基于描述 tt 和问题 qq 生成答案 aa(推理阶段)。这种解耦允许独立缩放两个组件,从而精确定位瓶颈。

1.2 四组缩放实验

论文设计了两组基线(4B 和 8B),每组进行两个方向的缩放:

实验一:固定 Perception,缩放 Reasoning

固定感知模块为 4B,将推理模块从 4B 逐步扩展到 8B、32B。

实验二:固定 Reasoning,缩放 Perception

固定推理模块为 4B,将感知模块从 4B 逐步扩展到 8B、32B。

在 8B 基线上重复同样的实验。

1.3 核心发现

所有实验指向同一个结论:

Perception@32B+Reasoning@4BPerception@4B+Reasoning@32B\text{Perception@32B} + \text{Reasoning@4B} \gg \text{Perception@4B} + \text{Reasoning@32B}

一个 32B 的感知模块配 4B 的推理模块,性能远超 4B 感知配 32B 推理。这意味着当前 STEM 视觉推理的边际收益最大处不在推理侧,而在感知侧

下表展示了 Captioner-Solver 框架下(Solver 固定为 Qwen3-30A3-Thinking)CodePercept 感知增强对推理的传导效果:

CaptionerMathVisionMathVistaMathVerseDynaMathWeMathLogicVistaAvg
Qwen3-VL-4B54.2167.3064.5969.4046.1054.1459.29
CodePercept-4B-S157.6369.6065.5971.3847.8160.4062.07
Qwen3-VL-32B58.5572.2071.0975.7848.0062.1964.63
CodePercept-32B-S162.2772.9071.7077.4154.1965.3367.30

感知增强为 4B 模型带来平均 +2.78 的提升,为 32B 模型带来 +2.67 的提升。WeMath 维度的跃升最为显著:32B 模型从 48.00 提升到 54.19(+6.19),说明代码驱动的感知对涉及多步逻辑的数学推理帮助最大。


二、自然语言的"描述失语"

2.1 几何空间关系的模糊性

自然语言在描述 STEM 视觉内容时存在系统性缺陷。考虑一个简单的例子:描述一个正四面体被平面截得的截面形状。

自然语言描述

一个正四面体,底面水平,顶点在上方。一个平行于底面的平面从高度 h 处截切,截面为等边三角形,边长与 h 成正比。

这段描述看似完整,但隐藏了大量模糊性:“高度 h” 的参考系是什么?“成正比"的比例系数是多少?截面的具体顶点坐标是什么?当 h 趋近于底面时截面退化为什么?

Python 代码描述

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

# 正四面体顶点
a = 2  # 边长
v_top = np.array([0, 0, a * np.sqrt(2/3)])
v_base = np.array([
    [a/2, -a/(2*np.sqrt(3)), 0],
    [-a/2, -a/(2*np.sqrt(3)), 0],
    [0, a/np.sqrt(3), 0]
])

# 在高度 h 处的截面
h = 0.6 * v_top[2]  # 60% 高度处
side_ratio = 1 - h / v_top[2]
cross_section_side = a * side_ratio

代码消除了所有歧义:坐标系统、比例关系、参数定义都是确定的。这就是 CodePercept 选择代码作为感知媒介的核心动机——可执行代码提供了精确的语义,天然与 STEM 视觉内容的结构化特征对齐

2.2 代码作为 Ground Truth 的确定性优势

在知识蒸馏范式中,教师模型生成的自然语言描述可能包含幻觉(hallucination)——凭空捏造不存在的对象、错误描述空间关系。而代码的验证是确定性的:执行一次,结果即知。一段 matplotlib 代码如果声称绘制了一个红色圆,执行后画出的就是一个红色圆,不存在"描述失语"的空间。


三、CodePercept 方法:代码驱动的双通道感知

CodePercept 提出两个互补的感知增强维度:Code-Grounded Caption GenerationSTEM Image-to-Code Translation。前者用代码修正文本描述,后者直接将图像翻译为可执行代码。

flowchart LR
    subgraph D1["维度一:Code-Grounded Caption"]
        X1["图像 x"] --> S1["Native Caption"]
        S1 --> T_draft["描述草稿 t_draft"]
        C1["代码 c"] --> S2["Code Analysis
+ Execution Tracer"] S2 --> T_code["验证事实 t_code"] T_draft --> S3["Code-Grounded
Refinement"] T_code --> S3 S3 --> T_new["修正字幕 t_new"] end subgraph D2["维度二:Image-to-Code"] X2["图像 x"] --> S4["Explanatory Draft
Generation"] S4 --> C_draft["代码草稿 c_draft"] C_draft --> S5["Code-Grounded
Refinement"] C2["GT 代码 c"] --> S5 S5 --> C_new["修正代码 c_new"] end style D1 fill:#f0f4ff,stroke:#4a6fa5 style D2 fill:#fff4f0,stroke:#a54a4a

3.1 维度一:Code-Grounded Caption Generation

该维度解决的核心问题是:现有知识蒸馏方法中,教师模型生成的字幕包含幻觉,而代码提供了可验证的 ground truth。流程分为三步:

Step 1: Native Caption

tdraft=Gcaption(x)t_{\text{draft}} = G_{\text{caption}}(\mathbf{x})

模型首先对图像 x\mathbf{x} 生成自然语言描述草稿。语言风格自然流畅,但可能包含事实错误——数量、位置、空间关系等细节可能被臆造。

Step 2: Code Analysis + Enhanced Execution Tracer

tcode=Ganalyze(c,ξ(c))t_{\text{code}} = G_{\text{analyze}}(\mathbf{c}, \xi(\mathbf{c}))

对图像对应的可执行代码 c\mathbf{c} 进行分析,提取精确的视觉事实。这里的关键创新是 Enhanced Execution Tracer ξ(c)\xi(\mathbf{c}):即使代码包含深层递归和嵌套循环,执行日志仍能提供确定性的渲染信息——精确坐标、维度参数、z-order 层级关系。这些信息构成了"代码对图像说了什么"的可靠事实来源。

Step 3: Code-Grounded Refinement

tnew=Grefine(tdraft,tcode)t_{\text{new}} = G_{\text{refine}}(t_{\text{draft}}, t_{\text{code}})

将描述草稿与代码验证事实对齐,进行"外科手术式"修正:纠正数量错误、空间关系错误,同时保持原有的自然语言风格。最终输出既准确又可读的修正字幕。

3.2 维度二:STEM Image-to-Code Translation

如果说维度一是"用代码纠正文字”,维度二则是"直接生成代码"。流程分为两步:

Step 1: Explanatory Draft Generation

cdraft=Gcode(x)c_{\text{draft}} = G_{\text{code}}(\mathbf{x})

模型观察图像后,生成一段带有逐步分解和参数解释的代码草稿。解释性注释使代码更易理解,但参数值可能存在错误。

Step 2: Code-Grounded Refinement

cnew=Grefine(cdraft,c)c_{\text{new}} = G_{\text{refine}}(c_{\text{draft}}, \mathbf{c})

用 ground-truth 代码 c\mathbf{c} 修正草稿中的错误,同时保留解释性结构。这一步确保最终代码既可执行又具有教学价值。

两个维度形成互补:Caption 通道生成人类可读的文本描述,Code 通道生成机器可验证的可执行代码。联合训练使模型同时掌握两种"语言"来表达对图像的理解。


四、ICC-1M:百万级三元组数据集

为实现上述双通道训练,论文构建了 ICC-1M 数据集——超过 100 万条高质量的 Image-Caption-Code 三元组。数据合成通过三条互补的流水线完成。

4.1 三条合成流水线

流水线一:Image Reproduction(FIRF_{\text{IR}}

FIR:Seed Image(Description,Reproduction Code)F_{\text{IR}}: \text{Seed Image} \to (\text{Description}, \text{Reproduction Code})

从种子图像出发,生成详细描述和 matplotlib 复现代码。受限于源图像多样性,此流水线的数据覆盖面有限。

流水线二:Image Diversity(FIDF_{\text{ID}})——核心创新

FID:Gprinciple(Seed){c1,c2,,cK}F_{\text{ID}}: G_{\text{principle}}(\text{Seed}) \to \{c_1, c_2, \ldots, c_K\}

这是数据多样性的关键突破。核心思路是"抽象原理,重新实例化":从种子图像中提取底层科学原理 GprincipleG_{\text{principle}}(如多米诺排列规律),然后基于同一原理生成 KK 个不同的视觉实例化代码。

例如,从一道多米诺骨牌谜题出发,同一抽象原理可以重新实例化为圆形轮盘排列、三角形组合、网格图等变体。这使数据量在原理层面实现了乘法级增长,突破了种子图像多样性的瓶颈。

流水线三:Solid Geometry Synthesis(FSGF_{\text{SG}}

FSG:Template(Ti,θ)(Image,Code),i{1,,8}F_{\text{SG}}: \text{Template}(T_i, \boldsymbol{\theta}) \to (\text{Image}, \text{Code}), \quad i \in \{1, \ldots, 8\}

针对 LLM 在立体几何代码生成上的根本缺陷,构建参数化模板库。8 类模板涵盖:立方体展开/折叠、正投影三视图、截面分析、多面体构造等。通过参数采样 θ\boldsymbol{\theta} 批量生成训练数据。

4.2 三级复合质量控制

每条数据需通过三级质量过滤:

质量级别指标含义
QIQ_I图像质量图像是否清晰、无渲染错误
QCQ_C代码质量代码是否可执行、符合 Python 规范
QICQ_{IC}图像-代码一致性代码执行结果是否与图像视觉一致

只有同时通过三级过滤的样本才会进入最终数据集,确保每条三元组的内部一致性。


五、从 SFT 到 RL:两阶段训练与三层递增奖励

5.1 Stage 1:联合监督微调(S1)

S1 阶段基于 Qwen3-VL 架构,使用 ICC-1M 数据集对 Image2CaptionImage2Code 两个任务进行联合优化:

配置项
基座模型Qwen3-VL(4B / 8B / 32B)
训练数据ICC-1M(100 万+ 三元组)
训练任务Image2Caption + Image2Code 联合训练
训练轮次1 epoch
GPU 配置32 ×\times A100

联合训练的关键意义:消融实验表明,CodeCap 和 ImCode 两个任务是互补的——只用字幕或只用代码训练效果都不如联合训练,完整配置达到最高。

5.2 Stage 2:GRPO 强化学习(R1)

S1 之后,论文进一步采用 Group Relative Policy Optimization(GRPO) 进行强化学习,但仅应用于代码生成任务。

配置项
RL 算法GRPO
训练任务仅 Image-to-Code
训练样本10,000

5.3 三层递增奖励设计

奖励函数由格式奖励和内容奖励两部分组成,内容奖励内部呈三层递进结构:

R=rfmt+rcntR = r_{\text{fmt}} + r_{\text{cnt}}

第一层:Format Reward(格式奖励)

通过正则表达式验证生成代码的格式是否正确——是否包含完整的 Python 代码块、是否具备基本语法结构。

第二层:Execution Reward(执行奖励)

验证代码能否成功执行。这是代码相对于自然语言的核心优势:验证是确定性的,不存在灰色地带。

第三层:Code-level + Image-level Reward(语义与视觉奖励)

  • Code-level:通过 GPT-4o 判断生成代码与 ground-truth 代码在语义上是否等价
  • Image-level:执行生成代码并渲染图像,计算与原图的视觉相似度

三层递进设计确保模型不仅生成格式正确的代码,还要生成语义等价、视觉一致的代码。

5.4 RL 的惊人效果

强化学习的效果远超预期。以 4B 模型为例:

指标S1 前S1 后R1 后R1 提升幅度
Image Score24.5538.1347.17+92%(vs S1 前)
Exec Rate79.4%80.7%91.3%+11.9 pp

仅用 10,000 个样本的 RL 训练,4B 模型的 Image Score 从 S1 后的 38.13 提升到 47.17(+23.7%),执行率从 80.7% 飙升至 91.3%。这验证了一个重要假设:代码生成任务天然适合 RL——奖励信号是确定且可验证的,不像自然语言生成那样需要模糊的人工评判。


六、实验结果:8B 如何超越 72B

6.1 STEM 推理基准

CodePercept-8B-S1 在 6 个 STEM 推理基准上一致超越 Qwen2.5-VL-72B,平均优势 +6.2%。一个仅 8B 参数的模型,仅通过增强感知能力,就超越了比自己大近 10 倍的模型。这有力地验证了"感知瓶颈"假说——当感知足够准确时,推理不需要那么大的模型。

更值得关注的是,CodePercept-8B-S1 甚至逼近了 Claude-Opus 4.1-Thinking 和 GPT5-Thinking 这样的闭源前沿模型。

6.2 STEM2Code-Eval:代码重建基准

论文提出 STEM2Code-Eval——一种全新的感知评估基准,包含 1000 张人工标注图像。与传统基准通过问题求解准确率间接评估不同,STEM2Code-Eval 要求模型生成可执行代码来重建原始图像,提供确定性和可验证的评估。

模型Image ScoreCode ScoreAvgExec Rate
Gemini2.5-Pro-Thinking68.8975.4172.1591.7%
GPT5-Thinking64.9764.9864.9896.6%
Qwen3-VL-4B-Instruct24.5526.4225.4979.4%
CodePercept-4B-S138.1343.4340.7880.7%
CodePercept-4B-R147.1745.8646.5291.3%
Qwen3-VL-8B-Instruct~47.34
CodePercept-8B-S159.64
CodePercept-8B-R163.56
Qwen3-VL-32B-Instruct36.8539.9838.4281.8%
CodePercept-32B-R168.9762.5365.7595.9%

关键发现:

  • CodePercept-32B-R1(65.75)超越 GPT5-Thinking(64.98),开源模型首次在此基准上超越闭源旗舰
  • CodePercept-8B-R1(63.56)超越 Qwen3-VL-Plus 等超大参数规模旗舰模型
  • 执行率从基线的 ~80% 提升到 RL 后的 91-96%,接近闭源模型水平

七、局限与反思

CodePercept 的范式并非没有边界。

matplotlib 依赖。当前方法仅限于可用 matplotlib 渲染的 STEM 图像,无法泛化到真实照片、TikZ 绘图、手绘草图等更广泛的视觉场景。这意味着 ICC-1M 数据集的领域覆盖存在系统性偏差。

GPT-4o 奖励偏差。RL 阶段的语义等价性评估依赖 GPT-4o 评分,引入了外部模型的价值判断偏差。当 GPT-4o 自身对某些代码模式的偏好与任务目标不一致时,这种偏差会被放大。

与最强模型的差距。CodePercept-32B-R1 在 STEM2Code-Eval 上与 Gemini2.5-Pro-Thinking 仍有 6.40 分差距(65.75 vs 72.15),说明感知增强虽是关键杠杆,但并非万能解——推理能力的提升仍然不可忽视。

可复现性。论文截至发表时,训练代码和数据均未公开,仅提供了推理权重和基准数据。这对于社区验证和后续研究而言是一个显著的阻碍。

相关概念

  • Dense Feature退化 — 感知瓶颈本质是dense feature质量问题,详见V-JEPA 2.1
  • 视觉原语锚定 — 坐标锚定与visual primitives是同一思路的不同实现,详见DeepSeek视觉原语

参考文献

本文部分 reference 的 arXiv ID 为 2026 年预占位编号,待论文正式公开后将更新链接。

  1. Guan T, Yang Z, Wan J, et al. CodePercept: Code-Grounded Visual STEM Perception for MLLMs[C]. CVPR, 2026. arXiv:2603.10757
  2. Guo D, Yang D, Zhang H, et al. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning[J]. arXiv preprint arXiv:2501.12948, 2025.
  3. Bai S, Chen K, Liu X, et al. Qwen3-VL: Thinking with Visual Perception[J]. arXiv preprint, 2025.
  4. Shi J, Yu Z, Wang Y, et al. GRPO: Group Relative Policy Optimization for Alignment[J]. arXiv preprint, 2024.
  5. Yang A, Yang B, Hui B, et al. Qwen2.5-VL Technical Report[J]. arXiv preprint, 2025.
  6. Lu P, Bansal H, Xia T, et al. MathVista: Evaluating Mathematical Reasoning of Foundation Models in Visual Contexts[C]. ICLR, 2024.