云镜收藏

稍后阅读

清单保存在当前浏览器,方便下次回来继续阅读。

清单还是空的

在笔记卡片或正文页点击“加入稍后阅读”即可收藏。

卷5 · 前沿专题

5.1 多模态推理与 RL:当前最热的研究现场

约 7 分钟阅读
全书目录

展开本章目录与同卷章节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 的两种用法:

  1. 让推理链更长更对(视觉 CoT / R1 范式):R1 式长思考迁移到视觉——模型先输出”我观察到…因此…”的长链,再给答案;
  2. 让模型”动手看”(thinking with images):把视觉操作(裁剪、放大、框选、调用检测器)作为推理中的工具调用——不是被动看一张图,而是主动获取证据。

两条路线的共同引擎是 RLVR(2.7):多模态任务里存在天然可验证的奖励——几何题对答案、图表题对数值、grounding 对框 IoU、GUI 任务对完成状态。“可验证”从数学/代码平移到视觉,就是这个方向 2024–2026 爆发的直接原因。

2. 三条技术路线与代表作(截至 2026 的格局)

路线核心机制代表工作类型
视觉长 CoT + RLR1 配方平移:冷启动长思考数据 → GRPOVision-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. 学生版复现配方(把”论文级”降到你的一张卡)

  1. 任务:Geometry3K 子集(几何题,答案可解析)或 ChartQA(图表数值,字符串可比对);
  2. 底座:Qwen2.5-VL-3B-Instruct,LoRA(rank 32 挂语言侧);
  3. 奖励:答案正确=1(正则抽取后比对)+格式正确=0.2(<answer>标签)——先用最简奖励跑通;
  4. 训练:TRL GRPOTrainer,G=8,单 4090 起步(3B+LoRA 约 20GB 内);几百 step 后看两个曲线:奖励均值(在学习吗)与回答长度(R1 现象:往往先变长后收敛);
  5. 评测:训练前 vs 后在留出集上对比 + 消融”去掉格式奖励/去掉视觉输入”(后者检验模型是否真在看图——防”语言先验作弊”是这个方向审稿必问)。

升级版选题(差分点):奖励设计的消融学(格式奖励会不会挤压思考?)、工具调用动作空间的取舍、“过程奖励 vs 结果奖励”在视觉任务上的对比、幻觉与 RL 的相互作用(RL 会不会强化自信的错误?)。

4. 审稿人视角的三个 open problem(你的论文切口)

  1. 奖励作弊(reward hacking):格式猜答案、先验蒙题——“去掉视觉输入性能不掉”是红灯;解法方向:对抗性验证集、过程监督;
  2. 推理链与视觉证据脱节:长 CoT 可能是”语言独角戏”,视觉 token 只进不出——评估”思考中是否真的利用了视觉”是新基准要害(涉及评测体系 3.7);
  3. 数据效率与冷启动:长 CoT 冷启动数据贵,GRPO 冷启动不稳定——蒸馏多少、RL 多少的最优配比未知。

5. 与你方向的接口

这套引擎完全可平移到美术学交叉带:美学评分的可验证化(人对齐偏好做奖励 → 8.2/8.6)、“先局部观察名画细节再回答”的看画 agent(thinking with images 的艺术版)、构图推理的过程奖励。领域+热门引擎 = 你的舒适发射位。

6. 自测题

  1. RLVR 在视觉领域”平移”的关键是什么?(找到天然可验证的奖励源——答案可解析/框可算 IoU/任务可判完成)
  2. 三条路线分别把什么当作”动作”?(思考 token / 视觉工具调用 / 过程步骤)
  3. 学生配方的两个最低成本消融是什么?(去格式奖励;去视觉输入)
  4. “去视觉输入性能不掉”说明什么?(语言先验在作弊,模型没看图——伪视觉推理)
  5. R1 现象指哪条曲线的什么行为?(回答长度随 RL 先增后稳——探索期学会铺开思考)
  6. 为什么 3B+LoRA 的 GRPO 是学生甜点?(组采样可小、LoRA 省显存、验证器零训练成本——2.10 的三因素在此聚齐)

7. 动手作业

  1. 跑通学生配方(哪怕只 500 step),repo 里放”训练前/后同题对比 + 回答长度曲线”两张图;
  2. 构造”作弊检测集”:从留出集挑 50 题,遮图重测,找出模型蒙对的题——写一页分析(这就是你理解 reward hacking 的第一手证据);
  3. 读 Vision-R1 或 DeepEyes 一篇,画出它的奖励函数与训练流程图,标注它对你配方的三处改进;
  4. 挑战:把任务换成”给定画作判断流派并给理由”,设计一个可验证奖励(流派标签可判分——思考:理由怎么验?)——把这个卡点写下来,它就是研究题。

图解与案例 · 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["下一个问题 → 循环"]

案例:四个回答的优势是怎么算出来的

奖励 r=[0.2, 0.9, 0.1, 0.8]r = [0.2,\ 0.9,\ 0.1,\ 0.8](如格式分 + 答案对错的加权)。

mean = 0.5,std ≈ 0.354 → 优势 A≈[−0.85, +1.13, −1.13, +0.85]A \approx [-0.85,\ +1.13,\ -1.13,\ +0.85]。

读出三件事:① 不需要价值网络——组内平均就是 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 现象)。然后做那两个最低成本消融:删格式奖励、遮题干数字。