Skip to content

11.2 VLM RL 的特殊挑战——当视觉遇上强化学习

上一节我们跑通了 VLM GRPO 实验,看到模型从"瞎猜答案"进化到"先描述图片再推理"。实验本身很顺利——换一个多模态模型,改改输入格式,GRPO 的核心代码几乎不用动。但当你把 VLM RL 推向更复杂的场景(医学影像分析、自动驾驶决策、机器人视觉导航),会碰到三个在纯文本 RL 中根本不存在的问题:奖励该归因于视觉理解还是文本推理?视觉编码器该不该跟着 RL 一起更新?模型会不会"看"到图片中不存在的东西?

这三个问题不是独立的小麻烦——它们是 VLM RL 的核心理论挑战,解决得好不好直接决定了系统能不能在真实场景中工作。

VISTA-Gym Main Results

图 1:VISTA-Gym / VISTA-R1 的主结果表。表中的 w/o Tools 与 w/o Reasoning 消融说明,视觉任务里的能力提升并不只来自模型变大,还来自工具验证、推理轨迹和奖励设计共同起作用。来源:VISTA-Gym / VISTA-R1 Blog

11.2.1 奖励归因:视觉 token 与文本 token

在纯文本 RL 中,奖励归因不是问题——整个回答都是文本 token 生成的,奖励自然归因于整个生成过程。但在 VLM 中,一个回答的质量取决于两个阶段的能力:视觉理解(模型是否正确"看"到了图片内容)和文本推理(模型是否基于正确的视觉信息做出了合理的推导)。

举个例子。给模型看一张有 3 个圆形和 2 个三角形的图片,问"图中有几个圆形?"。模型回答"图中有 2 个圆形"。这个回答是错误的。但错误的原因可能有两种:

  • 视觉错误:模型"看"错了,把 3 个圆形识别成了 2 个。这种情况下,奖励信号应该告诉视觉编码器"你需要更仔细地看"。
  • 推理错误:模型"看"对了(内部表示中确实识别出了 3 个圆形),但在生成文本时说错了。这种情况下,奖励信号应该告诉文本解码器"你的推理有问题"。

问题在于,在当前的 VLM RL 框架中,我们通常只有一个标量奖励分数,无法天然区分这两种情况。更实际的做法,是把一次错误拆成几个可观察的检查点:

检查点观察什么可能的训练动作
视觉 grounding注意力、框选区域、IoU 是否合理加入 grounding reward 或视觉一致性检查
文本推理视觉描述对了,但最后推导是否出错强化推理格式、过程奖励或 verifier
跨模态融合图像证据和文本结论是否一致差异化学习率、冻结 ViT、分阶段训练

目前的主流做法是整体归因——把奖励分配给整个序列(视觉 token + 文本 token),让梯度同时更新视觉编码器和文本解码器。这种做法简单直接,但有一个根本性的问题:如果视觉编码器的参数被 RL 的梯度搞坏了,模型可能失去图像理解能力——就像一个人在做数学题时被人猛推了一下,连题目都看不清了。

另一种做法是冻结视觉编码器——RL 只更新文本解码器的参数。这保证了视觉理解能力不被破坏,但代价是模型无法通过 RL 来提升视觉理解。在上一节的几何图形实验中,这可能导致模型永远无法准确区分重叠的图形——因为视觉编码器没有机会学习这种能力。

策略优势劣势适用场景
全量更新视觉+文本联合优化视觉编码器可能被破坏视觉理解需要提升的任务
冻结编码器保护视觉能力无法提升视觉理解视觉编码器已经很强的场景
差异化学习率平衡保护与优化超参数调优更复杂通用推荐策略

差异化学习率是最常用的折中方案——视觉编码器用文本解码器 1/10 的学习率。这样既能保护视觉特征,又允许适度的视觉优化。

python
# ==========================================
# 差异化学习率配置
# ==========================================
def setup_optimizer_with_lr_decay(model, text_lr=1e-6, vision_lr=1e-7):
    """对视觉编码器和文本解码器使用不同学习率"""
    param_groups = [
        {
            'params': [p for n, p in model.named_parameters()
                       if 'vision' in n or 'vit' in n],
            'lr': vision_lr,  # 视觉编码器:更小的学习率
            'weight_decay': 0.01,
        },
        {
            'params': [p for n, p in model.named_parameters()
                       if 'vision' not in n and 'vit' not in n],
            'lr': text_lr,    # 文本解码器:正常学习率
            'weight_decay': 0.01,
        },
    ]
    return torch.optim.AdamW(param_groups)

11.2.2 视觉幻觉:模型"看"到了不存在的东西

视觉幻觉(Visual Hallucination)是 VLM 最令人头疼的问题之一。它指的是模型在回答中描述了图片中根本不存在的内容。比如图片里只有一个红色三角形,模型却说"我看到图片中有 3 个红色三角形和 2 个蓝色圆形"。

视觉幻觉在纯文本 RL 中不存在——因为纯文本模型不会"看"到任何东西,它的所有输出都是基于文本输入生成的。但 VLM 的输入包含图像,模型需要对图像内容做出判断,而判断就可能出错。

在 RL 训练中,视觉幻觉会以一种特别阴险的方式出现。如果模型的某个幻觉恰好得到了高奖励(比如它"编造"了正确的图形数量),RL 会强化这种行为——模型学会了"猜"比"看"更划算。这和第 7 章讨论的奖励黑客本质上是一样的,但多了一个维度:模型不仅在文本生成上可能作弊,在视觉理解上也可能作弊。

应对视觉幻觉的几种策略:

策略一:视觉 grounding 检查。 在奖励函数中加入视觉一致性检查——模型描述的内容是否和图片一致。这需要一个额外的验证模型,或者用 OCR/目标检测等工具做交叉验证。

策略二:不确定性惩罚。 如果模型对视觉内容的描述过于肯定(比如"图中有 3 个圆形"而不是"图中似乎有 2-3 个圆形"),且描述与实际不符,给予额外惩罚。鼓励模型在不确定时表达不确定性。

策略三:多轮验证。 先让模型描述图片内容,然后用另一个模型(或规则系统)验证描述的准确性,只有通过验证的回答才能得到完整奖励。这本质上是在奖励函数中嵌入了一个"事实核查"步骤。

思考题:为什么视觉幻觉在 RL 训练中比在 SFT 训练中更容易恶化?

在 SFT 训练中,模型的输出被约束在人类标注的"标准答案"范围内——如果标准答案是"图中有 2 个圆形",模型就被训练成说"图中有 2 个圆形"。人类标注起到了"安全网"的作用。

但在 RL 训练中,模型通过试错来发现高奖励的行为。如果它偶尔"编造"了一个恰好正确的答案,得到了高奖励,这种行为就被强化了。更糟糕的是,RL 的探索机制会鼓励模型尝试各种策略——包括"不看图直接猜"的策略。如果这个策略碰巧有效(在简单任务上猜对的概率不低),它就会被迅速强化。

这就是为什么在 VLM RL 中,奖励函数的设计比纯文本 RL 更关键——你不仅要评估"答案对不对",还要评估"模型是否真的看了图"。

11.2.3 自动驾驶中的 VLM-RL

VLM RL 不只是学术实验,它已经在真实世界的应用中展现出巨大潜力。自动驾驶是其中最引人注目的方向之一。

想象一个自动驾驶系统的架构:VLM 接收前方路况的图像,生成对当前场景的理解("前方 50 米有行人正在过马路,左侧车道有一辆卡车正在变道"),然后基于这个理解生成驾驶决策。RL 的作用是训练 VLM 生成更好的场景理解和决策——不是用人类标注的"标准答案"来训练(因为你无法列举所有可能的场景),而是用奖励信号来引导模型学习。

工程上,这个闭环通常不会直接写成“图像 → 动作 → 奖励”三步,而会拆成更保守的链路:

环节主要问题安全约束
场景理解是否识别到了关键交通参与者低置信度时触发降级策略
决策候选当前动作是否合理硬过滤危险动作
仿真回放动作后果是否稳定在模拟环境中覆盖边界场景
奖励更新是否真正提升长期安全安全 reward 优先于舒适和效率
部署监控分布外场景是否出现线上只允许受控更新,不直接试错

在自动驾驶场景中,奖励函数的设计比几何图形计数复杂得多。它通常包含三个维度:

安全性奖励。 这是最重要的维度——任何导致碰撞或危险的行为都应该被严厉惩罚。安全性约束通常用硬约束来实现:某些动作(闯红灯、逆行)永远得不到正奖励,无论 VLM 给出什么理由。

舒适性奖励。 驾驶不仅要安全,还要舒适——急刹车、急转弯会让乘客不舒服。舒适性约束通常用软约束来实现:作为奖励函数的一个正则项,和安全奖励做权衡。

效率性奖励。 在保证安全和舒适的前提下,尽快到达目的地。效率性奖励鼓励模型选择更短的路线和更合理的速度。

python
# ==========================================
# 自动驾驶 VLM-RL 奖励函数
# ==========================================
def driving_reward(scene_description, action, telemetry):
    """
    自动驾驶奖励函数
    - scene_description: VLM 对场景的描述
    - action: 驾驶动作 (steering, acceleration, braking)
    - telemetry: 传感器数据 (速度, 距离, 车道位置)
    """
    reward = 0.0

    # 1. 安全性(硬约束)
    if telemetry['collision_risk'] > 0.8:
        return -10.0  # 碰撞风险高 → 直接大惩罚

    if telemetry['red_light_violation']:
        return -10.0  # 闯红灯 → 直接大惩罚

    if telemetry['speed_limit_exceeded']:
        reward -= 5.0  # 超速 → 重惩罚

    # 2. 舒适性(软约束)
    jerk = abs(telemetry['acceleration_change'])  # 加速度变化率
    reward -= 0.1 * jerk  # 急加速/急刹车 → 小惩罚

    lateral_error = abs(telemetry['lane_deviation'])  # 车道偏移
    reward -= 0.05 * lateral_error

    # 3. 效率性(正奖励)
    if telemetry['speed'] > 0:  # 在移动
        reward += 0.1  # 鼓励前进
    if telemetry['distance_to_goal'] < telemetry['prev_distance']:
        reward += 0.2  # 靠近目的地 → 奖励

    # 4. 场景理解质量(如果 VLM 的描述与传感器一致)
    if scene_matches_sensors(scene_description, telemetry):
        reward += 0.3  # VLM 正确理解了场景

    return reward

自动驾驶 VLM-RL 面临的一个独特挑战是安全性与探索的矛盾。RL 需要探索新的策略来找到更好的驾驶方式,但探索本身就可能产生不安全的驾驶行为。你不能让模型在真实道路上"试错"——一次错误就可能造成事故。因此,自动驾驶 VLM-RL 几乎完全在仿真环境中训练,然后再迁移到真实世界。这和第 12.1 节具身智能讨论的 Sim-to-Real 问题本质上是一样的。

另一个挑战是延迟约束。在纯文本场景中,模型花 2 秒生成一个回答是完全可接受的。但在自动驾驶中,2 秒的延迟意味着车辆在高速公路上盲开了 60 米。VLM 的推理必须在毫秒级完成——这要求模型足够小、足够快,与 RL 训练中通常使用的大模型形成矛盾。

11.2.4 多模态策略的架构选择

最后,让我们总结 VLM RL 中关于模型架构的几种选择:

架构视觉编码融合方式RL 更新范围适用场景
ViT + Transformer独立 ViTCross-attention全量或差异化通用 VLM RL
统一 Transformer共享 TransformerPatch embedding全量资源受限场景
冻结 ViT + 轻量解码器预训练 ViT(冻结)线性投影仅文本解码器快速迭代
多视觉编码器多个 ViT(不同尺度)Attention fusion选择性更新高精度视觉任务

"ViT + Transformer" 是目前最主流的架构——ViT 负责将图像编码为视觉 token,然后通过 cross-attention 机制与文本 token 交互。RL 训练时可以选择全量更新或差异化学习率。

"冻结 ViT + 轻量解码器"适合快速迭代的场景——比如你想快速验证一个奖励函数设计,不想花大量算力在视觉编码上。冻结 ViT 省掉了视觉部分的梯度计算,训练速度可以提升 3-5 倍。

"多视觉编码器"架构适合对视觉精度要求极高的任务——比如医学影像分析或卫星图像解译。多个 ViT 分别处理不同尺度或不同模态的视觉信息(比如一个处理整体布局,一个处理细节纹理),然后通过 attention fusion 层整合。RL 更新时可以选择只更新融合层,保留各个 ViT 的独立特征提取能力。

python
# ==========================================
# VLM RL 架构选择的影响:训练速度对比
# ==========================================

# 假设模型总参数量 3B,其中 ViT 1B,Transformer 2B
architectures = {
    "全量更新": {
        "可训练参数": "3B",
        "单步训练时间": "~8s",
        "视觉理解保护": "弱",
        "视觉优化能力": "强",
    },
    "差异化学习率": {
        "可训练参数": "3B(ViT lr=1e-7, LM lr=1e-6)",
        "单步训练时间": "~8s",
        "视觉理解保护": "中",
        "视觉优化能力": "中",
    },
    "冻结 ViT": {
        "可训练参数": "2B",
        "单步训练时间": "~5s",
        "视觉理解保护": "强",
        "视觉优化能力": "无",
    },
}

for name, config in architectures.items():
    print(f"策略: {name}")
    for key, value in config.items():
        print(f"  {key}: {value}")
    print()

11.2.5 VLM RL 挑战速查表

把这一节讨论的挑战和对应的缓解策略整理成一张速查表:

挑战根本原因缓解策略权衡
奖励归因视觉和文本 token 共享一个奖励信号差异化学习率 / 整体归因保护视觉能力 vs 视觉优化
视觉幻觉模型编造图片中不存在的内容视觉 grounding 检查 / 不确定性惩罚训练复杂度 vs 可靠性
视觉编码器退化RL 梯度破坏预训练特征冻结 ViT / 小学习率视觉理解保护 vs 提升空间
安全性与探索矛盾RL 探索可能产生不安全行为仿真训练 + 硬约束仿真与现实的差距
推理延迟大模型推理慢模型蒸馏 / 投机解码精度 vs 速度
多尺度视觉不同任务需要不同粒度的视觉理解多视觉编码器架构计算成本 vs 精度

这些挑战不是孤立的问题,而是相互关联的系统性困难。比如,解决视觉幻觉需要更精细的奖励归因,更精细的归因又需要更好的视觉编码器,更好的视觉编码器又需要更大的模型和更多的计算……每一个改进都需要在多个维度之间做权衡。

VLM RL 的挑战远不止这些——多模态输入的策略表示、跨模态的奖励归因、视觉幻觉的防范、安全性与效率的权衡……每一个都是活跃的研究方向。接下来让我们看看当前有哪些框架正在试图解决这些问题——VLM RL 框架与前沿

参考资料

  • VISTA-Gym / VISTA-R1 Blog —— 展示了工具、推理轨迹和奖励设计在视觉问答任务中的消融结果。
  • VLM-R1 GitHub —— 提供 grounding reward 曲线,可用来理解视觉奖励如何进入 VLM RL 训练。

Built for reusable bilingual course delivery