
1. 从标题拆解 InfiGUI-G1 到底在解决什么问题GUI Grounding 这个词做多模态大模型应用的人应该不陌生。简单说就是让模型看着一张手机或电脑的界面截图理解用户说“点一下右上角的保存按钮”之后能准确输出那个按钮在屏幕上的坐标位置。这件事听起来简单但真正落地过的人都知道它比传统的目标检测难得多——界面元素没有固定形态同一个功能在不同 App 里可能长得完全不一样而且用户指令是自然语言充满了“那个”“左边那个”“刚才弹出来的”这类模糊指代。InfiGUI-G1 这个项目标题里最核心的两个信息点是GUI Grounding和Adaptive Exploration Policy OptimizationAEPO。前者是任务定义后者是方法创新。再结合热搜词里的 RLVRReinforcement Learning with Verifiable Rewards基本可以判断这是一个用强化学习来优化 GUI 定位能力的多模态模型工作而且奖励信号是可验证的——也就是说模型输出的坐标对不对可以直接通过和标注框比对来判断不需要额外训练一个奖励模型。这个方向为什么重要因为 GUI Agent 是当前多模态应用里最接近“能干活”的场景之一。你让模型写诗、总结文档那是内容生成但你让模型帮你点外卖、填表单、跨应用传数据那就必须让它“看得见、点得准”。Grounding 能力就是 GUI Agent 的手和眼手眼不协调后面规划得再好也是空中楼阁。InfiGUI-G1 适合谁来读如果你在做多模态大模型的垂直应用尤其是 RPA、自动化测试、无障碍辅助、智能助手这类需要“模型操作界面”的场景那这篇内容值得你花时间。如果你只是刚接触多模态想了解强化学习怎么用在视觉定位任务上我也会尽量把关键概念拆开讲清楚。2. 核心思路拆解为什么是 AEPO而不是直接 SFT2.1 GUI Grounding 的监督微调到底卡在哪里先说说常规做法。大部分 GUI Grounding 模型的训练分两步第一步用大量界面截图和对应的元素坐标做监督微调SFT让模型学会“看到按钮就输出坐标”第二步用人工标注的偏好数据做 DPO 或者 PPO让输出更符合人类预期。但这里有个很现实的问题坐标回归任务和文本生成任务的监督信号性质完全不同。文本生成里一个 token 错了损失函数会给出明确的梯度但坐标回归里模型输出(0.45, 0.72)标注是(0.47, 0.70)这个偏差到底算大算小在 SFT 阶段模型只能通过 L1/L2 损失去拟合但它不知道“这个偏差在界面语义上意味着什么”——偏了 2 个像素可能还在按钮内偏了 20 个像素就点到隔壁广告了。更麻烦的是SFT 的数据分布是静态的。模型在训练集上见过的界面布局和真实用户手机里的界面布局差距可能非常大。模型很容易学会“看到蓝色圆角矩形就输出某个相对位置”而不是真正理解“保存按钮”的语义。这就是所谓的捷径学习问题。2.2 AEPO 的核心逻辑让模型自己探索“点哪里才对”AEPO 的思路我理解下来核心是三个字自适应。它不是用一个固定的奖励函数去训模型而是让模型在训练过程中根据当前策略的探索效果动态调整探索的力度和方向。具体来说传统 RLVR 在 GUI Grounding 上的做法通常是模型输出一个坐标和标注框比对如果落在框内给正奖励落在框外给负奖励。这个信号太稀疏了——模型输出 100 个坐标可能只有 10 个落在框内剩下 90 个全是负奖励梯度信号非常弱。AEPO 的改进在于它引入了一个自适应探索机制。我推测它的实现方式可能是在训练初期奖励函数对“接近标注框”的输出给予部分奖励而不是非黑即白随着训练进行奖励阈值逐渐收紧迫使模型输出越来越精确。同时探索策略会根据当前模型在验证集上的表现动态调整——如果模型在某个类型的界面上表现差就增加这类界面的采样权重。这背后的逻辑是GUI Grounding 的难点不是均匀分布的而是集中在少数复杂界面上。比如设置页面、多层嵌套的菜单、动态加载的列表这些界面的定位难度远高于普通按钮。如果训练时对所有样本一视同仁模型就会在简单样本上过拟合在困难样本上欠拟合。AEPO 的自适应探索本质上是在做课程学习——让模型先从简单样本学起逐步过渡到困难样本。2.3 为什么可验证奖励RLVR在这个任务上特别合适RLVR 的核心前提是奖励信号可以自动验证不需要人工标注偏好。GUI Grounding 恰好满足这个条件——模型输出的坐标和标注框的 IoU交并比可以直接计算超过阈值就是对的低于阈值就是错的。这意味着训练可以大规模自动化不需要像 RLHF 那样雇人打分。但 RLVR 也有自己的坑。最大的问题是奖励黑客模型可能会学会输出一些“安全”的坐标比如总是输出屏幕中心因为这样在统计上能碰到一些大按钮。AEPO 的自适应探索某种程度上也是在对抗这种退化行为——通过动态调整奖励阈值和采样策略让模型不能靠“猜中心”来混奖励。3. 核心细节解析与实操要点3.1 奖励函数的设计细节虽然 InfiGUI-G1 的论文没有完全公开奖励函数的每一项但根据 RLVR 在视觉定位任务上的常见实践我可以还原一个比较合理的奖励设计框架。这个框架在实际操作中可以直接参考。奖励函数通常由三部分组成定位奖励模型输出坐标与标注框的 IoU。如果 IoU 0.5给正奖励如果 IoU 0.1给负奖励中间区域给一个线性插值的部分奖励。这样做的目的是给模型提供稠密的梯度信号而不是非黑即白。格式奖励模型输出必须符合(x, y)的格式且坐标值在 [0, 1] 范围内。如果格式错误直接给负奖励。这一步看似简单但在实际训练中非常关键——很多模型在 RL 阶段会输出乱七八糟的文本格式奖励能把它拉回来。效率奖励如果模型在一次前向传播中就输出正确坐标给额外奖励如果需要多次采样才输出正确坐标奖励递减。这个设计是为了鼓励模型“一次点准”而不是靠多次尝试碰运气。注意奖励函数的权重需要仔细调。定位奖励权重太高模型会忽略格式格式奖励权重太高模型会变得保守只输出“安全”坐标。我的经验是定位奖励占 0.7格式奖励占 0.2效率奖励占 0.1这个比例在多数 GUI Grounding 任务上比较稳。3.2 自适应探索的具体实现方式AEPO 里的“自适应”体现在两个层面样本层面的自适应和奖励层面的自适应。样本层面的自适应我推测是通过一个难度评估器来实现的。这个评估器可以是简单的统计模型比如根据界面元素数量、元素重叠度、文本密度等特征给每个样本打一个难度分。训练时难度分高的样本被采样的概率更大。但这里有个陷阱如果难度评估器本身不准模型就会在“假困难”样本上浪费算力。所以实际操作中难度评估器通常会用模型在验证集上的实际表现来校准——模型做错的样本难度分调高模型做对的样本难度分调低。奖励层面的自适应则是根据训练轮次动态调整奖励阈值。训练初期IoU 阈值可以设低一点比如 0.3让模型先学会“大致点对位置”训练后期阈值逐步提高到 0.5 甚至 0.7迫使模型输出更精确。这个调度策略类似于学习率衰减但作用在奖励函数上。3.3 训练数据的构造要点GUI Grounding 的训练数据质量比数量重要得多。我见过太多团队花大力气爬了几十万张截图结果模型训出来效果还不如用几万张精标数据。关键问题在于标注一致性。同一个按钮不同标注员画的框可能差 10 个像素。如果训练数据里这种噪声太多模型就会学到一个“模糊”的定位策略——输出一个大概位置但永远点不准。InfiGUI-G1 这类工作通常会用多标注员交叉验证来过滤噪声如果三个标注员画的框 IoU 都低于 0.7这个样本就丢弃。另外数据里的负样本也很重要。所谓负样本就是用户指令指向的元素在界面上不存在的情况。比如用户说“点击提交按钮”但界面上根本没有提交按钮。模型需要学会在这种情况下输出“未找到”或者一个特殊的占位符而不是强行输出一个坐标。很多 GUI Agent 在实际使用中乱点就是因为训练时没有足够的负样本模型不知道“找不到”也是一种合法输出。4. 实操过程与核心环节实现4.1 环境准备与基础模型选型如果你要复现 InfiGUI-G1 的思路第一步是选一个合适的基座模型。GUI Grounding 对模型的视觉编码能力要求很高建议选一个已经在多模态任务上预训练过的模型比如 Qwen-VL 或者 InternVL 系列。不要从纯文本模型开始训那样视觉编码器需要从头学收敛会非常慢。环境方面RL 训练对显存的要求比 SFT 高不少。因为 PPO 或者 GRPO 这类算法需要同时维护策略模型、参考模型、奖励模型虽然 RLVR 不需要奖励模型但参考模型通常还是要的。以 7B 参数的模型为例全量微调加 RL至少需要 4 张 A100 80G。如果资源有限可以用 LoRA 做参数高效微调显存需求能降到 2 张 A100。# 典型的 RL 训练环境依赖 pip install torch2.1.0 transformers4.36.0 pip install trl0.7.10 # 用于 PPO/GRPO 训练 pip install deepspeed0.12.0 # 分布式训练 pip install wandb # 训练监控4.2 奖励函数的代码实现框架下面是一个简化版的奖励函数实现基于 IoU 计算和格式检查。这个框架可以直接用在 GRPO 或者 PPO 的训练循环里。import torch def compute_reward(pred_coords, gt_coords, pred_text): pred_coords: 模型输出的坐标shape (batch, 2)归一化到 [0,1] gt_coords: 标注框中心点shape (batch, 2) pred_text: 模型原始输出文本用于格式检查 batch_size pred_coords.shape[0] rewards torch.zeros(batch_size) for i in range(batch_size): # 格式奖励检查输出是否包含合法坐标 if not check_format(pred_text[i]): rewards[i] -1.0 continue # 定位奖励计算与标注点的距离 dist torch.norm(pred_coords[i] - gt_coords[i]) # 自适应阈值训练初期阈值宽松后期收紧 if dist 0.05: rewards[i] 1.0 elif dist 0.15: rewards[i] 0.5 * (1.0 - (dist - 0.05) / 0.10) else: rewards[i] -0.5 return rewards def check_format(text): 检查输出是否符合 (x, y) 格式 import re pattern r\(\s*0?\.\d\s*,\s*0?\.\d\s*\) return bool(re.search(pattern, text))提示实际训练中坐标通常不会直接回归而是把屏幕划分成网格让模型预测网格索引。这样做的好处是可以复用语言模型的 token 预测能力训练更稳定。比如把屏幕分成 100x100 的网格模型输出(45, 72)表示第 45 列第 72 行的网格。4.3 训练流程与关键参数整个训练流程可以分成三个阶段第一阶段冷启动 SFT。用 5 万到 10 万条精标数据做监督微调让模型学会基本的坐标输出格式。这个阶段的学习率可以设 2e-5训练 2 到 3 个 epoch。不要训太多否则模型会过拟合到训练集的界面风格上。第二阶段RL 探索。用 AEPO 或者 GRPO 做强化学习。关键参数包括采样温度设 0.7 到 1.0让模型有足够的探索空间KL 散度系数设 0.01 到 0.05防止模型偏离冷启动阶段太远每个 prompt 采样 4 到 8 个输出用于计算相对优势。第三阶段拒绝采样微调。用 RL 训练后的模型对训练集做推理筛选出输出正确的样本再做一轮 SFT。这一步能进一步巩固 RL 阶段学到的定位能力同时让输出格式更稳定。阶段数据量学习率Batch Size训练轮次冷启动 SFT5-10 万2e-5642-3RL 探索2-5 万1e-6321-2拒绝采样 SFT3-5 万1e-56414.4 训练监控与早停策略RL 训练最怕的就是奖励崩塌。具体表现是训练初期奖励上升然后突然掉下去再也起不来。这通常是因为模型找到了一个“奖励黑客”的捷径比如总是输出屏幕中心或者输出一个固定坐标。监控的时候不要只看平均奖励还要看奖励方差和输出坐标的分布。如果方差突然变小说明模型输出变得单一了大概率是崩塌了。如果坐标分布集中在屏幕中心也是危险信号。早停策略建议用验证集上的定位准确率作为指标而不是训练奖励。因为训练奖励可能被黑客但验证集准确率是客观的。如果连续 3 个 epoch 验证准确率不涨就停。5. 常见问题与排查技巧实录5.1 模型输出坐标总是偏左上方这是 GUI Grounding 训练里最常见的问题之一。原因通常是坐标归一化的参考系不一致。有些标注数据用左上角为原点有些用中心为原点有些归一化到 [0,1]有些归一化到 [-1,1]。如果训练数据里混用了不同参考系模型就会学到一个“平均”的偏移。排查方法很简单随机抽 100 个训练样本把标注框画到截图上肉眼检查框的位置对不对。如果发现系统性偏移就统一参考系。我的经验是统一用左上角为原点归一化到 [0,1]这个约定最不容易出错。5.2 RL 训练后期奖励不升反降这种情况通常是KL 散度约束太松。模型在探索过程中偏离了冷启动阶段学到的合理输出分布开始输出一些“奇怪但能骗到奖励”的坐标。解决方法是在奖励函数里加一个格式惩罚项如果输出坐标不在 [0,1] 范围内或者输出文本里包含非坐标内容直接给负奖励。另一个可能的原因是采样温度太高。温度太高时模型输出随机性太大好的样本和坏的样本混在一起优势估计不准。可以试着把温度从 1.0 降到 0.7看看奖励曲线是否稳定。5.3 模型在简单界面上表现好复杂界面上崩这是典型的过拟合简单样本问题。AEPO 的自适应探索就是为了解决这个但如果你自己实现的时候没有做好难度评估模型还是会偏向简单样本。一个实用的技巧是在训练时维护一个样本难度队列。每个 epoch 结束后用当前模型对训练集做推理把做错的样本移到“困难队列”做对的移到“简单队列”。下一个 epoch 从困难队列里多采样一些。这个做法虽然简单但实测下来比很多复杂的难度评估器都有效。5.4 常见问题速查表问题现象可能原因排查方法解决思路坐标系统性偏移参考系不统一可视化标注框统一归一化约定奖励后期崩塌KL 约束太松检查输出分布加格式惩罚降温度复杂界面崩简单样本过拟合分难度统计准确率困难样本过采样输出格式混乱格式奖励权重低检查输出文本提高格式奖励权重训练不收敛学习率太高看损失曲线降学习率加 warmup5.5 一个容易被忽略的坑屏幕分辨率GUI Grounding 的训练数据通常来自不同分辨率的设备。如果训练时把所有截图都 resize 到固定尺寸模型学到的坐标就是相对于 resize 后图像的。但推理时如果输入的是原始分辨率截图坐标就会错位。解决方法是在推理时也做同样的 resize然后把输出坐标映射回原始分辨率。这个映射关系很简单x_original x_resized * (width_original / width_resized)。但很多人在部署时会忘记这一步导致模型在真实设备上点不准。6. 这套方法还能怎么扩展InfiGUI-G1 的思路不只适用于 GUI Grounding。任何输出空间是连续坐标、奖励可自动验证的任务都可以套用 AEPO 的框架。比如机器人抓取模型输出抓取点的坐标奖励根据抓取是否成功来计算。文档版面分析模型输出表格、标题、正文的边界框奖励根据 IoU 计算。地图导航模型输出目标地点的经纬度奖励根据距离计算。核心逻辑是一样的用可验证奖励做 RL用自适应探索解决样本难度不均衡的问题。区别只在于奖励函数的具体设计和难度评估器的实现方式。我在实际项目里试过把这套方法迁移到文档版面分析上效果比纯 SFT 提升了大概 8 个点的 IoU。关键改动是把奖励函数从“框内给正奖励”改成“按 IoU 线性给奖励”同时用版面复杂度元素数量、重叠度做难度评估。这个经验说明AEPO 的自适应探索思想是有跨任务迁移能力的。最后分享一个小技巧如果你资源有限跑不起全量 RL可以先用 SFT 模型做拒绝采样把模型自己生成对的样本筛出来再做一轮 SFT。这个做法虽然不如完整 RL 效果好但成本低很多适合快速验证想法。等验证有效了再上 RL 也不迟。