模型简介
模型特点
模型能力
使用案例
🚀 Skywork奖励模型系列
Skywork奖励模型系列包含两款先进的奖励模型,分别基于特定架构构建,能有效处理复杂场景下的偏好问题,涵盖数学、编程和安全等多个领域。
🚀 快速开始
重要提示
本模型使用的是经过净化处理的原始Skywork奖励偏好数据集的版本,即v0.2。更新后的数据集 Skywork-Reward-Preference-80K-v0.2 从 magpie-ultra-v0.1 子集中移除了4957个受污染的样本对,这些样本对与 RewardBench 中的评估提示存在显著的n-gram重叠。你可以在 这里 找到被移除的样本对集合。有关更多详细信息,请参考 此GitHub要点。
如果你的任务涉及在 RewardBench 上进行评估,我们强烈建议同时使用数据集和模型的v0.2版本,而非v0.1版本,以确保适当的净化处理并避免任何污染问题。
✨ 主要特性
Skywork-Reward-Gemma-2-27B-v0.2 和 Skywork-Reward-Llama-3.1-8B-v0.2 分别基于 gemma-2-27b-it 和 Llama-3.1-8B-Instruct 架构构建。这两款模型均使用 Skywork奖励数据集合 进行训练,该集合仅包含80K个来自公开数据的高质量偏好样本对。
我们仅使用公开数据,旨在证明通过相对较小的数据集和简单的数据整理技术,无需进一步的算法或架构修改,即可实现高性能的奖励模型。Skywork奖励数据集合 中使用的数据来源详情见下文 数据混合 部分。
最终的奖励模型在处理复杂场景下的偏好问题方面表现出色,包括具有挑战性的偏好样本对,并且涵盖了数学、编程和安全等多个领域。
📦 数据混合
我们没有依赖现有的大型偏好数据集,而是精心整理了 Skywork奖励数据集合,目的是:(1) 包含高质量的偏好样本对;(2) 针对特定的能力和知识领域。整理后的训练数据集约由80K个样本组成,这些样本从多个公开可用的数据源中进行子采样得到,包括:
- HelpSteer2
- OffsetBias
- WildGuard (对抗性)
- Magpie DPO系列:Ultra、Pro (Llama-3.1)、Pro、Air。
声明:除了对上述数据集进行子采样以创建Skywork奖励数据集合外,我们未对原始数据集进行任何修改。
在数据集整理过程中,我们采用了一些技巧,以在不影响整体性能的前提下,实现性能提升和各领域之间的平衡:
- 我们根据数据集中提供的平均ArmoRM分数,分别从组合的Magpie数据集中的数学、编程和其他类别中选择顶级样本。我们分别将Magpie-Air子集和Magpie-Pro子集中的ArmoRM平均分数减去0.1和0.05,以优先选择Magpie-Ultra和Magpie-Pro-Llama-3.1样本。
- 我们没有将WildGuard中的所有偏好样本对都包含在内,而是首先在其他三个数据源上训练一个奖励模型(RM)。然后,(1) 使用这个RM对WildGuard中所有样本的选择响应和拒绝响应进行评分;(2) 仅选择选择响应的RM分数大于拒绝响应的RM分数的样本。我们观察到,这种方法在提高安全性的同时,在很大程度上保留了聊天、硬聊天和推理的原始性能。对于这两款模型,我们使用27B模型对WildGuard样本进行评分。
📚 RewardBench排行榜
我们使用 官方测试脚本 在 RewardBench 上对我们的模型进行了评估。截至2024年10月,Skywork-Reward-Gemma-2-27B-v0.2 在RewardBench排行榜上排名第一。
排名 | 模型 | 模型类型 | 分数 | 聊天 | 硬聊天 | 安全 | 推理 |
---|---|---|---|---|---|---|---|
1 | Skywork/Skywork-Reward-Gemma-2-27B-v0.2 | 序列分类器 | 94.3 | 96.1 | 89.9 | 93.0 | 98.1 |
2 | nvidia/Llama-3.1-Nemotron-70B-Reward | 自定义分类器 | 94.1 | 97.5 | 85.7 | 95.1 | 98.1 |
3 | Skywork/Skywork-Reward-Gemma-2-27B | 序列分类器 | 93.8 | 95.8 | 91.4 | 91.9 | 96.1 |
4 | SF-Foundation/TextEval-Llama3.1-70B | 生成式 | 93.5 | 94.1 | 90.1 | 93.2 | 96.4 |
5 | meta-metrics/MetaMetrics-RM-v1.0 | 自定义分类器 | 93.4 | 98.3 | 86.4 | 90.8 | 98.2 |
6 | Skywork/Skywork-Critic-Llama-3.1-70B | 生成式 | 93.3 | 96.6 | 87.9 | 93.1 | 95.5 |
7 | Skywork/Skywork-Reward-Llama-3.1-8B-v0.2 | 序列分类器 | 93.1 | 94.7 | 88.4 | 92.7 | 96.7 |
8 | nicolinho/QRM-Llama3.1-8B | 序列分类器 | 93.1 | 94.4 | 89.7 | 92.3 | 95.8 |
9 | LxzGordon/URM-LLaMa-3.1-8B | 序列分类器 | 92.9 | 95.5 | 88.2 | 91.1 | 97.0 |
10 | Salesforce/SFR-LLaMa-3.1-70B-Judge-r | 生成式 | 92.7 | 96.9 | 84.8 | 91.6 | 97.6 |
11 | Skywork/Skywork-Reward-Llama-3.1-8B | 序列分类器 | 92.5 | 95.8 | 87.3 | 90.8 | 96.2 |
12 | general-preference/GPM-Llama-3.1-8B | 自定义分类器 | 92.2 | 93.3 | 88.6 | 91.1 | 96.0 |
💻 使用示例
基础用法
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer
# Load model and tokenizer
device = "cuda:0"
model_name = "Skywork/Skywork-Reward-Gemma-2-27B-v0.2"
rm = AutoModelForSequenceClassification.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
device_map=device,
attn_implementation="flash_attention_2",
num_labels=1,
)
rm_tokenizer = AutoTokenizer.from_pretrained(model_name)
prompt = "Jane has 12 apples. She gives 4 apples to her friend Mark, then buys 1 more apple, and finally splits all her apples equally among herself and her 2 siblings. How many apples does each person get?"
response1 = "1. Jane starts with 12 apples and gives 4 to Mark. 12 - 4 = 8. Jane now has 8 apples.\n2. Jane buys 1 more apple. 8 + 1 = 9. Jane now has 9 apples.\n3. Jane splits the 9 apples equally among herself and her 2 siblings (3 people in total). 9 ÷ 3 = 3 apples each. Each person gets 3 apples."
response2 = "1. Jane starts with 12 apples and gives 4 to Mark. 12 - 4 = 8. Jane now has 8 apples.\n2. Jane buys 1 more apple. 8 + 1 = 9. Jane now has 9 apples.\n3. Jane splits the 9 apples equally among her 2 siblings (2 people in total). 9 ÷ 2 = 4.5 apples each. Each person gets 4 apples."
conv1 = [{"role": "user", "content": prompt}, {"role": "assistant", "content": response1}]
conv2 = [{"role": "user", "content": prompt}, {"role": "assistant", "content": response2}]
# Format and tokenize the conversations
# If you use `tokenize=False` with `apply_chat_template` and `tokenizer()` to tokenize the conversation,
# remeber to remove the duplicated BOS token.
conv1_tokenized = rm_tokenizer.apply_chat_template(conv1, tokenize=True, return_tensors="pt").to(device)
conv2_tokenized = rm_tokenizer.apply_chat_template(conv2, tokenize=True, return_tensors="pt").to(device)
# Get the reward scores
with torch.no_grad():
score1 = rm(conv1_tokenized).logits[0][0].item()
score2 = rm(conv2_tokenized).logits[0][0].item()
print(f"Score for response 1: {score1}")
print(f"Score for response 2: {score2}")
# Output:
# 27B:
# Score for response 1: 0.5625
# Score for response 2: -8.5
# 8B:
# Score for response 1: 13.6875
# Score for response 2: -9.1875
注意事项
为了使27B奖励模型达到最佳性能,请确保你已启用 flash_attention_2
或 eager
实现。默认的 spda
实现可能会导致错误,从而显著降低该特定模型的性能。
📄 声明与许可协议
声明
我们在此声明,Skywork模型不得用于任何对国家或社会安全构成威胁的活动,或从事非法行为。此外,我们要求用户在未进行适当的安全审查和记录的情况下,不要将Skywork模型部署到互联网服务中。我们希望所有用户都能遵守这一原则,以确保技术进步在规范和合法的环境中进行。
我们已尽最大努力确保模型训练过程中使用的数据符合规定。然而,尽管我们付出了大量努力,但由于模型和数据的复杂性,仍可能存在不可预测的风险和问题。因此,如果因使用Skywork开源模型而出现任何问题,包括但不限于数据安全问题、舆论风险,或因模型被误导、滥用、传播或不当使用而产生的任何风险和问题,我们将不承担任何责任。
许可协议
Skywork模型的社区使用需要遵循 Skywork社区许可协议。Skywork模型支持商业使用。如果你计划将Skywork模型或其衍生产品用于商业目的,则必须遵守 Skywork社区许可协议 中的条款和条件。
🔧 技术报告
Skywork-Reward: Bag of Tricks for Reward Modeling in LLMs
📞 联系我们
如果您有任何问题,请随时通过 yuhao.liuu@kunlun-inc.com 或 liang.zeng@kunlun-inc.com 与我们联系。
📚 引用
如果您认为我们的工作有帮助,请使用以下BibTeX条目引用我们:
@article{liu2024skywork,
title={Skywork-Reward: Bag of Tricks for Reward Modeling in LLMs},
author={Liu, Chris Yuhao and Zeng, Liang and Liu, Jiacai and Yan, Rui and He, Jujie and Wang, Chaojie and Yan, Shuicheng and Liu, Yang and Zhou, Yahui},
journal={arXiv preprint arXiv:2410.18451},
year={2024}
}



