KKPPに関する知られざること

第5回 将棋電王トーナメント決勝日の朝にこの記事を書いています。
KKPP型評価関数について、あまり知られていないこと、知っていると有利なことをざっと書いておきます。

昨日、Yorkieの作者の石田さんと軽く話しました。

やね「KKPP型で学習に成功されたって本当ですか?」
石田「バグが取りきれず、結局、普通の三駒(KPPT)で…」
やね「KKPPのコード、いまならきちんと動くものが学習部のおまけつきで、やねうら王のGitHubの最新版にありますけどね。(最近のcommitで、石田さんの開発開始時には無かったものなので、石田さんは独自に書かれたのでしょう。)」
石田「あー、そうなんですね。独自に実装していて、メモリに入り切らず、先手玉が1〜4筋にいるときは、ミラーかけてます。(これにより、テーブルサイズが5/9で済む。後手玉は81升すべてが対象。)」
やね「ミラーするコストが馬鹿にならないので、やめたほうが良いのでは。4段だけとかにすればいいじゃないですか。」
石田「4段だけってなんですか?」
やね「例えば、3段だけというは、先後の玉が双方、自陣にいるときだけKKPPにするってことですよ。その条件を満たさないときは、普通の3駒で。自陣から外に移動したときと、外から自陣に移動したときだけ、全計算になりますけど、4段なら(4段目から5段目に移動するのは実戦的には)レアケースなので無視できるかと。(やねうら王のKKPPのの実装はそうなっていて、この段数を自由に設定できるようになっている。)」
石田「へー。なるほど!」
平岡「それは気づかんかった!」
やね「マジすか。(平岡さんも気づかなかったのだとしたら、他の開発者は誰も気づいていないのかも。)」
石田「ミラーするコストが馬鹿にならないのでそのときは初手26歩に固定してました。(そうすると居飛車になり、玉は1〜4筋にはいない可能性が高いのでミラーの必要がなくなる。)」
やね「(笑) ミラーのコストと言っても玉が1〜4筋方面にいた玉が5筋に移動したときと、5〜9筋方面にいた玉が4筋に移動したときにEvalListのすべての駒のミラーが必要なだけで、そのとき以外は、(玉が1〜4筋にいるとして)DirtyPiece(移動した駒)のミラーだけで済むので、このように差分更新だけで済むから、処理コストは知れてますけどね…。」
石田「あー、そうか…」

補足情報。KPPT型の評価関数ファイルをKKPPT型評価関数ファイルに展開(等価変換)することが出来て、このときbenchコマンドのベンチマーク値は3%程度npsが上がります。1スレッド時。ただ、スレッド数を増やしたときに、CPU cacheの効率が下がるので、npsが落ちると嫌だと思い、今回の大会のやねうら王では採用していません。この展開したKKPPT型からの追加学習がうまくいかなかったというのもあります。何故うまく行かなかったのかはいまの時点ではわかっていません。詳しいことは、もう少し原因を調査して、別の記事で書きたいと思います。

KKPPに関する知られざること” への4件のコメント

  1. 初手86歩ってポナンザが佐藤名人とやった時でも入れてなかった程度には悪手という印象(評価値-300くらいの手?)なのですが、それで後手の84歩を誘って居飛車を強制してもお釣りが来る程度にはKKPPで強くなるのでしょうか

  2. 4段だけの件、昨日、会場で教えてもらうまで、さっぱり気づきませんでした(泣)
    大会終わってから、試行錯誤してみます。ありがとうございます。

    • やねうら王のGitHubにあるコード、KKPPの学習部も書いてあるのですが、どうも過学習しているのか、KPPからKKPPに展開したあと、追加学習させると弱くなるんです…。この原因がわかれば、お知らせください(´ω`)人

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です