強化学習と模倣学習の違いと特徴
強化学習(Reinforcement Learning)と模倣学習(Imitation Learning)はどちらも「エージェントに行動を学習させる」手法だが、何を手がかりに学習するかが根本的に異なる。本記事では両者の仕組み・特徴・使い分けを整理し、RLHF のような応用例まで俯瞰する。
強化学習(Reinforcement Learning)
基本的な仕組み
強化学習はエージェントが環境と相互作用しながら報酬を最大化するように行動を学習する枠組みだ。
エージェント ──行動(action)──▶ 環境
▲ │
└──状態(state)+報酬(reward)──┘
主な構成要素:
| 要素 | 説明 |
|---|---|
| エージェント (Agent) | 行動を決定する学習主体 |
| 環境 (Environment) | エージェントが作用する対象(ゲーム・ロボット等) |
| 状態 (State) | 現在の環境の観測値 |
| 行動 (Action) | エージェントが選択できる操作 |
| 報酬 (Reward) | 行動の良し悪しを示すスカラー値 |
| 方策 (Policy) | 状態から行動を決定するルール(学習の対象) |
特徴
- 報酬設計が全て: 何を「良い行動」とするかを数値で定義しなければならない。報酬設計の質が性能上限を決める
- 探索コストが高い: ランダム探索から始まるため、序盤の学習効率は低い
- 性能上限が高い: 人間のデモを超える「超人的な性能」を理論上達成できる(AlphaGoなど)
- 遅延報酬への対応: 行動の結果が後になって現れる場合(スパース報酬)の学習は難しい
代表的なアルゴリズム
Q-Learning / DQN
Q値(状態・行動の価値)を学習するモデルフリー手法。DQN(Deep Q-Network)はニューラルネットを組み合わせてAtariゲームを人間超えのレベルでプレイした。
import gymnasium as gym
import numpy as np
env = gym.make("CartPole-v1")
# Q-table の初期化(離散状態空間の例)
Q = np.zeros((env.observation_space.shape[0], env.action_space.n))
# 1エピソードの簡略フロー
obs, _ = env.reset()
for _ in range(200):
action = env.action_space.sample() # ε-greedy で選択
next_obs, reward, done, truncated, _ = env.step(action)
# TD更新: Q[s,a] += lr * (reward + gamma * max(Q[s']) - Q[s,a])
if done or truncated:
break
obs = next_obs
PPO(Proximal Policy Optimization)
方策勾配法の代表格。安定した学習が得られるため、OpenAI・Google DeepMindが多くの研究で採用している。
from stable_baselines3 import PPO
env = gym.make("CartPole-v1")
model = PPO("MlpPolicy", env, verbose=1)
model.learn(total_timesteps=50_000)
model.save("ppo_cartpole")
AlphaZero
モンテカルロ木探索(MCTS)と深層強化学習を組み合わせ、チェス・将棋・囲碁を自己対局だけでマスターした手法。
向いているケース
- 明確なルール・報酬が定義できる(ゲーム、ロボット制御)
- 人間のデモデータが入手できない・したくない
- 超人的性能(人間以上)を目指したい
模倣学習(Imitation Learning)
基本的な仕組み
模倣学習は専門家(エキスパート)のデモンストレーションを手がかりに行動を学習する。報酬を設計せずに「専門家のように行動する」ことを目標にする。
専門家のデモ (状態, 行動) のペア
│
▼
教師あり学習的に方策を訓練
│
▼
専門家に近い行動を模倣
特徴
- デモデータが必須: 専門家の行動データの質・量が性能を左右する
- 報酬設計不要: 何が「良い行動」かを数値化しなくてよい
- サンプル効率が高い: 最初から専門家の行動を学ぶので序盤学習が速い
- 性能上限が専門家に縛られる: デモの品質を超えることは難しい
主なアプローチ
行動クローニング(Behavior Cloning, BC)
最もシンプルなアプローチ。デモデータを(状態, 行動)のペアとして教師あり学習する。
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
# デモデータ(状態, 行動)を収集済みと仮定
# states: (N, state_dim), actions: (N,)
states = torch.randn(1000, 4)
actions = torch.randint(0, 2, (1000,))
dataset = TensorDataset(states, actions)
loader = DataLoader(dataset, batch_size=64, shuffle=True)
class PolicyNet(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Linear(4, 64), nn.ReLU(),
nn.Linear(64, 64), nn.ReLU(),
nn.Linear(64, 2)
)
def forward(self, x):
return self.net(x)
model = PolicyNet()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()
for epoch in range(10):
for s, a in loader:
loss = criterion(model(s), a)
optimizer.zero_grad()
loss.backward()
optimizer.step()
問題点: 分布シフト(Distribution Shift)。デモで見たことがない状態に陥ると、エラーが雪だるま式に蓄積する。
DAgger(Dataset Aggregation)
BCの分布シフト問題を解決するアルゴリズム。学習した方策でロールアウトしながら、専門家に「この状態ではどうすべきか」を継続的に問い合わせてデータを追加していく。
1. 初期デモで BC 学習
2. 学習済み方策でロールアウト
3. 訪問した状態を専門家にラベル付けしてもらう
4. データセットに追加して再学習
5. 2〜4 を繰り返す
GAIL(Generative Adversarial Imitation Learning)
GAN の枠組みを模倣学習に応用。識別器(Discriminator)が「専門家の行動」か「学習者の行動」かを判別し、その出力を報酬として RL で学習する。
専門家のデモ ──▶ Discriminator ◀── 学習者のロールアウト
│
「本物らしさ」スコア
│
▼
RL で方策を更新
向いているケース
- 専門家のデモデータが豊富に取得できる
- 報酬の数値化が困難(自然言語処理、料理ロボット等)
- 早期に「それなりの性能」が必要な場面
強化学習 vs 模倣学習 比較表
| 観点 | 強化学習(RL) | 模倣学習(IL) |
|---|---|---|
| 学習の基準 | 報酬の最大化 | 専門家への模倣 |
| デモデータ | 不要 | 必須 |
| 報酬設計 | 必須(難易度高い) | 不要 |
| 性能上限 | 理論上無制限 | 専門家レベルが上限 |
| サンプル効率 | 低い(探索コスト大) | 高い |
| 学習安定性 | 不安定になりやすい | 比較的安定 |
| 向く問題 | ゲーム、ロボット最適制御 | 自動運転、言語モデルの調整 |
組み合わせ応用
RLHF(Reinforcement Learning from Human Feedback)
ChatGPT などの大規模言語モデル(LLM)のファインチューニングで広く使われる手法。「人間の評価」を報酬として RL を行う。
1. 教師ありファインチューニング(SFT)── デモから BC
2. 報酬モデルの学習 ── 人間の好み比較データから
3. PPO で LLM を報酬モデルに対して最適化
模倣学習(SFT)で初期化したモデルを RL でさらに洗練するパイプラインになっており、両手法の組み合わせの好例だ。
IL → RL の初期化パターン
まず模倣学習でエージェントを「大まかに動ける」状態まで育て、その後 RL で性能を上積みする。
# Step 1: BCで初期方策を学習
bc_model = train_behavior_cloning(demo_data)
# Step 2: BC モデルの重みで RL エージェントを初期化
rl_model = PPO("MlpPolicy", env)
rl_model.policy.load_state_dict(bc_model.state_dict())
# Step 3: RL でファインチューニング
rl_model.learn(total_timesteps=100_000)
この手法はロボティクスや自動運転でよく使われる。BC だけでは分布シフトで破綻しがちな場面を、RL による自己改善でカバーできる。
ハマりやすいポイント
強化学習
- 報酬ハッキング: 設計した報酬を「抜け穴」で最大化してしまう(例: 走ることを目的としたエージェントが転倒し続けることで負の報酬を回避)
- スパース報酬: ゴール到達時だけ報酬が出る設定では、ランダム探索でゴールを見つけられず学習が進まない。報酬シェーピング(Reward Shaping)や HER(Hindsight Experience Replay)で対処する
- ハイパーパラメータ感度: PPO の
clip_range、学習率、エントロピー係数などが結果に大きく影響する
模倣学習
- 分布シフト(BC): 学習時と実行時の状態分布のズレがエラーを雪だるま式に蓄積させる。DAgger や GAIL で緩和できる
- デモの質: 専門家がコンシステントに行動していないとノイズが入る。デモフィルタリングが必要な場合がある
- GAIL の学習不安定性: GAN ベースなので Discriminator と Generator のバランス調整が難しい
業務での使いどころ
RL を選ぶべき場面
- ゲーム AI・シミュレーション: OpenAI Gym / Unity ML-Agents など環境が整備されており、失敗コストが低い
- 最適制御・スケジューリング: 配送ルート最適化、工場ラインのスループット最大化など、報酬が売上・コストで明確に定義できる
- ボードゲーム・戦略 AI: 完全情報ゲームで超人的性能を目指す
IL を選ぶべき場面
- 自動運転・ロボットアーム: 人間のデモ(遠隔操作ログ)が大量に取得しやすく、報酬設計が難しい
- LLM のスタイル・トーン制御: 特定ライターの文体を模倣させる BC ベースのファインチューニング
- 医療・安全クリティカルな環境: 現実での失敗が許されないため RL の探索フェーズを避けたい
ハイブリッドを選ぶべき場面
- LLM の RLHF 調整: SFT(BC に相当)→ 報酬モデル学習 → PPO のパイプラインが LLM 開発の標準
- ロボット転移学習: シミュレーターで BC 済みモデルを実機 RL でファインチューニング(Sim2Real)
まとめ
| RL | IL | |
|---|---|---|
| 「何が良いか」の情報源 | 報酬関数 | 専門家デモ |
| 最大の課題 | 報酬設計・探索効率 | 分布シフト・デモ収集コスト |
| 強みを活かす場面 | ルール明確・超人性能が必要 | デモ豊富・報酬設計困難 |
現代の実用システムでは純粋な RL か IL かの二択ではなく、IL で初期化して RL でファインチューニングする IL → RL パイプラインや、人間フィードバックを報酬にする RLHF のようなハイブリッド手法が主流になっている。