TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

将棋AIの実験ノート:オフポリシー補正

強化学習において、サンプル効率が低いという課題の対処として、リプレイバッファを使用して過去の方策で生成したデータも学習に使用するということが行われている。
一般的に挙動方策(経験を蓄積する際の方策)と推定方策(学習する方策)が異なる場合をオフポリシーと呼ぶ。
逆に一致する場合をオンポリシーと呼ぶ。

方策勾配法などのオンポリシーの手法で、サンプル効率を高めるためにリプレイバッファを使用することは、経験的に破壊的に大きなポリシー更新につながることがある。

AlphaZeroの強化学習

AlphaZeroもリプレイバッファを用いておりオフポリシーで学習を行っている。
ただし、AlphaZeroはシミュレータ内で探索を行った結果を方策としており、いわゆるモデルベースの手法なので、オフポリシー/オンポリシーの分類は適切ではないかもしれない。

AlphaZeroでは、方策の分布を学習しており、Actor-Criticとは異なります。
分布を学習する場合には、オフポリシーでも適用可能は不明です。

dlshogiの強化学習

一方、dlshogiの強化学習は、分布を学習すると教師データのデータ量が増えるので、指し手のみを学習に使用している。
方策の学習則には、Actor-Criticを使用しており、これはオンポリシーの手法である。

オンポリシーの手法に、リプレイバッファを使用するのは問題があるのではないかと考えていたが、うまく学習できているのもあって、ちゃんと検証していなかった。
今回一度確認しておこうと思って、検証することにした。

オフポリシー補正

Actor-Criticをオフポリシーで使用するために、V-TraceやACER、PPOといったアルゴリズムがある。
ここでは実装が簡単なV-TraceとPPOを試すことにする。

V-Trace

V-TraceをActor-Criticに適用する際の方策の目的関数は以下の通り。
\displaystyle
\rho_s \nabla_\omega\log\pi_\omega(a_s|x_s) \big( r_s+\gamma v_{s+1} - V_\theta(x_s)\big) \\
ここで、
\rho_t=\min\big(\bar\rho, \frac{\pi(a_t|x_t)}{\mu(a_t|x_t)}\big)\bar\rhoは定数である。\piは推定方策、\muは挙動方策を表す。

参考:[1802.01561] IMPALA: Scalable Distributed Deep-RL with Importance Weighted Actor-Learner Architectures

PPO

PPOの目的関数は以下の通り。
\displaystyle
L^{CLIP}(\theta) = \hat{\mathbb{E}}_t \big[ min(r_t(\theta)\hat{A}_t, clip(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t) \big]
ここで、r_t(\theta)=\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}\epsilonは定数である。

参考:[1707.06347] Proximal Policy Optimization Algorithms

検証方法

強化学習を回すのは時間がかかるので、AobaZeroの棋譜を使用して検証することにする。
AobaZeroの棋譜には候補手の訪問回数が記録されているため、それを挙動方策の遷移確率に利用する。

AobaZeroの棋譜のarch000015000000 ~ arch000015090000を使用。
AobaZeroは、探索結果の行動価値が記録されていないので(最近は記録されている)、アドバンテージのベースラインは0とする。
テストデータにはfloodgateからサンプリングした943456局面(レート3500以上、50手以上の対局、30手目以降)を使用する。

検証結果

訓練損失
平均方策損失 平均価値損失
Actor-Critic 1.90775840 0.62536926
V-Trace 1.87498970 0.62457944
PPO -0.00017280 0.61246887
テスト損失
テスト方策損失 テスト価値損失
Actor-Critic 1.06661845 0.55477527
V-Trace 1.06576384 0.55451178
PPO 2854212034370635596562432.0 0.58852763
テスト正解率
テスト方策正解率 テスト価値正解率
Actor-Critic 0.40007314 0.72041744
V-Trace 0.40022049 0.72101849
PPO 0.00014841 0.67355092

V-Traceは、Actor-Criticよりも少しだけ良い値だが、ほぼ誤差の範囲である。
PPOは全く学習できなかった。


アドバンテージのベースラインに、学習時に推論した価値を使用するパターンでも試してみた。

訓練損失
平均方策損失 平均価値損失
Actor-Critic 0.75596953 0.62025761
V-Trace 0.74280808 0.62022987
PPO 0.05604221 0.61169946
テスト損失
テスト方策損失 テスト価値損失
Actor-Critic 1.10852726 0.55280487
V-Trace 1.10677386 0.55142957
PPO inf 0.59008008
テスト正解率
テスト方策正解率 テスト価値正解率
Actor-Critic 0.38780105 0.72076196
V-Trace 0.38771095 0.72095700
PPO 0.00033497 0.67275483

傾向は変わらない。


Actor-CriticとV-Traceの差がほとんどないので、訓練データを倍にしてみた。PPOは学習できないので除外。

訓練損失
平均方策損失 平均価値損失
Actor-Critic 1.75861482 0.61717799
V-Trace 1.74029188 0.61730657
テスト損失
テスト方策損失 テスト価値損失
Actor-Critic 1.02857797 0.52934007
V-Trace 1.02989807 0.52900566
テスト正解率
テスト方策正解率 テスト価値正解率
Actor-Critic 0.41769314 0.73888017
V-Trace 0.41761576 0.73889289

やはり差は誤差の範囲である。

まとめ

Actor-Criticのオフポリシー補正手法であるV-TraceとPPOを試した。
結果、Actor-CriticとV-Traceでほとんど違いは見られなかった。
AlphaZeroの自己対局では挙動方策はMCTSで探索した結果であるため、以前のパラメータで探索した結果と現在のパラメータで推論した結果で差がでにくいのかもしれない。
そもそもモデルベースなので、正確にシミュレーション可能なモデルがあればオフポリシーでも学習できそうである。

PPOはなぜか全く学習できなかった(実装の誤りの可能性もある)。

AlphaZeroと同じように分布を学習した場合についても別途検証してみたい。