模型概述
模型特點
模型能力
使用案例
🚀 Skywork獎勵模型系列
Skywork獎勵模型系列包含兩款先進的獎勵模型,分別基於特定架構構建,使用高質量偏好數據對模型進行訓練,在RewardBench排行榜上表現優異,可用於處理複雜場景下的偏好問題。
🚀 快速開始
Skywork-Reward-Gemma-2-27B 和 Skywork-Reward-Llama-3.1-8B 分別基於 gemma-2-27b-it 和 Meta-Llama-3.1-8B-Instruct 架構構建。這兩款模型均使用 Skywork獎勵數據集合 進行訓練,該集合僅包含80K個來自公開數據的高質量偏好對。
我們僅使用公開數據,旨在證明在無需進一步進行算法或架構修改的情況下,通過相對較小的數據集和簡單的數據整理技術,也能夠實現高性能的獎勵模型。Skywork獎勵數據集合 中使用的數據來源詳情見下文 數據混合 部分。
訓練得到的獎勵模型在處理複雜場景下的偏好問題時表現出色,包括具有挑戰性的偏好對,並且涵蓋了數學、編碼和安全等多個領域。截至2024年9月,它們在 RewardBench排行榜 上分別位居第一和第三。
✨ 主要特性
- 高性能:在RewardBench排行榜上取得優異成績,Skywork-Reward-Gemma-2-27B和Skywork-Reward-Llama-3.1-8B分別排名第一和第三。
- 數據高效:使用相對較小的數據集(80K高質量偏好對)和簡單的數據整理技術,實現了高性能的獎勵模型。
- 多領域適用:能夠處理複雜場景下的偏好問題,涵蓋數學、編碼和安全等多個領域。
📚 詳細文檔
數據混合
我們沒有依賴現有的大型偏好數據集,而是精心整理了 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年9月,Skywork-Reward-Gemma-2-27B和Skywork-Reward-Llama-3.1-8B在RewardBench排行榜上分別排名第一和第三。
排名 | 模型 | 聊天 | 硬聊天 | 安全 | 推理 | 得分 |
---|---|---|---|---|---|---|
1 | Skywork-Reward-Gemma-2-27B | 95.8 | 91.4 | 92.0 | 96.1 | 93.8 |
2 | SFR-LLaMa-3.1-70B-Judge-r | 96.9 | 84.8 | 92.2 | 97.6 | 92.8 |
3 | Skywork-Reward-Llama-3.1-8B | 95.8 | 87.3 | 90.6 | 96.2 | 92.5 |
4 | Nemotron-4-340B-Reward | 95.8 | 87.1 | 92.2 | 93.6 | 92.2 |
5 | ArmoRM-Llama3-8B-v0.1 | 96.9 | 76.8 | 92.2 | 97.3 | 90.8 |
6 | SFR-nemo-12B-Judge-r | 97.2 | 82.2 | 87.5 | 95.1 | 90.5 |
7 | internlm2-20b-reward | 98.9 | 76.5 | 89.9 | 95.8 | 90.3 |
💻 使用示例
基礎用法
我們提供了Skywork獎勵模型系列的示例用法。請注意:
- 我們從兩個模型的聊天模板中移除了BOS標記,以防止在
apply_chat_template
和分詞過程中重複添加。因此,請不要依賴apply_chat_template
來添加BOS標記。 - 為了使27B獎勵模型達到最佳性能,請確保你已經啟用了
flash_attention_2
或eager
實現。默認的spda
實現可能會導致一些問題,從而顯著降低該模型的性能。
以下是一個獲取兩個對話獎勵分數的示例:
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer
# 加載模型和分詞器
device = "cuda:0"
model_name = "Skywork/Skywork-Reward-Gemma-2-27B"
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}]
# 格式化並分詞對話
conv1_formatted = rm_tokenizer.apply_chat_template(conv1, tokenize=False)
conv2_formatted = rm_tokenizer.apply_chat_template(conv2, tokenize=False)
conv1_tokenized = rm_tokenizer(conv1_formatted, return_tensors="pt").to(device)
conv2_tokenized = rm_tokenizer(conv2_formatted, return_tensors="pt").to(device)
# 獲取獎勵分數
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}")
# 輸出:
# Score for response 1: 9.1875
# Score for response 2: -17.875
🔧 技術細節
技術報告
Skywork-Reward: Bag of Tricks for Reward Modeling in LLMs
📄 許可證
聲明
我們在此聲明,不得將Skywork模型用於任何危害國家或社會安全的活動,或從事非法行為。此外,我們要求用戶在未進行適當的安全審查和記錄的情況下,不要將Skywork模型部署到互聯網服務中。我們希望所有用戶都能遵守這一原則,以確保技術進步在規範和合法的環境中進行。
我們已盡最大努力確保模型訓練過程中使用的數據符合規定。然而,儘管我們付出了巨大努力,但由於模型和數據的複雜性,仍然可能存在不可預測的風險和問題。因此,如果因使用Skywork開源模型而出現任何問題,包括但不限於數據安全問題、輿論風險,或因模型被誤導、濫用、傳播或不當使用而產生的任何風險和問題,我們將不承擔任何責任。
許可協議
社區使用Skywork模型需要遵循 Skywork社區許可證。Skywork模型支持商業使用。如果您計劃將Skywork模型或其衍生產品用於商業目的,則必須遵守 Skywork社區許可證 中的條款和條件。
📞 聯繫我們
如果您有任何問題,請隨時通過 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}
}



