逆強化学習について - Shinichi0713/Reinforce-Learning-Study GitHub Wiki

逆強化学習とは

逆強化学習(Inverse Reinforcement Learning, IRL)とは、エージェントが環境でどのように行動すべきかを報酬関数から学ぶ通常の強化学習(RL)とは逆に、「人間や専門家などの良い行動(軌跡やデモンストレーション)」から、その背後にある報酬関数(目的・意図)を推定する手法です。

逆強化学習の概要

  • 通常の強化学習(RL)
    報酬関数が与えられている → 最適な方策(policy)を学習

  • 逆強化学習(IRL)
    専門家の行動履歴(デモンストレーション)が与えられている → その行動を生み出した「報酬関数」を推定

逆強化学習の流れ

  1. 専門家の行動データ(軌跡)を収集
    例:人間の運転データ、熟練工の作業記録、ロボットの手本動作など

  2. その行動が「最適」になるような報酬関数を探索
    報酬関数は通常、パラメトリックな形(線形結合やニューラルネットワークなど)で仮定される

  3. 推定した報酬関数を使って、通常の強化学習で方策を学習
    こうすることで、専門家と同じような行動ができるエージェントが得られる

逆強化学習のメリット

  • 人間の意図や価値観を推定できる
    例:自動運転車が「安全運転」をどう評価しているかを学習できる
  • 報酬設計が難しい問題でも、デモから学習できる
    例:複雑なスケジューリングやロボット制御など

代表的な手法

  • Maximum Entropy IRL(最大エントロピー逆強化学習)
    専門家の行動だけでなく、行動の多様性も考慮して報酬関数を推定
  • Apprenticeship Learning(弟子入り学習)
    専門家の報酬関数を模倣するように方策を学習
  • Generative Adversarial Imitation Learning (GAIL)
    GANの枠組みを使い、専門家の行動分布とエージェントの行動分布が一致するように学習

まとめ

逆強化学習は、「なぜそのように行動するのか?」という目的や価値観(報酬関数)を、行動データから推定する技術です。
これにより、複雑な問題でも人間のノウハウや意図をエージェントに学ばせることができます。


逆強化学習の実装例

最大エントロピー逆強化学習(Maximum Entropy Inverse Reinforcement Learning, MaxEnt IRL)は、専門家の行動データから「最も説明力が高く、かつエントロピー(ランダム性)が最大となる」ような報酬関数を推定する手法です。
ここでは、簡単なグリッドワールド環境を例に、Pythonでの実装例(主要部分のサンプルコード)を紹介します。

必要なライブラリ

import numpy as np
from scipy.special import logsumexp

環境の設定(例:4x4グリッドワールド)

grid_size = 4
n_states = grid_size * grid_size
n_actions = 4  # 上下左右

# 状態sにおける行動aの結果遷移先状態を定義
def transition(s, a):
    row, col = divmod(s, grid_size)
    if a == 0 and row > 0:        # up
        row -= 1
    elif a == 1 and row < grid_size-1:  # down
        row += 1
    elif a == 2 and col > 0:      # left
        col -= 1
    elif a == 3 and col < grid_size-1:  # right
        col += 1
    return row * grid_size + col

専門家の軌跡データ(例:ゴールまでの最短経路)

# 例: 状態0から状態15(右下)までの経路
expert_trajectories = [
    [0, 1, 2, 3, 7, 11, 15]
]

報酬関数の初期化

reward = np.random.uniform(size=n_states)

特徴量の設計(ここではone-hot)

def state_features(s):
    f = np.zeros(n_states)
    f[s] = 1.0
    return f

MaxEnt IRLの主要部分

def maxent_irl(feature_matrix, trajectories, transition_func, n_actions, n_states, epochs=100, lr=0.01):
    reward = np.random.uniform(size=n_states)
    for epoch in range(epochs):
        # 1. 専門家の特徴量期待値
        expert_feat_exp = np.zeros(n_states)
        for traj in trajectories:
            for s in traj:
                expert_feat_exp += state_features(s)
        expert_feat_exp /= len(trajectories)

        # 2. 報酬で誘導される方策の下での特徴量期待値
        # 方策計算(soft value iteration)
        V = np.zeros(n_states)
        for _ in range(20):  # value iteration
            Q = np.zeros((n_states, n_actions))
            for s in range(n_states):
                for a in range(n_actions):
                    s_next = transition_func(s, a)
                    Q[s, a] = reward[s] + V[s_next]
            V = logsumexp(Q, axis=1)
        # 方策
        policy = np.exp(Q - V[:, None])

        # 状態分布の計算(軌跡の初期状態から遷移をシミュレート)
        state_visitation = np.zeros(n_states)
        for traj in trajectories:
            s = traj[0]
            state_visitation[s] += 1
            for _ in range(len(traj)-1):
                a = np.random.choice(n_actions, p=policy[s])
                s = transition_func(s, a)
                state_visitation[s] += 1
        state_visitation /= state_visitation.sum()

        # 3. 方策下での特徴量期待値
        model_feat_exp = np.zeros(n_states)
        for s in range(n_states):
            model_feat_exp += state_visitation[s] * state_features(s)

        # 4. 報酬の更新(勾配上昇法)
        grad = expert_feat_exp - model_feat_exp
        reward += lr * grad

    return reward

実行例

feature_matrix = np.eye(n_states)
estimated_reward = maxent_irl(
    feature_matrix,
    expert_trajectories,
    transition,
    n_actions,
    n_states,
    epochs=100,
    lr=0.01
)
print("推定された報酬:", estimated_reward.reshape((grid_size, grid_size)))

ポイント

  • 状態特徴量や軌跡データ、環境遷移モデルを適切に設計することで、様々な問題に応用できます。
  • 実際の応用では、特徴量をone-hotでなく、より意味のあるもの(例:ジョブの属性や資源の状態など)にすることで性能が向上します。