许可证: mit
数据集:
- array/SAT
语言:
- en
评估指标:
- accuracy
基础模型:
- Qwen/Qwen2-VL-2B
标签:
- r1
任务标签: 图像文本到文本
VisualThinker-R1-Zero
论文链接👁️
🚀 简介
最近的 DeepSeek-R1 展示了如何通过基于简单规则的奖励强化学习,使大型语言模型自主发展出复杂的推理能力,其特点是“顿悟时刻”——模型在训练过程中表现出自我反思和响应长度的增加。然而,将这一成功扩展到多模态推理的尝试往往未能重现这些关键特征。在本报告中,我们首次成功地在仅一个非监督微调(SFT)的 2B 模型上复现了这些多模态推理的涌现特征。以 Qwen2-VL-2B 为基础模型,直接在 SAT 数据集上应用强化学习,我们的模型在 CVBench 上达到了 59.47% 的准确率,比基础模型提升了约 30%,并超过了监督微调(SFT)设置约 2%。此外,我们还分享了在尝试使用强化学习实现类似 R1 推理能力的失败尝试和见解,旨在揭示其中的挑战。我们的关键观察包括:(1)在指令模型上应用强化学习通常会导致推理轨迹变得平庸;(2)简单的长度奖励无法有效激发推理能力。项目代码可在 https://github.com/turningpoint-ai/VisualThinker-R1-Zero 获取。
🔮 亮点
- 我们是首个成功在仅一个非监督微调的 2B 模型上复现“顿悟时刻”和响应长度增加的多模态推理研究。
- 我们展示了视觉中心任务也能从改进的推理能力中受益。
与 DeepSeek R1 类似,在视觉中心推理任务的强化学习训练中,我们也观察到了自我反思行为。模型表现出重新思考并纠正错误的涌现能力:
...
因此,带有白色毯子的深棕色木床并不在门道上方。
但等等!我可以想到其他可能性。
也许它只是比门道稍高,但比门道上方略低。
...
⚙️ 要求与安装
- Python >= 3.10
- Pytorch == 2.0.1
- CUDA 版本 >= 11.7
- 安装所需依赖包:
pip install git+https://github.com/huggingface/transformers
pip install qwen-vl-utils
💻 模型下载与使用
from PIL import Image
import requests
from io import BytesIO
from transformers import AutoProcessor, AutoModelForImageTextToText
processor = AutoProcessor.from_pretrained("turningpoint-ai/VisualThinker-R1-Zero")
model = AutoModelForImageTextToText.from_pretrained("turningpoint-ai/VisualThinker-R1-Zero",
torch_dtype="auto", device_map="auto")
model.eval()
image_url = "https://multimodal-r1.s3.us-west-1.amazonaws.com/demo_image.jpg"
question = "根据提供的图像中沙发和图片的相对位置,沙发相对于图片位于哪里?从以下选项中选择。\n(A) 上方 或 \n(B) 下方"
prompt = f"用户与助手之间的对话。用户询问关于图像的问题,助手解决它。助手先在脑海中思考推理过程,然后向用户提供答案。\n用户: {question} \n助手: 让我一步步解决这个问题。\n<思考>"
message = [
{
"type": "image",
"image": image_url,
},
{"type": "text", "text": "<image>" + prompt},
]
response = requests.get(image_url)
image = Image.open(BytesIO(response.content))
text = processor.apply_chat_template(message, tokenize=False, add_generation_prompt=True)
input = processor(
text=text,
image=image,
padding=True,
return_tensors="pt",
)
input = input.to("cuda")
generated_ids = model.generate(**input, use_cache=True, max_new_tokens=1024, do_sample=True)
generated_ids_trimmed = [
out_ids[len(in_ids):] for in_ids, out_ids in zip(input.input_ids, generated_ids)
]
batch_output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
output_text = batch_output_text[0]
print(output_text)
🙌 保持联系!
我们始终欢迎深入的讨论、合作,或者只是分享一杯虚拟咖啡。如需联系我们或加入我们的团队,请访问 TurningPoint AI 主页获取联系方式。
📖 致谢
我们衷心感谢 DeepSeek、Open-R1、QwenVL、Open-R1-Multimodal、R1-V、SAT 和 CV-Bench 提供的开源资源,为我们的项目奠定了基础。
🤝 贡献者
以下是 TurningPoint AI 对本项目的主要贡献者:
Hengguang Zhou1* , Xirui Li1* , Ruochen Wang1† , Minhao Cheng2, Tianyi Zhou3 和 Cho-Jui Hsieh14
* 项目负责人, † 主要顾问
1加州大学洛杉矶分校, 2宾夕法尼亚州立大学, 3马里兰大学, 4谷歌研究院
✏️ 引用
@misc{zhou2025r1zerosahamomentvisual,
title={R1-Zero's "Aha Moment" in Visual Reasoning on a 2B Non-SFT Model},
author={Hengguang Zhou and Xirui Li and Ruochen Wang and Minhao Cheng and Tianyi Zhou and Cho-Jui Hsieh},
year={2025},
eprint={2503.05132},
archivePrefix={arXiv},
primaryClass={cs.AI},
url={https://arxiv.org/abs/2503.05132},
}