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

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

Reflection-Play(反省会モード)は効果無しとの結論に至った

 以前Reflection-Playを有効にして強くなった事があったんですが、これはReflection-Playの効果では無く、単に運が良かっただけみたいです。

 という訳で、今日からは本命の本将棋モードでの学習に着手します。

 評価項目を駒割+PPT+王将の移動可能範囲に限定したんで、1ヶ月有れば収束してくれないかなぁ。

Winboardプロトコルの解析、ちょっと進んだ

 Winboardエンジンの標準入出力を覗き見してログファイルに保存するプログラムを作って、それを参考にプロトコル解析してみた。

 んで、現状ではShokidokiとLimaを起動して、5五将棋モードで対局させられる程度には解析出来た(はず)。ちゃんと強い設定になっているかどうかは謎だけど。

 という訳で、選手権後に自作の5五将棋対局サーバをWinboardプロトコル対応させる目処はつきました。

 これで、Fairy-Stockfish・Shokidoki・Limaの3ソフト相手に連続対局させる事は可能になりそうです。

川中島の戦いじゃないんだから…

13:56:26 @ core::rl::GameAggregator::aggregate() > 2200局終了
13:56:26 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
13:56:26 @ core::rl::GameAggregator::aggregate() > |   |   |   |   |   |v歩|   |   |^と|
13:56:26 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
13:56:26 @ core::rl::GameAggregator::aggregate() > |v香|v桂|   |^杏|   |   |   |   |   |
13:56:26 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
13:56:26 @ core::rl::GameAggregator::aggregate() > |v歩|^龍|   |   |   |v桂|   |   |v歩|
13:56:26 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
13:56:26 @ core::rl::GameAggregator::aggregate() > |   |   |v歩|   |   |v王|^歩|   |   |
13:56:26 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
13:56:26 @ core::rl::GameAggregator::aggregate() > |   |^桂|   |   |v歩|^金|   |   |   |
13:56:26 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
13:56:26 @ core::rl::GameAggregator::aggregate() > |   |^歩|^歩|   |   |^王|   |   |^歩|
13:56:26 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
13:56:26 @ core::rl::GameAggregator::aggregate() > |^歩|   |   |v龍|^角|   |v金|^歩|^香|
13:56:26 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
13:56:26 @ core::rl::GameAggregator::aggregate() > |^香|   |   |   |   |   |   |   |   |
13:56:26 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
13:56:26 @ core::rl::GameAggregator::aggregate() > |   |v角|   |v銀|   |vと|   |   |   |
13:56:26 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
13:56:26 @ core::rl::GameAggregator::aggregate() > 歩,香,桂,銀,金,角,飛,
13:56:26 @ core::rl::GameAggregator::aggregate() >  3, 0, 0, 2, 0, 0, 0,
13:56:26 @ core::rl::GameAggregator::aggregate() >  2, 0, 1, 1, 2, 0, 0,
13:56:26 @ core::rl::GameAggregator::aggregate() > 手番:後手
13:56:26 @ core::rl::GameAggregator::aggregate() > 手数:131

 前線まで王将が出張ってく必要、無くない?

第11回UEC杯5五将棋大会 in GAT2019版のGA将?を公開しました

 第11回UEC杯5五将棋大会 in GAT2019版のGA将?を公開しました。

 下記URLのからダウンロード可能です。動作環境や使い方に関しては、ZIPフィアル内のReadMe.txtをご参照下さい。

 ZIPファイルへの直リンク:
  https://drive.google.com/open?id=1mOWW2AYmJ554KMsM8XbpHsCSKd_Fa6ik

 GA将のウェブサイト内:
  http://gasyou.is-mine.net/archive/index.html

 また、何か問題が有りましたら、お手数ですが本エントリのコメント欄もしくはメール・Twitter*1でご連絡頂けると幸いです。

# 2019/03/14 15:30現在、公開の準備中です。10分ほどで公開完了予定です。

 2019/03/14 15:41に作業完了しました。

# 2019/03/15 15:42 AVX2命令をサポートしていないCPUで動作しない可能性が有りましたので、ZIPファイルを差し替えました。
# 問題が発生している方は、お手数ですが再度ダウンロードして頂けないでしょうか。動作している方に関しては、再DLの必要は有りません。

*1:アドレス・アカウントはReadMe.txtに記載してあります

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まで探しても局面がバラバラだから、現局面では長めに思考時間を設定しよう」とかやる感じです。

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

選手権までの開発スケジュール(案)

  • 3月中:PGQの実装&アピー文書書く
  • 4月頭~:評価関数パラメータの学習(4月20日頃までに完了させる)
  • 4月20日~:思考時間制御のデータ収集&設定を決める

 ギリギリ、だなぁ。