5五将棋用連続対局サーバの改良中
今まではGA将対ssp専用で実装していたのを、Winboardプロトコルのエンジン含む複数エンジン相手に対局可能な様にしようとしています。
んで、現在はFairy-Stockfish3つ相手に対局してログ出力出来る様にまではなりました。
後はWinboardプロトコルのエンジンへの対応ですが、これはもうちょっとかかりそうです。何しろUSIとは色々違うので、まずプロトコルの理解から始めないといけない状況です。
それから、Fairy-StockfishをVC++2015でビルドして5五将棋モードで対局させるのはとりあえず成功しました。ソースの修正箇所としては、スレッド数・ハッシュサイズのデフォルト値を変更した位で、これはまぁ連続対局サーバの方で対応しても良かったんですが、楽したかったんでFairy-Stockfishのソースをチョロっと書き換えました。後、スタックサイズがデフォルト値だとStack-Overflowしたんで、64MBに増量してみました。
今後の予定は、Winboardに対応させてShokidokiとLimaもスパーリング相手に加える事ですね。
多数決合議用の、複数の評価関数パラメータセットの学習
久々の更新ですが、ちょっとだけ進展有りました。
まず、以前から何回かトライしていた「複数の評価関数を生成し、それらのリーグ戦の結果から強化学習する」という手法ですが、ようやく成功したみたいです。
以前は学習結果の各パラメータの平均値をファイルに保存しておき、実戦ではその(平均をとった)パラメータにDropoutをかけて対局していました。
ただ、せっかく学習時に複数のパラメータセットを生成したんですから、それをそのまま使った方が良いんじゃないかと考えました。
んで、現在の実装では「複数のパラメータセットをそれぞれ個別のファイルに保存しておき、実戦では各評価関数はそれぞれ異なるファイルのパラメータセットを使用する」となっています。
肝心の棋力ですが、同じタイミングで保存しておいた、平均化したパラメータと生のパラメータ8個を使った場合を比較してみました。5五将棋モードで対局相手はssp、思考時間はGA将0.1秒・ssp1秒です。
結果、平均化した場合は627勝131敗で勝率82.7%。生のパラメータの場合は988勝149敗で勝率86.9%。ほぼ確実に強くなっています。レーティングは50程度向上した様子。
パラメータの推移を見た感じだとまだ収束していない様ですので、引き続き学習させてどこまで伸びるか見てみます。
「Combining policy gradient and Q-learning」を読んで、実装する為に最低限必要な知識をまとめてみた。
前提
二人零和有限確定完全情報ゲームで、自己対局の結果からPGQ(論文の提案アルゴリズム)を用いて評価関数パラメータの学習を行う事を目的とします。
報酬は「勝ち:+1、引き分け:0、負け:-1」と設定し、終局後に報酬を与えるものとします。
方策勾配法やQ学習に関しては本エントリでは解説しませんので、適当なリソースに当たって下さい。
論文の重要な部分
まず、エントロピー正則化ありの方策勾配法を考えます。方策π・状態sに対するエントロピーHは次式です。
この時、方策勾配法の停留点*1における状況から、「方策π・エントロピーH・状態価値Vを元に行動価値Qを計算出来る」というのが最大のポイントです。
具体的には、論文の式(5)です。(一部省略して記載します。)
パラメータ更新則
方策πはパラメータθを、状態価値関数Vはパラメータwを持ちます。この時、パラメータ更新則は次式の通りです。(論文の式(14)。)
ηは第一項と第二項のバランスを取る為のパラメータで、0~1の値を設定します。は方策πに従って得られた報酬を用いれば良い様です。
で期待値を取る計算が出て来ますが、これはREINFORCEの様にサンプリング結果から計算すればOKかと。
また、は最適ベルマンオペレータで、論文中では3ページ目に記載があります。
まー要するに、通常のQ学習の目標値を求めるやり方ですね。
GA将?の実装にあたって
ここからは論文に書いてない事で、「私はこうしました」って話です。
まず、論文ではパラメータθとwは別個に持っている様でしたが、わざわざ2つに分ける必要性を感じませんでしたので、θのみにしてあります。
具体的には、方策πと状態価値関数Vは下記の通りです。
evl(s,a|θ)は「パラメータθを用いて、局面sから手aを指した後の探索結果(評価値)」、evl_qui(s|θ)は「パラメータθを用いて、局面sから静止探索をして得られた探索結果(評価値)」です。Vに関しては、報酬が-1~+1なのでVの値もその範囲に収まる様にしています*2。
メタパラメータですが、α=0.1・η=0.5が三目並べでの実験結果では最適でしたので、本将棋モードでも同様の値を使用しています。