【徹底解説】PPOアルゴリズム:理論と仕組み
はじめに
強化学習は、エージェントが環境と相互作用しながら試行錯誤を通じて最適な行動戦略(方策)を学習する機械学習の手法です。近年、特に深層学習との組み合わせである深層強化学習(Deep Reinforcement Learning, DRL)が目覚ましい発展を遂げ、Atariゲームのプレイ、ロボットの制御、囲碁やチェスのような複雑なゲームでの人間超えなど、多くのブレークスルーを生み出しています。
DRLにおける主要な学習アプローチの一つに、「方策勾配法(Policy Gradient Methods)」があります。これは、方策(エージェントがどのような状態でどのような行動をとるかを決定する確率分布)を直接パラメータ化し、期待される累積報酬を最大化するように方策のパラメータを勾配上昇法によって更新していく手法です。方策勾配法は直感的に理解しやすく、複雑な行動空間を持つ問題にも適用可能という利点がありますが、いくつかの課題も抱えています。特に、学習の安定性が問題となることが多く、少しのパラメータ更新でも方策が大きく変化してしまい、それまで積み上げてきた学習成果が失われてしまう(パフォーマンスが崩壊する)リスクがあります。これは「ステップ幅問題」とも呼ばれます。
この方策勾配法の不安定性を克服し、より効率的かつ安定した学習を実現するために開発されたアルゴリズムの一つが、「近端方策最適化(Proximal Policy Optimization, PPO)」です。PPOは、OpenAIによって2017年に発表されて以来、そのシンプルさ、実装の容易さ、そして高い性能から、強化学習研究および実応用において最も広く使われているアルゴリズムの一つとなりました。OpenAI Five(Dota 2)やその他の多くのDRLプロジェクトで採用されています。
本記事では、PPOアルゴリズムの理論的な背景からその詳細な仕組みまでを、初心者にも理解できるよう丁寧に解説します。方策勾配法の基礎から始め、PPOの元となったトラストリージョン方策最適化(TRPO)のエッセンスに触れつつ、PPOがどのように方策の更新量を適切に制限しているのか、その鍵となる「クリッピング(Clipping)」の技術を中心に深く掘り下げていきます。
PPOの概要
PPO(Proximal Policy Optimization)は、方策勾配法の一種であり、特に「オンポリシー学習」に分類されます。オンポリシー学習とは、方策の評価と改善に、現在学習中のその方策自身によって収集されたデータを使用する学習パラダイムです。
PPOの根底にある考え方は、過去の方策(学習が進むにつれて変化していく方策の、ある時点でのスナップショット)と現在学習中の方策との乖離を抑制しつつ、方策を更新していくというものです。これにより、方策の急激な変化を防ぎ、学習の安定化を図ります。
PPOは、先行研究であるTRPO(Trust Region Policy Optimization)の思想を受け継いでいます。TRPOは、方策の更新量が過去の方策からのKLダイバージェンス( Kullback–Leibler divergence、確率分布間の差異を示す指標)によって定められた「トラストリージョン(信頼領域)」内に収まるように、最適化問題を解くアルゴリズムです。TRPOは理論的に強力な保証を持ち安定した学習が可能でしたが、制約付き最適化問題を解く必要があり、実装が複雑で計算コストが高いという難点がありました。
PPOは、TRPOが持つ「方策の更新量を適切に制限する」というアイデアを、よりシンプルで実装しやすい方法で実現しました。具体的には、目的関数に「クリッピング」という操作を導入することで、方策の変更量が大きくなりすぎることを罰し、トラストリージョンに近い効果を得ています。このシンプルさにもかかわらず、PPOは多くのタスクでTRPOと同等以上の性能を発揮することが経験的に示されています。
PPOの主な特徴は以下の通りです。
- 安定性: 方策の更新量を適切に制限することで、学習の不安定性を大幅に軽減します。
- 効率性: 収集した少量のデータから複数回学習を行うことで、データの利用効率を高めます(これはActor-Critic型のオフポリシー手法ほどではありませんが、典型的なオンポリシー手法より優れています)。
- 実装の容易さ: TRPOと比較して、クリッピングを用いることで最適化問題が単純化され、標準的な勾配降下法(Adamなど)で実装できます。
- 汎用性: 連続行動空間、離散行動空間のどちらにも適用可能です。
- 高い性能: 多くのベンチマークタスクで最先端(またはそれに近い)の性能を発揮します。
次に、PPOを理解するために必要な基本的な知識、特に関係の深い方策勾配法とActor-Critic法について見ていきます。
ポリシー勾配法の基礎
PPOは方策勾配法に属するため、まずは方策勾配法の基本的な考え方を理解することが重要です。
強化学習の基本要素
強化学習システムは、主に以下の要素から構成されます。
- エージェント(Agent): 環境内で行動を選択する学習主体。
- 環境(Environment): エージェントの行動に応じて状態を遷移させ、報酬を返す系。
- 状態(State, s): ある時点での環境の状況を表す情報。
- 行動(Action, a): エージェントが状態sで取りうる操作。
- 報酬(Reward, r): エージェントが行動aを取った結果、環境から与えられる評価値(スカラー)。
- 方策(Policy, π): エージェントが各状態でどのような行動を選択するかを決定する戦略。確率的な方策 π(a|s) は、状態sにおいて行動aを選択する確率を表します。
- 価値関数(Value Function, V or Q): ある状態や状態-行動ペアが将来どれだけの累積報酬をもたらすかを示す予測値。
- 状態価値関数 V_π(s): 方策πに従ったときに、状態sから開始して得られる期待累積割引報酬。
- 状態-行動価値関数 Q_π(s, a): 方策πに従ったときに、状態sで行動aを取り、その後方策πに従って行動を続けたときに得られる期待累積割引報酬。
強化学習の目標は、エージェントが環境から得られる累積報酬(長期的な報酬の合計)を最大化するような方策πを見つけることです。累積報酬は、通常、将来の報酬を割引率γ(0 < γ ≤ 1)で割り引いた合計(割引累積報酬)として定義されます。
目的関数と方策勾配定理
方策勾配法では、方策をパラメータθを持つ関数 π_θ(a|s) として表現します(例えば、ニューラルネットワーク)。学習の目的は、期待される累積報酬を最大化するθを見つけることです。この期待累積報酬を目的関数 J(θ) とします。エピソードの開始状態 s_0 からの期待割引累積報酬は、以下のようになります。
J(θ) = E [ ∑_{t=0}^T γ^t r_t | π_θ ]
ただし、E[…]は方策π_θに従ったときの期待値、Tはエピソードの終了時刻(無限ホライズンの場合は適切に定義される)。
方策勾配法は、この目的関数 J(θ) を勾配上昇法によって最大化します。つまり、パラメータθを以下の更新式に従って繰り返し更新します。
θ ← θ + α ∇ J(θ)
ただし、αは学習率、∇ J(θ)は目的関数 J(θ) の勾配です。
ここで重要なのが、方策勾配定理(Policy Gradient Theorem)です。この定理は、方策勾配 ∇ J(θ) が、行動の対数確率の勾配と、その行動をとったことによる「良さ」を表す項(通常は状態-行動価値関数 Q_π(s, a) やアドバンテージ関数 A_π(s, a))の期待値で計算できることを示しています。
∇ J(θ) ≈ E_{s,a ~ π_θ} [ ∇ log π_θ(a|s) * Q_π(s, a) ]
あるいは、より一般的には、ある状態sにおいて行動aを取ったことによる影響を評価するために、Q_π(s, a)の代わりに、状態価値関数V_π(s)からの差であるアドバンテージ関数 A_π(s, a) = Q_π(s, a) – V_π(s) を用いることが多いです。A_π(s, a)は、状態sで方策πに従うよりも、行動aを取る方がどれだけ良いかを示します。
∇ J(θ) ≈ E_{s,a ~ π_θ} [ ∇ log π_θ(a|s) * A_π(s, a) ]
この式は、もしある状態sで特定の行動aを取る確率が低い(log π_θ(a|s) の勾配の方向)にも関わらず、その行動が平均よりも良い結果(A_π(s, a) > 0)をもたらすのであれば、その行動を取る確率を高めるようにパラメータを更新すべきであることを示唆しています。逆に、その行動が悪ければ(A_π(s, a) < 0)、確率を低くするように更新します。
典型的な方策勾配アルゴリズムの課題
方策勾配定理に基づいて実装される最も基本的なアルゴリズムの一つにREINFORCEがあります。REINFORCEは、エピソード全体をプレイし、得られた全報酬の合計(または割引合計)を、そのエピソードで取られた各行動の価値として利用します(これはQ関数の推定値として利用できます)。しかし、REINFORCEはエピソード単位での学習が必要であり、また高分散な勾配推定値になりやすいという問題があります。これは、同じ状態から始めても、その後のランダム性によって得られる累積報酬が大きく変動するためです。高分散な勾配は学習を不安定にさせます。
また、より洗練された方策勾配法であっても、方策のパラメータを勾配方向に更新する際に、学習率(ステップ幅)の設定が非常に重要かつ難しいという共通の課題があります。少しでも学習率が大きすぎると、方策が大きく変化してしまい、それまで安定して獲得できていた報酬が急激に低下する可能性があります。これは、方策の小さな変更が環境との相互作用を通じて大きな結果の違いを生む可能性があるためです。逆に、学習率が小さすぎると、学習が非常に遅くなってしまいます。適切な学習率を見つけるための繊細なチューニングが必要となることが、方策勾配法の大きな課題の一つでした。
Actor-Critic法
方策勾配法の課題の一つである高分散を軽減するために、Actor-Critic法が広く用いられます。PPOもActor-Critic型のアルゴリズムとして実装されるのが一般的です。
ActorとCriticの役割
Actor-Critic法では、方策(Actor)と価値関数(Critic)という二つの要素を学習します。
- Actor: 方策関数 π_θ(a|s) をパラメータ化し、状態sにおいてどの行動aを選択するか(またはその確率)を決定します。これは方策を直接学習するため、「方策ベース」の部分です。
- Critic: 状態価値関数 V_φ(s) や状態-行動価値関数 Q_φ(s, a) をパラメータ化し、現在の状態や状態-行動ペアの価値を推定します。これは価値を推定するため、「価値ベース」の部分です。
学習プロセスでは、ActorはCriticが推定した価値情報(特にアドバンテージ関数 A(s, a) = Q(s, a) – V(s) )を利用して方策を更新します。Criticは、Actorが環境から収集した経験(状態遷移と報酬)を用いて、価値関数を学習します。
アドバンテージ関数の導入
Actor-Critic法における方策勾配の推定には、アドバンテージ関数 A(s, a) = Q(s, a) – V(s) がよく用いられます。これは、状態sにおける行動aの価値Q(s, a)から、状態sの平均的な価値V(s)を差し引いたものです。
前述の方策勾配定理の式 ∇ J(θ) ≈ E_{s,a ~ π_θ} [ ∇ log π_θ(a|s) * A_π(s, a) ] は、このアドバンテージ関数を使って勾配を推定することを示しています。
なぜQ(s, a)の代わりにA(s, a)を使うのでしょうか? それは、アドバンテージ関数を使うことで勾配の分散を下げることができるためです。Q(s, a)には、状態s自体の良さ(その状態に到達するだけで将来的に得られる報酬の期待値)が含まれています。しかし、方策を更新する際に本当に重要なのは、その状態sで特定の行動aを選択することが、他の行動を選択するよりもどれだけ良いか、つまり状態sにおける行動aの相対的な価値です。V(s)を差し引くことで、この相対的な価値のみを抽出することができ、勾配の推定値に含まれるノイズ(分散)を減らすことができます。
Actor-Critic法では、Criticが価値関数V(s)を学習し、このV(s)を用いてアドバンテージ A(s, a) を推定します。Q(s, a)の推定には、実際に行動aをとって遷移した次の状態s’での価値V(s’)と、そこに至るまでに得られた報酬rを利用したTD誤差(Temporal Difference Error)を用いるのが一般的です。
TD誤差 δ_t = r_t + γV_φ(s_{t+1}) – V_φ(s_t) は、時点tにおけるV(s_t)の推定値の誤差を表すと同時に、時点tで取った行動の瞬時的なアドバンテージの推定値としても利用できます(厳密には少し違いますが、よく代理として使われます)。より洗練されたAdvantage推定方法として、後述するGeneralized Advantage Estimation (GAE) があります。
Actor-Critic法のメリットと課題
メリット:
- 低分散: Criticが価値関数を学習し、これを用いてアドバンテージを推定することで、方策勾配の推定値の分散を下げることができます。これにより、REINFORCEのような手法と比較して学習が安定しやすくなります。
- 連続的な学習: 各ステップでCriticが価値をフィードバックするため、エピソードの終了を待たずに方策を更新できます。
課題:
- 不安定性: ActorとCriticという二つの学習対象が相互に影響し合いながら学習を進めるため、学習が不安定になる可能性があります。特に、Criticの価値推定が不正確だと、Actorが誤った方向に更新されてしまうことがあります。また、やはり方策の急激な変化による不安定性も存在します。
PPOは、このActor-Critic型の枠組みの中で、方策の更新を安定させるための工夫を凝らしたアルゴリズムと言えます。
トラストリージョン方策最適化 (TRPO) の理論
PPOの理解を深める上で、その前身であるTRPOの基本的な考え方を知ることは非常に有用です。TRPOは、方策の更新による性能の保証(性能が低下しないことの保証)を、理論的に強く追求したアルゴリズムです。
なぜステップ幅を制限する必要があるのか?
方策勾配法では、目的関数 J(θ) を勾配上昇法で最大化しようとします。しかし、方策 π_θ は環境との複雑な相互作用を通じて報酬につながるため、パラメータ空間での小さな変更が、方策空間(すべての可能な方策の集合)での大きな変化を引き起こす可能性があります。そして、方策空間での大きな変化は、環境から得られる報酬の劇的な変化(特に低下)につながりやすいのです。
例えば、ロボットアームの制御において、関節角度を決定する方策ネットワークのパラメータをわずかに変更しただけで、アームが予期せぬ方向に大きく振れてしまい、タスクの失敗や損傷につながる、といった状況が起こりえます。
目的関数 J(θ) は、通常、エピソード全体や多数のサンプルから推定される期待値であり、現在のθにおける局所的な勾配 ∇ J(θ) が、その勾配方向に大きく進んだときの目的関数の値の上昇を保証するわけではありません。したがって、方策の更新量を適切に制限し、方策の変更が「安全な範囲内」に留まるようにする必要がある、というのがTRPOの基本的な考え方です。
サロゲート目的関数とKL制約
TRPOは、現在の(古い)方策 π_θ_old から、新しい方策 π_θ への更新を考えます。このとき、新しい方策 π_θ による期待累積報酬 J(θ) を直接最大化するのではなく、古い方策 π_θ_old によって収集されたデータ(状態と行動のペア)を用いて定義された「サロゲート目的関数」を最大化することを考えます。
TRPOが用いるサロゲート目的関数 L(θ) は、新しい方策 π_θ と古い方策 π_θ_old の確率比 r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t) を用いて以下のように定義されます。
L(θ) = E_{s,a ~ π_θ_old} [ r_t(θ) * A_{t, old} ]
ここで、E_{s,a ~ π_θ_old}[…]は、古い方策 π_θ_old に従って収集された状態s_tと行動a_tのペアに関する期待値です。A_{t, old}は古い方策 π_θ_old の下でのアドバンテージの推定値です。
このサロゲート目的関数 L(θ) は、θ=θ_old の周りで、元の目的関数 J(θ) の変化量 ΔJ(θ) と密接な関係があることが理論的に示されています。特に、ある条件の下で ΔJ(θ) は L(θ) と、新しい方策と古い方策のKLダイバージェンス D_KL(π_θ_old || π_θ) に依存する誤差項でバウンドされることが示されています。
TRPOの核となる理論的保証は、新しい方策の性能が古い方策の性能から大きく悪化しないことを保証するために、方策の更新量を、新しい方策 π_θ と古い方策 π_θ_old の間のKLダイバージェンスが、ある小さな定数δ以下に収まるという制約を設けることです。
θ^* = argmax_θ E_{s,a ~ π_θ_old} [ π_θ(a|s) / π_θ_old(a|s) * A_{old}(s, a) ]
subject to E_{s ~ π_θ_old} [ D_KL(π_θ_old(·|s) || π_θ(·|s)) ] ≤ δ
つまり、TRPOは、サロゲート目的関数を最大化するという目的と、KLダイバージェンスによる方策の変化量制約を同時に満たす最適化問題を解くことで、理論的な性能保証を持ちつつ方策を更新します。
TRPOの課題
TRPOは理論的な基盤がしっかりしており、安定した学習が可能という大きな利点があります。しかし、その実装には以下のような課題がありました。
- 制約付き最適化: KLダイバージェンス制約の下での目的関数最大化は、標準的な勾配降下法では直接解けません。共役勾配法などの二次最適化手法を用いる必要があり、実装が複雑になります。
- 計算コスト: KLダイバージェンスの計算や二次最適化 solver の利用は、特に大規模なニューラルネットワークを用いる場合に計算コストが高くなります。
- 汎用性: 連続行動空間には比較的適用しやすいですが、離散行動空間や複雑なネットワーク構造(RNNなど)への適用はより工夫が必要になる場合があります。
PPOは、TRPOの「方策の更新量を適切に制限する」という重要なアイデアを維持しつつ、これらの実装上・計算上の課題を克服することを目指して開発されました。
PPOアルゴリズムの詳細
PPOは、TRPOのKLダイバージェンス制約による方策更新量の制限を、目的関数に直接組み込む「クリッピング」という手法によって実現します。これにより、制約付き最適化問題を解く必要がなくなり、標準的な勾配降下法で効率的に学習できます。
PPOは通常、Actor-Critic型のフレームワークで実装されます。Actorは方策ネットワーク π_θ(a|s) をパラメータθで、Criticは価値ネットワーク V_φ(s) をパラメータφで表現します。両方のネットワークは、しばしば入力層や一部の中間層を共有する形で実装されます。
サロゲート目的関数 (Clipped Surrogate Objective)
PPOの核となるのは、新しい方策のパラメータθを更新するためのサロゲート目的関数です。TRPOと同様に、古い方策 π_θ_old から収集されたデータを利用し、新しい方策 π_θ のパラメータθを更新します。
PPOのサロゲート目的関数は、確率比 r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t) を用いて定義されます。ここで、π_θ_old は、パラメータが前回の更新ステップで固定された古い方策、π_θ は現在更新中の新しい方策です。
単純なサロゲート目的関数は TRPO と同様に L(θ) = E [ r_t(θ) * A_t ] ですが、ここで期待値 E[…] は、古い方策 π_θ_old およびそこから導出される状態分布に従って収集されたサンプルについての平均を表します。A_t は、古い方策 π_θ_old の下で推定された時点tでのアドバンテージです。
この単純な目的関数 L(θ) をそのまま最大化しようとすると、r_t(θ) が極端に大きな値を取る可能性があります。これは、新しい方策 π_θ(a_t|s_t) が古い方策 π_θ_old(a_t|s_t) よりも特定の行動a_tを選択する確率をはるかに高くした場合に起こります。r_t(θ) が大きくなると、アドバンテージ A_t が正の場合、目的関数 L(θ) は非常に大きくなり、勾配ステップによって方策が急激に変化してしまい、学習が不安定になるリスクがあります。TRPOはKLダイバージェンス制約によってこれを防ぎましたが、PPOは目的関数自体に変更を加えます。
PPOが導入する「クリッピング付きサロゲート目的関数 (Clipped Surrogate Objective)」 L_CLIP(θ) は以下の式で定義されます。
L_CLIP(θ) = E_{s_t, a_t ~ π_θ_old} [ min( r_t(θ) * A_t, clip(r_t(θ), 1-ε, 1+ε) * A_t ) ]
ここで、
* r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t) は確率比。
* A_t は、古い方策 π_θ_old の下で推定されたアドバンテージ。
* ε はクリッピングの範囲を決定するハイパーパラメータ(例えば0.1や0.2)。
* clip(x, l, h) は x の値を [l, h] の範囲にクリッピングする関数。すなわち、x < l なら l、x > h なら h、それ以外なら x を返す。
* min(A, B) は A と B の小さい方を選択する関数。
この目的関数の意味するところを見てみましょう。min関数の中の2つの項を比較しています。
1. 一つ目の項: r_t(θ) * A_t 。これは、新しい方策 π_θ の下での期待される報酬変化量を、古い方策のデータを用いて単純に推定したものです。
2. 二つ目の項: clip(r_t(θ), 1-ε, 1+ε) * A_t 。これは、確率比 r_t(θ) を [1-ε, 1+ε] の範囲にクリッピングしてからアドバンテージ A_t を乗じたものです。
この min 関数とクリッピングの組み合わせが、方策の急激な変化を抑制する鍵です。
- A_t > 0 の場合(行動 a_t が平均より良かった): 方策を更新して、行動 a_t を取る確率を高めたい(つまり r_t(θ) を大きくしたい)状況です。このとき、二つの項は r_t(θ) * A_t と clip(r_t(θ), 1-ε, 1+ε) * A_t です。もし r_t(θ) が 1+ε を超えて大きくなろうとしても、clip(r_t(θ), 1-ε, 1+ε) は最大で 1+ε に制限されます。したがって、min 関数は r_t(θ) * A_t と (1+ε) * A_t の小さい方を選択します。r_t(θ) が 1+ε を超える場合は、(1+ε) * A_t が選択されます。これは、r_t(θ) が 1+ε を超えても、目的関数の増加がそれ以上得られなくなることを意味します。つまり、古い方策から確率が (1+ε) 倍よりも大きく増えたとしても、報酬の増加は (1+ε) 倍までしか考慮されないため、方策を過度に急激に変化させるインセンティブが抑制されます。
- A_t < 0 の場合(行動 a_t が平均より悪かった): 方策を更新して、行動 a_t を取る確率を低くしたい(つまり r_t(θ) を小さくしたい)状況です。このとき、二つの項は r_t(θ) * A_t と clip(r_t(θ), 1-ε, 1+ε) * A_t です。A_t が負なので、目的関数を大きくするためには r_t(θ) を小さくしたい、つまり r_t(θ) * A_t を負の大きい値(0に近い値)にしたいと考えます。min 関数は r_t(θ) * A_t と clip(r_t(θ), 1-ε, 1+ε) * A_t の小さい方を選択します。もし r_t(θ) が 1-ε を下回って小さくなろうとしても、clip(r_t(θ), 1-ε, 1+ε) は最小で 1-ε に制限されます。したがって、min 関数は r_t(θ) * A_t と (1-ε) * A_t の小さい方を選択します。r_t(θ) が 1-ε を下回る場合、r_t(θ) * A_t は (1-ε) * A_t よりも負の絶対値が大きい値になります(例えば A_t = -1 のとき、r_t(θ)=0.5なら項は-0.5、1-ε=0.8なら項は-0.8。minは-0.8を選ぶ)。r_t(θ) が 1-ε を下回ると、clip項の方が大きくなり(負の絶対値が小さくなり)、min関数は r_t(θ) * A_t を選択します。しかし、min関数は r_t(θ) * A_t を下から (1-ε) * A_t でバウンドすることで、負の方向への過度な更新を防ぐ効果も持ちます。
より正確には、A_t < 0 の場合、方策を更新して r_t(θ) を小さくすることで r_t(θ) * A_t を大きくしたい(0に近づけたい)と考えます。もし r_t(θ) が 1-ε より小さくなったとしても、min関数は r_t(θ) * A_t と clip(r_t(θ), 1-ε, 1+ε) * A_t の小さい方を選びます。clip(r_t(θ), 1-ε, 1+ε) は最小で 1-ε なので、min関数は r_t(θ) * A_t と (1-ε) * A_t の小さい方を選びます。r_t(θ) が 1-ε より小さいとき、r_t(θ) * A_t は (1-ε) * A_t よりも小さい(負の絶対値が大きい)値となります。したがって min 関数は r_t(θ) * A_t を選択します。この場合、クリッピングは下方向には直接機能していないように見えますが、min関数全体で考えると、A_t>0の場合は上方向へのクリッピング、A_t<0の場合は下方向へのクリッピングとして機能します。つまり、確率比が [1-ε, 1+ε] の範囲から外れた場合、目的関数はその外れた方向への勾配を打ち消すように動作し、方策の変更がクリッピング範囲内に留まるように促す効果があります。
このクリッピング付きサロゲート目的関数 L_CLIP(θ) を最大化することで、PPOはTRPOのようなKLダイバージェンス制約を用いずに、方策の変更量を効果的に制限します。
その他の目的関数項
PPOは通常Actor-Critic法として実装されるため、方策の学習だけでなく、価値関数の学習も行います。価値関数 V_φ(s) は、状態sの価値を推定するためのネットワークであり、通常は平均二乗誤差(MSE)を用いて学習されます。
価値関数誤差項 L_VF(θ) は以下のように定義されます。
L_VF(θ) = E_{s_t ~ π_θ_old} [ (V_φ(s_t) – V_t^{target})^2 ]
ここで V_t^{target} は、時点tにおける状態価値の目標値です。これは通常、収集された経験に基づいて計算されるモンテカルロリターン(割引累積報酬)や、GAE(Generalized Advantage Estimation)で用いられる目標値などを用います。この項は、価値ネットワーク φ のパラメータを更新するために使われます。方策ネットワーク θ と価値ネットワーク φ が一部の層を共有している場合、L_VF(θ) は方策ネットワークの更新にも影響を与えます。
さらに、PPOでは、方策の確率分布のエントロピー Sπ_θ を目的関数に加えることが一般的です。これは、方策が特定の一つの行動に偏りすぎることを防ぎ、多様な行動を探索する(exploration)ことを促す効果があります。
エントロピー項 Sπ_θ = – ∑_a π_θ(a|s_t) log π_θ(a|s_t) (離散行動空間の場合)
最終的なPPOの目的関数 L^{total}(θ, φ) は、これらの項の組み合わせとして定義されます。方策ネットワークのパラメータθを更新するための目的関数は、L_CLIP(θ) にエントロピー項を加えたものに、価値関数誤差項を加えたものとなります。ただし、価値関数誤差項は最小化、L_CLIPとエントロピー項は最大化したいので、符号に注意が必要です。
L^{total}(θ, φ) = E [ L_CLIP(θ) – c_1 * L_VF(φ) + c_2 * Sπ_θ ]
ここで、
* L_CLIP(θ) はクリッピング付きサロゲート目的関数(最大化)。
* L_VF(φ) は価値関数誤差(最小化)。
* Sπ_θ は方策のエントロピー(最大化)。
* c_1 と c_2 はハイパーパラメータとして調整される係数です。
実際には、Actorネットワーク(θ)とCriticネットワーク(φ)がパラメータを共有している場合、この統合された目的関数を用いて勾配計算が行われます。共有していない場合は、L_CLIP(θ) + c_2 * Sπ_θ をActorの目的関数として最大化し、L_VF(φ) をCriticの目的関数として最小化します。
GAE (Generalized Advantage Estimation) の活用
PPOを含む多くの方策勾配法では、アドバンテージ A_t の推定に Generalized Advantage Estimation (GAE) が用いられます。GAEは、TD誤差に基づくアドバンテージ推定(低分散だがバイアス大)と、モンテカルロ法に基づくアドバンテージ推定(高分散だが低バイアス)との間のバイアス・バリアンスのトレードオフを調整するための手法です。
TD誤差δ_t = r_t + γV_φ(s_{t+1}) – V_φ(s_t) は、時点tでの瞬時的なアドバンテージの推定値として利用できます(これはA_t=Q(s_t,a_t)-V(s_t)において、Q(s_t,a_t)をTDターゲット r_t + γV(s_{t+1}) で置き換えたものに相当します)。これはバイアスを含みますが分散は小さいです。
一方、モンテカルロ的なアドバンテージ推定としては、エピソードの最後までプレイして得られた累積報酬からV(s_t)を引く方法がありますが、これは分散が大きくなります。
GAEは、パラメータλ (0 ≤ λ ≤ 1) を導入し、kステップ先のTD誤差の加重平均としてアドバンテージを推定します。
A_t^{GAE(γ,λ)} = ∑{l=0}^∞ (γλ)^l δ{t+l}
ただし、δ_t = r_t + γV_φ(s_{t+1}) – V_φ(s_t)。
実際には、収集した有限のデータ(通常は複数ステップ、またはエピソードの最後まで)を用いてこの無限和を近似します。λ=0 の場合はTD誤差のみを用いたアドバンテージ推定に、λ=1 かつエピソード全体を考慮する場合はモンテカルロ的な推定に近づきます。GAEでは、通常 λ を0から1の間の値に設定することで、適切なバイアス・バリアンスのバランスを取ります。
PPOでは、古い方策 π_θ_old によって収集されたデータに対して、学習済みのCritic V_φ(s) を用いてGAEを計算し、そのアドバンテージ推定値 A_t を方策更新のためのサロゲート目的関数 L_CLIP に使用します。価値関数の目標値 V_t^{target} としては、GAEの計算で用いる GAEターゲット(状態tからの割引累積TD誤差)や、単純なモンテカルロリターンなどが使われます。
PPOアルゴリズムの擬似コード/手順
PPOアルゴリズムの一般的な流れは以下のようになります。
- 初期化: 方策ネットワーク π_θ と価値ネットワーク V_φ のパラメータ θ と φ を初期化する。古い方策のパラメータ θ_old を θ で初期化する。
- データ収集: 現在の方策 π_θ に従って、環境と相互作用しながら N 個のタイムステップ分のデータ(状態、行動、報酬、次の状態)を収集する。通常は、複数の並列環境で同時にデータ収集を行うことで効率を高める。収集されるデータセット D = {(s_t, a_t, r_t, s_{t+1})}_{t=1}^N 。
- アドバンテージの計算: 収集したデータと現在の価値ネットワーク V_φ を用いて、各タイムステップでのアドバンテージ A_t を計算する。GAEを用いるのが一般的。
- 古い方策のパラメータ更新: 現在の方策パラメータ θ を θ_old にコピーして保存する。
- 学習: 収集したデータセット D に対して、複数 epochs (例えば K epoch)学習を行う。
a. データセット D をミニバッチに分割する。
b. 各ミニバッチについて、以下を行う。
i. 現在の θ および φ を用いて、各サンプル (s_t, a_t) について確率比 r_t(θ) = π_θ(a_t|s_t) / π_θ_old(a_t|s_t)、現在の価値 V_φ(s_t) を計算する。
ii. ステップ3で計算したアドバンテージ A_t を用いて、PPOのクリッピング付きサロゲート目的関数 L_CLIP(θ) のミニバッチ平均を計算する。
iii. 価値関数誤差 L_VF(φ) のミニバッチ平均を計算する(価値の目標値 V_t^{target} は、収集時に計算しておいたGAEターゲットやモンテカルロリターンなどを用いる)。
iv. 方策のエントロピー Sπ_θ のミニバッチ平均を計算する。
v. 全体の目的関数 L^{total}(θ, φ) のミニバッチ平均を計算する。
vi. L^{total}(θ, φ) の勾配を計算し、標準的な勾配下降法(Adamなど)を用いてパラメータ θ と φ を更新する。 - 繰り返し: ステップ2に戻り、新しい方策 π_θ に従って再びデータを収集し、学習を続ける。これを収束するまで繰り返す。
Clippingパラメータ ε
クリッピングパラメータ ε は、PPOの挙動に大きな影響を与える重要なハイパーパラメータです。εの値は、古い方策からの確率比 r_t(θ) をどれだけ許容するかを決定します。
- εが大きい場合: クリッピング範囲 [1-ε, 1+ε] が広くなり、方策の変更がより自由に許容されます。これはより積極的な探索や高速な学習を促す可能性がありますが、安定性を損なうリスクも高まります。
- εが小さい場合: クリッピング範囲が狭くなり、方策の変更がより厳しく制限されます。これにより学習は安定しやすくなりますが、学習速度が遅くなる可能性があります。
適切なεの値は、タスクやネットワークアーキテクチャによって異なります。一般的には0.1または0.2がよく用いられますが、ハイパーパラメータチューニングによって最適な値を探索することが推奨されます。
Adamオプティマイザ
PPOでは、ネットワークパラメータの更新にAdamなどの適応的学習率を持つオプティマイザが広く用いられます。Adamは、学習率の調整や勾配の運動量管理を自動で行うため、学習を安定させ、収束を早める効果が期待できます。
PPOの実装における考慮事項
PPOを効率的に実装し、高性能を引き出すためには、いくつかの実践的な考慮事項があります。
- ネットワークアーキテクチャ: 方策ネットワークと価値ネットワークは、タスクの入力(状態)の性質に応じて適切なアーキテクチャを選択します。画像入力であればCNN、系列データであればRNNなどが用いられます。パラメータ共有は、学習の効率を高める一方、価値関数と方策の学習が互いに干渉し合う可能性もあります。
- バッチ処理: 収集したデータを効率的に利用するため、学習フェーズではミニバッチ単位での勾配計算とパラメータ更新を行います。バッチサイズは、勾配推定の精度と計算効率に影響します。
- 並列環境の利用: 強化学習では、多くの環境サンプルを収集することが重要です。複数の環境を並列に実行し、そこから得られる経験をまとめて学習に利用する(Vectorized Environmentなど)ことで、データ収集効率を劇的に向上させることができます。PPOはオンポリシー手法ですが、収集したデータを複数回(複数epoch)利用できるため、特に並列環境との相性が良いです。
- ハイパーパラメータチューニング: PPOにはε、GAEのλ、学習率、バッチサイズ、学習epoch数、目的関数の係数c1, c2など、多くのハイパーパラメータがあります。これらのハイパーパラメータの組み合わせによって性能が大きく変わるため、ベイズ最適化などの手法を用いたチューニングが重要になります。特に、クリッピングパラメータεとGAEのλは、学習の安定性と効率のトレードオフを調整する上で重要です。
- 正規化: 入力状態の正規化(例:平均0、分散1)、アドバンテージの正規化(特にバッチ内のアドバンテージを正規化することで、アドバンテージのスケールに頑健になる)は、学習の安定性を向上させることが多いです。
TRPO vs PPO
PPOとTRPOは、共に方策の更新量を制限することで学習の安定化を図る方策勾配法ですが、その手法と特性には違いがあります。
- 理論的保証: TRPOは、方策の更新によって性能が単調に改善(または大きく低下しない)するという理論的な保証を持っています。PPOは、クリッピングによるヒューリスティックな手法であり、TRPOのような強い理論的保証はありません。
- 実装の複雑さ: TRPOはKLダイバージェンス制約付きの最適化問題を解く必要があり、共役勾配法などの手法を必要とするため、実装が複雑です。PPOは、目的関数にクリッピングを組み込むだけで、標準的な勾配降下法で最適化できるため、実装が比較的容易です。
- 計算コスト: TRPOは二次最適化 solver の利用により、反復ごとの計算コストが高くなる傾向があります。PPOは標準的な勾配計算と勾配降下法を用いるため、反復ごとの計算コストが低い傾向があります。
- 性能: 多くのベンチマークタスクにおいて、PPOはTRPOと同等またはそれ以上の性能を発揮することが経験的に示されています。PPOの方がハイパーパラメータチューニングは必要ですが、適切な設定を見つければ強力な性能を発揮します。
- 汎用性: PPOはクリッピングが確率比に対して適用されるため、連続行動空間、離散行動空間のどちらにも容易に適用できます。TRPOは離散行動空間への適用に工夫が必要な場合があります。また、RNNのような複雑なネットワーク構造との組み合わせも、PPOの方が容易なことが多いです。
これらの比較から、PPOはTRPOの理論的な強さを継承しつつ、実装と計算の容易さを大幅に改善したアルゴリズムと言えます。これが、PPOがDRLコミュニティで広く受け入れられ、普及した大きな理由です。
PPOのメリットとデメリット
PPOのメリットとデメリットをまとめます。
メリット
- 実装の容易さ: 標準的な深層学習フレームワークと勾配降下法で実装できるため、比較的容易です。
- 計算効率: TRPOと比較して、反復ごとの計算コストが低く、並列環境でのデータ収集と組み合わせて効率的な学習が可能です。
- 安定性: クリッピングやGAEの利用により、従来のポリシー勾配法よりも学習が安定しやすいです。
- 汎用性: 離散・連続行動空間のどちらにも適用可能で、様々なネットワーク構造と組み合わせやすいです。
- 高い性能: 多くのタスクで高い性能を発揮し、強化学習のベンチマークにおいて強力なベースラインとなっています。
デメリット
- ハイパーパラメータチューニング: クリッピングパラメータεやGAEのλなど、調整が必要なハイパーパラメータが多く、適切な設定を見つけるのに試行錯誤が必要な場合があります。
- 理論的保証: TRPOのような強い理論的な性能保証はありません(経験的にはうまく機能しますが)。
- オンポリシー: 基本的にはオンポリシーアルゴリズムであり、収集したデータを古い方策の学習には利用できますが、TRPOと同様に大幅に古いデータや別の方策で収集したデータを効率的に利用することは難しいです(オフポリシー学習の手法と比較した場合)。これは、学習に使うデータが常に最新の方策で収集されたものである必要があるため、データ収集のコストが課題となる場合に非効率になる可能性があります。
PPOの応用例
PPOは、その高い性能と安定性から、様々な強化学習の応用分野で成功を収めています。
- ゲーム: OpenAI FiveがDota 2のような複雑なマルチエージェントゲームで人間トッププレイヤーを破るためにPPOが利用されました。他にもAtariゲーム、ロボットシミュレーションゲーム(MuJoCoなど)などで広く用いられています。
- ロボティクス: ロボットアームの操作、歩行、物体操作など、様々なロボット制御タスクにPPOが適用されています。現実世界への転移(Sim-to-Real)にも成功例があります。
- 自動運転: 自動運転における車両制御や経路計画の一部に強化学習を用いる研究があり、PPOが活用されることがあります。
- その他の制御問題: 複雑な動的システムにおける制御問題(例:航空宇宙、エネルギーシステム)などにも応用されています。
PPOがこれらの多様なタスクで成功していることは、その汎用性と有効性を示しています。
まとめ
本記事では、強化学習における主要な方策勾配アルゴリズムであるPPO(Proximal Policy Optimization)について、その理論的な背景から詳細な仕組みまでを解説しました。
PPOは、方策勾配法が抱える学習の不安定性、特にステップ幅問題を克服するために開発されました。先行研究であるTRPOがKLダイバージェンス制約によって方策の更新量を制限したのに対し、PPOは目的関数に「クリッピング」というシンプルな手法を導入することで、方策の急激な変化を効果的に抑制します。
PPOの核となるクリッピング付きサロゲート目的関数は、確率比 r_t(θ) とアドバンテージ A_t を用いて、方策の変更によって得られる報酬の改善量を推定しつつ、確率比がクリッピング範囲 [1-ε, 1+ε] から外れた場合には、それ以上の大きな改善量(または悪化量)を考慮しないように設計されています。これにより、TRPOのような複雑な制約付き最適化問題を解く必要がなくなり、標準的な勾配降下法で効率的に学習が可能となりました。
また、PPOは通常Actor-Critic型のフレームワークで実装され、方策ネットワークと共に価値ネットワークを学習します。アドバンテージの推定にはGAEが広く用いられ、学習の安定性をさらに高めています。目的関数には、価値関数誤差項やエントロピー項も加えられることが一般的です。
PPOは、TRPOのような強い理論的保証は持ちませんが、その実装の容易さ、計算効率、そして多くのタスクで示された高い性能から、現在の深層強化学習において最も広く利用されているアルゴリズムの一つとなりました。ゲーム、ロボティクス、自動運転など、様々な分野で成功を収めています。
もちろん、PPOにもハイパーパラメータチューニングが必要であるといった課題はありますが、方策勾配法の強力なベースラインとして、今後も様々な研究や応用の基盤となっていくでしょう。
PPOの理解は、現代の深層強化学習を学ぶ上で不可欠です。本記事が、PPOの理論と仕組みについての理解を深める一助となれば幸いです。