自動運転のAIを開発するとき、「安全に運転する」という目標をどのように数学的に定式化すればよいでしょうか。「衝突しない」「車線を守る」「速度制限を守る」といったルールを列挙できますが、人間のドライバーが暗黙的に従っている微妙な判断基準 — 例えば「この状況では少し加速した方が安全」「この交差点では早めに減速すべき」「歩行者がいる場合は少し広めに車間を取る」— を全て手動で数式にするのは極めて困難です。報酬関数の設計ミス(reward hacking)はAIの予期しない行動を引き起こす原因として知られており、適切な報酬関数の設計は強化学習の最も困難な課題の一つです。
しかし、熟練ドライバーの運転データ(行動の軌跡)は大量に収集できます。そこで発想を逆転させます。行動から報酬関数を推定するのです。これが逆強化学習(Inverse Reinforcement Learning, IRL)です。
通常の強化学習が「報酬関数 → 最適方策」を求めるのに対し、逆強化学習は「エキスパートの方策 → 報酬関数」を求めます。この発想の転換は非常に強力です。報酬関数はタスクの「何を達成すべきか」を本質的に記述するものであり、特定の環境や状況に依存しません。推定された報酬関数を使えば、新しい環境(たとえば見たことのない道路)でも最適化を行い、エキスパートのような行動を生成できます。これは行動を直接コピーする模倣学習(行動クローニング)にはない大きな利点です。
逆強化学習を理解すると、以下のような場面で活用できます。
- 自動運転: 人間の運転行動から暗黙的な報酬関数を学習。Waymoの自動運転システムでもIRLベースの手法が使われています
- ロボティクス: 人間のデモンストレーションからタスクの目標を推定。物を掴む、運ぶ、置くなどの動作の「何が良い動作か」を数式化できます
- ゲームAI: プレイヤーの行動パターンから好みや意図を推定。NPCの行動をよりリアルにするのに使われます
- 医療: 専門医の治療方針から治療の報酬関数を推定。熟練医の暗黙知を形式化する試みとして研究されています
本記事の内容
- 逆強化学習の問題設定と動機
- Abbeel & Ng(2004)の特徴量マッチング
- 最大エントロピーIRL(MaxEnt IRL)の理論
- 逆強化学習の不良設定性と正則化
- Pythonでの実装と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
- 方策勾配定理の導出と実装 — 強化学習の基礎
- DQNの理論と実装 — 価値関数の近似
問題設定
マルコフ決定過程(MDP)の復習
逆強化学習は、マルコフ決定過程(MDP)の枠組みで定式化されます。MDPは以下の要素で構成されます。
$$ \mathcal{M} = (\mathcal{S}, \mathcal{A}, P, R, \gamma) $$
- $\mathcal{S}$: 状態空間
- $\mathcal{A}$: 行動空間
- $P(s’|s, a)$: 状態遷移確率
- $R(s, a)$: 報酬関数(未知)
- $\gamma \in [0, 1)$: 割引率
通常の強化学習では $R$ が既知で、最適方策 $\pi^*$ を求めます。これを順問題(forward problem) と呼びます。
$$ \pi^* = \arg\max_\pi \mathbb{E}_\pi\left[\sum_{t=0}^{\infty} \gamma^t R(s_t, a_t)\right] $$
この問題は価値反復法や方策勾配法で解くことができます。
逆強化学習の問題
逆強化学習は順問題の逆問題(inverse problem) です。報酬関数 $R$ が未知であり、代わりにエキスパートの方策 $\pi_E$ による行動軌跡(デモンストレーション)
$$ \mathcal{D} = \{\tau_1, \tau_2, \ldots, \tau_N\}, \quad \tau_i = (s_0^i, a_0^i, s_1^i, a_1^i, \ldots) $$
が与えられます。目標は、エキスパートの行動を「最適」にする報酬関数 $R$ を推定することです。
$$ \text{Find } R \text{ such that } \pi_E = \arg\max_\pi \mathbb{E}_\pi\left[\sum_t \gamma^t R(s_t, a_t)\right] $$
この問題を日常的な例えで理解しましょう。あなたが料理の達人の調理過程を観察しているとします。達人がどのタイミングで塩を入れ、どのくらい火を加減するかは観察できますが、達人の頭の中にある「美味しさの基準」(報酬関数)は直接見ることができません。逆強化学習は、「この行動パターンを最適にする美味しさの基準とは何か?」を推定する問題です。
不良設定性
逆強化学習の根本的な課題は、問題が不良設定(ill-posed)であることです。任意のエキスパート方策を最適にする報酬関数は無数に存在します。
具体的に考えてみましょう。以下のような報酬関数はいずれもエキスパートの方策を最適にします。
- $R(s, a) = 0$(全ての状態・行動に対して報酬0) — 全ての方策が等しく最適なので、エキスパートの方策も当然最適です
- $R(s, a) = c$(全ての状態・行動に対して同じ定数) — 同上
- $R'(s, a) = \alpha R(s, a)$(任意の正の定数 $\alpha > 0$ でスケーリング) — 最適方策はスケーリングに対して不変です
- $R'(s, a) = R(s, a) + \Phi(s)$(ポテンシャル関数の加算) — ポテンシャルベースの報酬変換は最適方策を変えません
このように、報酬関数の「形」には大きな自由度があります。これは物理学における電位のゲージ自由度に似ています。電位そのものの値は物理的に意味がなく、電位の差(電場)だけが意味を持つのと同様に、報酬関数の絶対値よりも状態間の報酬の相対的な差が方策の形を決定します。
したがって、解を一意にするための追加的な仮定や正則化が必要です。
この不良設定性を解決する主要なアプローチを見ていきましょう。
特徴量マッチング
報酬関数の線形モデル
不良設定性を解決する最初のアプローチは、報酬関数のクラスを制限することです。Abbeel & Ng(2004)は、報酬関数を特徴量の線形結合でモデル化しました。
$$ R(s) = \bm{w}^T \bm{\phi}(s) = w_1 \phi_1(s) + w_2 \phi_2(s) + \cdots + w_k \phi_k(s) $$
ここで $\bm{\phi}(s) \in \mathbb{R}^k$ は状態 $s$ の特徴量ベクトル(手動で設計)、$\bm{w} \in \mathbb{R}^k$ は未知の重みベクトルです。$k$ 個の特徴量は人間の事前知識に基づいて設計します。
例えば自動運転なら、$\bm{\phi}(s)$ は「速度」「車線からの距離」「前方車両との距離」「交差点との距離」「歩行者の有無」などの特徴量です。各特徴量の「重要度」を表す重み $\bm{w}$ が未知のパラメータであり、これを推定するのがIRLの目的になります。
線形モデルの利点は、推定すべきパラメータが $k$ 個の重みだけであるためシンプルで解釈しやすいことです。推定された $\bm{w}$ を見れば、「エキスパートは車線からの距離よりも前方車両との距離を重視している」といった定性的な知見が得られます。一方、欠点は特徴量の設計が人手に依存すること、そして線形結合では表現できない非線形な報酬関数を捉えられないことです。
特徴量期待値
方策 $\pi$ のもとでの特徴量期待値(feature expectation)は
$$ \bm{\mu}(\pi) = \mathbb{E}_\pi\left[\sum_{t=0}^{\infty} \gamma^t \bm{\phi}(s_t)\right] $$
です。方策 $\pi$ の期待累積報酬は
$$ V(\pi) = \bm{w}^T \bm{\mu}(\pi) $$
と書けます。
マッチング条件
エキスパートの方策 $\pi_E$ が最適であるための必要条件は、任意の方策 $\pi$ に対して
$$ \bm{w}^T \bm{\mu}(\pi_E) \geq \bm{w}^T \bm{\mu}(\pi) $$
が成り立つことです。Abbeel & Ngはこの条件から、
$$ \bm{\mu}(\pi) \approx \bm{\mu}(\pi_E) $$
すなわち「学習した方策の特徴量期待値がエキスパートの特徴量期待値と一致する」ことを目標とするアルゴリズムを提案しました。
しかし、特徴量マッチングだけではいくつかの問題があります。第一に、特徴量期待値が一致する方策は複数存在する可能性があり、どれを選ぶべきか基準がありません。第二に、エキスパートの行動の「曖昧さ」(同程度に良い行動が複数ある場合)を適切にモデル化できません。エキスパートは必ずしも常に最適な行動だけを取るわけではなく、同程度に良い行動の中からある程度ランダムに選択しています。この確率的な振る舞いをモデル化するのが最大エントロピーIRLです。
最大エントロピーIRL(MaxEnt IRL)
動機
Ziebart et al.(2008)の最大エントロピーIRL(MaxEnt IRL)は、情報理論の最大エントロピー原理に基づきます。最大エントロピー原理は統計力学やベイズ推論でも広く用いられる原理であり、「知っている制約だけを課し、それ以外については最大限無知でいる」という合理的な推論の原理です。
核心的なアイデアは、「エキスパートの行動はランダムではないが、完全に決定論的でもない」ということです。同程度に良い行動の中から、エキスパートは何らかの確率で行動を選択します。たとえば自動車の運転では、目的地に向かう複数の経路が同程度に良い場合、ドライバーはその中から確率的に1つを選びます。しかし、明らかに遠回りの経路を選ぶ確率は低いはずです。
MaxEnt IRLでは、特徴量マッチングの制約を満たす軌跡の分布のうち、最もエントロピーが高い(= 最も情報を仮定しない、最も「偏りのない」)分布を選びます。これにより、不良設定性の問題に対して原理的で一意な解が得られます。
軌跡の確率モデル
MaxEnt IRLでは、エキスパートが軌跡 $\tau$ を生成する確率を
$$ \begin{equation} P(\tau | \bm{w}) = \frac{1}{Z(\bm{w})} \exp\left(\bm{w}^T \bm{f}_\tau\right) \end{equation} $$
とモデル化します。ここで $\bm{f}_\tau = \sum_t \gamma^t \bm{\phi}(s_t)$ は軌跡 $\tau$ の累積特徴量、$Z(\bm{w}) = \sum_{\tau’} \exp(\bm{w}^T \bm{f}_{\tau’})$ は分配関数(正規化定数)です。
この確率モデルはボルツマン分布(Gibbs分布)の形をしています。統計力学でエネルギー $E$ の状態が確率 $\propto \exp(-E/k_BT)$ で実現されるのと同じ形式です。ここでは報酬がエネルギーの負に対応し、報酬が高い軌跡ほど指数的に高い確率で選択されます。この分布が実際に最大エントロピー原理から導かれることを確認しましょう。特徴量期待値の制約 $\mathbb{E}[\bm{f}_\tau] = \bar{\bm{f}}_E$ と確率の正規化条件 $\sum_\tau P(\tau) = 1$ の下でエントロピー $H[P] = -\sum_\tau P(\tau) \ln P(\tau)$ を最大化するラグランジュ乗数法を適用すると、まさにボルツマン分布の形が得られます。ラグランジュ乗数 $\bm{w}$ が報酬関数の重みに対応します。
最尤推定
エキスパートの軌跡 $\mathcal{D} = \{\tau_1, \ldots, \tau_N\}$ の対数尤度を最大化する $\bm{w}$ を求めます。
$$ \begin{equation} \bm{w}^* = \arg\max_{\bm{w}} \sum_{i=1}^{N} \log P(\tau_i | \bm{w}) = \arg\max_{\bm{w}} \sum_{i=1}^{N} \left[\bm{w}^T \bm{f}_{\tau_i} – \log Z(\bm{w})\right] \end{equation} $$
対数尤度の $\bm{w}$ に関する勾配は
$$ \nabla_{\bm{w}} \mathcal{L} = \frac{1}{N}\sum_{i=1}^{N} \bm{f}_{\tau_i} – \mathbb{E}_{\tau \sim P(\tau|\bm{w})}[\bm{f}_\tau] $$
右辺の第1項はエキスパートの軌跡の経験的な特徴量期待値、第2項は現在の報酬関数のもとでのモデルの特徴量期待値です。
勾配が0になる条件は
$$ \frac{1}{N}\sum_{i=1}^{N} \bm{f}_{\tau_i} = \mathbb{E}_{\tau \sim P(\tau|\bm{w})}[\bm{f}_\tau] $$
すなわち「エキスパートの特徴量期待値とモデルの特徴量期待値が一致する」ことです。これは特徴量マッチングの条件と同じですが、MaxEnt IRLではこの条件を最大エントロピー原理に基づいて導出している点が本質的に異なります。
この勾配は直感的に理解できます。エキスパートの特徴量期待値が大きい特徴量(つまりエキスパートがよく訪れる状態の特徴量)の重みを増やし、モデルの方策がよく訪れるがエキスパートはあまり訪れない状態の特徴量の重みを減らします。これを繰り返すことで、モデルの方策がエキスパートの行動パターンに徐々に近づきます。
アルゴリズム
MaxEnt IRLのアルゴリズムは以下のループです。
- エキスパートの特徴量期待値を計算: $\bar{\bm{f}}_E = \frac{1}{N}\sum_i \bm{f}_{\tau_i}$
- 現在の $\bm{w}$ で方策を計算(動的計画法またはRL)
- 方策のもとでの特徴量期待値を計算: $\bar{\bm{f}}_\pi$
- 勾配更新: $\bm{w} \leftarrow \bm{w} + \eta(\bar{\bm{f}}_E – \bar{\bm{f}}_\pi)$
- 2-4を収束まで繰り返す
ステップ2の「現在の $\bm{w}$ で方策を計算」が最も計算コストが高い部分です。小さなMDPでは動的計画法で正確に解けますが、大規模な問題ではRLのサブルーチンが必要になります。
正則化と拡張
L2正則化
MaxEnt IRLの最尤推定でも、不良設定性の影響は残ります。特に学習データが少ない場合、重み $\bm{w}$ が極端に大きな値に発散する可能性があります。これを緩和するため、対数尤度にL2正則化を加えます。
$$ \bm{w}^* = \arg\max_{\bm{w}} \left[\sum_{i=1}^{N} \log P(\tau_i | \bm{w}) – \frac{\lambda}{2}\|\bm{w}\|^2\right] $$
正則化項 $-\frac{\lambda}{2}\|\bm{w}\|^2$ は $\bm{w}$ の大きさを制限し、報酬関数が極端な値を取ることを防ぎます。ベイズの観点では、$\bm{w}$ に対するガウス事前分布 $p(\bm{w}) = \mathcal{N}(\bm{0}, \lambda^{-1}\bm{I})$ を置いたMAP推定に対応します。$\lambda$ が大きいほど単純な(重みが小さい)報酬関数が好まれ、汎化性能が向上しますが、表現力は制限されます。
正則化の強度 $\lambda$ の選択は、交差検証やベイズ的なモデル選択で行うことができます。
深層逆強化学習
線形モデル $R(s) = \bm{w}^T \bm{\phi}(s)$ は解釈しやすい反面、特徴量の手動設計が必要であり、非線形な報酬構造を捉えられないという制限があります。Wulfmeier et al.(2015)やFinn et al.(2016)は、報酬関数をニューラルネットワーク $R_\theta(s, a)$ でパラメータ化する深層IRLを提案しました。
深層IRLでは、生の状態(画像や高次元のセンサデータなど)を直接入力として受け取り、報酬関数を自動的に学習します。特徴量設計の手間がなくなり、複雑な環境(自動運転の画像入力など)にも対応可能になります。ただし、学習した報酬関数がブラックボックスになるため、解釈性が犠牲になるというトレードオフがあります。
GAIL(Generative Adversarial Imitation Learning)
Ho & Ermon(2016)のGAILは、IRLとGAN(敵対的生成ネットワーク)を組み合わせた手法です。GAILの着想は、IRLの内部ループ(現在の報酬関数で方策を最適化する部分)とIRLの外部ループ(報酬関数を更新する部分)を同時に学習するというものです。
具体的には、判別器 $D(s, a)$ が「このstate-actionペアはエキスパートの軌跡からのものか、学習者の軌跡からのものか」を判別し、生成器(方策 $\pi_\theta$)が判別器を騙す(エキスパートと区別がつかない軌跡を生成する)ように学習します。判別器の出力 $-\log(1 – D(s, a))$ が暗黙的な報酬関数として機能します。
GAILは報酬関数の明示的な推定ステップを省略できるため、大規模な問題にスケールしやすい利点があります。また、理論的にはMaxEnt IRLの目的関数と等価であることが示されています。
IRLの計算コストの問題
MaxEnt IRLの最大の計算ボトルネックは、ステップ2の「現在の報酬関数で最適方策を計算する」部分です。各イテレーションで強化学習の問題を解く必要があるため、計算コストが非常に高くなります。この問題に対して、以下の改善策が提案されています。
- サンプルベースの近似: 方策の特徴量期待値を少数のロールアウト(軌跡のサンプリング)で近似する
- GAILの利用: 報酬関数の推定と方策の最適化を同時に行い、IRLの「内部ループ」を不要にする
- 方策の差分更新: 報酬関数が少し変わるだけなので、方策を1から計算し直すのではなく差分的に更新する
実装を見る前に、これらの理論的な背景を頭に入れておくと、コードの各部分の役割が理解しやすくなります。
Pythonでの実装
グリッドワールドでのMaxEnt IRL
小さなグリッドワールドでMaxEnt IRLを実装し、エキスパートの行動から報酬関数を復元します。
import numpy as np
import matplotlib.pyplot as plt
class GridWorld:
"""簡単なグリッドワールド環境"""
def __init__(self, size=5):
self.size = size
self.n_states = size * size
self.n_actions = 4 # 上下左右
self.goal = (size-1, size-1)
# 遷移行列の構築
self.P = np.zeros((self.n_states, self.n_actions, self.n_states))
for s in range(self.n_states):
r, c = s // size, s % size
for a in range(4):
dr, dc = [(-1,0),(1,0),(0,-1),(0,1)][a]
nr, nc = min(max(r+dr, 0), size-1), min(max(c+dc, 0), size-1)
ns = nr * size + nc
self.P[s, a, ns] = 1.0
def state_features(self, s):
"""状態の特徴量(位置ベース)"""
r, c = s // self.size, s % self.size
goal_r, goal_c = self.goal
# 特徴量: ゴールとの距離、壁との距離、位置
dist_goal = abs(r - goal_r) + abs(c - goal_c)
return np.array([
-dist_goal / (2 * self.size), # ゴールへの近さ
float(r == goal_r and c == goal_c), # ゴール到達
-0.1, # ステップペナルティ
])
def value_iteration(env, reward, gamma=0.9, tol=1e-6):
"""価値反復法"""
n_s, n_a = env.n_states, env.n_actions
V = np.zeros(n_s)
for _ in range(1000):
V_new = np.zeros(n_s)
for s in range(n_s):
q_values = []
for a in range(n_a):
q = reward[s] + gamma * np.sum(env.P[s, a] * V)
q_values.append(q)
V_new[s] = max(q_values)
if np.max(np.abs(V_new - V)) < tol:
break
V = V_new
# 方策の抽出(ソフトマックス)
policy = np.zeros((n_s, n_a))
for s in range(n_s):
q_values = np.array([reward[s] + gamma * np.sum(env.P[s, a] * V)
for a in range(n_a)])
exp_q = np.exp(q_values - q_values.max())
policy[s] = exp_q / exp_q.sum()
return V, policy
def compute_feature_expectations(env, trajectories):
"""エキスパートの軌跡から特徴量期待値を計算"""
n_features = env.state_features(0).shape[0]
feat_exp = np.zeros(n_features)
n_steps = 0
for traj in trajectories:
for t, s in enumerate(traj):
feat_exp += (0.9 ** t) * env.state_features(s)
n_steps += 1
return feat_exp / len(trajectories)
def compute_policy_feature_expectations(env, policy, gamma=0.9, n_episodes=100, max_steps=50):
"""方策の特徴量期待値をシミュレーションで推定"""
n_features = env.state_features(0).shape[0]
feat_exp = np.zeros(n_features)
for _ in range(n_episodes):
s = 0 # 始点
for t in range(max_steps):
feat_exp += (gamma ** t) * env.state_features(s)
a = np.random.choice(env.n_actions, p=policy[s])
s_next = np.random.choice(env.n_states, p=env.P[s, a])
s = s_next
return feat_exp / n_episodes
def maxent_irl(env, expert_trajectories, n_features=3, lr=0.1, n_iters=50):
"""最大エントロピーIRL"""
w = np.random.randn(n_features) * 0.01
# エキスパートの特徴量期待値
feat_exp_expert = compute_feature_expectations(env, expert_trajectories)
w_history = [w.copy()]
for iteration in range(n_iters):
# 現在の報酬関数
reward = np.array([w @ env.state_features(s) for s in range(env.n_states)])
# 方策の計算
_, policy = value_iteration(env, reward)
# 方策の特徴量期待値
feat_exp_policy = compute_policy_feature_expectations(env, policy)
# 勾配更新
grad = feat_exp_expert - feat_exp_policy
w += lr * grad
w_history.append(w.copy())
return w, w_history
np.random.seed(42)
# 環境の構築
env = GridWorld(size=5)
# 真の報酬関数
true_reward = np.zeros(env.n_states)
for s in range(env.n_states):
r, c = s // env.size, s % env.size
if r == 4 and c == 4:
true_reward[s] = 10.0 # ゴール
else:
true_reward[s] = -0.1 # ステップペナルティ
# エキスパートの最適方策を計算
_, expert_policy = value_iteration(env, true_reward)
# エキスパートの軌跡を生成
expert_trajectories = []
for _ in range(50):
s = 0
traj = [s]
for t in range(30):
a = np.random.choice(env.n_actions, p=expert_policy[s])
s_next = np.random.choice(env.n_states, p=env.P[s, a])
traj.append(s_next)
s = s_next
if s == 24: # ゴール
break
expert_trajectories.append(traj)
# MaxEnt IRLの実行
w_learned, w_history = maxent_irl(env, expert_trajectories, n_features=3, lr=0.2, n_iters=30)
# 推定された報酬関数
learned_reward = np.array([w_learned @ env.state_features(s) for s in range(env.n_states)])
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
# (a) 真の報酬関数
ax = axes[0]
im = ax.imshow(true_reward.reshape(5, 5), cmap="RdYlGn", origin="lower")
ax.set_title("True Reward Function", fontsize=13)
ax.set_xlabel("Column", fontsize=12)
ax.set_ylabel("Row", fontsize=12)
for i in range(5):
for j in range(5):
ax.text(j, i, f"{true_reward[i*5+j]:.1f}", ha='center', va='center', fontsize=9)
plt.colorbar(im, ax=ax, fraction=0.046)
# (b) 推定された報酬関数
ax = axes[1]
im = ax.imshow(learned_reward.reshape(5, 5), cmap="RdYlGn", origin="lower")
ax.set_title("Learned Reward (MaxEnt IRL)", fontsize=13)
ax.set_xlabel("Column", fontsize=12)
ax.set_ylabel("Row", fontsize=12)
for i in range(5):
for j in range(5):
ax.text(j, i, f"{learned_reward[i*5+j]:.1f}", ha='center', va='center', fontsize=9)
plt.colorbar(im, ax=ax, fraction=0.046)
# (c) 重みの収束
ax = axes[2]
w_hist = np.array(w_history)
for i in range(w_hist.shape[1]):
ax.plot(w_hist[:, i], linewidth=2, label=f"$w_{i+1}$")
ax.set_xlabel("Iteration", fontsize=12)
ax.set_ylabel("Weight Value", fontsize=12)
ax.set_title("Weight Convergence", fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("inverse_rl.png", dpi=150, bbox_inches="tight")
plt.show()
このグラフから、逆強化学習の動作が確認できます。
-
左図(真の報酬関数): 5×5グリッドワールドの真の報酬関数です。右上のゴール(4,4)に高い報酬(10.0)が設定され、他のセルにはステップペナルティ(-0.1)が設定されています
-
中央図(推定された報酬関数): MaxEnt IRLが推定した報酬関数です。真の報酬関数と完全に一致はしませんが、ゴールに向かう方向に報酬が増加するパターンを正しく捉えています。特にゴール付近で高い報酬が推定されている点が重要で、この報酬関数のもとでの最適方策はエキスパートの方策に近いものになります
-
右図(重みの収束): 特徴量の重み $w_1, w_2, w_3$ がイテレーションとともに収束しています。$w_2$(ゴール到達の特徴量)が最も大きな正の値を持ち、$w_1$(ゴールへの近さ)も正の値に収束していることが、推定された報酬関数の構造と整合しています
模倣学習との関係
逆強化学習と模倣学習(Imitation Learning)は関連していますが、異なるアプローチです。
| 特性 | 行動クローニング | 逆強化学習 |
|---|---|---|
| 学習するもの | 方策(状態→行動のマッピング) | 報酬関数 |
| 汎化 | 訓練データの分布外で脆弱 | 新しい環境に汎化しやすい |
| 計算コスト | 低い(教師あり学習) | 高い(RLのサブルーチンが必要) |
| 分布シフト | 問題あり | RL過程で回避される |
行動クローニングは「何をするか」を直接学習するのに対し、逆強化学習は「なぜそうするか」(報酬関数)を学習します。報酬関数は方策より汎化性が高いため、訓練時と異なる初期状態や遷移確率でもエキスパートのような行動を生成できます。
行動クローニングの最大の弱点は分布シフト(distribution shift)の問題です。学習時にはエキスパートの軌跡に沿った状態しか観察しませんが、推論時に少しでもエキスパートの軌跡から外れると(これは小さなエラーの蓄積により必然的に起こります)、未知の状態に遭遇し、誤った行動を取ってしまいます。そしてその誤った行動がさらに未知の状態を生み、エラーが雪だるま式に増大します。これに対して逆強化学習では、推定された報酬関数のもとでRLを実行するため、エージェント自身が生成する状態分布の下で方策が最適化され、分布シフトの問題が自然に回避されます。
DAgger(Dataset Aggregation)はこの分布シフト問題に対処するために、学習者が実際に訪れた状態でエキスパートに再度ラベル付けを依頼するというアプローチを取ります。IRLとDAggerはそれぞれ異なる方法で同じ問題を解決しようとしています。
まとめ
本記事では、逆強化学習の理論と実装について解説しました。
- 逆強化学習は「行動から報酬関数を推定する」問題で、通常の強化学習の逆問題。報酬関数の手動設計の困難さを回避できる
- 問題は不良設定であり、同じ行動を最適にする報酬関数は無数に存在する。正則化や追加の原理(最大エントロピー原理)が必要
- 特徴量マッチングはエキスパートの特徴量期待値と一致する方策を求めるアプローチで、IRLの基礎を築いた
- MaxEnt IRLは最大エントロピー原理に基づき、特徴量マッチングの制約を満たす最もエントロピーの高い分布を選ぶ。ボルツマン分布の形で軌跡の確率をモデル化する
- 推定された報酬関数はエキスパートの特徴量期待値と方策の特徴量期待値を一致させるように学習される
- 深層IRLはニューラルネットワークで報酬関数をパラメータ化し、特徴量の手動設計を不要にする
- GAILはIRLとGANを組み合わせ、報酬関数の明示的推定を省略して大規模な問題にスケールする
- 逆強化学習は模倣学習(行動クローニング)と比べて汎化性が高く、分布シフトに対して頑健
次のステップとして、以下の記事も参考にしてください。
- 方策勾配定理の導出と実装 — 方策最適化の基礎
- 報酬設計の理論と実践 — 報酬関数の手動設計
- 探索と活用のトレードオフ — 強化学習の基本的なジレンマ