オフポリシー強化学習のすゝめ

# 前書き

強化学習を使ってみよう！という方がオンポリシーのアルゴリズムに頼って、良い結果が出ずに終わっているのを見かけるので、オフポリシー学習もイイぞ！と伝えたいと思いました。

（2021/6/22：PPOをオンポリシー、と記載していましたが、これを訂正し、解説を最後に追記）

# オンポリシーとオフポリシーの違い

以降モデルフリー学習に限っての説明になりますが、以下のように区別されます。

### オンポリシー

- 推定方策と挙動方策が一緒
- エピソード生成で計算した方策に対してそのままバックアップ

### オフポリシー

- 推定方策と挙動方策が違っても良い
- 大きなリプレイバッファを取る

オンポリシーは常に最新の自分自身のエピソードを学習に使うので、**方策によって観測の分布が大きく異なり最新のデータでないと学習する価値がないような環境**では学習を速く進められます。

一方でオフポリシーは過去のデータまで学習に使うので、常に多様性の高い学習データを用意することができ、**行動以外の部分で与えられる変化が大きい環境**では安定した学習が行えます。


# オフポリシー→価値ベース、ではない

強化学習によって主に以下の３つの値を学習します。

- 方策 **π**
- 状態価値 **v**
- 行動価値 **q**

このうち、方策 **π** を学習する方策勾配法がオンポリシー、**q**を学習するQ学習がオフポリシー、と昔の教科書には書かれていました。

**現代ではその理解は間違いです。**

方策勾配法と重点サンプリングを組み合わせることで、方策勾配法をオフポリシーで行うことができるようになりました。

もっと言えば、エントロピー正則化付きの強化学習は、**Q学習であれ方策勾配法であれ同じ結果に収束する**ことがわかっています。

ですので、方策関数を使いたいのでオンポリシー、という選択をする必要はありません。


# 強化学習は掛けたリソースが全て

強化学習がうまくいかない理由のほとんどは適切な計算機リソースが掛けられていないからです。

DeepmindのAlphaZeroなども、**理屈としては可能だが現実に上手く行くかどうかはわからない**と界隈の誰もが思っていたことを適切なリソースを掛けることにより実現した好例です。

その後の研究で必要なリソースは減って来てはいますが、**ある問題を初めて解くときに、すでに解かれた問題と同程度の少ない労力で解けると思うのは危険**です。**その問題がどの程度のリソースで解けるのかは、解けるまでリソースを費やす人が現れない限りわかりません。**

これから新しい問題を解きたいならば、リソースを掛けてスケールさせやすい手法を選ぶことが大事です。


# マシン間並列に優れた手法を選べ

リソースを増やすために最も簡単な方法はマシン間並列です。

最も簡単な並列化は学習/サーバーを中央に置き、エピソード生成のワーカーをあるだけ外部から追加する形式です。
このとき、マシン間でネットワークの内部状態を共有することはコストが大きいため、**入力と出力のみをサーバーに送る**ことが一般的です。
またマシン間でモデルをやりとりする回数もそれほど頻繁には行えず遅延があるため、マシン間並列での強化学習がオフポリシーの方が自然であると言えます。


# どうすれはオフポリシーになるか？

では実際に、オフポリシー方策勾配法を行うポイントを説明します。

## 1. min(1, π/p) をアドバンテージに掛ける

- 挙動方策 **p**
- 推定方策 **π**

として比をclipしたもの（1はハイパーパラメータ）を方策更新の際のアドバンテージに掛ければ良いです。

通常の方策勾配法における勾配が、収益 R, 推定価値 V, 方策 π, 方策のパラメータ θ として

```math
（R - V） \frac{\partial \pi}{\partial \theta}
```

であるのに対して、オフポリシーの方策勾配法では挙動方策 p として

```math
\min (1, \frac{\pi}{p}) （R - V） \frac{\partial \pi}{\partial \theta}
```

を勾配としてパラメータを更新すれば良いです。

・・・

以上です。

この係数は**Retrace**にて提案され、**Vtrace**にて方策勾配法に応用されたものです。実はこれだけで実用上ほとんど大丈夫になります。

オフポリシーの方策学習において理論上収束の保証がある**Retrace**や**VTrace**などがありますが、実用上は1ステップのみ重点サンプリングを掛ければ発散を心配しなくて良いです。

有名な論文でも、**AlphaStar**の論文では方策の学習に**UPGO**を用いていますが、**UPGO**のアドバンテージに**min(1, π/p)**が掛かっているので、問題なく学習できるという理屈になっています（※文章修正：kngwyu様ありがとうございます）。

正式なオフポリシーとして理論的保証のあるアルゴリズムを用いるべきかは場合によると考えられます。

環境に対して行動の影響力が大きく、違う手を選んだ場合方策のエピソードを打ち切るような効果をもたらすためには論文通りのオフポリシーアルゴリズムが適しています。

一方で行動がもたらす以外のノイズが大きい場合には、TD(λ)のように安定化したターゲットを用いることが良いと考えられます。なのでStarCraftにおいてTD(λ)が使われたのはたまたまではないでしょう。

自分は、ゲームを学習するアルゴリズムは、価値、方策のターゲットいずれもTD(λ)をまず第一候補に入れて使っています。もちろんmin(1, π/p)を付けてオフポリシーで。


# 時系列的なオフポリシー強化学習手法を使うには？

収益 R としてモンテカルロ収益を用いる場合は前の節の式の変更だけで良いのですが、TD(λ)やVtraceのように後々の価値出力を利用する場合にはバッチの形が変わります。

具体的には、バッチサイズ B, 特徴量の次元数 F である学習バッチの形状は通常

```math 
B \times F
```

ですが、後々の価値出力を利用する場合には

```math
B \times T \times F
```

のように時間の軸を追加します。[^1]
[^1]: 時間の軸を最初に追加した方がデータを並び順に使えるので効率が良いですね。ただしマルチGPUを使う場合にバッチ軸が最初の方が簡単に並列化できます。

そして、ネットワークの前向き計算の後に時刻が後ろの方から再帰的にλ収益やVtraceの価値推定を計算していきます。

# 追記：PPOはオンポリシー？

最初の版で「PPOのようなオンポリシー手法」と書いてしまったのですが、あれは誤りです。
**PPOはリプレイバッファを使うのでオンポリシーではありません。**

いわゆるオンポリシー手法とは、モデルの計算過程を保持した状態に対してのみロスをバックアップするものを言います。
このため、バックアップが起こる局面で選んだ手は、全てその状態のモデルで生成したものといえます。

一方でリプレイバッファを使った場合、現在のモデルより古い、もしくは別のモデルなり人間なりの行動が含まれる可能性がありますのでオフポリシーです。

問題は、**オフポリシーにも程度がある**ことです。
PPOは明確に、「**学習局面での挙動方策に近づく、離れにくい**」設計ですし、　V-Traceは離れる方向のアップデートも許可しますが、**価値の学習の停留点においては挙動方策と推定方策の平均的な方策における価値が出力される**という証明があります。

そのため、どんな挙動方策からでも、推定方策と価値を最適にできる「理想的な」オフポリシーからは程遠いです。
そのため、near-on-policy、と呼ばれたりします。
しかし現実的には、継続的にエピソードを生成し続けることでバッファ内が全体的に良い方策でのエピソードの割合が上がっていくので、実用的には十分なのです。

まとめると、オンポリシーの度合いは

```
完全なオンポリシー > nearオンポリシー > 理想的なオフポリシー
```

のように分かれていて、PPOやVTraceはnearオンポリシーに入ります。
では、本稿で解説したV-Trace系と、PPOとどちらが良いのかということですが、自分の経験ではPPOは学習がなだらかだが安定し、V-Trace系は学習が速いがたまに不安定になる、ような感覚ですが、少ないサンプルなのでそうではない場合もあるかもしれません。

最初の版が誤解によるPPO下げになってしまっていたためここに訂正します。申し訳ありませんでした。

# おわりに

ロボット制御のようなテーマではまた状況も変わってくるかと思いますが、ゲーム関係においては並列オフポリシー強化学習を使いこなせればある程度のことはできます。

もちろん、適切なリソース量を掛けることは大前提なので、スポンサー探しが第一に重要です。

起業して囲碁AIを作ったハサビス氏は偉大です。