機械学習周りのプログラミング中心。 イベント情報
ポケモンバトルAI本電子書籍通販中

DNNの方策に従来型エンジンのbestmoveをブレンドする 実装編 part03(終)【コンピュータ将棋】

前回、dlshogiの方策関数にelmoの読み筋をブレンドする実験の結果を示しました。dlshogi同士でこの改造の有無を比較すると改造したほうが強くなるのですが、対戦相手としてelmo単体(dlshogiから呼び出すのではなく、elmoを普通に対局エンジンとして使用する)と比較すると若干弱くなっているという結果でした。dlshogiからelmoを呼び出す場合も、elmo単体の場合もelmoの評価関数が全く同じものだったので、これを変えた場合の比較を行います。ただし、elmoですべてのCPUコアを使うとdlshogiよりかなり強いため戦力差を測りにくい状況となっていたため、スレッド数を下げて強さの均衡を図りました。

今回は、elmoの評価関数としてNNUE型(WCSC29版)とKPPT型(WCSC27版)の2つを用いることで、評価関数が完全一致することによる悪影響の可能性を解消することとしました。まずは、dlshogiと組ませる評価関数を変えた場合の結果を示します。前回提示した結果も含まれます。

elmo(xT,y)は、xスレッド、評価関数yの設定を示します。無改造dlshogiは、電竜戦バージョンではなく実験コードの分岐元となったcommit cc722f5を私の開発環境でビルドしたものです。DNN評価関数はGCT(電竜戦2020)です。dlshogi+yは、dlshogiからelmoを呼び出して読み筋を得る場合にelmo内で使用する評価関数がyであることを表します。

測定対象 基準 勝-負-分
dlshogi+NNUE 無改造dlshogi 226-162-12 (58.0%)
dlshogi+KPPT 無改造dlshogi 55-41-4 (57.0%)
dlshogi+KPPT dlshogi+NNUE 43-52-5 (45.5%)
無改造dlshogi elmo(8T,NNUE) 122-369-9 (25.3%)
dlshogi+NNUE elmo(8T,NNUE) 68-227-5 (23.5%)
dlshogi+KPPT elmo(8T,NNUE) 24-74-2 (25.0%)

無改造dlshogiとの対局においては、dlshogiと組ませる評価関数がNNUEでもKPPTでもほとんど差はないようです。dlshogi+NNUEとdlshogi+KPPTの直接対局では、NNUEのほうが若干強い可能性があります。一方で、elmoとの対局では、dlshogi+KPPTのほうがdlshogi+NNUEよりわずかに強い可能性が残ります。

elmoが強すぎるため、elmo単体のスレッド数を変えた場合の強さを示します。

測定対象 基準 勝-負-分
無改造dlshogi elmo(1T,NNUE) 56-40-4 (58.0%)
無改造dlshogi elmo(2T,NNUE) 34-64-2 (35.0%)
無改造dlshogi elmo(4T,NNUE) 16-84-0 (16.0%)
無改造dlshogi elmo(8T,NNUE) 28-68-4 (30.0%)
無改造dlshogi elmo(1T,KPPT) 71-26-3 (72.5%)
無改造dlshogi elmo(2T,KPPT) 50-48-2 (51.0%)
無改造dlshogi elmo(4T,KPPT) 34-64-2 (35.0%)
無改造dlshogi elmo(8T,KPPT) 44-56-0 (44.0%)
elmo(1T,NNUE) elmo(1T,KPPT) 221-77-2 (74.0%)

一貫して、elmoの評価関数としてはNNUEのほうが強いという結果です。無改造のdlshogiと強さが均衡するのはelmoが1~2スレッドの時のようです。elmoのスレッド数をあえて下げないときの設定として8を設定していましたが、4のほうが強いようです。物理コア4コア、ハイパースレッディングなしの環境ではこれが最適のようです。従来型エンジンの測定に慣れておらず、「物理コア数の2倍に設定する」という説明を盲目的に使用してしまっていました。

elmoを1スレッドに固定し、評価関数の組み合わせを変えて比較しました。dlshogiからelmoを呼び出す際のnps低下の影響を考慮するため、elmoを呼び出すが結果を無視する場合も試しました。dlshogi+0%と表記しています。

測定対象 基準 勝-負-分
無改造dlshogi elmo(1T,NNUE) 56-40-4 (58.0%)
dlshogi+0% elmo(1T,NNUE) 55-44-1 (55.5%)
dlshogi+NNUE elmo(1T,NNUE) 51-47-2 (52.0%)
dlshogi+KPPT elmo(1T,NNUE) 56-43-1 (56.5%)
無改造dlshogi elmo(1T,KPPT) 71-26-3 (72.5%)
dlshogi+0% elmo(1T,KPPT) 76-23-1 (76.5%)
dlshogi+NNUE elmo(1T,KPPT) 67-33-0 (67.0%)
dlshogi+KPPT elmo(1T,KPPT) 68-31-1 (68.5%)

ブレンドによって勝率が低下しているようです。dlshogi+0%は無改造dlshogiより純粋にnpsが低下しただけですが、elmo(1T,KPPT)に対する勝率が若干上がっており原因不明です。dlshogiの改造前後の直接対決ではブレンドしたほうが強くなるものの、elmoに対しては若干不利になるという結果でした。深層学習系の将棋エンジンがトップを争う状況であれば、今回の手法で少し優位に立てるかもしれないということになります。対戦相手によって手法の有効性が異なるという結果に対する仮説として、(1)dlshogi同士では相手の見落としを咎めることで有利になる可能性があるが、elmoに対してはdlshogi側のミスは減るが決勝打にはならない、(2)深層学習モデルの棋風が発揮されるのを阻害してしまっているという可能性がありますが、これらを実証する方法は現状思いついていません。棋風などについて詳しい方なら検証できるかもしれません。

手元の環境・知識でできそうな実験は終わったので、本連載はここで終わりとします。最後に、今回実装したソフトの動かし方を記事にします。