中午,看到三大顶会推了一个叫VLM-R1的仓库,评测的2个图看起来很漂亮,如下。左图是测试相同领域评测结果,右图是out-of-domain的评测结果。随着训练步骤增加,grpo相比sft都有明显优势,sft更容易过拟合。 看完之后,问题就来了,r1是用的规则奖励函数,而vlm的训练数据,很多是这种格式的: q + image -> a,那vlm是怎么跟r1结合到一起的? 所以笔者去瞧了瞧,简单分享下这个项目是怎么把grpo迁移到vlm上的。
VLM-R1-evaluation
项目地址:https://github.com/om-ai-lab/VLM-R1/tree/main
关于数据,这个项目是基于一个目标检测数据集的,Refcoco+。以前没做过这块,所以我去搜了下,说是这么个格式的数据集,每张图,有一些框,然后针对这些框有一些描述。
整个项目是基于open-r1项目的,那就很简单了,直接瞄准data处理和reward就完事了。
他的prompt这块跟文本的没啥太大区别,所以看不出来啥。
https://github.com/om-ai-lab/VLM-R1/blob/main/src/open-r1-multimodal/src/open\_r1/grpo\_rec.py
滑到奖励函数,就清晰了。一个格式奖励函数,一个iou函数。iou是目标检测中一个常见的度量标准, 简单来说两个框的交集面积除以并集面积的比值。判断是否大于0.5,给予奖励。
因此,猜测这个数据构造应该就是把那个描述构造成问题,然后让模型预测框框的位置。
打开hf demo的app脚本,确实就是这样做的。
https://huggingface.co/spaces/omlab/VLM-R1-Referral-Expression/blob/main/app.py
好像也不太好玩,别的不做过多介绍了,之前详细分析过open-r1的代码。这个项目的demo地址:https://huggingface.co/spaces/omlab/VLM-R1-Referral-Expression