
通义千问又开源啦!WorldPM-世界偏好模型来了!
大家好,我是刘聪NLP。
是的,没错,Qwen团队又开源了,这次是偏好模型-WorldPM。
偏好模型,就是也可以理解为奖励模型,在强化学习中用来打分的那个模型!
HF:https://huggingface.co/collections/Qwen/worldpm-6826f363e9c62f97a0b437e6
Paper:https://arxiv.org/abs/2505.10527
WorldPM,是在1500万条训练样本上进行偏好训练,模型规模从1.5B到72B,同时发现偏好模型遵循与语言模型类似的缩放规律。
模型的训练数据来自多个公共论坛,包括StackExchange(一个专业问答平台)、Reddit(一个社交新闻和社区讨论平台)和 Quora(一个知识分享和问答社区)。数据一般是一个问题+多个帖子的形式,用户对这些帖子进行点赞或点踩。
偏好数据就是从回答列表中的随机选择两个具有不同净点赞数(点赞-点踩) 回答,数据样例如下。
同时为了全面评估 WorldPM,包括不同的维度的评测数据集,
- PPE:包括主观和客观部分的评估。主观部分的数据来自 Chatbot Arena 的真实用户标注。客观部分从 MMLU-Pro、IFEval、GPQA、MATH和 MBPP-Plus数据集中收集问题,并从顶尖模型中收集回答。通过与真实答案验证回答的正确性,形成偏好对。
- RMB:主要依赖 GPT4 作为主要标注器,并辅以人工验证过程。涵盖多种场景,主要分为两个方面:有用性和无害性。
- RM-Bench:包括聊天、代码、数学和安全四个领域的评估。聊天领域的评估通过在回答中插入事实错误来评估模型识别错误的能力。代码和数学的提示分别来自 HumanEvalPack和 MATH数据集,并与真实答案进行验证。安全部分包括伪有害和真正有害的问题,以评估模型的安全评估能力。
- Reward Bench:包括聊天、聊天困难、推理和安全四个领域的评估。聊天困难部分主要来自 LLMBar,通过构建微妙的错误回答来挑战奖励模型,以误导评估。
- Offset Bias:数据集构建高质量。
- HelpSteer2:数据集由人工标注者精心标注和筛选。
WorldPM在训练过程中,尝试了不同超参,发现相同步数时Batch Size越大越好,但考虑到整体数据量,最终使用10K,同时学习率采样3e-6。训练基模采样Qwen2.5系列模型。
通过结果分析,WorldPM发现,
- 在对抗性上,测试损失呈现幂律下降,说明随着训练数据和模型尺寸的增加,模型在表面完善但不相关或不完整的回复方面的能力得到了显著提升。
- 在客观评估上,存在明显的“涌现”现象,更大的模型在更多基准测试中展现出测试损失的幂律下降。WorldPM需要借助更大规模的模型来捕捉与客观知识相关的偏好。
- 在主观评估上,没有明显的scaling law,主要是主观评估具有多维特性,评估结果是多个维度的平均值。会导致某些维度呈现正向扩展,而其他维度呈现负向扩展,最终整体表现缺乏扩展性。
同时,WorldPM是一个很好的基座模型,经过3个不同的开源偏好数据集二次微调,都取得了不同程度的提高,如下表所示。
最后,在WorldPM使用时,需要注意,需要保留system token,但系统提示词要设为空,并且奖励计算采用<|endoftext|> token的隐藏状态。
from transformers import AutoModel, AutoTokenizer, AutoConfig
# 初始化模型
model_name = 'Qwen/WorldPM-72B'
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
config = AutoConfig.from_pretrained(model_name,trust_remote_code=True )
model = AutoModel.from_pretrained(
model_name,
config = config,
device_map = "auto",
trust_remote_code=True,
).eval()
# 获取偏好值
def get_score(model, tokenizer, conversation):
con_str = tokenizer.apply_chat_template(conversation, tokenize=False, add_generation_prompt=False)
input_ids = tokenizer.encode(con_str, return_tensors="pt", add_special_tokens=False)
outputs = model(input_ids=input_ids.to(model.device))
score = outputs[0].cpu().item()
return score
# 数据构造
messages = [
[
{'role': 'system', 'content': ""},
{'role': 'user', 'content': "Tips for better sleep?"},
{'role': 'assistant', 'content': "Three key tips for better sleep:\n1. Set a consistent bedtime and wake-up schedule\n2. Avoid screens 1 hour before bed\n3. Keep your bedroom cool and dark\n\nStart with these habits and you should notice improvement within a week."}
],
[
{'role': 'system', 'content': ""},
{'role': 'user', 'content': "Tips for better sleep?"},
{'role': 'assistant', 'content': "just try sleeping earlier or take some pills if u cant sleep lol. maybe watch tv until u get tired idk"}
]
]
# 计算结果
score = [get_score(model, tokenizer=tokenizer, cnotallow=message) for message in messages]
print(score)
本文转载自NLP工作站,作者:NLP工作站
