shotgunのponderの話

出張先のホテルで寝付けなくて困ってる。

軽口叩く割にストレス性胃痛が持ち味だ。

せっかくの地酒が用意された懇親会でもほとんど呑めてない。

 

そこそこ反響のあるponderについて手の内を盛大に明かしておこうと思う。

ソースを提出しない分のお詫びも含めてね。

私がやったチューニングよりよいものが出来ると楽しい。

結論から言うと技巧2のmultiPVで挙げた候補+前探索のponderを加えたものの中から最善手からある許容範囲の手を選び上限5手を並べる。(王手局面とか2手とかになる)

そうしておいてて5つのやねうら王に各3,2,1,1,1スレッドの負荷で先行分岐探索を行っている。(二手なら4,4だったかな)

ざっくり書くとこれがshotgunの先行分岐探索(multi ponder)

ちょっと分かれば実装できそうでしょ?

 

効果のほどはニコ生の通り(私はまだ見てないが)

当初は持ち時間を使わないことがかっこいいと思ってて,PR文の中にこれを「ダニーシステム」と命名するとか書いて消した。優柔不断な主人公が云々の辺りが残骸ねww

実は本当に効いたのは相手のponderの役割を奪うことだったようだ。

これは本戦参加ではじめて感じた。かっぱさんが熱く語ってた件のひとつがこれで,かっぱさんもそういう思想の時間制御を入れているらしい。うちはもっとえげつない極振りですがw。序盤は3/8の探索力で戦うくらいのノリ。

 

で,本当はここに至る経緯が重要。(学者っぽいね)

当初ディープラーニングで候補手をリスト化してた。詳しくは山岡さんのblogを見てください。ここも本当に参考になります。ソースも出されているのですが,私は当初機械学習を習熟するのが目的だったので手順だけ参考にpythonで実装する。

分岐した先の探索がやねうら王なのは何より速いからだ。

それから・・・評価関数が複数プロセス間でメモリ共有できるので5プロセスでも評価関数部分のメモリは1個分で足りる。(これ本来自己対戦用の機能です)

もうひとつはやねうら王,option機能がゲーム中に可能です。具体的にはstopコマンドの後に「setoption name Threads value 4」とか送るとそのプロセスのやねうら王が次のgoコマンドから4スレッド使うようになります。

 

次に確認したのはponderのヒット率。打率が低いと意味がないので。

で,比較対象は技巧2クラスタで行われている浅い探索のmultiPVという発想。

技巧2は時間で切ってたがうちはどうしてもマシン内クラスタなのでもっと軽くする意味でdepth6,8,10と3種類テストしてみた。同様にやねうら王エンジン&複数の評価関数のdepth6,8,10もやってみた。

floodgateで対戦しながら・・・とか最初思ってたが,これ過去棋譜でいいんじゃないかなって過去棋譜を半年分くらい落として全局面のponderヒット率を計測した。

コーディング2日計算3日くらいの作業。結論から言って技巧2が偉い。深さはそんなに差がつかないのでdepth6でいいやとしておいた。ここでディープラーニングが消えた。

#じつはこのころ技巧人気のためにたまたまfloodgateに技巧が多かったのかもしれない。

 

ってことで,候補手を並べるのが技巧になった。pythonで作り始めたのでまぁ,やねうら王もsubprocessで呼び出してるんだから技巧もそれでいいかって落ち着いた。都合6プロセスがメインのスクリプトから呼ばれることになる。

最後はpython独自のGILの問題でうまくリソースが使えなくてイラついたが,まぁカリカリにチューニングして優勝を狙うわけでもなく極端な時間制御を実演して他の開発者にウケたらいいかくらいで思ってた。

 

python使った恩恵もあって,pythonにはデフォルトで辞書型というデータ構造を持ってて,これが定跡管理にちょうど使えた。オブジェクト指向言語なのでメモリは無駄に使ってる感じがあったけどなんとか許容範囲だった。

やねうら王型の定跡を複数管理して串刺し検索するのは簡単に実装できた。

 

「二種類の定跡を交互に参照して定跡抜ける局面を全探索する」って開発者なら何してるかわかりますよね。pythonpython-shogiで簡単に書けます。便利ツールです。

棋譜の手を順に進めて評価値が一定値以上下がる局面をリスト化する」とかも簡単です。自動感想戦できそうでしょ。

 

以上がshotgunの基本実装。ネタバレしたら一日で実装できる人もいるよね。

今からはpythonじゃなくgoとかrustでやった方がいいよw

ーーー

追記:

バージョン03および03aってのが,やねうら王のC++ソースに手を入れて上記に準ずるアルゴリズムを組み込んだもの。multiPVもやねうら王になる。置換表がスレッド間共有されるって言っても開発者しか意味わからないだろうな。レーティングは上がるんよ。floodgateでこいつが一番高かったからね。シングルバイナリでメモリ効率もいいし,使い勝手いいやつよ。03aがうちの最強エンジンと思う。

ガチ勝負ならこれをベースにチューニングするべきだった。ただ,細かい実験がしづらい上,御本尊がバージョンアップを止めないしgitの使い方はあまり分かってないのでキャッチアップする自信がなかった。プログラムをチーム開発するような経験がないのでねぇ。(ソースのマージで爆発したら困るじゃない)

まぁ,私が既に考えている強化案だけでも結構あるのよ。実装が追いつかないだけで。

実施してない数値実験も幾つもあります。お楽しみに。

#エンジョイ,コンピュータ将棋