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

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 的学习率。这样既能保护视觉特征,又允许适度的视觉优化。
# ==========================================
# 差异化学习率配置
# ==========================================
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 给出什么理由。
舒适性奖励。 驾驶不仅要安全,还要舒适——急刹车、急转弯会让乘客不舒服。舒适性约束通常用软约束来实现:作为奖励函数的一个正则项,和安全奖励做权衡。
效率性奖励。 在保证安全和舒适的前提下,尽快到达目的地。效率性奖励鼓励模型选择更短的路线和更合理的速度。
# ==========================================
# 自动驾驶 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 | 独立 ViT | Cross-attention | 全量或差异化 | 通用 VLM RL |
| 统一 Transformer | 共享 Transformer | Patch embedding | 全量 | 资源受限场景 |
| 冻结 ViT + 轻量解码器 | 预训练 ViT(冻结) | 线性投影 | 仅文本解码器 | 快速迭代 |
| 多视觉编码器 | 多个 ViT(不同尺度) | Attention fusion | 选择性更新 | 高精度视觉任务 |
"ViT + Transformer" 是目前最主流的架构——ViT 负责将图像编码为视觉 token,然后通过 cross-attention 机制与文本 token 交互。RL 训练时可以选择全量更新或差异化学习率。
"冻结 ViT + 轻量解码器"适合快速迭代的场景——比如你想快速验证一个奖励函数设计,不想花大量算力在视觉编码上。冻结 ViT 省掉了视觉部分的梯度计算,训练速度可以提升 3-5 倍。
"多视觉编码器"架构适合对视觉精度要求极高的任务——比如医学影像分析或卫星图像解译。多个 ViT 分别处理不同尺度或不同模态的视觉信息(比如一个处理整体布局,一个处理细节纹理),然后通过 attention fusion 层整合。RL 更新时可以选择只更新融合层,保留各个 ViT 的独立特征提取能力。
# ==========================================
# 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 训练。