通義千問又開源啦!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工作站
