一文要約: 事前学習はテキストの予測を教え、RLHFとDPOは「あなたが本当に求めていたもの」の予測を教えます。

第29章の概要: 選好学習 — 教師あり微調整から報酬モデルの学習、PPOによるRLHF、そして報酬モデルをスキップして比較データから直接選好を学ぶシンプルなDPOの目的関数まで

29.1 アライメントが存在する理由

29.1.1 事前学習の原罪

数千万ドルと何千GPUヶ月もかけて1750億パラメータの言語モデルを学習させたとします。そのモデルはどんなテキストでも流暢に続けることができ、インターネット上の文書をほぼ読み尽くし、膨大な知識を持っています。

そこであなたが入力します: 「チャーハンの作り方を教えて」

モデルはこう返します:

チャーハンの作り方?これは素晴らしい質問です。チャーハンには数千年にわたる
豊かな食文化の歴史があります...

[500ワードの歴史が続く]

...これが、チャーハンが世界の料理の礎として今も残り続けている理由です。

あわせて考えてみたい質問:
1. 一日置いたご飯はなぜ食感が変わるのか?
2. カロリーはどれくらいか?
3. どの醤油がおすすめか?

モデルはあなたの質問に答えませんでした。あなたの質問に関するインターネット風のテキストを続けたのです。これこそが、次のトークン予測が最適化しているものです。

これが、事前学習のみのモデルが持つ3つのコア問題のうち最初のものです。

29.1.2 アライメントされていないモデルの3つの問題

1. 役に立たない (Not Helpful)

事前学習は「学習分布を与えられたとき次のトークンを予測する」を最適化します。その分布はウェブテキスト、書籍、コードであり、専門家が実際に質問に答えるQ&Aトランスクリプトではありません。

「春について詩を書いて」というプロンプトは、詩ではなく有名な春の詩について論じる段落を生み出すかもしれません。

2. 無害でない (Not Harmless)

インターネットには有害なコンテンツが含まれています。フィルタリングなしでそれを学習したモデルは、特定のコンテキストで有害なコンテンツが存在することを学習し、それを再現できます。十分に直接的に尋ねれば、未アライメントの事前学習済みモデルはしばしば従ってしまいます。

3. 正直でない(ハルシネーション)

モデルは流暢で自信に満ちた文章を生成するよう学習されています。「わかりません」と言う明示的なメカニズムがありません。その結果がハルシネーション、つまり自信満々の捏造です:

ユーザー: アインシュタインはいつノーベル化学賞を受賞しましたか?
モデル: アインシュタインは1925年に有機反応機構の研究でノーベル化学賞を
       受賞しました...

アインシュタインが受賞したのは1921年の物理学賞で、光電効果の研究によるものです。モデルが自信に満ちた文章を生成することを学習報酬が促したため、もっともらしい誤答を生み出してしまいます。

29.1.3 HHHの目標

Anthropicはアライメントの目標を3つの性質で体系化しました。これはよく HHH と呼ばれます:

性質意味
Helpful(役立つ)ユーザーが本当に望んでいることを理解して答える
Harmless(無害)過剰反応することなく、本当に危険なリクエストを断る
Honest(正直)作り話をするのではなく、不確実性を認める

これらは当然に見えます。3つすべてを同時に満たし、互いにトレードオフを生じさせずにモデルに実現させることが、難しい部分です。

29.1.4 InstructGPT: コンセプトの証明

2022年、OpenAIはInstructGPTの論文を発表しました。その結果は直感に反するものでした: RLHFで微調整した13億パラメータのモデルが、同じプロンプトで1750億パラメータのGPT-3に対して、人間の評価者に 71%の確率で 好まれました。

人間の選好比較:
  InstructGPT-1.3B  71%の確率で選ばれた
  GPT-3-175B        29%の確率で選ばれた

130倍小さいモデルが、大幅に優れていると評価された。このギャップは知識やパラメータ数の問題ではなく、アライメントの問題でした。ChatGPTはGPT-3.5に同じRLHFパイプラインを適用したものです。


29.2 RLHFパイプライン

29.2.1 3つのステージ

RLHFには3つの逐次的なステージがあります。それぞれが前のステージの上に成り立っています:

ステージ1: 教師あり微調整 (SFT)
  入力:  (プロンプト, 人間が書いた応答) のペア
  出力: Q&Aフォーマットを知っているSFTモデル

ステージ2: 報酬モデル (RM) の学習
  入力:  (プロンプト, 応答A, 応答B, 選好) のタプル
  出力: 人間の選好を予測するスコアリングモデル

ステージ3: PPOによるRL最適化
  入力:  プロンプト + RMのフィードバック信号
  出力: アライメントされたポリシーモデル

29.2.2 ステージ1: 教師あり微調整

ここでの目標は控えめです: まずモデルが役立つフォーマットで応答できるようにする。

データ: 人間が書いたデモンストレーション。OpenAIはInstructGPTに約1万3000ペアを使用しました。アノテーターは品質と一貫性のスクリーニングを通過した40人でした。

学習: 応答トークンに対する標準的なクロスエントロピー微調整:

# SFT学習ループ
for prompt, response in sft_dataset:
    input_ids = tokenize(f"User: {prompt}\nAssistant: {response}")
    logits = model(input_ids)
    loss = cross_entropy(logits[:-1], input_ids[1:])  # 次トークン予測
    loss.backward()

何が変わるか: モデルはQ&Aフォーマットで応答し、トピックを維持し、指示に従うことを学びます。品質はばらつきがあり、時に良くありませんが、適切な種類の質問に答えるようにはなっています。

量より質: 1万3000件の高品質なデモンストレーションは、13万件のスクレイプされた例に勝ります。ここではスケールよりもアノテーションガイドラインのほうが重要です。

29.2.3 ステージ2: 報酬モデルの学習

次に、応答が良いかどうかを自動的に判断できるモデルが必要です。

データ収集プロセス:

各プロンプトに対して、SFTモデルがK個の応答を生成します(通常K = 4〜9)。人間のアノテーターがそれらをランク付けします。そのランキングはすべてのペアワイズ比較に変換されます: K個の応答から (K2)\binom{K}{2} ペアが得られます。

プロンプト: 「ニューラルネットワークとは何か説明してください。」

応答A: 「ニューラルネットワークとは、例から学ぶ生物学的ニューロンに
        着想を得た相互接続されたノードのシステムです...
応答B: 「ニューラルネットワーク = 脳シミュレーター笑」
応答C: 「ニューラルネットワークとは、重みで結ばれたニューロンの層からなる
        数学的モデルです。学習を通じて...

アノテーターのランキング: A > C > B

抽出されたペア:
  (A, C)  Aが勝利
  (A, B)  Aが勝利
  (C, B)  Cが勝利

InstructGPTは約5,000プロンプトから約3万3,000の比較ペアを使用しました。

モデルアーキテクチャ: 報酬モデルは通常、言語モデリングヘッドを単一のスカラー出力に置き換えたSFTモデルです。入力は(プロンプト + 応答)、出力は品質を表す1つの数値です。

報酬モデル:
  [プロンプト] [応答]
       
  Transformer層  (通常SFTモデルから初期化)
       
  線形ヘッド
       
  スカラースコア r  

学習目的 — Bradley-Terryモデル:

応答AがBより優れている確率が、スコアの差に依存するようにします:

P(AB)=σ(r(A)r(B))P(A \succ B) = \sigma(r(A) - r(B))

ここで σ\sigma はシグモイド関数です。学習損失は人間のランキングの対数尤度を最大化します:

LRM=E[logσ(r(yw)r(yl))]\mathcal{L}_{RM} = -\mathbb{E}\left[\log \sigma(r(y_w) - r(y_l))\right]

ここで ywy_w は選ばれた(勝者の)応答、yly_l は棄却された(敗者の)応答です。

コードで表すと:

def compute_rm_loss(prompt, chosen, rejected, reward_model):
    r_chosen   = reward_model(prompt, chosen)
    r_rejected = reward_model(prompt, rejected)

    # log P(chosen > rejected) = log σ(r_chosen - r_rejected)
    loss = -torch.log(torch.sigmoid(r_chosen - r_rejected))
    return loss.mean()

Bradley-Terryスコアリングの具体例:

r(A) = 5, r(B) = 3 の場合:
  P(A > B) = σ(5 - 3) = σ(2)  0.88

r(A) = 3, r(B) = 5 の場合:
  P(A > B) = σ(3 - 5) = σ(-2)  0.12

r(A) = r(B) = 4 の場合:
  P(A > B) = σ(0) = 0.50

29.2.4 ステージ3: PPO最適化

スコアラーができました。3番目のステージでは、そのスコアラーを報酬信号として言語モデルを改善します。

なぜここで教師あり学習を使わないのか? 「正解」が存在しないからです。品質信号があるだけです。オープンエンドの生成には唯一の正解がなく、より良いものと悪いものがあります。報酬が定義されているが正解がない場合、強化学習が適切なツールです。

最適化目的:

maxπE[rθ(x,y)]βKL(ππref)\max_\pi \mathbb{E}\left[r_\theta(x, y)\right] - \beta \cdot \text{KL}(\pi \| \pi_{ref})

相反する2つの項があります:

  1. 報酬の最大化: RMが高くスコアする応答を生成する
  2. KLペナルティ: SFTリファレンスモデルから遠ざかりすぎない

なぜKLペナルティが必要か? なければ、ポリシーは報酬モデルの抜け穴を見つけます。実際によく見られる報酬ハッキングのパターン:

KL制約なしで発見されるショートカット:
  - 長いほど常に良い  モデルが冗長になる
  - 「役立つAIアシスタントとして...」という書き出し  毎回使うようになる
  - 自信に満ちたトーンがより高いスコアを得る  不確実性を示さなくなる

KL制約あり:
  - ポリシーは改善できるが、SFTの挙動に近い状態を保つ
  - 報酬の抜け穴はKL項でペナルティを受ける

KLダイバージェンス — トークンレベルの計算:

def compute_kl(policy_logits, reference_logits):
    policy_probs    = softmax(policy_logits)
    reference_probs = softmax(reference_logits)
    kl = policy_probs * (log(policy_probs) - log(reference_probs))
    return kl.sum(dim=-1).mean()

β\beta 係数は通常0.01〜0.1で初期化されます。多くのシステムでは動的に調整します: KLが大きくなりすぎたら β\beta を増加させ、ポリシーが保守的すぎたら減少させます。目標KLは通常6〜10ナットに設定されます。

なぜ特にPPOなのか? LMのアクション空間は巨大です(1つのアクション = vocab_size通りのカテゴリカル分布から1つのトークン)。このスケールでは素朴な方策勾配は不安定です。PPOは旧ポリシーと新ポリシーの確率比をクリッピングして安定化します:

PPOクリップ: new_policy(a) / old_policy(a)  [1 - ε, 1 + ε] に収める

これにより、1回の更新でポリシーが急激に変化するのを防ぎます。PPOはTRPO(フィッシャー情報行列が必要)よりも実装が簡単です。

29.2.5 パイプライン全体のまとめ

ステージ入力出力目的
SFT(プロンプト, 応答) ペアSFTモデルQ&Aフォーマットを学ぶ
RM学習選好比較報酬モデル応答のスコアリングを学ぶ
PPOプロンプト + RM信号アライメント済みモデルより良い応答を生成する

29.3 報酬モデルの詳細

29.3.1 選好ペアの収集

報酬モデルには学習データが必要ですが、人間は絶対スコアを信頼性高く付けることができません(「この回答は7.4/10に値する」など)。人間が確実にできることは比較です: 同じプロンプトへの2つの応答を見せられたとき、ほとんどのアノテーターはどちらが優れているかに同意します。

プロンプト: 「光合成を3文で説明してください。」

応答A: 植物は葉緑体を使って太陽光を食物に変換します。このプロセスでは
       水を分解し、CO2と水素を結合させて糖を作ります。酸素は副産物
       として放出されます。

応答B: 光合成は最も重要な生物学的プロセスです。それがなければ生命は
       存在しなかったでしょう。植物の中で起こります。

アノテーターの選択: A (具体的で実質的、タスクに沿っている)

各アノテーションステップは (プロンプト, 選ばれた応答, 棄却された応答) のタプルになります。典型的な選好データセットには、数週間のコントラクター作業で収集した5万〜10万のペアが含まれます。InstructGPTは約3万3,000ペアを使用しました。AnthropicのHH-RLHFデータセットには16万1,000件あります。これらのペアのデータ品質がすべての下流に影響します。雑なデータセットは雑な報酬モデルを生み、雑なポリシーを生み出します。

29.3.2 Bradley-Terry: 選好を損失に変換する

ペアワイズ選好データは報酬モデルに直接ターゲットを与えません。「正しいスコア」に当てはめることができないからです。古典的な解決策が Bradley-Terryモデル で、選好を確率的な目的関数に変換します。

核心的な仮定: 応答AがBより選ばれる確率は、その基礎となる品質スコアの差のみに依存する。

P(AB)=σ(r(A)r(B))P(A \succ B) = \sigma\bigl(r(A) - r(B)\bigr)

ここで r()r(\cdot) は報酬モデルが付けるスコア、σ(x)=1/(1+ex)\sigma(x) = 1 / (1 + e^{-x}) はシグモイドです。

直感:

r(A) = 5,  r(B) = 3     P(Aが勝つ) = σ(2)   0.88
r(A) = 3,  r(B) = 5     P(Aが勝つ) = σ(-2)  0.12
r(A) = 4,  r(B) = 4     P(Aが勝つ) = σ(0)  = 0.50

スコア差が大きい ⇒ 勝率が高い。スコアが等しい ⇒ コイントス。

報酬モデルの学習。 観測された選好の尤度を最大化すると、標準的な報酬モデル損失が得られます:

LRM=E(x,yw,yl)D[logσ(rθ(x,yw)rθ(x,yl))]\mathcal{L}_{RM} = -\mathbb{E}_{(x, y_w, y_l) \sim D}\bigl[\log \sigma\bigl(r_\theta(x, y_w) - r_\theta(x, y_l)\bigr)\bigr]

ここで ywy_w は選ばれた(「勝利」)応答、yly_l は棄却された応答、rθr_\theta はスカラーヘッドを持つTransformerベースの報酬モデルで、通常は教師あり学習チェックポイントから学習されます。

# 報酬モデルの学習ステップ
for prompt, chosen, rejected in preference_pairs:
    r_chosen   = reward_model(prompt, chosen)    # スカラー
    r_rejected = reward_model(prompt, rejected)  # スカラー
    loss = -log_sigmoid(r_chosen - r_rejected)
    loss.backward(); optimizer.step()

報酬モデルは学習中に絶対的なスコアを必要としません。選ばれたものと棄却されたものを区別することだけを学びます。絶対スケールは任意で、下流で重要なのは順位付けです。

29.3.3 アノテーションの一貫性

Bradley-Terryを損失として使っていても、信号はラベルの品質次第です。実際の問題: アノテーターは意見が分かれます。人によって「役立つ」や「適切」の基準が異なります。

プロンプト: 「社会は遺伝子工学を支持すべきか?」

アノテーターA(研究者):  科学に肯定的で繊細な応答を好む
アノテーターB(政策重視): 慎重でバランスのとれた応答を好む

対策:

  • 一般的なエッジケースを固定する明示的なアノテーションルーブリックを書く
  • 1ペアに複数のアノテーターの多数決を使う(5人中3人が一般的)
  • 本番前にアノテーター間一致度でアノテーターをスクリーニングする
  • チーム自身がラベルを付けた「ゴールドセット」を保持し、コントラクターの一致度を監査する

29.3.4 報酬ハッキング

報酬モデルは有限分布のプロンプトと補完で学習されています。ポリシーは最終的に、報酬モデルでは高くスコアされるが実際には悪い入力を見つけます。これはRLHFに適用されたグッドハートの法則です。

一般的な報酬ハッキングパターン:
  - 長い応答がより高いスコアを得る  とりとめなくなる
  - リストは構造的に見える  すべてをリストで包む
  - 自信に満ちたトーンがより高いスコアを得る  適切な不確実性を示さなくなる
  - 「すばらしい質問ですね!」という迎合的な書き出しが報酬のショートカットとして学習される

防御策:

  • プロンプトカテゴリのロングテールをカバーする多様なデータ
  • 報酬モデルの学習中に対抗的な例を追加する
  • ポリシーがドリフトするにつれて報酬モデルを更新する(「イテレーティブRLHF」)
  • PPO目的関数のKLペナルティ(§29.2.4で説明)でポリシーをSFTリファレンスの近くに保つ

KLペナルティは贅沢品ではありません。「Certainly!」で始まる自信満々の2ページのエッセイで毎回応答することをモデルが決断するのを防ぐ唯一のものです。


29.4 DPO: よりシンプルな代替手段

29.4.1 RLHFの実際的な問題

RLHFは機能します。しかし高コストで壊れやすくもあります。実際に実行するには:

  • GPUメモリに同時に4つのモデル: SFT、RM、リファレンスポリシー、現在のポリシー
  • PPOのハイパーパラメータ調整(学習率、KL係数、GAEラムダ)
  • 学習中に推論速度で応答を生成するロールアウトループ

多くのチームにとって、この複雑さは許容できません。計算コストはSFTのみのベースラインの約3〜4倍です。

29.4.2 DPOの核心的な洞察

2023年、DPOを開発したStanfordの研究者たちは、RLHFの目的関数が閉形式の解を持つことに気づきました。最適なポリシー π\pi^* は次を満たします:

π(yx)πref(yx)exp ⁣(r(x,y)β)\pi^*(y \mid x) \propto \pi_{ref}(y \mid x) \cdot \exp\!\left(\frac{r(x, y)}{\beta}\right)

整理すると、報酬はポリシーの比として表現できます:

r(x,y)=βlogπ(yx)πref(yx)+constr(x, y) = \beta \log \frac{\pi^*(y \mid x)}{\pi_{ref}(y \mid x)} + \text{const}

報酬は単に β\beta でスケールされた対数確率比です。これは報酬の式をBradley-Terryの比較確率に直接代入でき、別の報酬モデルを必要とせず、ポリシーモデルとリファレンスモデルのみを含む損失が得られることを意味します。

29.4.3 DPO損失

選好確率式に代入すると:

LDPO=E ⁣[logσ ⁣(β(logπ(ywx)πref(ywx)logπ(ylx)πref(ylx)))]\mathcal{L}_{DPO} = -\mathbb{E}\!\left[\log \sigma\!\left(\beta \left(\log\frac{\pi(y_w \mid x)}{\pi_{ref}(y_w \mid x)} - \log\frac{\pi(y_l \mid x)}{\pi_{ref}(y_l \mid x)}\right)\right)\right]

直感:

  • 選ばれた応答 ywy_w の相対的な確率を増加させる
  • 棄却された応答 yly_l の相対的な確率を減少させる
  • どちらもリファレンスモデルに対して相対的に測定されるため、SFTの出発点から遠ざかりすぎない

29.4.4 DPO vs RLHF

性質RLHFDPO
パイプラインステージ数31
メモリ内のモデル数4(SFT、RM、リファレンス、ポリシー)2(リファレンス、ポリシー)
学習の安定性PPOは気難しいSFTに近い
計算コストSFTの約3〜4倍SFTの約1〜1.5倍
必要なデータ同じ選好ペア同じ選好ペア
実際の品質非常に良いRLHFに近いか同等

29.4.5 DPOのコード

import torch
import torch.nn.functional as F

def compute_dpo_loss(
    policy_model,
    reference_model,
    chosen_input_ids,
    rejected_input_ids,
    beta: float = 0.1,
):
    policy_chosen_logps   = get_log_probs(policy_model,    chosen_input_ids)
    policy_rejected_logps = get_log_probs(policy_model,    rejected_input_ids)

    with torch.no_grad():
        ref_chosen_logps   = get_log_probs(reference_model, chosen_input_ids)
        ref_rejected_logps = get_log_probs(reference_model, rejected_input_ids)

    chosen_logratios   = policy_chosen_logps   - ref_chosen_logps
    rejected_logratios = policy_rejected_logps - ref_rejected_logps

    logits = beta * (chosen_logratios - rejected_logratios)
    loss   = -F.logsigmoid(logits).mean()
    return loss


def get_log_probs(model, input_ids):
    outputs   = model(input_ids)
    logits    = outputs.logits[:, :-1, :]
    labels    = input_ids[:, 1:]
    log_probs = F.log_softmax(logits, dim=-1)
    selected  = torch.gather(log_probs, dim=-1, index=labels.unsqueeze(-1)).squeeze(-1)
    return selected.sum(dim=-1)

29.4.6 TRLを使ったDPO

HuggingFaceのTRLライブラリにはプロダクション品質のDPOトレーナーが搭載されています:

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
from trl import DPOTrainer, DPOConfig
from datasets import load_dataset
import torch

model_name = "mistralai/Mistral-7B-v0.1"
model     = AutoModelForCausalLM.from_pretrained(
    model_name, torch_dtype=torch.bfloat16, device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token

# VRAMを削減するためのオプションLoRA
lora_config = LoraConfig(
    r=16, lora_alpha=32,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05, bias="none", task_type="CAUSAL_LM",
)
model = get_peft_model(model, lora_config)

# 選好データセット: {"prompt": ..., "chosen": ..., "rejected": ...}
dataset = load_dataset("HuggingFaceH4/ultrafeedback_binarized")

def format_dataset(example):
    return {
        "prompt":   example["prompt"],
        "chosen":   example["chosen"][1]["content"],
        "rejected": example["rejected"][1]["content"],
    }

dataset = dataset.map(format_dataset)

training_args = DPOConfig(
    output_dir="./dpo-mistral",
    beta=0.1,
    learning_rate=5e-7,          # SFTより小さく、通常1e-7〜5e-7
    per_device_train_batch_size=2,
    gradient_accumulation_steps=8,
    num_train_epochs=1,
    warmup_ratio=0.1,
    bf16=True,
    logging_steps=10,
    save_steps=500,
)

trainer = DPOTrainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    eval_dataset=dataset["test"],
    tokenizer=tokenizer,
)

trainer.train()
trainer.save_model("./dpo-mistral-final")

29.5 その他のアライメント手法

29.5.1 RLAIF: 人間ではなくAIによるフィードバック

人間によるアノテーションは高コストで遅いです。RLAIF(Reinforcement Learning from AI Feedback)は人間の比較をAIによる比較で置き換えます。

Constitutional AI(CAI) はAnthropicが開発した最もよく知られたRLAIFのアプローチです:

  1. 「憲法」を定義する — 例えば: 応答は役立つべき、有害なコンテンツを含まないべき、不確実性を認めるべき、プライバシーを尊重するべき、といった原則のリスト。
  2. AIが憲法に従って自分の初期応答を批判させる。
  3. AIがその批判に基づいて修正させる。
  4. AIが生成した選好ペアを使って報酬モデルを学習する。
Constitutional AI批判ループ:

AIの初期応答: [問題のある可能性のある回答]

AIの自己批判:
  「この応答は有害な行動を促進しないという原則に
   違反していますか?」
  「はい、なぜなら...

AIの修正応答: [改善された回答]

メリット: 人間のアノテーションよりはるかに安く、反復が速く、原則が明示的で監査可能。

デメリット: AIの判断がそれ自身のバイアスを引き継ぐ。微妙な価値判断が、スケールにより間違った方向に増幅される可能性がある。

29.5.2 KTO: 単一ポイントのフィードバック

DPOはペアワイズ比較を必要とします: 棄却された応答ごとに、必ず選ばれた応答がなければなりません。これを収集するのはまだコストがかかります。

KTO(Kahneman-Tversky Optimization) はよりシンプルなデータで機能します: 応答が良かったか悪かったかを示すラベルだけです。

DPOデータ形式: (プロンプト, 選ばれた応答, 棄却された応答)
KTOデータ形式: (プロンプト, 応答, is_good)   # is_good  {0, 1}

KTOは行動経済学のプロスペクト理論に動機付けられています: 人は等価な利益よりも損失に対してより敏感です。損失関数はこの非対称性を直接エンコードしています。

これは、ペアワイズ比較なしにクリックスルーデータや単純なサムズアップ/サムズダウン信号がある場合に役立ちます。

29.5.3 IPO: Identity Preference Optimization

DPOは一部のケースで過学習する可能性があります。一方の応答が強く選ばれているペアでは、ポリシーの対数比が発散することがあります。IPOは選ばれた/棄却されたマージンが無制限に成長するのを防ぐ、よりスムーズな損失関数でこれに対処します。

29.5.4 手法の比較

手法RMが必要?RLが必要?データ形式複雑さ
RLHFはいはい(PPO)選好ペア
DPOいいえいいえ選好ペア
RLAIF / CAIはいはいAI生成ペア
KTOいいえいいえバイナリ信号
IPOいいえいいえ選好ペア

29.6 実際の運用

29.6.1 完全な学習スタック

現代のアライメント済みLLMは大まかに4つのフェーズを経ます:

フェーズ1  事前学習
  データ:    ウェブ、書籍、コードから数兆トークン
  目的:    次トークン予測
  計算:    何千ものGPU、数ヶ月
  出力:    ベースモデル(能力はあるが役立たない)

フェーズ2  教師あり微調整
  データ:    数万の(指示、応答)ペア
  目的:    Q&Aフォーマットを学び、指示に従う
  計算:    数十のGPU、数日
  出力:    指示モデル(役立つが品質にばらつきあり)

フェーズ3  アライメント(RLHFまたはDPO)
  データ:    数十万の選好比較
  目的:    品質向上、有害性低減、誠実さの改善
  計算:    数十のGPU、数日〜数週間
  出力:    アライメント済みモデル(ChatGPT、Claudeなど)

フェーズ4  継続的な反復
  ユーザーフィードバックを収集し、失敗モードを特定し、繰り返す

29.6.2 オープンソースの例

LLaMA 2 Chat(Meta):

  • SFT: 約2万7,540件の高品質な会話
  • RLHF: 約140万件の選好比較
  • 5ラウンドのイテレーティブRLHF

Zephyr(HuggingFace):

  • ベース: Mistral 7B
  • SFT: UltraChatデータセット
  • DPO: UltraFeedbackデータセット
  • 結果: 7BモデルでいくつかのベンチマークにおいてLLaMA 2 70B Chatを超えた

OpenChat / Starling: 条件付き報酬微調整(C-RLFT)を使用し、SFTと選好学習を組み合わせて7BでGPT-3.5クラスの動作に近づく。

29.6.3 アライメントデータセット

一般的に使用されるオープンソースデータセット:

データセットタイプスケール用途
OpenAssistantSFT16万1,000会話マルチターンSFT
DollySFT1万5,000指示指示チューニング
UltraChatSFT150万会話マルチターンSFT
UltraFeedback選好6万4,000比較DPO
HH-RLHF選好17万比較RLHF / DPO
Anthropic HH選好16万比較安全アライメント(有用+無害の分割)

29.7 章のまとめ

29.7.1 主要概念

概念意味
アライメントモデルの挙動を人間の価値観と意図に合わせること
HHHHelpful、Harmless、Honest — 3つのアライメント目標
RLHF人間の比較から報酬モデルを学習し、PPOでポリシーを最適化する
SFTデモンストレーションデータに対する教師あり微調整
報酬モデルスカラーの品質スコアを出力するモデル
PPO言語モデルを最適化するために使用するポリシー勾配RLアルゴリズム
DPODirect Preference Optimization — RMなしで選好ペアから学習する
KL制約ポリシーがSFTリファレンスから遠ざかりすぎるのを防ぐ

29.7.2 主要な数式

Bradley-Terry選好確率:

P(AB)=σ(r(A)r(B))P(A \succ B) = \sigma(r(A) - r(B))

RLHF目的関数:

maxπE[r(x,y)]βKL(ππref)\max_\pi \mathbb{E}[r(x, y)] - \beta \cdot \text{KL}(\pi \| \pi_{ref})

DPO損失:

LDPO=E ⁣[logσ ⁣(β(logπ(ywx)πref(ywx)logπ(ylx)πref(ylx)))]\mathcal{L}_{DPO} = -\mathbb{E}\!\left[\log \sigma\!\left(\beta \left(\log\frac{\pi(y_w \mid x)}{\pi_{ref}(y_w \mid x)} - \log\frac{\pi(y_l \mid x)}{\pi_{ref}(y_l \mid x)}\right)\right)\right]

29.7.3 私の見解

何度考えても戻ってくる洞察: InstructGPT 1.3Bが人間の選好でGPT-3 175Bを上回ったのは偶然ではありません。あなたが何を求めているかを知っている小さなモデルは、インターネットテキストの統計的近似を行う大きなモデルよりも有用です。アライメントは単なる倫理インフラではありません。人々が使い続けるツールと、使われないままになるツールの違いです。

DPOがこれをアクセス可能にしました。今では1枚のA100ノードで、公開されている選好データセットを使って、1日以内に本格的な選好学習実験を実行できます。


章のチェックリスト

この章を終えたら、次のことができるようになっているはずです:

  • 事前学習済みモデルがなぜ自動的に役立つわけではないか(3つの問題)を説明できる。
  • RLHFの3つのステージ: SFT、報酬モデリング、PPOを説明できる。
  • Bradley-Terryモデルとは何か、報酬モデルの学習にとって何を意味するかを説明できる。
  • PPOにKLペナルティが存在する理由と、それなしの場合に報酬ハッキングがどう見えるかを説明できる。
  • RLHF目的関数からDPO損失関数を導出できる。
  • DPOとRLHFを複雑さ、計算コスト、実際の品質で比較できる。
  • TRLライブラリを使ってDPO学習ジョブを実行できる。

次の章へ

モデルはあなたが望む通りに振る舞うようになりました。でも、シンプルなクエリのほとんどでその能力が無駄になっていても、すべてのトークンにすべてのパラメータをアクティベートしています。

第30章ではMixture of Expertsを解説します: Mixtral 8x7Bがトークンごとにわずか12.9Bのパラメータをアクティベートしながら、LLaMA 70Bと同等の品質を達成する方法、そしてDeepSeek-V3がこれを256の細粒度エキスパートと1つの共有エキスパートをユニバーサルバックボーンとして押し進めた方法を見ていきましょう。

このページを引用する
Zhang, Wayland (2026). 第29章: RLHFと選好学習 — モデルを本当に役立つものにする. In Transformer アーキテクチャ:直感から実装まで. https://waylandz.com/llm-transformer-book-ja/chapter-29-rlhf-preference-learning
@incollection{zhang2026transformer_ja_chapter_29_rlhf_preference_learning,
  author = {Zhang, Wayland},
  title = {第29章: RLHFと選好学習 — モデルを本当に役立つものにする},
  booktitle = {Transformer アーキテクチャ:直感から実装まで},
  year = {2026},
  url = {https://waylandz.com/llm-transformer-book-ja/chapter-29-rlhf-preference-learning}
}