要約
2つネットワークを用いて対局させても学習時間が長くなるばかりで学習高速化とか性能向上といった改善は見られなかった。
背景
個人的に、今まで手元で行ったAlphaZero学習ほぼ全てについて、最終的に得られるモデルが
- 対抗形に弱い
- 穴熊の評価がおかしい
という性質を持つことについてずっと違和感を抱いている。
初期局面を穴熊にして対局させると、先手のときはすぐ穴熊を崩すが、後手のときは穴熊を崩せない pic.twitter.com/c6ESBij7u9
— t (@tokumini_ss) 2020年4月18日
これらは要するに探索範囲が狭い(生成する棋譜が特定の戦型に偏っている)ことが原因だと考えられ、特定できていないだけで居飛車についても悪影響が出ているのではないかと思っている(たとえば未検証だがじっくり組み合う相矢倉とかも弱いかもしれない)。
探索範囲を広げるためには、複数のエージェントを学習させるという方法があると思われる。今回は単純に2つのネットワークを訓練しデータ生成はこれらを両方使って行うという手法について実験を行った。
実験
全く同じアーキテクチャのネットワークを2つランダム初期化し、それらを用いてデータ生成、学習のサイクルを行っていく。
データ生成
データ生成では実装の都合上、1回推論するごとに使うネットワークを切り替える方式で行った。1局面あたり800回探索(ネットワークでの局面評価)をするわけだが、そのうち400回はネットワークAを、残り400回はネットワークBを使う形になる。今まで1つのネットワークで自己対局していたところを交互に使うだけになるので、これによる計算量の増加はない。
本当は手番ごとに入れ替えることが理想だとは思うのだが、GPUキューに貯まる評価要求局面は手番がバラバラになり得るので難しい。愚直に実装すればできないことはないが、生成速度が落ちてしまいそうなので見送っている。
学習
学習はリプレイバッファは共通、サンプリングは別で行った。学習ステップで2つネットワークの重み更新を行うので、学習部分は計算量が2倍になるが、基本的にAlphaZero型の学習は「学習の計算時間 <<<< データ生成の計算量」となるので学習が2倍になっても総学習時間にはあまり影響がない。これは
複数のハイパーパラメータでマルチエージェント的に学習させていき、途中の評価に応じてハイパーパラメータを自動調整することでAlphaZero式の学習を高速化できるとのこと。まぁ効果はありそうな気がするが、実装するのもそこそこしんどいのではとも思ってしまうhttps://t.co/dVD98CHHoc
— t (@tokumini_ss) 2020年5月2日
で主張されているのと同じ。
実験結果
学習速度、性能などほとんど変化はなかった。オセロで探索範囲が狭い挙動が出ているかどうかは確認していないので、ゲームに依存する可能性ももちろんあるが、2つネットワークを使うことが一般に性能向上に繋がるわけではなさそう。
学習時間はほとんど増加しないと思っていたが、実際はオセロだとデータ生成部分が軽いからかかなり差が出て、ネットワーク1つだと18時間45分、2つだと27時間29分であり、約1.47倍となった。冷静に考えると教師あり学習でも0.5Mステップ回そうとするとそれなりに時間はかかるので、無視できるような量ではないか。
余談
以下余談。穴熊や、そもそも振り飛車みたいな居飛車とは大きく異なるような指し方を発見するためには、一つ一つの指し手レベルでのランダム性ではなく方針レベルでのランダム性が探索において重要そうな気がしている。それを実現する上でマルチエージェント的にやっていくというのは自然な方向に思われるが、今回みたいに雑にやって上手くいくというわけではなさそうか。もちろんオセロだったから変わらなかっただけという可能性も十分にあるが……。
マルチエージェント的なやり方をするにしても複数のネットワークを(同程度の棋力を持ちつつ)性質の異なるものとして学習させる必要がありそうだとは思っていて、全体を見て制御する主体が必要になりそう。そうなるとほぼ階層的強化学習そのものなのでは? という気もするが、良い定式化の方法を知っているわけでもない。
そもそも問題意識自体が合っているのかどうかもやや不安になるところ。AobaZeroとかは普通に後手四間飛車を指すらしいし、Miacisが振り飛車を指さないのは単にハイパーパラメータのちょっとした違いが原因だったりするのかもしれない。データ生成量が少ないまま学習を繰り返すので最初に発見した良いやり方(それは飛車先を突いていく場合が多そう)にすぐ適合してしまい、振り飛車が切り捨てられるのが早すぎるという可能性もありそうなところ。むつかしい。