卷5 · 前沿专题
5.1 多模态推理与 RL:当前最热的研究现场
展开本章目录与同卷章节
1. 为什么”理解”之后还要”推理 + RL”2. 三条技术路线与代表作(截至 2026 的格局)3. 学生版复现配方(把”论文级”降到你的一张卡)4. 审稿人视角的三个 open problem(你的论文切口)5. 与你方向的接口6. 自测题7. 动手作业图解与案例 · GRPO 的一次循环8. 延伸资源附录 · 完整可运行脚本:grpo_math.py(RLVR 起点)同卷章节5.1 多模态推理与 RL:当前最热的研究现场5.2 数据为中心的 VLM 研究5.3 具身智能与 VLA:从"会说"到"会做"5.4 世界模型与空间智能:学会"预测世界怎么变"5.5 3D 视觉:NeRF → 3DGS → 前馈重建5.6 视觉 Agent 与 Computer Use:让模型操作你的电脑5.7 AI for Science 与医学影像:多模态的"硬价值"赛道5.8 高效化:蒸馏、量化、剪枝与小模型本章目标:进入你未来最可能发表论文的领域——让 VLM”想清楚再说、必要时动手看”。2.7 的 GRPO 在这里全面登场。学完标准:能说出这个领域的三条技术路线、一个学生版复现配方,以及审稿人最关心的三个 open problem。
1. 为什么”理解”之后还要”推理 + RL”
卷3 的 VLM 会看会说,但系统性短板仍在:几何题靠蒙、图表数值算错、需要”再看一眼细节”时不会再看、幻觉随难度上升。两条互补的补强路线,恰好对应 RL 的两种用法:
- 让推理链更长更对(视觉 CoT / R1 范式):R1 式长思考迁移到视觉——模型先输出”我观察到…因此…”的长链,再给答案;
- 让模型”动手看”(thinking with images):把视觉操作(裁剪、放大、框选、调用检测器)作为推理中的工具调用——不是被动看一张图,而是主动获取证据。
两条路线的共同引擎是 RLVR(2.7):多模态任务里存在天然可验证的奖励——几何题对答案、图表题对数值、grounding 对框 IoU、GUI 任务对完成状态。“可验证”从数学/代码平移到视觉,就是这个方向 2024–2026 爆发的直接原因。
2. 三条技术路线与代表作(截至 2026 的格局)
| 路线 | 核心机制 | 代表工作类型 |
|---|---|---|
| 视觉长 CoT + RL | R1 配方平移:冷启动长思考数据 → GRPO | Vision-R1、LLaVA-CoT 类、各家”思考型 VLM” |
| Thinking with images | 工具调用式 RL:裁剪/缩放/grounding 作为动作空间 | DeepEyes、OpenThinkIMG、GUI agent 系 |
| 过程奖励/多粒度验证 | 除最终答案外对中间步骤给奖励 | PRM 类、多 verifier 组合 |
配套的共性组件:数据(GSM8K/ImageNet 几何题/ChartQA 类可验证集);奖励设计(格式奖励保证可解析 + 答案奖励 + 过程/工具奖励);训练栈(Qwen2.5/3-VL 2–7B + LoRA + GRPO,框架 TRL / verl / EasyR1)。
3. 学生版复现配方(把”论文级”降到你的一张卡)
- 任务:Geometry3K 子集(几何题,答案可解析)或 ChartQA(图表数值,字符串可比对);
- 底座:Qwen2.5-VL-3B-Instruct,LoRA(rank 32 挂语言侧);
- 奖励:
答案正确=1(正则抽取后比对)+格式正确=0.2(<answer>标签)——先用最简奖励跑通; - 训练:TRL
GRPOTrainer,G=8,单 4090 起步(3B+LoRA 约 20GB 内);几百 step 后看两个曲线:奖励均值(在学习吗)与回答长度(R1 现象:往往先变长后收敛); - 评测:训练前 vs 后在留出集上对比 + 消融”去掉格式奖励/去掉视觉输入”(后者检验模型是否真在看图——防”语言先验作弊”是这个方向审稿必问)。
升级版选题(差分点):奖励设计的消融学(格式奖励会不会挤压思考?)、工具调用动作空间的取舍、“过程奖励 vs 结果奖励”在视觉任务上的对比、幻觉与 RL 的相互作用(RL 会不会强化自信的错误?)。
4. 审稿人视角的三个 open problem(你的论文切口)
- 奖励作弊(reward hacking):格式猜答案、先验蒙题——“去掉视觉输入性能不掉”是红灯;解法方向:对抗性验证集、过程监督;
- 推理链与视觉证据脱节:长 CoT 可能是”语言独角戏”,视觉 token 只进不出——评估”思考中是否真的利用了视觉”是新基准要害(涉及评测体系 3.7);
- 数据效率与冷启动:长 CoT 冷启动数据贵,GRPO 冷启动不稳定——蒸馏多少、RL 多少的最优配比未知。
5. 与你方向的接口
这套引擎完全可平移到美术学交叉带:美学评分的可验证化(人对齐偏好做奖励 → 8.2/8.6)、“先局部观察名画细节再回答”的看画 agent(thinking with images 的艺术版)、构图推理的过程奖励。领域+热门引擎 = 你的舒适发射位。
6. 自测题
- RLVR 在视觉领域”平移”的关键是什么?(找到天然可验证的奖励源——答案可解析/框可算 IoU/任务可判完成)
- 三条路线分别把什么当作”动作”?(思考 token / 视觉工具调用 / 过程步骤)
- 学生配方的两个最低成本消融是什么?(去格式奖励;去视觉输入)
- “去视觉输入性能不掉”说明什么?(语言先验在作弊,模型没看图——伪视觉推理)
- R1 现象指哪条曲线的什么行为?(回答长度随 RL 先增后稳——探索期学会铺开思考)
- 为什么 3B+LoRA 的 GRPO 是学生甜点?(组采样可小、LoRA 省显存、验证器零训练成本——2.10 的三因素在此聚齐)
7. 动手作业
- 跑通学生配方(哪怕只 500 step),repo 里放”训练前/后同题对比 + 回答长度曲线”两张图;
- 构造”作弊检测集”:从留出集挑 50 题,遮图重测,找出模型蒙对的题——写一页分析(这就是你理解 reward hacking 的第一手证据);
- 读 Vision-R1 或 DeepEyes 一篇,画出它的奖励函数与训练流程图,标注它对你配方的三处改进;
- 挑战:把任务换成”给定画作判断流派并给理由”,设计一个可验证奖励(流派标签可判分——思考:理由怎么验?)——把这个卡点写下来,它就是研究题。
图解与案例 · GRPO 的一次循环
flowchart TB
Q["问题 x(几何题/图表题)"] --> G["采样 G=4 个回答"]
G --> R["规则打分 r₁..r₄<br>(格式分 + 答案对错)"]
R --> A["优势 Aᵢ = (rᵢ − mean) / std"]
A --> U["好的回答抬概率 ↑<br>差的压概率 ↓(KL 系绳防漂移)"]
U --> NX["下一个问题 → 循环"]案例:四个回答的优势是怎么算出来的
奖励 (如格式分 + 答案对错的加权)。
mean = 0.5,std ≈ 0.354 → 优势 。
读出三件事:① 不需要价值网络——组内平均就是 baseline,同一题的四个回答互为参照,题目难度被自然消掉;② 推力按相对排名分配,而不是绝对分数;③ 若组内全对(std=0)→ 优势全 0 → 该题这轮白采。GRPO 对太简单和太难的题都天然无梯度——这既是省算力的特性,也是要靠课程数据(5.2)解决的效率问题。
8. 延伸资源
- DeepSeek-R1 论文——配方源头(2.7 已列,此处重读方法论节)
- EasyR1 / verl / TRL-GRPO 文档——三选一作为你的训练栈
- Visual-RFT / VLM-R1 类开源复现——代码级参考
附录 · 完整可运行脚本:grpo_math.py(RLVR 起点)
依赖:
trl>=0.14 peft transformers datasets(TRL 的 GRPO API 迭代较快——跑前对照你安装版本的官方文档核对参数名)。这是 5.1 §3 学生配方的文本版;多模态版只需把数据换成图文 prompt(Qwen2.5-VL 底座)。
# grpo_math.py —— Qwen2.5-1.5B + LoRA 在 GSM8K 子集上做 RLVR
import re, torch
from datasets import load_dataset
from peft import LoraConfig
from trl import GRPOConfig, GRPOTrainer
ANS = re.compile(r"<answer>(-?[\d,\.]+)</answer>")
def norm(s): return s.replace(",", "").rstrip("0").rstrip(".")
def reward_fn(completions, answer, **kwargs):
"""规则奖励:格式 0.1 + 答案正确 1.0(5.1 §3 的最简奖励)"""
out = []
for c, gold in zip(completions, answer):
m = ANS.search(c)
ok = m and abs(float(norm(m.group(1))) - float(norm(gold))) < 1e-4
out.append((1.0 if ok else 0.0) + (0.1 if m else 0.0))
return out
def to_prompt(ex):
gold = re.search(r"####\s*(.+)", ex["answer"]).group(1)
return {"prompt": [{"role": "user",
"content": ex["question"] + "\n请一步步推理,最后一行用 <answer>数字</answer> 作答。"}],
"answer": gold}
def main():
ds = load_dataset("openai/gsm8k", "main", split="train[:2000]").map(to_prompt)
cfg = GRPOConfig(
output_dir="out-grpo",
per_device_train_batch_size=8,
num_generations=8, # G=8:GRPO 的组大小
max_prompt_length=256, max_completion_length=320,
learning_rate=2e-5, bf16=True,
num_train_epochs=1, logging_steps=5, report_to="none")
peft = LoraConfig(r=32, lora_alpha=64, task_type="CAUSAL_LM",
target_modules=["q_proj","k_proj","v_proj","o_proj",
"gate_proj","up_proj","down_proj"])
trainer = GRPOTrainer(model="Qwen/Qwen2.5-1.5B-Instruct",
reward_funcs=[reward_fn], args=cfg,
train_dataset=ds, peft_config=peft)
trainer.train()
trainer.save_model("out-grpo/final")
if __name__ == "__main__":
main()
跑起来后盯两条曲线(5.1 §3):奖励均值(在学习吗)与回答长度(R1 现象)。然后做那两个最低成本消融:删格式奖励、遮题干数字。
