GA将?開発日記~王理のその先へ~

ネタ勢最強を目指して絶賛開発中。

PGQの実装、一通り完了

arxiv.org

 上記論文を参考にして、PGQ*1を実装。将棋モードではαβ探索と組み合わせて動く様にしてみました。

 論文との違いは以下の様な感じです。

  • DNNではなく線形の評価関数を用いる。
  • Replay Bufferを使用しない。
  • 式(14)の第1項と第2項を同時に学習する。

 で、αとηという2つのメタパラメータを設定する必要があるのですが、現在は三目並べモードで色々な設定を試して、最適値を探っている所です。

 それと、5五将棋モードで学習用マシンに投入。こっちは、αとηはそれぞれ0.1・0.5でやってます。

 5五将棋モードでしばらく走らせて、上手く動く様でしたら本命の本将棋モードに移行します。

*1:方策勾配法とQ学習を組み合わせたアルゴリズム

思考時間制御の修正案

 先日書いた、合議での票の割れ具合に応じた思考時間制御の問題点ですが、解決策が見つかったのでメモ。

 つらつら書くより擬似コードの方が分かりやすいかと思うので、まずそれから。C++風の構文です。

// PVには静止探索の読み筋も含むので、長さはバラバラ
各クライアントからPVを取得する; 

const int minPvLength = 取得したPVのうち、最も短いものの長さ;

// 局面の一致具合の最大値
int maxAccordCount = -1;

for( int d = 1; d <= minPvLength; d++ ) {

  // この値は1以上クライアント数以下になる
  const int firstMajorityCount = d手先で最も多く現れた局面の出現回数;

  // 全局面が同一なら、この変数は0になる
  const int secondMajorityCount = d手先で二番目に多く現れた局面の出現回数; 

  // 必要なら最大値を更新
  maxAccordCount = max( maxAccordCount, firstMajorityCount - secondMajorityCount );

}// for(..d..)

// ここから先で、maxAccordCountに応じて思考時間制御を行う

 まー要するに、PV中の局面を順に見ていって、最も出現回数の差が大きかった部分(=最も局面の一致した部分)の一致具合をベースに、思考時間制御をしようって事です。

 例えば、「7手先で全局面が一致したから、現局面での思考時間は短くていいかな」とか「minPvLengthまで探しても局面がバラバラだから、現局面では長めに思考時間を設定しよう」とかやる感じです。

 多分これで上手く問題解決するはずなんで、選手権までには実装します。

UEC杯の振り返りと今後の予定

振り返り

 UEC杯ですが、GA将?は大きなトラブルは無く、無事指し終える事が出来ました。強いて言えば、2日目開始前にPCのコンセントが半分抜けかかっていて、突然電源が落ちる事があった位ですかね。まぁ、これも対局前に気付いたんで、大きな問題にはなりませんでした。

 棋譜とかログとかの分析はまだしていませんが、負けた将棋(対Shokidokiと対Fairy-Stockfish)を覚えている範囲で検証してみました。

対Shokidoki

 まずShokidokiですが、かなり広くて深い定跡を持っています。GA将?と当たった時は、20数手と45手程度まで定跡でした。

 なんで、Shokidokiの定跡を抜けた段階で、形勢はほぼ互角で残り時間がGA将?6~7分・Shokidoki 20分とかって感じでしたね。読みの深さ的にはShokidokiはGA将?と大差無い感じでしたし、評価関数もやや不正確なんじゃないかと思います*1ので、定跡にやられた感が半端なくあります。

 今回の大会では、初手から4四金4五角2五飛*2とした形が結構現れましたが、Shokidokiの定跡は当然その形も入っていました。しかも、玉が敵陣付近まで上がる展開まで定跡内でしたので、どんだけ深いんだと。

 大会の棋譜が公開されたら、Shokidokiの負けた対局を見て、どういう展開が良いのか分析する必要が有りそうです。

対Fairy-Stockfish

 次にFairy-Stockfish。ひたすら探索が速かったです。PVの長さで言えば、GA将?の1.5倍は行っています。

 ただ、序盤で飛車をぶった切って攻め込もうとして、それが敗着になった対局があった様ですので、評価関数の精度的にはつけ込むスキが有りそうな感じです。

 GA将?対Fairy-Stockfishでは、中盤まではほぼ互角だったのが、ジリジリと差を付けられてそのまま押し切られた感じでした。

 なんで、こちらの手としては評価関数の精度を更に上げてそっち方面で勝負するか、探索ルーチンの改良をして読みの深さを互角まで持って行くかの二択になるかと思います。

その他全般的に

 broaden_55の中屋敷さんや他の方にも指摘されたのですが、GA将?は序盤に時間を使いすぎる傾向がありました。

 今回のGA将?は8クライアントで合議を行い、票の割れ具合に応じて5秒・60秒・120秒の3段階で思考時間を決めていました。

 序盤は「現局面での指し手がクライアント毎に違うけど、PV通りに進めばどの手でも同一局面に合流する」というケースが有るので、そういう場合に無駄に長考してしまったのが原因かと思います。

 んで、例えば「序盤は最大10秒までしか考えない」とかってのも一つの手ですが、そういうヒューリスティックは極力避けたいです。

 なんで、「各クライアントのPVの10手先で同一局面に合流するか」で思考時間制御をするとか、そういうロジックを組み込みたいです。

 あと、先後同型になってお互い相手の出方待ちの局面が結構あったので、そういう場合に積極的に動いていける工夫もしたいですね。

 これは、強化学習時に割引率を適切に設定してやれば、短手数で勝てば割引報酬が大きくなるので、それで解決出来そうな気がしています。

来年に向けて

やりたい事

 まず、スパーリングの相手がsspでは正確な棋力が測れなくなった感じがあります。という事で、Fairy-StockfishやShokidoki・Lima等の公開されている強豪ソフト相手に連続対局出来る環境を構築したいです。

 それから、棋力の向上は主に評価関数の精度向上と探索ルーチンの全面見直しで行う予定。

 評価関数については、PGQという強化学習アルゴリズムを実装出来る程度には理解した*3ので、これを使って何とかしようと思います。

 探索は、全幅探索ベースでゴリゴリ枝刈りするか、実現確率探索を実装するかの二択ですが、こっちはまだ迷っています。まぁ、後1年あるので両方やってみて、強くなった方を採用でも良い気がしています。

多分やらない(やれない)事

 定跡の自動構築。Shokidokiと同じ土俵で戦っては勝ち目が無いと思いますので、これには手を出さないつもりです。仮にやるとしても、序盤10手に限定するとかその程度になるかと。

 それから、深層強化学習も興味深くは有るんですが、それは他の人に任せて、私は線形の評価関数+αβ探索で行く予定。

最後に

 近日中にUEC杯バージョンのGA将?を公開予定です。

 公開出来次第、ブログで告知しますので、しばしお待ち下さい。

*1:時々Shokidokiの評価値グラフが激しく上下していました

*2:4五角は3四角経由

*3:理論面はまだ不十分ですが…

UEC杯終了!

 先程無事帰宅し、GA将?のUEC5五将棋大会は無事終了しました。家に帰るまでが大会です。

 主催・運営の方々ならびに参加者の皆様には大変感謝しています。ありがとうございました。

 さて、結果ですが、優勝はFairy-Stockfish。2位はGA将?・Nyanpass ・Shokidoki が並びました。詳細に関しては公式サイトをご覧下さい。
 
  第11回UEC杯 in GAT5五将棋大会 - 5五将棋 portal

 GA将?の事は後で改めて書きますが、まず一言。大会後の懇親会でも喋らせて貰いましたが「将棋固有の知識がほとんど入っていないFairy-Stockfishに負けて、凄く悔しいです!」

 Fairy-Stockfishの指し手ですが、異次元レベルで強いって程では無い感触でした。実際、Nyanpassさんに2敗、Limaさんに1敗していますし。なんで、多分1000局やれば今のGA将?でも2~3割は勝てるんじゃないかと。

 ソースはGithubで公開されているので、早速ダウンロードして対局させてみます。
 
github.com

 という訳で、皆さんお疲れ様でした~!!!

明日開戦!!

 明日16時からUEC5五将棋大会開催です。今年は優勝狙いたいので、がんばってきます(主にGA将?がw)。

 

 まぁ、今となっては私に出来るのはオペミスしない様気を付ける事位ですかねぇ。

VS ssp(5五将棋モード・ハンディキャップマッチ)で最高勝率を更新!

 Reflection-Play(反省会モード)を実装して76万局経過後のパラメータ。787勝108敗で勝率87.9%。あっさり最高記録を更新してしまいました。

 この調子だと、そのうち勝率が90%超えそうなんで、ハンデの与え方を変えないといけないかも。GA将の方は全幅3手+静止探索に限定するとかでも良いかな?