PPOアルゴリズムとは?仕組みを分かりやすく解説: 詳細版
はじめに: 強化学習と方策勾配法の課題
近年、人工知能、特に機械学習の分野は目覚ましい進歩を遂げています。その中でも、「エージェント」が自ら試行錯誤を重ねながら最適な行動を学習していく「強化学習」は、ゲーム攻略、ロボット制御、自動運転、資源管理など、多岐にわたる応用分野で注目を集めています。
強化学習における重要な課題の一つは、「どうすればエージェントが最適な行動方策(ポリシー)を見つけられるか」ということです。この課題に取り組むアルゴリズムは数多く存在しますが、その中でも特に実用性が高く、多くの成功事例を持つアルゴリズムとして、「PPO (Proximal Policy Optimization)」が挙げられます。
PPOは、OpenAIの研究者たちによって提案された方策勾配法(Policy Gradient Methods)の一種です。方策勾配法は、エージェントの行動方策を直接的に改善していく手法であり、複雑な行動空間を持つ問題や、連続的な行動が必要な問題に対して特に有効です。しかし、従来の方策勾配法にはいくつかの課題がありました。最も大きな課題は、「学習の安定性」です。わずかな方策の変更が、環境との相互作用を通じて大きな結果の違いを生み出し、学習が不安定になったり、最適解から大きく外れてしまったりすることが頻繁に起こりました。また、適切な学習率やその他のハイパーパラメータの調整が非常に難しいという問題もありました。
これらの課題を克服し、より安定して効率的に学習を進めるために開発されたのがPPOです。PPOは、方策を更新する際に、その更新幅を適切に制限することで、学習の安定性を飛躍的に向上させました。この記事では、PPOアルゴリズムがどのようにこれらの課題を解決しているのか、その仕組みを詳細かつ分かりやすく解説していきます。PPOを深く理解するためには、強化学習の基本的な概念や、従来の方策勾配法の仕組みを知っておくことが役立ちます。まずは、これらの基礎から丁寧に見ていきましょう。
強化学習の基本: PPOを理解するための前提知識
PPOアルゴリズムの詳細に入る前に、強化学習におけるいくつかの重要な基本概念を確認しておきましょう。
1. エージェントと環境 (Agent and Environment)
強化学習システムは、基本的に「エージェント」と「環境」の二つから構成されます。
* エージェント (Agent): 学習主体であり、意思決定を行います。環境の状態を観測し、それに基づいて行動を選択します。
* 環境 (Environment): エージェントを取り巻く世界です。エージェントの行動を受け取り、次の状態への遷移と報酬を返します。
2. 状態、行動、報酬 (State, Action, Reward)
強化学習のプロセスは、エージェントと環境の間の相互作用の繰り返しです。
* 状態 (State, $s$): ある時点における環境の状況を表す情報です。エージェントはこの状態を観測し、次の行動を決定します。例えば、ロボットの関節角度や速度、ゲームの盤面の配置などが状態になり得ます。
* 行動 (Action, $a$): エージェントが環境に対して行う操作です。例えば、ロボットのモーターを動かす、ゲームで特定のコマンドを入力するなどです。行動は離散的である場合(例:上下左右に移動)も、連続的である場合(例:モーターに加えるトルクの値)もあります。
* 報酬 (Reward, $r$): エージェントがある状態である行動をとった結果、環境から与えられるフィードバック信号です。報酬は通常スカラー値で、エージェントが望ましい行動をとったときには正の値、望ましくない行動をとったときには負の値(罰)が与えられます。エージェントの目的は、将来にわたって得られる報酬の合計(累積報酬)を最大化することです。
3. マルコフ決定過程 (Markov Decision Process, MDP)
多くの強化学習問題は、マルコフ決定過程(MDP)として定式化されます。MDPは以下の要素で定義されます:
* 状態の集合 $S$
* 行動の集合 $A$
* 遷移確率関数 $P(s’ | s, a)$: 状態 $s$ で行動 $a$ をとったときに、次の状態が $s’$ になる確率。
* 報酬関数 $R(s, a, s’)$: 状態 $s$ で行動 $a$ をとり、状態 $s’$ に遷移したときに得られる報酬。
* 割引率 $\gamma \in [0, 1]$: 将来得られる報酬をどれだけ重視するかを決定する係数。
MDPの「マルコフ性」とは、「次の状態は現在の状態と行動のみに依存し、それより過去の状態や行動には依存しない」という性質です。
4. 方策 (Policy, $\pi$)
方策とは、エージェントがどのような状態のときにどのような行動をとるかを定めたルールです。方策は、状態 $s$ が与えられたときに、とりうる行動 $a$ を選択する確率分布として表現されることが多いです。これを「確率論的方策 (Stochastic Policy)」と呼び、$\pi(a | s)$ と表記します。これは、状態 $s$ において行動 $a$ をとる確率を表します。一方、「決定的方策 (Deterministic Policy)」は、各状態に対して特定の一つの行動を決定的に定めます。
強化学習の目的は、累積報酬を最大化する最適な方策 $\pi^*$ を見つけることです。
5. 価値関数 (Value Function)
価値関数は、ある状態や状態・行動ペアがどれだけ「良い」か、つまり将来得られる累積報酬の期待値を表す関数です。
* 状態価値関数 (State-Value Function, $V^\pi(s)$): 方策 $\pi$ に従って状態 $s$ から開始した場合に、将来得られる割引累積報酬の期待値。
$V^\pi(s) = E_\pi [ \sum_{k=0}^\infty \gamma^k r_{t+k+1} | s_t = s ]$
* 行動価値関数 (Action-Value Function, $Q^\pi(s, a)$): 方策 $\pi$ に従って状態 $s$ で行動 $a$ をとり、その後方策 $\pi$ に従って行動した場合に、将来得られる割引累積報酬の期待値。
$Q^\pi(s, a) = E_\pi [ \sum_{k=0}^\infty \gamma^k r_{t+k+1} | s_t = s, a_t = a ]$
価値関数は、方策を評価したり、改善したりするために非常に重要です。特に、行動価値関数 $Q^\pi(s, a)$ が分かっていると、各状態において最も高い $Q$ 値を持つ行動を選択することで、より良い方策を簡単に導くことができます。
6. アドバンテージ関数 (Advantage Function, $A^\pi(s, a)$)
アドバンテージ関数は、行動価値関数と状態価値関数の差として定義されます。
$A^\pi(s, a) = Q^\pi(s, a) – V^\pi(s)$
これは、「状態 $s$ において、方策 $\pi$ が通常選択する行動をとるよりも、特定の行動 $a$ をとることがどれだけ優れているか」を表します。アドバンテージが正であれば、その行動は現在の状態における平均的な行動よりも優れており、負であれば劣っていることを意味します。アドバンテージ関数は、方策勾配法の分散を低減し、学習を安定させるために重要な役割を果たします。
7. 目的関数 (Objective Function)
強化学習における目的は、累積報酬を最大化することです。これを数式で表したものが目的関数です。方策勾配法では、この目的関数を最大化(あるいは負の目的関数を最小化)するように方策のパラメータを更新します。方策が確率論的方策 $\pi_\theta(a|s)$ でパラメータ $\theta$ を持つ場合、目的関数は以下のように定義されることが多いです。
$J(\theta) = E_{s \sim \rho^\pi, a \sim \pi_\theta} [ R_t ]$ あるいは $J(\theta) = E_{s \sim \rho^\pi, a \sim \pi_\theta} [ A^\pi(s, a) ]$
ここで $\rho^\pi$ は方策 $\pi$ のもとでの定常状態分布(エージェントが各状態に滞在する確率)を表します。方策勾配法は、この目的関数をパラメータ $\theta$ について微分し、勾配 $\nabla_\theta J(\theta)$ を用いてパラメータを更新します。
方策勾配法 (Policy Gradient Methods): REINFORCEとその課題
PPOは方策勾配法に基づいています。方策勾配法は、方策をパラメータ化し(例:ニューラルネットワーク)、環境との相互作用で得られた経験に基づいて、累積報酬を最大化するように方策のパラメータを勾配法で直接更新する手法です。
方策勾配定理によれば、ある目的関数(例えば、割引累積報酬の期待値)の勾配は、以下のような形式で表すことができます。
$\nabla_\theta J(\theta) = E_{s \sim \rho^\pi, a \sim \pi_\theta} [ \nabla_\theta \log \pi_\theta(a|s) \cdot Q^\pi(s, a) ]$
この勾配は、「ログ確率の勾配 $\nabla_\theta \log \pi_\theta(a|s)$」と「行動の良さ $Q^\pi(s, a)$」の積の期待値として計算されます。直感的には、もしある状態 $s$ で行動 $a$ をとった結果 $Q^\pi(s, a)$ が高ければ(良い行動であれば)、その行動をとる確率 $\pi_\theta(a|s)$ を高める方向に方策パラメータ $\theta$ を更新し、逆に低ければ(悪い行動であれば)その行動をとる確率を下げる方向に更新するという意味になります。
REINFORCEアルゴリズム
方策勾配定理に基づいた最も基本的なアルゴリズムの一つに、REINFORCE(Reward Increment=Non-negative Factor Times Cosine Error)があります。REINFORCEは、エピソード(開始状態から終了状態までの一連の状態・行動・報酬のシーケンス)を最後まで実行し、そのエピソードで得られた累積報酬 $G_t = \sum_{k=0}^\infty \gamma^k r_{t+k+1}$ を、そのエピソード中の各タイムステップ $(s_t, a_t)$ における $Q^\pi(s_t, a_t)$ の推定値として使用します。
REINFORCEの勾配推定値は以下のようになります。
$\nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \sum_{t=0}^{T_i-1} \nabla_\theta \log \pi_\theta(a_{i,t}|s_{i,t}) \cdot G_{i,t}$
ここで $N$ はエピソード数、$T_i$ は $i$ 番目のエピソードの長さ、$G_{i,t}$ は $i$ 番目のエピソードのタイムステップ $t$ 以降の割引累積報酬です。
REINFORCEは方策を直接学習できる強力な手法ですが、いくつかの重大な課題を抱えています。
REINFORCEの課題
- 高い分散 (High Variance): REINFORCEはエピソード全体の累積報酬 $G_t$ を使用して勾配を推定します。この累積報酬は、エピソードごとに、あるいは同じエピソード内の異なるタイムステップでも大きく変動する可能性があります。この大きな変動(高い分散)が勾配推定の精度を低下させ、学習を不安定にします。特定の良い(または悪い)エピソードの偶然の結果が、方策パラメータの大きな更新を引き起こし、最適解から遠ざかってしまうことがあります。
- ベースラインの必要性: 分散を低減するために、REINFORCEでは「ベースライン」を導入することが一般的です。ベースラインは状態価値関数 $V(s)$ などが使われ、勾配推定の際に累積報酬から差し引かれます。
$\nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \sum_{t=0}^{T_i-1} \nabla_\theta \log \pi_\theta(a_{i,t}|s_{i,t}) \cdot (G_{i,t} – b(s_{i,t}))$
ここで $b(s_{i,t})$ はベースラインです。これは勾配の期待値は変えずに分散を低減する効果があります。ベースラインとして状態価値関数 $V(s)$ を使うと、 $(G_{i,t} – V(s_{i,t}))$ はアドバンテージ関数 $A(s_{i,t}, a_{i,t})$ の推定値に相当します。これにより、勾配の向きが「ある状態での行動が、その状態の平均的な結果(価値)と比べてどれだけ良かったか」に基づいたものになります。 - 学習率の調整の難しさ: 方策勾配法では、適切な学習率を設定することが非常に重要です。学習率が大きすぎると、方策が急激に変化しすぎて不安定になり、性能が低下します。学習率が小さすぎると、学習が非常に遅くなります。微妙な学習率の調整が、成功の鍵となります。
アクタークリティック法 (Actor-Critic Methods)
REINFORCEのような基本的な方策勾配法は、行動の良さを評価するためにエピソード終了まで待つ必要があったり、分散が高かったりする課題がありました。これらの課題を解決するために、方策(Actor)と価値関数(Critic)の両方を同時に学習する「アクタークリティック法」が登場しました。
アクタークリティック法では:
* Actor: 方策 $\pi_\theta$ を学習する部分です。環境の状態を受け取り、行動を出力します。方策パラメータ $\theta$ を更新する役割を担います。
* Critic: 価値関数(通常は状態価値関数 $V_\phi$)を学習する部分です。環境の状態を受け取り、その状態の価値を推定します。クリティックは、アクターが選択した行動の良さを評価し、アクターの学習信号(アドバンテージ推定値など)を提供します。
アクタークリティック法の勾配推定値は、一般的にアドバンテージ関数 $A(s, a)$ の推定値 $\hat{A}$ を用いて以下のように表されます。
$\nabla_\theta J(\theta) \approx E_{s, a \sim \pi_\theta} [ \nabla_\theta \log \pi_\theta(a|s) \cdot \hat{A}(s, a) ]$
ここでアドバンテージ推定値 $\hat{A}(s, a)$ は、クリティックが学習した価値関数を利用して計算されます。例えば、1ステップのTD誤差(Temporal Difference Error)を利用する方法があります:
$\hat{A}(s_t, a_t) = r_{t+1} + \gamma V_\phi(s_{t+1}) – V_\phi(s_t)$
アクタークリティック法は、価値関数を利用してオンラインでアドバンテージを推定できるため、REINFORCEよりもデータ効率が良く、分散も低減されます。有名なアクタークリティックアルゴリズムとしては、A2C (Advantage Actor-Critic) や、その非同期版であるA3C (Asynchronous Advantage Actor-Critic) があります。これらの手法は、方策勾配法の学習の安定性を改善しましたが、それでも方策の更新幅によっては不安定になる可能性を完全に排除できたわけではありませんでした。
PPOの登場背景と目的
アクタークリティック法によって学習の安定性は向上しましたが、まだ方策の更新幅に関する課題が残っていました。方策勾配法は、現在のデータを使って計算された勾配方向に方策パラメータを更新します。しかし、勾配は現在の(古い)方策の周りでのみ正確な方向を示します。もし更新幅が大きすぎると、方策が大きく変化してしまい、計算された勾配がもはや新しい方策にとって意味のある方向を示さなくなる可能性があります。これは、学習の不安定性や、性能の低下につながります。
この問題を解決するために、TRPO (Trust Region Policy Optimization) というアルゴリズムが提案されました。TRPOは、方策を更新する際に、新しい方策が古い方策から大きく離れすぎないように制約を設けることを目的としています。具体的には、KLダイバージェンス(二つの確率分布の隔たりを示す指標)を用いて、新しい方策 $\pi_\theta$ と古い方策 $\pi_{\theta_{old}}$ の間の隔たりを一定値以下に抑えるという制約付き最適化問題を解きます。
$Maximize_{\theta} E_{s, a \sim \pi_{\theta_{old}}} [ \frac{\pi_\theta(a|s)}{\pi_{\theta_{old}}(a|s)} \hat{A}{\theta{old}}(s, a) ]$
$Subject \ to \ E_{s \sim \pi_{\theta_{old}}} [ KL[\pi_{\theta_{old}}(\cdot|s) || \pi_\theta(\cdot|s)] ] \le \delta$
ここで、$\hat{A}{\theta{old}}(s, a)$ は古い方策 $\pi_{\theta_{old}}$ のもとで計算されたアドバンテージ推定値です。目的関数の中の $\frac{\pi_\theta(a|s)}{\pi_{\theta_{old}}(a|s)}$ は重要度サンプリング (Importance Sampling) の比率であり、古い方策で収集したデータを使って新しい方策の期待値を推定するために使用されます。
TRPOは理論的に強力で、多くのタスクで良い性能を示しました。しかし、KLダイバージェンスに基づく制約付き最適化問題を解くプロセスが複雑で、実装が難しいという欠点がありました。特に、大規模なニューラルネットワークを使った場合や、計算効率を重視する場合には、TRPOは必ずしも扱いやすいアルゴリズムではありませんでした。
そこで、TRPOの持つ「方策の更新幅を制限する」という重要なアイデアを、よりシンプルかつ効率的に実現することを目指して開発されたのがPPO (Proximal Policy Optimization) です。PPOは、TRPOのような複雑な二次近似や制約付き最適化を用いる代わりに、目的関数自体に「クリッピング (Clipping)」という簡単な機構を導入することで、方策の更新幅を適切に制限します。これにより、PPOはTRPOに匹敵する性能を多くのタスクで達成しながらも、実装が容易でハイパーパラメータの調整も比較的容易であるという大きなメリットを持っています。
PPOの目的は、TRPOと同様に、古い方策で収集したデータを使って新しい方策を更新する際に、方策の更新幅を適切に保ち、学習の安定性と効率性を両立させることです。これは、データ収集(環境との相互作用)と方策更新を繰り返す学習サイクルにおいて、収集したデータを複数回利用することを可能にし(これはオンポリシー手法としては珍しい特徴です)、データ効率性の向上にも貢献します。
PPOの仕組み: 詳細解説
PPOアルゴリズムの核心は、その巧妙に設計された目的関数にあります。この目的関数は、従来の方策勾配法の目的関数に、方策の更新幅を制限するための項を追加したものです。
PPOにはいくつかのバリアントがありますが、最も一般的で効果的なのは「クリッピング付きPPO (PPO-Clip)」です。ここでは、主にPPO-Clipの仕組みを詳細に解説します。
1. PPOの目的関数を構成する要素
PPOの目的関数を理解するために、まずは基本的な方策勾配法の目的関数から始め、そこに要素を追加していく形で説明します。
-
重要度サンプリング比率 (Policy Ratio):
PPOは、古い方策 $\pi_{\theta_{old}}$ で収集した経験データ(状態 $s$, 行動 $a$, 報酬 $r$, 次の状態 $s’$ など)を使って、新しい方策 $\pi_\theta$ を学習します。これは、収集したデータを複数回再利用できるため、データ効率性を向上させます。しかし、古い方策で収集したデータは、新しい方策の下でのデータの分布とは異なります。この分布の違いを補正するために「重要度サンプリング」という技術が用いられます。重要度サンプリングでは、ある分布からサンプリングされたデータを使って、別の分布に関する期待値を推定する際に、各サンプルに「重み」をつけます。この重みは、新しい分布におけるサンプルの確率と古い分布におけるサンプルの確率の比率で与えられます。PPOの場合、この重みは新しい方策 $\pi_\theta$ と古い方策 $\pi_{\theta_{old}}$ の下での行動 $a_t$ の確率の比率になります。
$r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$
この比率 $r_t(\theta)$ は、タイムステップ $t$ において、状態 $s_t$ で行動 $a_t$ を選択する確率が、方策パラメータ $\theta$ の更新によってどれだけ変化したかを示します。$r_t(\theta) > 1$ ならば確率が増加、$0 < r_t(\theta) < 1$ ならば減少したことを意味します。古い方策 $\theta_{old}$ の時点では $r_t(\theta_{old}) = 1$ となります。
-
アドバンテージ関数 (Advantage Function):
方策勾配法と同様に、PPOでも行動の良さを評価するためにアドバンテージ関数 $\hat{A}t$ が使用されます。$\hat{A}_t$ は、現在のタイムステップ $t$ で観測された経験から計算される、アドバンテージ関数 $A^{\pi{\theta_{old}}}(s_t, a_t)$ の推定値です。アドバンテージが正であれば、その行動は期待よりも良い結果をもたらし、負であれば悪い結果をもたらしたことを示唆します。PPOでは、収集した経験に基づいてアドバンテージを推定します。よく使われる推定方法に、Generalized Advantage Estimation (GAE) があります。GAEは、1ステップTD誤差と複数ステップTD誤差を組み合わせたもので、バイアスと分散のトレードオフを調整できます。GAE($\lambda, \gamma$) におけるアドバンテージ推定値 $\hat{A}_t$ は、以下のように定義されます。
$\hat{A}t = \delta_t + (\gamma\lambda)\delta{t+1} + (\gamma\lambda)^2\delta_{t+2} + \cdots$
ここで $\delta_t$ はタイムステップ $t$ におけるTD誤差であり、$\delta_t = r_t + \gamma V_\phi(s_{t+1}) – V_\phi(s_t)$ です。$\lambda$ はGAEのパラメータで、$0 \le \lambda \le 1$ です。$\lambda=0$ の場合は1ステップTD誤差、$\lambda=1$ の場合はモンテカルロ推定に近くなります。PPOでは通常、$0.9$ や $0.95$ といった値が使われます。このアドバンテージ推定値 $\hat{A}t$ は、クリティックが学習した状態価値関数 $V\phi$ を用いて計算されます。 -
基本的な方策勾配目的関数 (再掲):
重要度サンプリングを用いて、古い方策 $\pi_{\theta_{old}}$ で収集したデータの下での新しい方策 $\pi_\theta$ の目的関数を推定すると、以下のような形になります。$L^{PG}(\theta) = E_{s_t, a_t \sim \pi_{\theta_{old}}} [ r_t(\theta) \hat{A}_t ]$
これは、従来の目的関数 $E_{s_t, a_t \sim \pi_\theta} [ \hat{A}_t ]$ を、古い方策でのサンプリングを使って推定する形にしたものです。この目的関数 $L^{PG}(\theta)$ を最大化するように方策パラメータ $\theta$ を更新すれば、理論的には累積報酬を増加させることができます。しかし、前述の通り、この目的関数を素直に最大化しようとすると、方策比率 $r_t(\theta)$ が極端に大きくなったり小さくなったりして、方策が大きく変化し、学習が不安定になるという問題があります。特に、アドバンテージ $\hat{A}_t$ が大きい場合に $r_t(\theta)$ を大きくしようとする力が働きすぎることが問題です。
2. PPOのクリッピング付き目的関数 (PPO-Clip)
PPO-Clipの核心は、この方策比率 $r_t(\theta)$ にクリッピングを施すことで、方策の更新幅を制限する点にあります。PPO-Clipの目的関数 $L^{CLIP}(\theta)$ は以下のように定義されます。
$L^{CLIP}(\theta) = E_{s_t, a_t \sim \pi_{\theta_{old}}} [ \min(r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t) ]$
この目的関数の各要素を詳しく見ていきましょう。
-
clip(r_t(θ), 1-ε, 1+ε)
: これは、方策比率 $r_t(\theta)$ の値を $[1-\epsilon, 1+\epsilon]$ の範囲にクリップする関数です。$\epsilon$ は小さな正のハイパーパラメータ(例えば0.1や0.2)であり、方策比率が許容される範囲を決定します。- もし $1-\epsilon \le r_t(\theta) \le 1+\epsilon$ ならば、
clip
関数は $r_t(\theta)$ そのものを返します。 - もし $r_t(\theta) > 1+\epsilon$ ならば、
clip
関数は $1+\epsilon$ を返します。つまり、方策比率の「上限」を設けます。 - もし $r_t(\theta) < 1-\epsilon$ ならば、
clip
関数は $1-\epsilon$ を返します。つまり、方策比率の「下限」を設けます。
このクリッピングにより、新しい方策 $\pi_\theta(a_t|s_t)$ は、古い方策 $\pi_{\theta_{old}}(a_t|s_t)$ に対して、$1-\epsilon$ 倍から $1+\epsilon$ 倍の範囲に確率が収まるように「ペナルティ」がかかります。方策が大きく変わりすぎようとすると、その変化が抑制される仕組みです。
- もし $1-\epsilon \le r_t(\theta) \le 1+\epsilon$ ならば、
-
min(r_t(θ) \hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t)
: PPOの目的関数の中核部分です。これは、以下の二つの項のうち小さい方を選択します。r_t(θ) \hat{A}_t
: これは、クリッピングされていない本来の目的関数項です。clip(r_t(θ), 1-\epsilon, 1+\epsilon) \hat{A}_t
: これは、方策比率をクリップした上での目的関数項です。
この
min
操作が、方策の更新を制限する鍵となります。ケース分けして考えてみましょう。-
ケース1: $\hat{A}_t > 0$ (行動 $a_t$ が状態 $s_t$ において期待よりも良い結果をもたらした)
エージェントはこの良い行動をとる確率を増やしたいと考えます。つまり、$r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$ を大きくする方向に方策を更新したいです。
目的関数項は $\hat{A}_t$ を乗算しているので、これを最大化するには $r_t(\theta)$ を大きくしたいです。
このとき、min
の中身は $r_t(\theta) \hat{A}_t$ とclip(r_t(θ), ...) \hat{A}_t
となります。
もし $r_t(\theta)$ がクリップ範囲内であれば ($1-\epsilon \le r_t(\theta) \le 1+\epsilon$)、clip(r_t(θ), ...)
は $r_t(\theta)$ そのものなので、二つの項は等しくなり、最大化は通常の勾配昇格($r_t(\theta)$ を大きくする)と同じになります。
もし $r_t(\theta)$ がクリップ範囲上限を超えて大きくなろうとした場合 ($r_t(\theta) > 1+\epsilon$)、clip(r_t(θ), ...)
は $1+\epsilon$ になります。このとき、$r_t(\theta) \hat{A}_t > (1+\epsilon) \hat{A}_t$ となります。しかし、min
を取るため、目的関数に寄与する項は $(1+\epsilon) \hat{A}_t$ に「クリップ」されます。これは、「いくら方策比率を大きくしても、$1+\epsilon$ 倍以上に方策の改善効果は評価しません」ということを意味します。これにより、良い行動に対して方策を大きく変更しすぎることを防ぎます。更新方向は依然として $r_t(\theta)$ を大きくする方向ですが、勾配の「大きさ」が制限されるイメージです。 -
ケース2: $\hat{A}_t < 0$ (行動 $a_t$ が状態 $s_t$ において期待よりも悪い結果をもたらした)
エージェントはこの悪い行動をとる確率を減らしたいと考えます。つまり、$r_t(\theta)$ を小さくする方向に方策を更新したいです。
目的関数項は $\hat{A}_t$ を乗算しており $\hat{A}_t$ は負なので、これを最大化するには $r_t(\theta)$ を小さくする必要があります(負の値を小さくすれば最大化)。
このとき、min
の中身は $r_t(\theta) \hat{A}_t$ とclip(r_t(θ), ...) \hat{A}_t
となります。
もし $r_t(\theta)$ がクリップ範囲内であれば ($1-\epsilon \le r_t(\theta) \le 1+\epsilon$)、clip(r_t(θ), ...)
は $r_t(\theta)$ そのものなので、二つの項は等しくなり、最大化は通常の勾配降下($r_t(\theta)$ を小さくする、ただし目的関数は最大化なので負の方向へ進む)と同じになります。
もし $r_t(\theta)$ がクリップ範囲下限を下回って小さくなろうとした場合 ($r_t(\theta) < 1-\epsilon$)、clip(r_t(θ), ...)
は $1-\epsilon$ になります。このとき、$\hat{A}_t$ は負なので、$r_t(\theta) \hat{A}_t > (1-\epsilon) \hat{A}_t$ となります。(例えば $\hat{A}_t = -1, \epsilon = 0.1$ で $r_t=0.5$ なら $0.5 \times -1 = -0.5$、clip
は $0.9$ なので $0.9 \times -1 = -0.9$。$-0.5 > -0.9$ となる)。しかし、min
を取るため、目的関数に寄与する項は $(1-\epsilon) \hat{A}_t$ に「クリップ」されます。これは、「いくら方策比率を小さくしても、$1-\epsilon$ 倍より方策の改善効果は大きく評価しません(負の方向への影響を制限します)」ということを意味します。これにより、悪い行動に対して方策を大きく変更しすぎることを防ぎます。更新方向は依然として $r_t(\theta)$ を小さくする方向ですが、勾配の「大きさ」が制限されます。
まとめると、min
操作とクリッピングは、アドバンテージが正の場合には方策比率の上限を設け、アドバンテージが負の場合には方策比率の下限を設けることで、方策の更新が現在の古い方策から大きく離れすぎることを防ぐ役割を果たします。これにより、学習の安定性が向上します。
3. 価値関数の学習 (Value Function Loss)
PPOはアクタークリティック手法であり、方策(アクター)だけでなく価値関数(クリティック)も学習します。価値関数 $V_\phi(s)$ は、アドバンテージ関数の推定 $\hat{A}_t$ を計算するために必要であり、またベースラインとして方策勾配の分散を低減する役割も果たします。
価値関数は、通常、状態 $s_t$ における実際の割引累積報酬の推定値(ターゲット値)$V^{target}t$ を予測するように学習されます。ターゲット値としては、収集された経験から計算される、将来の報酬の和(モンテカルロ推定)や、TDターゲット(例:$r_t + \gamma V\phi(s_{t+1})$)が使われます。PPOでは、アドバンテージ推定にGAEが使われることが多いため、ターゲット値として $V_\phi(s_t) + \hat{A}_t$ が用いられることがあります。
価値関数損失 $L^{VF}(\phi)$ は、推定された価値関数 $V_\phi(s_t)$ とターゲット値 $V^{target}_t$ との間の平均二乗誤差 (Mean Squared Error, MSE) として定義されるのが一般的です。
$L^{VF}(\phi) = E_{s_t \sim \rho^{\pi_{\theta_{old}}}} [ (V_\phi(s_t) – V^{target}_t)^2 ]$
この損失を最小化するように、価値関数パラメータ $\phi$ が勾配降下法によって更新されます。方策ネットワークと価値ネットワークは、通常、状態入力を共有するが、最終出力層は異なるニューラルネットワークとして実装されます(これは「共有ネットワークアーキテクチャ」と呼ばれ、学習効率を高めます)。
4. エントロピーの追加 (Entropy Bonus)
強化学習では、既知の良い行動を繰り返し選択する「活用 (Exploitation)」と、未知の行動を試してより良い行動を見つける「探査 (Exploration)」のバランスが重要です。方策 $\pi_\theta(a|s)$ のエントロピーは、方策のランダム性、つまり探査の度合いを示す指標とみなせます。エントロピーが高いほど、方策は様々な行動を均等に選択する傾向があり、探査が促進されます。
PPOの目的関数に方策エントロピー項を追加することで、エージェントの探査を促し、局所最適解に陥るのを防ぐことができます。エントロピー損失 $L^S(\theta)$ は、方策のエントロピー $H(\pi_\theta(\cdot|s_t))$ の期待値の負の値として定義されます。
$L^S(\theta) = E_{s_t \sim \rho^{\pi_{\theta_{old}}}} [ H(\pi_\theta(\cdot|s_t)) ]$
この項は、最大化したいPPO目的関数全体にはプラスの項として加えられます(エントロピーを最大化するため)。
5. PPOの最終的な目的関数
PPOの最終的な目的関数 $L(\theta, \phi)$ は、上記の三つの損失項(クリッピング付き方策損失、価値関数損失、エントロピー損失)を組み合わせたものになります。ただし、方策パラメータ $\theta$ と価値関数パラメータ $\phi$ は別々に、または共同で最適化されます。通常は、クリッピング付き方策損失とエントロピー損失を方策パラメータ $\theta$ で最大化し、価値関数損失を価値関数パラメータ $\phi$ で最小化します。
全体としての最適化は、以下の目的関数を最大化(または負の値を最小化)するように行われます。
$L(\theta, \phi) = E_{s_t, a_t \sim \pi_{\theta_{old}}} [ L^{CLIP}(\theta) – c_1 L^{VF}(\phi) + c_2 L^S(\theta) ]$
ここで、$c_1$ と $c_2$ はハイパーパラメータであり、価値関数損失とエントロピー損失が全体の最適化にどの程度影響するかを調整します。$c_1$ は通常正の値、$c_2$ は正の値です。価値関数損失は最小化したいので負号がついています。
6. PPOのアルゴリズム手順
PPOアルゴリズムの学習サイクルは、以下のステップを繰り返して行われます。
- 経験の収集 (Rollout): 現在の方策 $\pi_{\theta_{old}}$ を使用して、環境と相互作用し、一定数のタイムステップ(または一定数のエピソード)分の経験データ(状態、行動、報酬、次の状態など)を収集します。この経験データは、後続の更新ステップで使用されます。
- アドバンテージの計算: 収集した経験データと現在の価値関数 $V_\phi$ を使用して、各タイムステップにおけるアドバンテージ推定値 $\hat{A}_t$ を計算します(通常はGAEを使用)。また、価値関数学習のためのターゲット値 $V^{target}_t$ も計算します。
- 目的関数の構成と最適化: 収集した経験データ、計算したアドバンテージ $\hat{A}t$、および古い方策の確率 $\pi{\theta_{old}}(a_t|s_t)$ を使用して、PPOの目的関数 $L(\theta, \phi)$ を構成します。この目的関数は、方策パラメータ $\theta$ と価値関数パラメータ $\phi$ を更新するために使用されます。
特に重要なのは、方策の更新において、古い方策 $\pi_{\theta_{old}}(a_t|s_t)$ は固定された値として扱われることです。新しい方策 $\pi_\theta(a_t|s_t)$ は、現在のパラメータ $\theta$ を使用して計算され、パラメータ更新によって変化します。
この目的関数を、ミニバッチ勾配降下法(例:Adamオプティマイザを使用)を用いて複数回更新します(これを「Epoch」と呼びます)。つまり、収集した一つのバッチの経験データを、方策および価値関数の更新のために複数回再利用します。これは、従来のオンポリシー手法がデータを一度しか使えないのと比較して、PPOのデータ効率性を高める要因の一つです。
更新回数(Epoch数)はハイパーパラメータとして指定されます。通常、少ないEpoch数(例:5〜20回)で十分な性能が得られます。Epoch数が多すぎると、方策が古い方策から離れすぎてしまい、クリッピングの効果が十分に働かず、学習が不安定になる可能性があるので注意が必要です。 - 古い方策の更新: 目的関数の最適化が完了したら、現在の方策パラメータ $\theta$ を新しい「古い方策」パラメータ $\theta_{old}$ として保存し、次の経験収集フェーズに備えます。価値関数パラメータ $\phi$ も更新されますが、こちらは「古い」という概念は特にありません。
これらのステップを、エージェントの性能が十分に向上するか、あるいは所定の学習回数に達するまで繰り返します。
PPO-Penalty (PPO2)
PPOの別のバリアントとして、PPO-Penalty(OpenAIの実装ではPPO2と呼ばれることもあります)があります。これは、クリッピングの代わりに、TRPOのようにKLダイバージェンスを方策の更新幅の制限に利用する手法です。目的関数にKLダイバージェンス項をペナルティとして追加します。
$L^{KLPEN}(\theta) = E_{s_t, a_t \sim \pi_{\theta_{old}}} [ r_t(\theta) \hat{A}t – \beta KL[\pi{\theta_{old}}(\cdot|s_t) || \pi_\theta(\cdot|s_t)] ]$
ここで $\beta$ はKLペナルティの係数です。TRPOとの違いは、制約としてではなく目的関数に直接ペナルティとして加える点と、KLペナルティ係数 $\beta$ を学習の進行に合わせて動的に調整する仕組みがある点です。もし方策の更新によるKLダイバージェンスが大きくなりすぎたら $\beta$ を大きくしてより強いペナルティをかけ、小さすぎるなら $\beta$ を小さくしてより大きな更新を許容するように調整します。
PPO-ClipとPPO-Penaltyは、どちらも方策の更新幅を制限するという同じ目的を持っていますが、その実現方法が異なります。PPO-Clipの方が実装が容易で、多くのタスクで良好な性能を示すため、より広く使われています。
PPOのメリット
PPOが多くの強化学習タスクで標準的なアルゴリズムとして広く利用されているのには、いくつかの明確なメリットがあるからです。
- 実装の容易さ: TRPOと比較して、PPO(特にPPO-Clip)は目的関数にクリッピングという単純な操作を導入するだけで方策の更新幅を制限できます。これにより、複雑な二次近似や制約付き最適化ソルバーを必要とせず、標準的なディープラーニングライブラリ(TensorFlow, PyTorchなど)の自動微分機能を使って簡単に実装できます。これは研究者やエンジニアにとって大きな利点です。
- 高い性能: PPOは多くのベンチマークタスクや実世界の問題において、TRPOに匹敵するか、あるいはそれを上回る性能を示しています。クリッピング機構が、安定した学習を促し、最終的に高い報酬を獲得する方策を見つけるのに効果的であることが示されています。
- 学習の安定性: PPOの最大の強みは、方策の更新幅を制限することによる学習の安定性です。これにより、方策が急激に変化して性能が崩壊するリスクが低減され、ハイパーパラメータ調整の負担も軽減されます。特に、学習率や探索に関わるハイパーパラメータに対して、比較的頑健である傾向があります。
- データ効率性: PPOは基本的にはオンポリシーアルゴリズム(現在の古い方策で収集したデータしか学習に使わない)ですが、収集したデータを複数のミニバッチで複数回(Epochs)使用することができます。これにより、データを一度しか使えない従来のオンポリシー手法(例:標準的なA2C)と比べて、データ効率が向上します。オフポリシー手法(例:DQN, DDPG, SAC)ほどではないかもしれませんが、オンポリシー手法としては高いデータ効率を持っています。
- 並列化との相性: A2C/A3Cと同様に、複数のエージェントが並列に経験を収集し、それをまとめて方策の更新に利用するというアクタークリティックの構造は、並列計算と相性が良いです。これにより、大量の経験を効率的に収集し、学習時間を短縮することができます。
PPOのデメリット
優れたアルゴリズムであるPPOにも、いくつかのデメリットや限界が存在します。
- ハイパーパラメータ調整の必要性: PPOは比較的ハイパーパラメータに対して頑健であるとはいえ、最適な性能を引き出すためには、クリッピングの範囲を決定する $\epsilon$、価値関数損失の係数 $c_1$、エントロピー損失の係数 $c_2$、GAEの $\lambda$、学習率、バッチサイズ、更新回数(Epochs)など、多くのハイパーパラメータを調整する必要があります。これらの値はタスクによって適切な範囲が異なります。
- クリッピングの効果: クリッピングは単純で効果的ですが、常に最適な振る舞いをするわけではありません。特に、非常に複雑な環境や、報酬がスパースな環境では、クリッピングが探索を妨げたり、局所最適解に留まってしまったりする可能性もゼロではありません。クリッピングの範囲 $\epsilon$ の設定は性能に大きな影響を与えます。
- オンポリシーであること: 収集したデータを複数回利用できるとはいえ、PPOは基本的にオンポリシー手法です。これは、方策が更新されるたびに新しいデータを収集する必要があることを意味します。オフポリシー手法のように、過去の全て(あるいは大量)の経験データを学習に再利用できるわけではないため、非常にデータ収集コストが高い環境(例:実世界のロボットや複雑な物理シミュレーション)においては、オフポリシー手法の方が有利な場合があります。
- 大規模な探索が必要なタスク: 報酬が非常にスパースで、多くの試行錯誤を経てようやくポジティブな報酬が得られるようなタスクでは、クリッピングによる更新幅の制限が、必要な大きな方策の変化を妨げてしまう可能性があります。このようなタスクでは、より積極的な探索戦略を持つアルゴリズムや、オフライン強化学習のようなアプローチが適している場合があります。
PPOの応用例
PPOは、その高い性能と実装の容易さから、様々な強化学習の応用分野で広く使われています。
- ゲーム: PPOはコンピュータゲームのAI開発で非常に成功しています。特に、OpenAIが開発した人間のプロゲーマーを凌駕するAI「OpenAI Five」(Dota 2)や「AlphaStar」(StarCraft II)の基盤アルゴリズムとしてPPOが利用されました。これらのAIは、複雑な戦略、チーム連携、リアルタイムの意思決定を学習する必要があり、PPOの安定性と性能がその成功に貢献しました。
- ロボット制御: ロボットアームの操作、歩行ロボットの制御、ドローンの飛行制御など、連続的な行動空間を持つロボット制御タスクでPPOが使われています。PPOは安定して方策を学習できるため、実機での実験やシミュレーションベースの学習において有効です。
- 自動運転: 自動運転における車両の制御(アクセル、ブレーキ、ハンドル操作)や、他の車両とのインタラクション、経路計画など、複雑で連続的な行動が求められるタスクの一部でPPOが研究・応用されています。
- シミュレーション環境での学習: 物理シミュレーション環境での学習(例:MuJoCo環境でのロボット制御タスク)において、PPOは標準的なベンチマークアルゴリズムとして広く利用されており、その有効性が確認されています。
- 金融: 株取引やポートフォリオ管理など、金融市場における意思決定に応用する研究も行われています。
- 推薦システム: ユーザーの行動履歴に基づいて最適なアイテムを推薦するタスクにおいても、強化学習、特にPPOのような方策最適化手法が試みられています。
他のアルゴリズムとの比較
PPOをより深く理解するために、他の主要な強化学習アルゴリズムとの比較を行います。
- REINFORCE: 最も基本的な方策勾配法。分散が高く学習が不安定になりやすい。PPOはアドバンテージ推定とクリッピングにより、REINFORCEの課題を克服しています。
- A2C / A3C: アクタークリティック法。方策と価値関数を同時に学習し、アドバンテージ推定によりREINFORCEより分散を低減。PPOはA2C/A3Cにクリッピング機構を追加することで、方策の更新幅をより厳密に制御し、安定性をさらに向上させています。A3Cは非同期版であり、並列化の方法がPPOとは異なります。
- TRPO: PPOの直接的な前身。KLダイバージェンスを制約として方策の更新幅を制限。理論的に洗練されていますが、実装が複雑で計算コストが高い。PPOはクリッピングというシンプルな方法でTRPOのアイデアを模倣し、同等以上の性能をより容易に実現しています。
- DQN (Deep Q-Network): Q学習をディープラーニングで実装したオフポリシー手法。離散的な行動空間にのみ適用可能。経験リプレイやターゲットネットワークにより学習を安定させますが、価値関数を学習するため、連続行動空間には直接適用できません。PPOは方策を直接学習するため、離散・連続どちらの行動空間にも適用可能です。
- DDPG (Deep Deterministic Policy Gradient): Q学習と方策勾配法を組み合わせたオフポリシーのアクタークリティック手法。連続行動空間向け。経験リプレイを使用するためデータ効率は高いですが、ハイパーパラメータ調整が難しく、学習が不安定になることがあります。PPOはDDPGより一般的に学習が安定していると評価されています。
- SAC (Soft Actor-Critic): 方策エントロピーを最大化する項を目的関数に追加したオフポリシーのアクタークリティック手法。データ効率が高く、連続行動空間で高い性能と安定性を示すSOTA(State-of-the-Art)アルゴリズムの一つです。PPOと同様にエントロピー項を含みますが、SACはオフポリシーであり、別の目的関数(最大エントロピー強化学習)を最適化します。一般的に、データ効率はSACがPPOより優れる傾向がありますが、実装の複雑さや計算コストはSACの方が高い場合があります。
まとめると、PPOはオンポリシーのアクタークリティック手法であり、特に学習の安定性と実装の容易さにおいて優れています。TRPOのような理論的保証はないものの、実用上は多くのタスクで高性能を発揮し、広く利用されています。
実装上のヒント
実際にPPOを実装したり利用したりする際のいくつかのヒントを挙げます。
- ネットワークアーキテクチャ: 方策ネットワークと価値ネットワークは、状態入力を共有する(例:CNNやMLPの最初の数層を共有する)ことが多いです。これにより、特徴抽出部分の学習が効率化され、学習が安定する傾向があります。出力層は、方策ネットワークは行動の確率分布(離散行動空間ならソフトマックス、連続行動空間なら平均と標準偏差)、価値ネットワークは状態価値(スカラー値)を出力するように設計します。
- アドバンテージ推定 (GAE): PPOではGAE ($\lambda \in [0, 1]$) を用いたアドバンテージ推定が標準的です。$\lambda$ は $0.9$ や $0.95$ といった値がよく使われます。適切に実装することで、分散を低減しつつバイアスを抑えたアドバンテージが得られます。
- 正規化: 入力状態、アドバンテージ、報酬などを適切に正規化することが学習の安定性にとって重要です。特に、アドバンテージをミニバッチごとに正規化(平均0、標準偏差1)することは効果的です。
- クリッピングパラメータ $\epsilon$: $\epsilon$ はPPOの性能に大きな影響を与えるハイパーパラメータです。タスクによって最適な値は異なりますが、0.1や0.2あたりから試してみるのが一般的です。
- 更新回数 (Epochs): 1回のデータ収集で、何回方策と価値関数を更新するか(Epochs)も重要なハイパーパラメータです。少なすぎるとデータ効率が悪くなり、多すぎると方策が古い方策から離れすぎて不安定になります。5〜20回程度が一般的です。
- バッチサイズ: 経験収集のバッチサイズ、および学習に使うミニバッチサイズも調整が必要です。大きすぎるとメモリを消費し、小さすぎると勾配のばらつきが大きくなります。
- 学習率: 学習率も重要ですが、PPOは標準的な方策勾配法よりは学習率に対して頑健な傾向があります。多くの場合、Adamオプティマイザが使用されます。
- OpenAI Baselines / Stable Baselines3: PPOはOpenAI Baselinesやその後継であるStable Baselines3といった強化学習ライブラリに標準で実装されており、これらのライブラリを利用することで容易に試したり、独自の環境に適用したりできます。
まとめ
PPO (Proximal Policy Optimization) は、方策勾配法に基づいた強化学習アルゴリズムであり、特にその学習の安定性と実装の容易さから広く普及しています。
従来の基本的な方策勾配法(REINFORCE)は分散が高く不安定であり、アクタークリティック法はそれを改善しましたが、方策の更新幅に関する課題が残りました。TRPOはKLダイバージェンスを用いて更新幅に制約を設けることで安定化を図りましたが、実装が複雑でした。
PPOは、TRPOの「方策の更新幅を制限する」という重要なアイデアを、目的関数への「クリッピング」というシンプルなメカニズムによって実現しました。これにより、方策が古い方策から大きく逸脱することを防ぎ、学習の安定性を飛躍的に向上させました。PPOの目的関数は、重要度サンプリング比率、アドバンテージ関数、そしてクリッピング機構を組み合わせて構成されます。さらに、価値関数学習とエントロピー項も組み合わせることで、総合的な性能と探索能力を高めています。
PPOは、ゲームAI、ロボット制御、自動運転など、様々な分野で成功を収めています。そのメリットは、実装の容易さ、高い性能、学習の安定性、そして比較的良好なデータ効率にあります。一方、最適な性能を引き出すためにはハイパーパラメータ調整が必要であることや、本質的にはオンポリシーであることなどがデメリットとして挙げられます。
今日の強化学習研究および応用において、PPOは最も強力で信頼できるベースラインアルゴリズムの一つとして位置づけられています。そのシンプルなアイデアながら効果的な機構は、今後の強化学習アルゴリズム開発においても重要な示唆を与え続けるでしょう。
以上で、PPOアルゴリズムについての詳細な解説を終わります。強化学習の基礎から始まり、方策勾配法の課題、PPOの登場背景、そしてその核心であるクリッピング機構を含む目的関数、アルゴリズム手順、メリット・デメリット、応用例、そして他の手法との比較まで、幅広く掘り下げてきました。この解説が、PPOへの理解を深める一助となれば幸いです。