はじめに
RLHF (人間のフィードバックからの強化学習) は、GPT-3 を ChatGPT に変えた技術であり、報酬モデルと PPO を通じて LLM を人間の好みに合わせます。
1. RLHF パイプライン — 3 つのステップ
ステップ 1: 教師あり微調整 (SFT)
from transformers import AutoModelForCausalLM, TrainingArguments
from trl import SFTTrainer
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B")
trainer = SFTTrainer(
model=model,
train_dataset=demo_dataset, # (prompt, response) pairs
args=TrainingArguments(
output_dir="./sft_model",
num_train_epochs=3,
per_device_train_batch_size=4,
learning_rate=2e-5,
),
)
trainer.train()
ステップ 2: 報酬モデルのトレーニング
from trl import RewardTrainer, RewardConfig
reward_model = AutoModelForSequenceClassification.from_pretrained(
"meta-llama/Llama-3.1-8B", num_labels=1
)
trainer = RewardTrainer(
model=reward_model,
train_dataset=preference_dataset,
# Format: {prompt, chosen_response, rejected_response}
args=RewardConfig(
output_dir="./reward_model",
per_device_train_batch_size=4,
num_train_epochs=1,
),
)
trainer.train()
ステップ 3: PPO の微調整
from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead
model = AutoModelForCausalLMWithValueHead.from_pretrained("./sft_model")
ref_model = AutoModelForCausalLMWithValueHead.from_pretrained("./sft_model")
config = PPOConfig(
batch_size=16,
learning_rate=1e-5,
ppo_epochs=4,
mini_batch_size=4,
)
trainer = PPOTrainer(config, model, ref_model, tokenizer)
for batch in dataloader:
queries = batch["query"]
responses = model.generate(queries)
rewards = reward_model(queries, responses)
# KL penalty to prevent reward hacking
trainer.step(queries, responses, rewards)
2. 報酬ハッキングと KL ダイバージェンス
Total Reward = RM_score(response) - β * KL(π || π_ref)
KL ペナルティはモデルを SFT モデルに近づけます → 報酬のハッキングを回避します。
3. 憲法上の AI (人間的)
- 応答を生成する 2.モデルに原則に基づいて批評してもらいます
- モデルに修正を依頼する
- 修正された対応についてトレーニングする (RLAIF)
概要
| ステップ | 入力 | 出力 | 目的 |
|---|---|---|---|
| SFT | デモンストレーション | 微調整された LLM | 学習形式 |
| 報酬モデル | 人間の好み | 報酬スコアラー | 好みを学ぶ |
| PPO | RMの報酬 | 整列LLM | 好みに合わせて最適化する |