🚀 決定木を用いた言語モデルの好みの解釈
このプロジェクトは、決定木を通じて言語モデルの好みを解釈する手法を提供します。複数のモデルを比較し、RewardBenchのランキングを公開しています。
- 著者: Min Li
- ブログ: https://rlhflow.github.io/posts/2025-01-22-decision-tree-reward-model/
- モデル:
- コードリポジトリ: https://github.com/RLHFlow/RLHF-Reward-Modeling/tree/main/decision_tree
- 技術レポート: 近日公開予定
📊 RewardBenchリーダーボード (2025年1月)
順位 |
モデル |
ベースモデル |
手法 |
総合スコア |
チャット |
チャット難易度 |
安全性 |
推論能力 |
1 |
Decision-Tree-Reward-Gemma-2-27B |
Gemma-2-27B |
決定木 |
95.4 |
96.9 |
91.4 |
93.9 |
99.2 |
2 |
INF-QRM-Llama3.1-70B |
Llama-3.1-70B |
シーケンス分類器 |
95.1 |
96.6 |
91.0 |
93.6 |
99.1 |
3 |
Decision-Tree-Reward-Llama-3.1-8B |
Llama-3.1-8B |
決定木 |
94.5 |
96.6 |
89.5 |
93.2 |
98.6 |
4 |
QRM-Gemma-2-27B |
Gemma-2-27B |
シーケンス分類器 |
94.4 |
96.6 |
90.1 |
92.7 |
98.3 |
5 |
Skywork-Reward-Gemma-2-27B-v0.2 |
Gemma-2-27B |
シーケンス分類器 |
94.3 |
96.1 |
89.9 |
93.0 |
98.1 |
6 |
Llama-3.1-Nemotron-70B-Reward |
Llama-3.1-70B |
カスタム分類器 |
94.1 |
97.5 |
85.7 |
95.1 |
98.1 |
7 |
Skywork-Reward-Gemma-2-27B |
Gemma-2-27B |
シーケンス分類器 |
93.8 |
95.8 |
91.4 |
91.9 |
96.1 |
8 |
TextEval-Llama3.1-70B |
Llama-3.1-70B |
生成モデル |
93.5 |
94.1 |
90.1 |
93.2 |
96.4 |
9 |
MetaMetrics-RM-v1.0 |
- |
カスタム分類器 |
93.4 |
98.3 |
86.4 |
90.8 |
98.2 |
10 |
Skywork-Critic-Llama-3.1-70B |
Llama-3.1-70B |
生成モデル |
93.3 |
96.6 |
87.9 |
93.1 |
95.5 |
11 |
QRM-Llama3.1-8B-v2 |
Llama-3.1-8B |
シーケンス分類器 |
93.1 |
96.4 |
86.8 |
92.6 |
96.8 |
12 |
Skywork-Reward-Llama-3.1-8B-v0.2 |
Llama-3.1-8B |
シーケンス分類器 |
93.1 |
94.7 |
88.4 |
92.7 |
96.7 |
💻 使用例
基本的な使用法
モデルを使用する前に、以下の依存関係をインストールしてください。
transformers==4.45.2
torch>=2.5.0
flash-attn>=2.6.3
注意: このコードはNVIDIA Ampereアーキテクチャ以上のGPUが必要です。
from transformers import AutoModelForSequenceClassification
import torch
from transformers import AutoTokenizer
model_name = "Decision-Tree-Reward-Gemma-2-27B"
repo_id = f"RLHFlow/{model_name}"
device = "cuda"
model = AutoModelForSequenceClassification.from_pretrained(repo_id, trust_remote_code=True, torch_dtype=torch.bfloat16, attn_implementation="flash_attention_2", device_map=device)
tokenizer = AutoTokenizer.from_pretrained(repo_id, use_fast=True)
model.load_decision_tree(repo_id, filename="decision_tree.pkl")
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."
output = model.compare(prompt, response1, response2, tokenizer, device)
print("Response 1 rewards")
print(dict(zip(output["attributes"], output["rewards"][0])))
print("Response 2 rewards")
print(dict(zip(output["attributes"], output["rewards"][1])))
print("Model preference")
print(output["preference"])
📄 ライセンス
注意: このモデルはSkyworkモデルをファインチューニングしたもので、以下のライセンス契約に基づいています。
Skyworkモデルのコミュニティ利用にはSkywork Community Licenseが必要です。Skyworkモデルは商用利用をサポートしています。Skyworkモデルまたはその派生モデルを商用目的で使用する場合は、Skywork Community License内の条件に従わなければなりません。
📋 今後の予定
- [x] 報酬モデルの使用コード
- [ ] アーキテクチャ図