模倣学習 - Shinichi0713/Reinforce-Learning-Study GitHub Wiki

模倣学習(Imitation Learning)は、「人間やエキスパートの行動を観察し、それを模倣するようにエージェントを訓練する手法」です。
最も基本的な方法は**行動クローン(Behavior Cloning, BC)**です。以下に代表的な実装手順とポイントを説明します。


1. 行動クローン(Behavior Cloning, BC)の手順

(1) データ収集

  • エキスパート(人間や熟練エージェント)が環境で行動し、状態(観測)と行動(アクション)のペアを記録します。
    • 例:ゲームの画面(状態)と操作(行動)

(2) データセット作成

  • 収集した「状態–行動」ペアをデータセットとしてまとめます。

(3) ニューラルネットワークの設計

  • 状態を入力、行動を出力とするネットワークを設計します。
    • 例:画像→操作キー、座標値→連続値アクションなど

(4) 教師あり学習

  • 上記データセットを使い、状態→行動のマッピングを「教師あり学習」で学習します。
    • 目的関数:行動のクロスエントロピー損失(離散の場合)やMSE(連続値の場合)

(5) 学習したモデルを使ってエージェントを動かす


2. PyTorchによる簡単な実装例

ここでは、OpenAI GymのCartPole環境で、エキスパートのデータから模倣学習を行う例を示します。

(1) エキスパートデータの収集

import gym
import numpy as np

env = gym.make('CartPole-v1')
expert_data = []

for episode in range(20):  # 20エピソード分データ収集
    obs = env.reset()
    done = False
    while not done:
        # ここでは簡単なルールベースのエキスパート
        action = 0 if obs[2] < 0 else 1  # ポールの角度で左右決定
        expert_data.append((obs, action))
        obs, reward, done, info = env.step(action)

# データ整形
states = np.array([d[0] for d in expert_data])
actions = np.array([d[1] for d in expert_data])

(2) ニューラルネットワークと学習

import torch
import torch.nn as nn
import torch.optim as optim

class PolicyNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Sequential(
            nn.Linear(4, 64),
            nn.ReLU(),
            nn.Linear(64, 2)
        )
    def forward(self, x):
        return self.fc(x)

model = PolicyNet()
optimizer = optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()

states_tensor = torch.FloatTensor(states)
actions_tensor = torch.LongTensor(actions)

for epoch in range(50):
    logits = model(states_tensor)
    loss = criterion(logits, actions_tensor)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if epoch % 10 == 0:
        print(f"Epoch {epoch}, Loss: {loss.item():.4f}")

(3) 学習済みモデルでエージェントを動かす

obs = env.reset()
done = False
while not done:
    obs_tensor = torch.FloatTensor(obs).unsqueeze(0)
    with torch.no_grad():
        logits = model(obs_tensor)
        action = torch.argmax(logits, dim=1).item()
    obs, reward, done, info = env.step(action)
    env.render()
env.close()

3. その他の模倣学習手法

  • Inverse Reinforcement Learning(逆強化学習)
    報酬関数自体を推定する高度な手法もあります。
  • DAgger(Dataset Aggregation)
    エージェントが自分で生成したデータも混ぜて学習することで、分布のズレ(covariate shift)を緩和します。

まとめ

  • 模倣学習は「状態–行動」ペアを使った教師あり学習が基本です。
  • 最もシンプルなのは「行動クローン(Behavior Cloning)」です。
  • より高性能な手法や、現実的な課題(分布シフト等)にはDAggerや逆強化学習も検討されます。