0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

マルチモーダルLLMの個人メモ⑤RLHF

0
Posted at

はじめに

この記事はAIで作成されています。LLM(大規模言語モデル)のアラインメントと事後学習(Post-training)に関するメモを記載しています。RLHF、DPO、PPO、GRPO、RLAIFを中心に、それぞれの目的・仕組み・違いを整理します。

目次

全体像

LLMの学習は、大きく事前学習(Pretraining)と事後学習(Post-training)に分けられる。事前学習では大量のテキストから言語や知識のパターンを学び、事後学習では指示への追従、回答品質、安全性、推論能力などを改善する。事後学習で利用される代表的な手法には、SFT、RLHF、DPO、PPO、GRPOなどがある。

用語の分類

用語 分類 主な役割
SFT 教師あり学習 お手本となる回答を学習する
RLHF 学習の枠組み 人間のフィードバックを利用する
PPO 強化学習アルゴリズム 報酬をもとにモデルを更新する
DPO 選好最適化手法 好ましい回答を直接学習する
RLAIF 学習の枠組み AIのフィードバックを利用する
GRPO 強化学習アルゴリズム グループ内の相対評価を使ってモデルを更新する
RLVR 学習の枠組み 検証可能な報酬を利用する
Distillation 学習手法 教師モデルの能力を生徒モデルに移す

現在の主流

LLMの事後学習では、目的に応じて複数の手法を組み合わせる。

  • 回答品質・アラインメント:SFT、RLHF、DPOなど
  • 強化学習によるモデル改善:PPO、GRPOなど
  • 推論能力の強化:RLVRとGRPOなどの組み合わせ
  • 評価データの生成:RLHFにおける人間の評価、RLAIFにおけるAIの評価
  • 推論能力の小型モデルへの移転:Distillation

ただし、特定の手法がすべてのLLMで採用されているわけではない。モデルの目的、学習データ、計算資源などによって適切な手法は異なる。

①RLHF(Reinforcement Learning from Human Feedback)

論文名: Training language models to follow instructions with human feedback
URL: https://arxiv.org/abs/2203.02155
発表日: 2022-03-04

✅ ポイント

  • 人間による回答の評価や選好を利用して、LLMの振る舞いを改善する学習の枠組みである。
  • 代表的な構成では、SFT、報酬モデル(Reward Model)の学習、強化学習の3段階を経る。
  • 強化学習のアルゴリズムとしてPPOを利用する構成が知られている。
  • 人間の好みを学習できる一方、評価データの作成にコストがかかり、報酬モデルの誤差や過剰最適化が問題になることがある。

🧠 学習の仕組み

代表的なRLHFは、次の3段階で構成される。

① SFT
   質問と模範回答を使ってモデルを学習
          ↓
② Reward Model
   人間が回答を比較した選好データから
   回答の望ましさを予測するモデルを学習
          ↓
③ Reinforcement Learning
   報酬モデルの評価を使って
   LLMを更新

Step 1:SFT

質問と模範回答のペアを用意し、モデルが望ましい回答を生成できるように学習する。

Step 2:Reward Model

同じ質問に対して生成された複数の回答を、人間が比較する。例えば、回答Aが回答Bより好ましいと評価された場合、その選好データから、回答の望ましさを予測する報酬モデルを学習する。

Step 3:Reinforcement Learning

LLMに回答を生成させ、報酬モデルで評価する。

その報酬を利用してLLMのパラメータを更新し、望ましい回答を生成しやすくする。

🧪 学習の疑似コード

# Step 1: SFT
model = supervised_fine_tuning(
    pretrained_model,
    demonstrations
)

# Step 2: Reward Model
reward_model = train_reward_model(
    preference_dataset
)

# Step 3: Reinforcement Learning
reference_model = copy_model(model)

while not converged:
    prompts = sample_prompts()

    # 現在のモデルで回答を生成
    responses = model.generate(prompts)

    # 回答を報酬モデルで評価
    rewards = reward_model(prompts, responses)

    # 参照モデルからの過度な逸脱を抑制しながら
    # 強化学習でモデルを更新
    loss = compute_rlhf_loss(
        model=model,
        reference_model=reference_model,
        prompts=prompts,
        responses=responses,
        rewards=rewards
    )

    update(model, loss)

※ compute_rlhf_loss() は説明用の疑似関数であり、実際の実装ではPPOなどのアルゴリズムを使用する。

❓ よくある質問

Q. RLHFとPPOは何が違うの?

  • RLHFは人間のフィードバックを利用する学習の枠組みである。
  • PPOは報酬に基づいてモデルを更新する強化学習アルゴリズムである。
  • RLHFの代表的な構成でPPOを利用するため、両者は一緒に登場することが多い。

Q. RLHFでは必ず報酬モデルが必要なの?

  • 代表的なRLHFでは報酬モデルを学習する。
  • ただし、RLHFという用語は広い意味で使われるため、すべての人間フィードバック型学習が独立した報酬モデルを必要とするわけではない。
  • DPOのように、選好データを直接利用する方法もある。

Q. Reward Hackingとは?

  • 報酬モデルが高い評価を与える回答をモデルが過度に生成し、本来の目的から外れてしまう問題である。
  • 報酬モデルの評価と、人間が本当に望む回答が一致しない場合に起こり得る。

②PPO(Proximal Policy Optimization)

論文名: Proximal Policy Optimization Algorithms
URL: https://arxiv.org/abs/1707.06347
発表日: 2017-07-20

✅ ポイント

  • PPOは、強化学習において方策(Policy)を更新するアルゴリズムである。
  • 報酬を高めながら、1回の更新で方策が大きく変化しすぎないように制御する。
  • RLHFでは、報酬モデルの評価を利用してLLMを更新する方法として広く知られている。
  • 代表的な実装では、方策モデルに加えて、価値関数を推定するCriticモデルを利用する。

🧠 学習の仕組み

LLMを強化学習の枠組みで考えると、回答を生成するモデルが方策に相当する。PPOでは、生成した回答の報酬などをもとに、今後その回答を生成する確率を調整する。ただし、単純に報酬が高かった回答の確率を増やすだけでは、学習が不安定になることがある。そこでPPOは、方策の更新量を制御する仕組みを導入している。

🧪 学習の疑似コード

model = initialize_policy_model()
critic = initialize_value_model()

while not converged:
    prompts = sample_prompts()

    # 現在の方策で回答を生成
    responses = model.generate(prompts)

    # 報酬を取得
    rewards = compute_rewards(prompts, responses)

    # 価値関数とAdvantageを計算
    values = critic(prompts, responses)
    advantages = compute_advantages(
        rewards,
        values
    )

    # PPOの目的関数で更新
    loss = compute_ppo_loss(
        model,
        responses,
        advantages
    )

    update(model, loss)
    update(critic, rewards, values)

※ 実際のPPOでは、旧方策と新方策の確率比、クリッピング、価値関数の損失などを考慮する。上記は概念を示す疑似コードである。

🧮 目的関数

PPOの代表的なクリップ付き目的関数は次のように表せる。

$$
L^{\mathrm{CLIP}}(\theta)
=\mathbb{E}_t
\left[
\min
\left(
r_t(\theta)\hat{A}_t,,
\operatorname{clip}
\left(
r_t(\theta),
1-\epsilon,
1+\epsilon
\right)
\hat{A}_t
\right)
\right]
$$

ここで、

  • $r_t(\theta)$:新旧の方策の確率比
  • $\hat{A}_t$:Advantage。行動が基準よりどれだけ良かったかを表す推定値
  • $\epsilon$:更新量を制御するクリッピング幅

である。Advantageが正の場合は、その行動が相対的に良かったことを意味する。負の場合は、相対的に望ましくなかったことを意味する。PPOは確率比をクリッピングすることで、方策の更新が過度に大きくなることを抑制する。

❓ よくある質問

Q. PPOはRLHF専用なの?

  • いいえ。PPOは一般的な強化学習アルゴリズムであり、LLM以外のタスクでも利用される。
  • LLMでは、RLHFなどの学習に利用されることがある。

Q. Criticとは?

  • 状態や状況から、将来得られる報酬を予測する価値関数を学習するモデルである。
  • PPOの代表的な実装では、Criticの予測を使ってAdvantageを推定する。

Q. PPOの課題は?

  • 方策モデルに加えて価値関数を学習する必要がある構成では、メモリや計算コストが大きくなり得る。
  • 報酬設計や学習条件によって、学習の安定性が左右される。

Q. Advantageとは?

  • Advantageは、ある行動が期待値と比較してどれくらい良かったか・悪かったかを表す値である。
  • 基本的には、行動した場合の期待報酬(Q-value)から、その状態での期待報酬(Value)を引いて計算する。

$$
A(s,a) = Q(s,a) - V(s)
$$

  • Advantageが正なら期待より良い行動、負なら期待より悪い行動を意味する。
  • PPOでは、この値を使って、良い行動の生成確率を高め、悪い行動の生成確率を低める方向にモデルを更新する。

③DPO(Direct Preference Optimization)

論文名: Direct Preference Optimization: Your Language Model is Secretly a Reward Model
URL: https://arxiv.org/abs/2305.18290
発表日: 2023-05-29

✅ ポイント

  • DPOは、人間などの選好データを使って、LLMを直接最適化する手法である。
  • 好ましい回答(Chosen)と、好ましくない回答(Rejected)のペアを利用する。
  • 代表的なRLHFの構成と異なり、独立した報酬モデルを学習し、その報酬でPPOを実行する工程を省略できる。
  • 選好データから直接学習できるため、学習パイプラインを比較的シンプルにできる。

🧠 学習の仕組み

例えば、同じ質問に対して2つの回答があるとする。

質問:
日本の首都は?

Chosen:
日本の首都は東京です。

Rejected:
日本の首都は大阪です。

DPOでは、ChosenがRejectedよりも相対的に生成されやすくなるようにモデルを最適化する。一般的なDPOでは、学習対象モデルに加えて、学習の基準となる参照モデルを用いる。参照モデルは、学習対象モデルが選好データに過度に適応するのを抑えるための基準として働く。

🧪 学習の疑似コード

# SFT済みモデルを初期モデルとして利用
model = load_sft_model()

# 参照モデルを固定
reference_model = copy_model(model)
freeze(reference_model)

while not converged:
    # 選好データを取得
    prompts, chosen, rejected = sample_preferences()

    # 学習対象モデルの対数確率
    chosen_logp = model.log_prob(
        prompts, chosen
    )
    rejected_logp = model.log_prob(
        prompts, rejected
    )

    # 参照モデルの対数確率
    ref_chosen_logp = reference_model.log_prob(
        prompts, chosen
    )
    ref_rejected_logp = reference_model.log_prob(
        prompts, rejected
    )

    # DPO損失を計算
    loss = compute_dpo_loss(
        chosen_logp,
        rejected_logp,
        ref_chosen_logp,
        ref_rejected_logp
    )

    update(model, loss)

🧮 目的関数

一般的なDPOの損失関数は次のように表せる。

\mathcal{L}_{\mathrm{DPO}}(\pi_\theta)
=
-\mathbb{E}_{(x,y_w,y_l)}
\left[
\log \sigma
\left(
\beta
\log
\frac{\pi_\theta(y_w|x)}
{\pi_{\mathrm{ref}}(y_w|x)}
-
\beta
\log
\frac{\pi_\theta(y_l|x)}
{\pi_{\mathrm{ref}}(y_l|x)}
\right)
\right]

ここで、

  • $x$:入力プロンプト
  • $y_w$:好ましい回答(Chosen)
  • $y_l$:好ましくない回答(Rejected)
  • $\pi_\theta$:学習対象モデル
  • $\pi_{\mathrm{ref}}$:参照モデル
  • $\beta$:選好最適化の強さを調整するパラメータ
  • $\sigma$:シグモイド関数

である。

DPOは、参照モデルに対する相対的な対数確率の差を利用し、好ましい回答と好ましくない回答を区別するように学習する。

❓ よくある質問

Q. DPOとRLHFは何が違うの?

  • RLHFは、人間のフィードバックを利用する学習の枠組みである。
  • DPOは、選好データを直接利用する最適化手法である。
  • DPOでは、代表的なRLHF構成における独立した報酬モデルとPPOの学習工程を省略できる。

Q. DPOでは報酬を使わないの?

  • PPOのように、独立した報酬モデルが出力する報酬を使って強化学習する必要はない。
  • ただし、DPOは選好データに含まれる情報を利用しており、数理的には報酬最大化の枠組みと関連している。

Q. DPOでは参照モデルが必要なの?

  • 標準的なDPOでは参照モデルを利用する。
  • 一方、参照モデルを必要としない選好最適化手法も提案されている。

④RLAIF(Reinforcement Learning from AI Feedback)

論文名: Constitutional AI: Harmlessness from AI Feedback
URL: https://arxiv.org/abs/2212.08073
発表日: 2022-12-15

✅ ポイント

  • RLAIFは、人間の代わりにAIの評価を利用してモデルを改善する考え方である。
  • AIに回答の優劣を判定させ、その結果を選好データや報酬の生成に利用する。
  • AIを使って評価データを大量に作成できるため、人間による評価のコストを抑えられる可能性がある。
  • 評価用AI自体の偏りや誤判定が、学習結果に影響する可能性がある。

🧠 学習の仕組み

RLAIFでは、評価用のAIが回答の優劣を判定する。

例えば、同じ質問に対してモデルが回答Aと回答Bを生成し、別のAIがどちらの回答が優れているかを判定する。

その判定を学習データとして利用する。

質問
  ↓
LLMが複数の回答を生成
  ↓
評価用AIが回答を比較
  ↓
AIによる選好データを作成
  ↓
DPOや報酬モデルなどを利用して学習

RLAIFはフィードバックの生成元を表すため、その後の学習方法は一つに限定されない。

🧪 学習の疑似コード

# SFT済みモデル
model = load_sft_model()

# 評価用AI
judge_model = load_judge_model()

# 選好データを生成
preference_dataset = []

for prompt in prompts:
    response_a = model.generate(prompt)
    response_b = model.generate(prompt)

    # 評価用AIが回答を比較
    preference = judge_model.compare(
        prompt,
        response_a,
        response_b
    )

    preference_dataset.append(
        (prompt, response_a, response_b, preference)
    )

# 生成した選好データを使って学習
model = train_with_preferences(
    model,
    preference_dataset
)

※ judge_model.compare() は説明用の疑似関数である。実際には評価用AIの出力を検証したり、評価基準を指定したりすることがある。

❓ よくある質問

Q. RLAIFとDPOは何が違うの?

  • RLAIFは、AIのフィードバックを利用する枠組みである。
  • DPOは、選好データを直接利用する学習方法である。
  • RLAIFで生成した選好データをDPOで学習することができる。

Q. RLAIFとRLHFはどちらが優れているの?

  • 一概には言えない。
  • RLAIFは評価データを大量に作りやすい一方、評価用AIの判断に依存する。
  • RLHFは人間の判断を直接利用できる一方、人間による評価のコストがかかる。
  • 実際には両者を組み合わせることもできる。

Q. Constitutional AIとは?

  • AIに明示的な原則を与え、その原則に沿って回答を批評・修正・評価させるアプローチである。
  • RLAIFと関連が深いが、両者は同義ではない。

⑤GRPO(Group Relative Policy Optimization)

論文名: DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models
URL: https://arxiv.org/abs/2402.03300
発表日: 2024-02-05

✅ ポイント

  • GRPOは、LLMの強化学習に利用される最適化アルゴリズムである。
  • 同じプロンプトに対して複数の回答を生成し、グループ内の相対的な報酬を利用してモデルを更新する。
  • PPOの一般的な構成で使われる、価値関数を推定するCriticモデルを必要としない設計が特徴である。
  • 数学などの推論能力を高める強化学習で注目された。

🧠 学習の仕組み

GRPOでは、同じ問題に対して複数の回答を生成し、それぞれの報酬を比較する。

例えば、数学の問題に対して4つの回答を生成する。

問題:
17 × 19 は?

回答A:323
回答B:313
回答C:323
回答D:333

正解判定器がある場合、各回答の正誤を判定して報酬を与える。

回答A:正解 → 高い報酬
回答B:不正解 → 低い報酬
回答C:正解 → 高い報酬
回答D:不正解 → 低い報酬

GRPOでは、同じプロンプトから生成された回答の報酬をグループ内で比較し、その相対的な評価を使って方策を更新する。

🧪 学習の疑似コード

model = load_sft_model()

while not converged:
    prompts = sample_prompts()

    # 各プロンプトに対して複数の回答を生成
    groups = [
        model.generate_multiple(prompt, num_samples=G)
        for prompt in prompts
    ]

    # 回答ごとの報酬を計算
    rewards = compute_rewards(
        prompts,
        groups
    )

    # グループ内で報酬を正規化し、
    # 相対的なAdvantageを計算
    advantages = group_relative_advantages(
        rewards
    )

    # GRPOの目的関数でモデルを更新
    loss = compute_grpo_loss(
        model,
        groups,
        advantages
    )

    update(model, loss)

※ 説明用の疑似コードである。実際のGRPOでは、旧方策との確率比、クリッピング、参照方策とのKL制約などを考慮する実装がある。

🧮 グループ相対Advantage

代表的なGRPOの考え方では、同じプロンプトに対する各回答の報酬を使って、相対的なAdvantageを計算する。

\hat{A}_i
=
\frac{r_i-\operatorname{mean}(r_1,\ldots,r_G)}
{\operatorname{std}(r_1,\ldots,r_G)+\epsilon}

ここで、

  • $r_i$:回答 $i$ の報酬
  • $G$:同じプロンプトに対して生成した回答の数
  • $\operatorname{mean}$:グループ内の平均報酬
  • $\operatorname{std}$:グループ内の報酬の標準偏差
  • $\epsilon$:ゼロ除算を防ぐための小さな値

である。

この式は、グループ内で回答が平均より良かったか、悪かったかを表す一例である。実際の実装では、報酬の正規化方法やAdvantageの計算単位などが異なる場合がある。

❓ よくある質問

Q. GRPOとPPOは何が違うの?

  • どちらも強化学習アルゴリズムである。
  • PPOの一般的な構成では、Criticモデルを使って価値関数を推定する。
  • GRPOでは、複数の回答の相対的な報酬を利用することで、独立したCriticモデルを不要にする設計を採用している。

Q. GRPOはRLHFの代わりなの?

  • 必ずしもそうではない。
  • GRPOはモデルの更新方法であり、RLHFは人間のフィードバックを利用する学習の枠組みである。
  • 人間の評価から得られた報酬をGRPOで利用する設計も、検証可能な報酬をGRPOで利用する設計も考えられる。

Q. なぜ複数の回答を生成するの?

  • グループ内で回答の報酬を比較するためである。
  • ただし、回答を複数生成するため、その分の推論コストがかかる。
  • また、すべての回答の報酬が同じ場合などは、相対評価から得られる学習信号が弱くなることがある。

⑥RLVR(Reinforcement Learning with Verifiable Rewards)

✅ ポイント

  • RLVRは、正解判定器やテストなど、検証可能な結果から得られる報酬を利用して強化学習を行う枠組みである。
  • 数学の正解判定やプログラムのテスト結果など、客観的に検証できるタスクで利用しやすい。
  • GRPOやPPOなど、複数の強化学習アルゴリズムと組み合わせることができる。
  • 最終的な答えが正しいことと、推論過程が正しいことは必ずしも同じではない。

🧠 学習の仕組み

RLVRでは、報酬モデルによる主観的な評価の代わりに、検証可能な基準を報酬に利用する。例えば、数学の問題では、生成した回答が正解と一致するかどうかを判定する。プログラミングでは、生成したコードをテストし、その結果を報酬に利用できる。

問題を入力
    ↓
LLMが回答を生成
    ↓
正解判定器・テストで検証
    ↓
検証結果から報酬を計算
    ↓
GRPOやPPOなどでモデルを更新

🧪 学習の疑似コード

model = load_sft_model()

while not converged:
    prompts = sample_verifiable_tasks()

    responses = model.generate_multiple(
        prompts,
        num_samples=G
    )

    # 正解判定器やテストで報酬を計算
    rewards = verifier(prompts, responses)

    # GRPOなどの強化学習でモデルを更新
    loss = compute_grpo_loss(
        model,
        responses,
        rewards
    )

    update(model, loss)

❓ よくある質問

Q. RLVRとGRPOは何が違うの?

  • RLVRは、どのような報酬を利用するかに注目した枠組みである。
  • GRPOは、その報酬を使ってモデルをどのように更新するかを定めるアルゴリズムである。
  • そのため、RLVRとGRPOは組み合わせて利用できる。

Q. RLVRは数学専用なの?

  • いいえ。
  • 数学以外にも、コードのテスト、形式的な制約の検証、正解が明確な問題などで利用できる。
  • ただし、自由形式の文章の有用性や自然さなど、客観的な正解判定が難しいタスクでは報酬の設計が難しくなる。

⑦Distillation(知識蒸留)

✅ ポイント

  • Distillationは、教師モデル(Teacher)の出力や振る舞いを利用して、生徒モデル(Student)を学習する手法である。
  • 高性能なモデルの能力を、より小さなモデルに移すために利用できる。
  • 教師モデルが生成した回答をSFTのデータとして利用する方法もある。
  • 強化学習による推論能力の改善と組み合わせて利用することもできる。

🧠 学習の仕組み

教師モデルが生成した回答や推論例を収集し、それを使って生徒モデルを学習する。

高性能な教師モデル
        ↓
回答・推論例を生成
        ↓
学習データを作成
        ↓
生徒モデルを教師あり学習
        ↓
小型モデルに能力を移転

🧪 学習の疑似コード

teacher = load_teacher_model()
student = load_student_model()

# 教師モデルから学習データを作成
dataset = []

for prompt in prompts:
    response = teacher.generate(prompt)
    dataset.append((prompt, response))

# 教師の出力を使って生徒モデルを学習
student = supervised_fine_tuning(
    student,
    dataset
)

❓ よくある質問

Q. Distillationは強化学習なの?

  • 必ずしもそうではない。
  • 教師モデルの出力を使って教師あり学習する方法もあれば、より複雑な学習方法を使う場合もある。
  • Distillationは、教師モデルから生徒モデルへ知識や振る舞いを移すことに着目した概念である。

Q. RLVRとDistillationは組み合わせられるの?

  • 組み合わせられる。
  • 例えば、教師モデルをRLVRなどで改善し、そのモデルが生成した回答を使って生徒モデルを学習する方法が考えられる。
  • ただし、教師モデルの能力がすべて生徒モデルに移るとは限らない。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?