模型概述
模型特點
模型能力
使用案例
🚀 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}
}



