PPOアルゴリズム徹底解説: Deep Learning時代の強化学習手法
はじめに
Deep Learningの発展は、画像認識、自然言語処理といった分野に革命をもたらしました。同時に、この強力な技術は、古くから研究されてきた強化学習(Reinforcement Learning: RL)の分野にも大きな進歩をもたらしています。強化学習は、エージェントが環境と相互作用しながら、試行錯誤を通じて最適な行動戦略(方策)を学習する枠組みです。Deep Learningが登場する以前は、複雑な環境での強化学習は困難でしたが、Deep Neural Network(DNN)を関数近似器として用いることで、高次元の状態空間や行動空間を持つ問題にも対応できるようになりました。
Deep Learning時代の強化学習を象徴するアルゴリズムとしては、Deep Q-Network (DQN) や、人間のプロ棋士を凌駕したAlphaGoなどが挙げられます。これらの成功を受けて、強化学習の研究は急速に加速し、様々な新しい手法が提案されています。本記事で解説するPPO(Proximal Policy Optimization)アルゴリズムも、そうした「Deep RL」の代表的な手法の一つです。
強化学習アルゴリズムは、大別して「価値ベース(Value-based)」と「方策ベース(Policy-based)」、そしてその両者を組み合わせた「アクタークリティック(Actor-Critic)」手法に分けられます。DQNは価値ベースの手法であり、最適な行動価値関数を学習することを目指します。一方、方策ベースの手法は、行動を選択する「方策」自体を直接学習します。方策ベースの手法は、連続的な行動空間を持つ問題にも適用しやすいという利点がありますが、学習の安定性や効率性に課題がありました。
PPOは、この方策ベース、特にアクタークリティック手法の課題を克服するために提案された、非常に効果的で広く使われているアルゴリズムです。その最大の特長は、学習の「安定性」と「効率性」の両立に成功している点にあります。本記事では、PPOがどのようにしてこれらの目標を達成しているのか、その理論的な背景、具体的なアルゴリズム、実装上の詳細、そして利点と欠点について、詳細かつ徹底的に解説していきます。
Policy Gradient法の基本原理
PPOはPolicy Gradient法を改良したアルゴリズムであるため、まずはPolicy Gradient法の基本から理解することが重要です。
Policy Gradient法では、エージェントは現在の状態$s$において、ある行動$a$を選択する確率を与える「方策(Policy)」$\pi(a|s; \theta)$を学習します。ここで、$\theta$は方策を決定するパラメータです(例えば、DNNの重みやバイアス)。学習の目的は、エージェントが獲得するであろう累積報酬の期待値を最大化するようなパラメータ$\theta$を見つけることです。この目的関数を$J(\theta)$とします。
強化学習における目的関数$J(\theta)$は、典型的には以下のように定義されます。
* エピソードの開始状態からの累積報酬の期待値:$J(\theta) = E_{\tau \sim p_\theta(\tau)} [R(\tau)]$
* $\tau$は状態と行動の系列(エピソード)$(s_0, a_0, r_0, s_1, a_1, r_1, \dots)$を表します。
* $p_\theta(\tau)$は方策$\pi_\theta$に従ってエージェントが行動した場合に、そのエピソードが発生する確率分布です。
* $R(\tau)$はそのエピソードで得られる総報酬(割引報酬和)です。
この$J(\theta)$を最大化するためには、パラメータ$\theta$を勾配の方向に更新する必要があります。勾配$\nabla_\theta J(\theta)$を計算するための重要な結果が「Policy Gradient Theorem」です。この定理は、複雑な期待値の勾配を比較的簡単な形で表現できることを示しています。Policy Gradient Theoremの基本的な形は以下のようになります。
$\nabla_\theta J(\theta) = E_{s \sim \rho_\pi, a \sim \pi_\theta(\cdot|s)} [\nabla_\theta \log \pi(a|s; \theta) A(s, a)]$
ここで、
* $E_{s \sim \rho_\pi, a \sim \pi_\theta(\cdot|s)}$は、方策$\pi_\theta$に従った場合の定常状態分布$\rho_\pi$における状態$s$と、その状態$s$で方策$\pi_\theta$に従って選択された行動$a$に関する期待値を表します。
* $\nabla_\theta \log \pi(a|s; \theta)$は、対数方策の勾配であり、「スコア関数(Score Function)」と呼ばれます。これは、選択した行動$a$の確率をパラメータ$\theta$に関してどれだけ変化させればよいかを示唆します。
* $A(s, a)$は、状態$s$で行動$a$を選択したことによる「Advantage(利益)」です。これは、その行動が状態$s$における平均的な行動よりもどれだけ良かったか(または悪かったか)を示します。典型的な定義は、$A(s, a) = Q(s, a) – V(s)$です。ここで、$Q(s, a)$は行動価値関数(状態$s$で行動$a$をとった後に方策に従った場合の期待累積報酬)、$V(s)$は状態価値関数(状態$s$から方策に従った場合の期待累積報酬)です。
この勾配式が示唆するところは、ある状態$s$で選択した行動$a$がもし良かった($A(s, a) > 0$)ならば、その行動を選択する確率$\pi(a|s; \theta)$を高める方向にパラメータ$\theta$を更新し($\nabla_\theta \log \pi(a|s; \theta)$の方向に更新)、もし悪かった($A(s, a) < 0$)ならば、その行動を選択する確率を下げる方向に更新するということです。
Policy Gradient法のアルゴリズムの骨子は以下のようになります。
1. 方策パラメータ$\theta$と、必要であれば価値関数パラメータ(Critic用)を初期化する。
2. 現在のパラメータ$\theta$を持つ方策に従って、環境との相互作用を通じて経験データ(状態、行動、報酬、次の状態など)を収集する。これを複数回繰り返してバッチデータとする。
3. 収集した経験データを用いて、各時点におけるAdvantage値$A(s, a)$を推定する。
4. Policy Gradient Theoremに基づき、勾配$\nabla_\theta J(\theta)$を計算する。実際には、収集した経験データの平均として勾配を近似する。
$\nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \nabla_\theta \log \pi(a_i|s_i; \theta) A(s_i, a_i)$
5. 計算した勾配を用いて、パラメータ$\theta$を更新する。
$\theta \leftarrow \theta + \alpha \nabla_\theta J(\theta)$
ここで$\alpha$は学習率です。
6. ステップ2に戻り、学習を繰り返す。
Policy Gradient法のメリットは、方策を直接学習するため、連続行動空間の問題に自然に対応できること、また確率的な方策を学習できるため、探索が行いやすいという点です。
しかし、Policy Gradient法にはいくつかの大きな課題がありました。
* 学習の不安定性: 勾配の推定値に大きな分散があるため、学習が不安定になりやすい。特にAdvantageの推定精度が低い場合や、学習率$\alpha$の選択が難しい。小さなステップでさえ、方策が大きく変わってしまい、性能が急激に悪化することがある。
* サンプル効率の悪さ: 上記の基本的なPolicy Gradient法は「オンポリシー」手法です。つまり、方策の更新に用いるデータは、現在の方策で収集されたものである必要があります。パラメータ$\theta$を更新すると、その古い方策で収集したデータは「古いデータ」となり、勾配計算に使うには適さなくなります。そのため、パラメータを少し更新するたびに、環境から新しいデータを収集し直す必要があり、サンプル効率が非常に悪くなります。
Actor-Critic法によるPolicy Gradient法の改善
Policy Gradient法の学習の不安定性を改善するために提案されたのが、Actor-Critic(アクタークリティック)法です。Actor-Critic法は、Policy Gradient法と価値ベースの手法を組み合わせたものです。
- Actor(アクター): 方策$\pi(a|s; \theta)$を学習する部分です。状態$s$が与えられたときに、どの行動$a$を選択すべきかを決定します。Policy Gradient法における方策の役割を担います。
- Critic(クリティック): 価値関数(状態価値関数$V(s; \phi)$または行動価値関数$Q(s, a; \phi)$)を学習する部分です。方策に従った場合の、現在の状態や状態-行動ペアの価値を評価します。Advantage関数の推定に利用されます。
Actor-Critic法におけるPolicy Gradient Theoremに基づくActorの更新式は、Advantage関数$A(s, a)$を用いる点でPolicy Gradient法と同じです。
$\nabla_\theta J(\theta) \approx E[\nabla_\theta \log \pi(a|s; \theta) A(s, a)]$
Advantage関数$A(s, a)$は、Criticが学習した価値関数を用いて推定します。最も一般的なのは、$A(s, a) = r + \gamma V(s’) – V(s)$という、TD誤差に基づいた推定です。
* $r$は状態$s$で行動$a$をとった直後に得られる報酬です。
* $s’$は行動$a$をとった後の次の状態です。
* $\gamma$は割引率です。
* $V(s’)$と$V(s)$は、Criticが学習した状態価値関数です。
Criticは、収集した経験データを用いて、価値関数の推定値を真の値に近づけるように学習します。例えば、状態価値関数$V(s; \phi)$を学習する場合、TD学習を用いて$(V(s; \phi) – (r + \gamma V(s’; \phi)))^2$のようなTD誤差の二乗を最小化するようにパラメータ$\phi$を更新します。
Actor-Critic法のメリットは、CriticがAdvantage関数を推定することで、Policy Gradient法の勾配推定における分散を低減し、学習を安定させることができる点です。Advantage関数は、総報酬のような長期的な結果ではなく、より局所的な情報(TD誤差など)に基づいて計算されるため、分散が小さくなります。
しかし、Actor-Critic法もまだ課題を抱えていました。特に、 Criticの学習が不安定だと、Actorの学習も不安定になってしまうこと、そしてPolicy Gradient法の根本的な課題である「大きなパラメータ更新による方策の急激な変化」や「オンポリシー学習によるサンプル効率の悪さ」は依然として残っていました。特に、Advantage関数の推定に古いデータを使用すると、方策が大きく変化した場合に推定値が不正確になり、学習が破綻する可能性がありました。
PPO: 近い方策最適化 (Proximal Policy Optimization)
PPOは、これらの課題、特に「方策の急激な変化による不安定性」と「オンポリシー学習のサンプル効率の悪さ」を改善するために提案されました。PPOの基本的なアイデアは非常にシンプルかつ強力です。それは、「現在の(古い)方策から大きく逸脱しない範囲で、新しい方策を更新する」というものです。これにより、学習の安定性を保ちつつ、収集したデータを複数回利用することが可能となり、サンプル効率を向上させます。
PPOは、Policy Gradient法の目的関数を修正することでこれを実現します。修正された目的関数は、新しい方策と古い方策の比率(重要度サンプリング比率)を利用し、この比率が極端に大きくならないように制約を加えます。
重要度サンプリング (Importance Sampling) の導入
Policy Gradient法では、勾配計算の期待値$E_{s \sim \rho_{\pi_{old}}, a \sim \pi_{old}(\cdot|s)} [\dots]$は、現在の方策(古い方策$\pi_{old}$)に従って収集された経験データに基づいています。オンポリシー学習では、方策を更新するたびに新しいデータが必要です。
一方、オフポリシー学習では、ターゲット方策(学習したい方策)とは異なる行動方策で収集されたデータを用いて学習を行います。Policy Gradient法をオフポリシーで行うためには、重要度サンプリングというテクニックを利用します。
重要度サンプリングでは、ある確率分布$p(x)$に関する期待値$E_{x \sim p}[f(x)]$を、別の確率分布$q(x)$からサンプリングしたデータ${x_i}$を用いて近似します。
$E_{x \sim p}[f(x)] = \int p(x) f(x) dx = \int \frac{p(x)}{q(x)} q(x) f(x) dx = E_{x \sim q} [\frac{p(x)}{q(x)} f(x)]$
ここで、$\frac{p(x)}{q(x)}$は重要度比率と呼ばれます。
Policy Gradient法に応用すると、古い方策$\pi_{old}$で収集したデータ${s_t, a_t}$を用いて、新しい方策$\pi_\theta$に関する期待値を計算できます。
$E_{s \sim \rho_{\pi_\theta}, a \sim \pi_\theta(\cdot|s)} [\nabla_\theta \log \pi_\theta(a|s) A(s, a)]$
これは複雑なので、通常は状態分布を古い方策のもの$\rho_{\pi_{old}}$で近似します。
$E_{s \sim \rho_{\pi_{old}}, a \sim \pi_\theta(\cdot|s)} [\nabla_\theta \log \pi_\theta(a|s) A(s, a)]$
この期待値を、古い方策$\pi_{old}$に従って収集したデータを用いて近似します。期待値の定義は、方策$\pi_\theta$に従って行動$a$が選択される確率$ \pi_\theta(a|s)$を用いています。これを古い方策$\pi_{old}(a|s)$でサンプリングしたデータから計算するために、重要度サンプリング比率$\rho_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{old}(a_t|s_t)}$を導入します。
Policy Gradient法の目的関数(総報酬の期待値)を重要度サンプリングで書き換えると、以下のようになります。
$J(\theta) = E_{s_t \sim \rho_{\pi_{old}}, a_t \sim \pi_{old}} [ \frac{\pi_\theta(a_t|s_t)}{\pi_{old}(a_t|s_t)} A_{t, old} ] = E_{s_t \sim \rho_{\pi_{old}}, a_t \sim \pi_{old}} [ \rho_t(\theta) A_{t, old} ]$
ここで、$A_{t, old}$は古い方策で収集したデータから推定されたAdvantage値です。
この目的関数$L^{PG}(\theta) = E[\rho_t(\theta) A_{t, old}]$を最大化する方向にパラメータ$\theta$を更新すれば良いように見えます。しかし、このままでは問題があります。重要度比率$\rho_t(\theta)$は、新しい方策$\pi_\theta$が古い方策$\pi_{old}$から大きく外れると、非常に大きな値や非常に小さな値(ゼロに近い値)をとる可能性があります。重要度比率の大きな変動は、勾配の推定における分散を再び増大させ、学習を不安定にしてしまいます。Policy Gradient法の不安定性は、結局この重要度サンプリングによってもたらされる分散によって再び顕在化してしまうのです。
PPOの核心:目的関数のクリッピングまたは罰則項
PPOの核心は、この重要度比率$\rho_t(\theta)$が極端な値をとることを防ぎ、新しい方策$\pi_\theta$が古い方策$\pi_{old}$から急激に離れることを抑制する仕組みにあります。PPO論文では主に2つのバージョンが提案されていますが、最も一般的に使用されているのは「Clip」バージョンです。
PPO Clipバージョン
PPO Clipバージョンでは、目的関数にクリッピング関数を導入します。目的関数$L^{CLIP}(\theta)$は以下のように定義されます。
$L^{CLIP}(\theta) = E_{s_t \sim \rho_{\pi_{old}}, a_t \sim \pi_{old}} [\min(\rho_t(\theta) A_{t, old}, \text{clip}(\rho_t(\theta), 1-\epsilon, 1+\epsilon) A_{t, old})]$
ここで、
* $\rho_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{old}(a_t|s_t)}$は重要度比率です。
* $A_{t, old}$は古い方策で収集したデータから推定されたAdvantage値です。
* $\epsilon$(イプシロン)は小さなハイパーパラメータであり、方策が古い方策から許容される最大の「逸脱度」を定義します。例えば$\epsilon=0.1$など。
* $\text{clip}(x, l, h)$は、値$x$を区間$[l, h]$内にクリッピングする関数です。つまり、$\text{clip}(x, l, h) = \max(l, \min(x, h))$です。
目的関数$L^{CLIP}(\theta)$は、元の重要度サンプリング目的関数$\rho_t(\theta) A_{t, old}$と、重要度比率$\rho_t(\theta)$を$[1-\epsilon, 1+\epsilon]$の範囲にクリッピングしたバージョン$\text{clip}(\rho_t(\theta), 1-\epsilon, 1+\epsilon) A_{t, old}$のうち、小さい方を選択します。
この「小さい方を選択する」という操作が、方策の急激な変化を抑制する鍵となります。
* Advantage $A_{t, old} > 0$の場合(行動が期待より良かった): 方策更新は、選択した行動$a_t$の確率を増やしたい方向に向かいます($\rho_t(\theta)$を大きくしたい)。しかし、$\rho_t(\theta)$が$1+\epsilon$を超えると、目的関数の値は$\text{clip}(\rho_t(\theta), 1-\epsilon, 1+\epsilon) A_{t, old} = (1+\epsilon) A_{t, old}$で頭打ちになります。これは、たとえ$\rho_t(\theta)$が$1+\epsilon$を超えて非常に大きくなっても、目的関数の増加は$1+\epsilon$でクリップされることを意味します。つまり、方策が古い方策から$1+\epsilon$を超えて大きく離れて、かつそれが有利な行動の確率を過度に増加させる方向であっても、その超過分は目的関数の勾配に反映されません。これにより、有利な行動の確率が急激に増えすぎることを防ぎます。
* Advantage $A_{t, old} < 0$の場合(行動が期待より悪かった): 方策更新は、選択した行動$a_t$の確率を減らしたい方向に向かいます($\rho_t(\theta)$を小さくしたい)。このとき、$A_{t, old}$が負なので、目的関数$\rho_t(\theta) A_{t, old}$を最大化することは、$\rho_t(\theta)$を小さくすることと同じです。しかし、$\rho_t(\theta)$が$1-\epsilon$を下回ると、目的関数の値は$\text{clip}(\rho_t(\theta), 1-\epsilon, 1+\epsilon) A_{t, old} = (1-\epsilon) A_{t, old}$($A_{t, old}$が負なので、より絶対値が小さい負の数)で頭打ちになります。これは、たとえ$\rho_t(\theta)$が$1-\epsilon$を下回って非常に小さくなっても、目的関数の増加(つまり、$A_{t, old}$が負なので減少幅の縮小)は$1-\epsilon$でクリップされることを意味します。つまり、方策が古い方策から$1-\epsilon$を下回って大きく離れて、かつそれが不利な行動の確率を過度に減少させる方向であっても、その超過分は目的関数の勾配に反映されません。これにより、不利な行動の確率が急激に減りすぎることを防ぎます。
このように、PPO Clip目的関数は、重要度比率$\rho_t(\theta)$が$[1-\epsilon, 1+\epsilon]$の範囲外に出た場合に、その影響をクリップすることで、方策の更新幅を制御します。これにより、方策が古い方策から急激に逸脱することを防ぎ、学習の安定性を大幅に向上させます。
PPO Adaptive KL Penaltyバージョン (PPO2)
PPO論文で提案されたもう一つのバージョンは、重要度サンプリングを用いた目的関数に、新しい方策と古い方策の間のKLダイバージェンス(Kullback-Leibler Divergence)による罰則項を加えるものです。
$L^{KL}(θ) = E_{s_t \sim \rho_{\pi_{old}}, a_t \sim \pi_{old}} [\rho_t(\theta) A_{t, old} – \beta D_{KL}(\pi_{old}(\cdot|s_t) || \pi_\theta(\cdot|s_t))]$
ここで、$D_{KL}(\pi_{old}(\cdot|s_t) || \pi_\theta(\cdot|s_t))$は、状態$s_t$における古い方策$\pi_{old}$と新しい方策$\pi_\theta$の間のKLダイバージェンスです。KLダイバージェンスは、2つの確率分布の間の「距離」や「違い」を表す指標であり、値が大きいほど2つの分布は異なっています。
目的関数を最大化する際に、$\rho_t(\theta) A_{t, old}$を増加させようとすると、方策$\pi_\theta$が変化し、KLダイバージェンス$D_{KL}$が増加します。罰則項$-\beta D_{KL}$は、KLダイバージェンスの増加に対してペナルティを与え、方策の急激な変化を抑制します。ハイパーパラメータ$\beta$は、KLダイバージェンスに対するペナルティの強さを制御します。
さらに、このバージョンでは、学習中にKLダイバージェンスが目標値(例:1.5や2.0など)から大きく外れないように、$\beta$の値を動的に調整する仕組みが導入されることがあります。例えば、あるイテレーションでの平均KLダイバージェンスが目標値より大きい場合はβを増加させ、目標値より小さい場合はβを減少させます。これにより、KLダイバージェンスを一定の範囲に保ちつつ学習を進めます。
KLバージョンは、TRPO(Trust Region Policy Optimization)という先行研究のアイデアに基づいています。TRPOは、方策更新の際にKLダイバージェンスが一定の閾値を超えないというハード制約を課す手法ですが、制約付き最適化問題を解く必要があり計算コストが高いという欠点がありました。PPOのKLバージョンは、KL制約を罰則項として目的関数に組み込むことで、TRPOのアイデアをよりシンプルに実装したものです。
OpenAIが発表したPPO論文では、ClipバージョンとKLバージョンが比較され、Clipバージョンの方が実装が簡単で、多くのタスクで同等または優れた性能を発揮することが示されています。そのため、現在PPOと言う場合は、通常Clipバージョンを指すことが多いです。
PPOの実装の詳細
実際のPPOの実装は、Actor-Criticフレームワークの中で行われます。典型的には、方策(Actor)と価値関数(Critic)はDeep Neural Network(DNN)によって近似されます。これらのネットワークは、状態を入力として受け取り、Actorネットワークは行動の確率分布(離散行動空間の場合)または行動の値(連続行動空間の場合)を出力し、Criticネットワークは状態の価値$V(s)$を出力します。ActorとCriticはパラメータを共有する場合と、完全に分かれている場合があります。パラメータを共有する場合、ネットワークの本体部分は共通で、出力層だけが方策用と価値関数用に分かれます。
PPOの学習プロセスは、以下のようなループで構成されます。
- 経験の収集: 現在の(古い)方策$\pi_{old}$に従って、環境との相互作用を行います。典型的には、複数の環境を並列に実行し、一定量のステップ(例:Tタイムステップ)またはエピソード分の経験データ(状態$s_t$, 行動$a_t$, 報酬$r_t$, 次の状態$s_{t+1}$, 終端フラグ$done_t$)を収集します。収集されたデータはメモリに保存されます。
- Advantageと価値ターゲットの計算: 収集した経験データを用いて、各時点$t$におけるAdvantage値$A_t$と、Criticの学習ターゲットとなる価値ターゲット$V_{target,t}$を計算します。Advantageの計算には、Generalized Advantage Estimation (GAE) という手法を用いるのが一般的です。GAEは、TD(λ)法に基づいたAdvantage推定法であり、バイアス(TD誤差)と分散(モンテカルロ推定)のトレードオフをパラメータλによって調整できます。
- TD誤差: $\delta_t = r_t + \gamma V(s_{t+1}; \phi_{old}) – V(s_t; \phi_{old})$
- GAE(γ, λ): $A_t = \sum_{l=0}^{T-t-1} (\gamma \lambda)^l \delta_{t+l}$ (エピソード終端やタイムリミットで考慮が必要)
- 価値ターゲット: $V_{target, t} = A_t + V(s_t; \phi_{old})$ (Advantageの定義から $A_t = Q_t – V_t$ なので、$Q_t = A_t + V_t$ に対応)
ここで、$V(s; \phi_{old})$は、経験収集を開始した時点のCriticネットワークのパラメータ$\phi_{old}$によって推定された価値関数です。
- パラメータの更新: 収集した経験データ(状態$s_t$, 行動$a_t$, および計算されたAdvantage $A_t$, 価値ターゲット$V_{target, t}$)を用いて、ActorとCriticのパラメータを更新します。PPOでは、収集した一連のデータを、複数回(Kエポック)にわたってミニバッチ学習に利用します。これにより、オンポリシーでありながらサンプル効率を向上させています。
- 損失関数: PPOの学習における全体の損失関数$L(\theta, \phi)$は、通常、方策損失、価値関数損失、およびエントロピーボーナスの合計として定義されます。
$L(\theta, \phi) = L^{CLIP}(\theta) – c_1 L^{VF}(\phi) + c_2 S(\theta)$- $L^{CLIP}(\theta)$: 上記で説明したPPOクリップ目的関数です。これは最大化したい項なので、損失関数に含める場合は負の符号を付けます($-L^{CLIP}(\theta)$)。
- $L^{VF}(\phi)$: Criticの価値関数損失です。通常は、推定された価値$V(s_t; \phi)$と価値ターゲット$V_{target, t}$との間の二乗誤差です。$L^{VF}(\phi) = (V(s_t; \phi) – V_{target, t})^2$。これは最小化したい項です。$c_1$は価値損失の重み係数です。
- $S(\theta)$: 方策のエントロピーです。$S(\theta) = E_{a \sim \pi_\theta(\cdot|s_t)} [-\log \pi_\theta(a|s_t)]$。エントロピーを最大化することで、方策のランダム性を維持し、局所最適解に陥ることを防ぎ、探索を促進します。これは最大化したい項なので、損失関数に含める場合は負の符号を付けます($-c_2 S(\theta)$)。$c_2$はエントロピーボーナスの重み係数です。
- 最適化: 上記の損失関数$L(\theta, \phi)$を、勾配降下法(例:Adam optimizer)を用いて最小化することで、パラメータ$\theta$(Actor)と$\phi$(Critic)を同時に更新します。この際、Actorのパラメータは$L^{CLIP}$と$S$に関わる部分の勾配、Criticのパラメータは$L^{VF}$に関わる部分の勾配を用います。共有パラメータがある場合は、両方の勾配を合計して更新します。
- 損失関数: PPOの学習における全体の損失関数$L(\theta, \phi)$は、通常、方策損失、価値関数損失、およびエントロピーボーナスの合計として定義されます。
- 古い方策の更新: パラメータ更新が終わったら、現在の方策を新しいパラメータ$\theta$で定義される方策に置き換えます。次の経験収集イテレーションでは、この新しい方策が「古い方策」$\pi_{old}$として扱われます。
- ステップ1に戻り、学習を繰り返す。
この学習プロセスにおいて、PPOが収集した経験データを複数回再利用できるのは、PPO目的関数が方策の急激な変化を抑制しているためです。方策が大きく変わらなければ、古いデータから計算されたAdvantage値も比較的正確であると期待でき、データの再利用が可能になります。これは、Pure Policy Gradient法や、データの再利用に厳しい制約があるTRPOと比較して、サンプル効率の大幅な向上につながります。
GAE (Generalized Advantage Estimation) の詳細
GAEはPPOだけでなく、A2C/A3Cなど他のActor-Critic手法でも広く利用されるAdvantage推定法です。Advantage $A_t$は、$Q(s_t, a_t) – V(s_t)$を推定したい量です。
* モンテカルロ推定: 最も簡単なAdvantage推定は、エピソード終了まで待って総報酬$R_t = \sum_{k=t}^T \gamma^{k-t} r_k$を計算し、$A_t = R_t – V(s_t; \phi_{old})$とする方法です。これは不偏推定ですが、分散が大きくなりやすいです。
* TD(0)推定: TD誤差$\delta_t = r_t + \gamma V(s_{t+1}; \phi_{old}) – V(s_t; \phi_{old})$をAdvantageの推定値とする方法です。$A_t = \delta_t$。これはバイアスを持つ推定ですが、分散が小さくなります。
* TD(λ)推定: TD(0)とモンテカルロ推定の中間を取る推定法です。λパラメータ(0から1の間の値)によって、どの程度先の報酬まで考慮するかを調整します。λが0に近いほどTD(0)に近く、1に近いほどモンテカルロ推定に近くなります。GAEは、このTD(λ)の考え方をAdvantage推定に応用したものです。
GAEの式 $A_t = \sum_{l=0}^{T-t-1} (\gamma \lambda)^l \delta_{t+l}$ は、時点$t$以降のTD誤差を指数関数的に減衰させながら合計しています。λ=0の場合、Advantageは$\delta_t$となりTD(0)推定に一致します。λ=1の場合、Advantageはモンテカルロ推定に近くなります(厳密には少し異なります)。GAEを用いることで、学習の安定性と効率性のバランスを調整できます。PPOの実装では、通常、割引率$\gamma$とGAEパラメータ$\lambda$の両方を設定します。
PPOの利点
PPOアルゴリズムがDeep Learning時代の強化学習で広く採用されているのは、その優れた特性によるものです。
- 安定性: PPOの最も重要な利点です。PPO ClipやPPO KLのような目的関数を用いることで、方策が古い方策から急激に変化することを効果的に抑制します。これにより、Policy Gradient法や従来のActor-Critic法で問題となりやすかった学習の不安定さが大幅に改善されます。学習曲線がスムーズになり、ハイパーパラメータの調整も比較的容易になります。
- サンプル効率: オンポリシーアルゴリズムでありながら、収集した経験データを複数回利用してパラメータを更新できるため、従来のオンポリシー手法(例:A2C)に比べてサンプル効率が良いです。オフポリシー手法(例:DQN、SAC、TD3)ほどではないにしても、実用上十分な効率を発揮します。
- 実装の容易さ: PPO Clipバージョンは、その目的関数が比較的シンプルであり、標準的なDeep Learningフレームワーク(TensorFlow, PyTorchなど)で容易に実装できます。複雑な制約付き最適化や、複数のActor・Criticネットワークを管理する必要がある他の手法と比較して、実装の手間が少ないことも普及の要因となっています。
- 汎用性: 離散行動空間と連続行動空間のどちらにも容易に対応できます。様々な種類の環境やタスクに適用可能であるため、汎用的な強化学習アルゴリズムとして非常に優れています。
- 高性能: 多くのベンチマークタスク(Atariゲーム、MuJoCoなどの物理シミュレーションタスクなど)で、State-of-the-Artまたはそれに近い性能を安定して達成しています。
これらの利点から、PPOは研究分野だけでなく、ロボティクス、ゲーム開発、産業用制御など、様々な実応用分野で広く利用されています。
PPOの欠点と課題
PPOは多くの利点を持つ一方で、いくつかの欠点や課題も存在します。
- サンプル効率の限界: 他の優れたオフポリシー手法(例:SAC, TD3)と比較すると、サンプル効率が劣る場合があります。特に、環境との相互作用が高コストであるような実環境での応用においては、より少ない経験データで学習できるオフポリシー手法が有利な場合があります。PPOは古いデータを再利用しますが、その再利用は方策の逸脱度によって制限されるため、無限に古いデータを使えるわけではありません。
- ハイパーパラメータの調整: PPOは比較的ハイパーパラメータの調整が容易と言われますが、それでも適切な性能を引き出すためには、いくつかの重要なハイパーパラメータ(ε、GAEのλ、損失項の係数c1, c2、バッチサイズ、エポック数、学習率など)をタスクに合わせてチューニングする必要があります。
- 理論的保証: TRPOのような信頼領域に基づいた手法は、理論的な性能保証(単調改善など)がある程度存在しますが、PPO(特にClipバージョン)はそのような厳密な理論的保証を持っていません。ただし、実用上は非常にうまく機能することが経験的に示されています。
- 探索の課題: PPOはエントロピーボーナスを加えて探索を促しますが、Sparse Reward環境(報酬がほとんど得られない環境)や、長期的な依存関係がある環境での効果的な探索は、他の多くの強化学習アルゴリズムと同様に依然として難しい課題です。
PPOのハイパーパラメータチューニング
PPOの性能は、適切なハイパーパラメータ設定に大きく依存します。主要なハイパーパラメータとその役割、チューニングの一般的な指針を以下に示します。
- 学習率 (Learning Rate): ActorおよびCriticネットワークのパラメータ更新のステップサイズを決定します。大きすぎると学習が不安定になり発散しやすく、小さすぎると学習が遅くなります。通常、Adamオプティマイザを使用し、タスクに合わせて0.001〜0.0001程度の値を試します。線形に減衰させるスケジュールを用いることもあります。
- 割引率 (Discount Factor) γ: 将来の報酬を現在どれだけ重要視するかを決定します。1に近いほど長期的な報酬を重視します。タスクの特性(エピソードの長さ、遅延報酬の重要性など)に応じて0.9〜0.999程度の値を設定します。
- GAEパラメータ λ: Advantage推定におけるバイアス-分散のトレードオフを調整します。λ=0はTD(0)に近く分散が小さいがバイアスが大きい、λ=1はモンテカルロ推定に近く不偏だが分散が大きい。通常、0.9〜0.99の値を試します。
- PPOクリップパラメータ ε: 方策の逸脱度の許容範囲を決定します。小さすぎると方策の更新が進まず学習が遅くなり、大きすぎると学習が不安定になります。0.1〜0.3程度の値が一般的です。
- 価値関数損失係数 c1: 総合損失における価値関数損失の重みです。ActorとCriticの学習バランスを調整します。通常0.5〜1.0程度の値を設定します。
- エントロピー係数 c2: 総合損失におけるエントロピーボーナスの重みです。方策のランダム性(探索)を調整します。大きいほど探索的になります。学習の進行とともに値を減衰させるスケジュールを用いることもあります。初期には0.01〜0.001程度の値を設定することが多いです。
- バッチサイズ (Batch Size): 経験収集イテレーションごとに収集するデータの総ステップ数です。このデータを複数のミニバッチに分割して複数回学習します。バッチサイズが大きいほど勾配推定の分散は小さくなりますが、必要なメモリも増加します。数百から数千ステップ程度が一般的です。
- エポック数 (Number of Epochs): 収集した経験データを何回繰り返して学習に利用するかです。多いほどデータ効率は上がりますが、方策が古くなりすぎることによる不安定化のリスクも高まります。通常、3〜10回程度のエポックを行います。
- ミニバッチサイズ (Minibatch Size): パラメータ更新の1ステップに用いるデータのサイズです。大きいほど勾配推定のノイズは減りますが、メモリが必要になります。収集したバッチサイズを適切に分割したサイズを設定します。
これらのハイパーパラメータは相互に関連しているため、タスクや環境に合わせて実験的に調整することが重要です。ベースとなる実装や論文で提案されているデフォルト値から始めて、徐々に調整していくのが一般的なアプローチです。
PPOの応用事例
PPOは、その安定性と汎用性の高さから、様々な分野で成功を収めています。
- ロボティクス: 複雑なマニピュレーション、歩行、移動など、高次元の連続行動空間を持つロボット制御タスクにPPOはよく適用されます。シミュレーション環境でPPOを用いて方策を学習し、実機に転移する研究も盛んに行われています。
- ゲーム: OpenAIの巨大なゲームAIであるOpenAI Five(Dota 2)やAlphaStar(StarCraft II)は、PPOやその派生形を大規模に用いて学習されました。これらの事例は、PPOのスケーラビリティと複雑な戦略学習能力を示しています。
- 自動運転: 車両制御、経路計画、交通シミュレーションなど、自動運転に関連する様々なタスクにおいて、PPOは有望な手法として研究されています。
- 金融取引: 複雑な市場環境における最適な取引戦略の学習に応用されることもあります。
- その他の制御タスク: プロセス制御、エネルギー管理、推薦システムなど、決定を下すエージェントが環境と相互作用する様々な制御問題にPPOは適用可能です。
PPOと他の手法との比較
強化学習にはPPO以外にも多数のアルゴリズムが存在します。PPOをより深く理解するために、代表的な手法との比較を行います。
- DQN (Deep Q-Network): 価値ベース、オフポリシー、離散行動空間に限定。DQNは価値関数$Q(s, a)$を学習し、それに基づいて行動を選択(通常は$\arg\max_a Q(s, a)$)。PPOは方策$\pi(a|s)$を直接学習。DQNは離散行動空間で高い性能を発揮したが、連続行動空間には直接拡張できない。オフポリシーなのでサンプル効率は良いが、価値関数の過大評価や学習の不安定性が課題となることがある。
- A2C/A3C (Advantage Actor-Critic / Asynchronous Advantage Actor-Critic): Actor-Critic法、オンポリシー。PPOの先行研究・関連手法。A2Cは同期的なバッチ学習、A3Cは非同期的な学習を行う。PPOはA2C/A3CのPolicy Gradient更新にPPO目的関数を適用し、方策の急激な変化を抑制することで安定性を向上させたもの。A3Cは実装が複雑になる傾向がある。
- TRPO (Trust Region Policy Optimization): Policy Gradient法、オンポリシー、信頼領域ベース。TRPOは、方策更新の際に古い方策からのKLダイバージェンスが一定の閾値を超えないという制約を厳密に満たそうとする。理論的な保証(単調改善)があるが、二次計画問題を解く必要があり計算コストが高い。PPOはTRPOのアイデアを近似し、よりシンプルかつスケーラブルにしたもの(KLバージョンは罰則項、Clipバージョンはクリッピング)。PPOはTRPOに比べて実装が容易で計算効率が良い。
- SAC (Soft Actor-Critic) / TD3 (Twin Delayed Deep Deterministic policy gradient): 最新のオフポリシーActor-Critic手法。特にSACはエントロピー最大化を取り入れている。サンプル効率が非常に高い傾向がある。PPOと比較して、実装がやや複雑になることが多い。SACは連続行動空間で優れた性能を示す。
PPOは、TRPOの安定性に関するアイデアを、A2C/A3CのようなActor-Criticフレームワークに取り入れ、かつ経験データのリプレイ(複数エポック学習)を可能にすることで、安定性とサンプル効率のバランスをうまくとったアルゴリズムと言えます。特に実装の容易さと安定した性能から、現在のDeep RLにおけるデファクトスタンダードの一つとして広く採用されています。
まとめと将来展望
PPO(Proximal Policy Optimization)アルゴリズムは、Deep Learning時代の強化学習において最も広く利用され、成功を収めている手法の一つです。Policy Gradient法やActor-Critic法の学習の不安定性やサンプル効率の悪さといった課題に対し、「現在の(古い)方策から大きく逸脱しない範囲で方策を更新する」というシンプルながら強力なアイデアで対処しました。
PPO Clipバージョンは、重要度サンプリング比率をクリッピングすることで方策更新のステップサイズを効果的に制御し、学習の安定性を大幅に向上させました。同時に、収集した経験データを複数回再利用できるため、オンポリシー手法でありながら優れたサンプル効率を発揮します。これらの特性に加えて、比較的容易な実装と汎用性の高さが、PPOが多くのタスクで高い性能を安定して達成し、Deep RL研究および応用分野における主要なアルゴリズムとなる要因となりました。
もちろん、強化学習の研究は日々進歩しており、PPOにも改善の余地はあります。特に、さらなるサンプル効率の向上、Sparse Reward環境や非常に長いエピソードを持つタスクへの対応、理論的な理解の深化などが今後の課題として挙げられます。また、PPOを他の手法(例:探索戦略の改善、モデルベースRLとの組み合わせ)と組み合わせることで、さらに強力なアルゴリズムが生まれる可能性もあります。
しかし、現時点において、PPOは安定した高性能を発揮する、実装しやすく、汎用性の高い強化学習アルゴリズムの代表格であり続けています。強化学習の研究や応用に取り組む上で、PPOの理解は不可欠と言えるでしょう。
本記事が、PPOアルゴリズムの詳細な仕組みとその重要性についての理解を深める一助となれば幸いです。