TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

第32回世界コンピュータ将棋選手権 結果報告

5/3~5/5に開催された第32回世界コンピュータ将棋選手権に参加しました。

HEROZチームとして、「dlshogi with HEROZ」というプログラム名でエントリしました。

大会の概要

世界コンピュータ将棋選手権は、1990年より毎年開催されている歴史のあるコンピュータ将棋の大会です。
今回は32回目の開催で、51チームが参加しました。
第1予選、第2予選を通過した上位8チームで総当たりのリーグ戦で決勝戦が行われました。

大会の結果

決勝では1回も負けることはなく、優勝という結果になりました。
第32回世界コンピュータ将棋選手権 決勝

ソフトの強さは毎年強くなっており、上位ソフトの強さは拮抗しており決勝に残るだけでも難しい状況でした。
優勝の可能性はあると考えていましたが、決勝に残るチームでの勝率の差は10%程度だと考えていたので、1回勝負では運で決まる要素も大きいと思っていました。

優勝できたのは、望外の結果です。

今大会の注目ポイント

従来型の探索方法にニューラルネットワークの評価関数を使ったNNUE系の将棋ソフトと、ディープラーニング系の将棋ソフトのどちらが勝つのか関係者が注目していたポイントになります。

昨年の大会の時点で、ディープラーニング系の将棋ソフトが優勝するのではという予測がありましたが、昨年まではまだNNUE系に及んでいませんでした。
ただし、昨年の世界コンピュータ選手権の前に開催された電竜戦では、ディープラーニング系の将棋ソフトGCT(dlshogiライブラリ)が優勝していました。

世界コンピュータ選手権は、持ち時間が電竜戦より長く、長い持ち時間ではディープラーニング系の将棋ソフトよりNNUE系が有利だったのではという見方がありました。
低レーティング帯では、その傾向があることを確かめています。
ただし、高レーティング帯では持ち時間のその影響は小さくなるため、モデルの精度が勝負だと考えていました。

チームの役割分担

今大会ではHEROZの将棋AI開発者で、一つのチームとして参加しました。
主な目的は、HEROZ社内の計算リソースを分け合わずに集中するためでした。

dlshogiの開発、強化学習、定跡作成は私が行い、チームメンバに計測を手伝っていただいたり、大会に向けた作戦の意見を伺ってそれを反映しました。

今大会の工夫

モデルの精度

モデルの精度が最重要と考えていましたので、秋の電竜戦が終了後まずはモデル精度に注力しました。

dlshogiでは、初期局面集から自己対局を行って教師データを生成していますが、これまでは大量に用意した初期局面集から開始局面を選択していましたが、この方法では序盤よりも中・終盤が多くなるため、序盤の精度が不足していました。

floodgateの棋譜に出現する8手目までの局面から開始局面を選択し、一定の手数までは最善手の評価値(勝率)から閾値の範囲にある手を確率的に選択して自己対局を行うようにしました。
こうすることで序盤の局面ごとの勝率をモデルに反映させることができると考えました。

モデルサイズ

電竜戦ではResNetの15ブロック224フィルタのモデルを使用していましたが、15ブロックのモデルが強くならなくなったため、途中で20ブロックに移行しました。

モデルサイズを大きくすることでNPSが低下するため、精度が上がっても強くならないことが懸念でしたが、自己対局と事前探索による定跡作成では精度が高い方が有利であるため、20ブロックに移行して、大会向けには15ブロックを使用することも考えていました。

結局、20ブロックの方が精度、強さともに15ブロックを上回ったため、大会でも20ブロックのモデルを使用しました。

定跡作成

dlshogiは、アピール文章にある方法で、事前に高ノード数で探索した手を定跡としています。
定跡作成時の相手側指し手は、floodgateの棋譜の出現頻度や、dlshogiで探索した際の子ノードの訪問回数から確率的に選択し、大会での出現確率が高そうな手順をより深く作成するようにしています。

ただし、どの戦型を採用するかランダムプレイありのdlshogiで連続対局を行い、その勝率を見て決めて、自動生成した定跡を手動で数局面だけ修正しています。

dlshogi同士の対局では戦型は角換わりになりますが、上記計測で先手勝率の高かった相掛かりを採用しました。

定跡の並列生成

定跡を幅広く、深く作成するため、複数マシンで並列で生成しました。
相手の指し手を確率的に選択しているため、並列でも別々の局面を検討して作成することができます。
他ノードで作成した情報を共有した方が効率が上がるため、定期的に定跡をマージする機能を実装しました

定跡に欠陥がないか検証

高ノード数で探索しても、何十手も先にあるトラップを発見することはできないため、負ける手順に嵌る場合があります。
そのため、作成した定跡に対して、dlshogiのランダムプレイありで連続対局を行い欠陥がないか検証しました。
欠陥のある手順は、その手順にならないように定跡を手動で修正しました。

修正前の定跡も大会での予備として、残しておきました。
これは大会でも役に立ちました。

Stochastic Multi Ponder

今大会はチームで参加したことにより、大会でマシンリソースをすべて利用できるようになりました。
マシンリソースを有効活用するため、クラスタ構成にすることを検討しました。

MCTSのルート並列化でクラスタ構成にすることを以前に試した際は成果がでなかったため、実装が容易で、ほぼデメリットがないMulti Ponderによるクラスタ構成としました。

Multi Ponderは、第5回電王トーナメントでshotgunが採用した手法で、相手の指し手を複数予測して、並列でPonderを行う手法です。
http://id.nii.ac.jp/1001/00199872/

shotgunで実装されていたMulti Ponderでは、技巧2のMulti PVの結果を利用していましたが、dlshogiでは相手番で相手局面を探索するStochastic Ponderという手法を実装しているため、ほとんどの場合、相手局面でのゲーム木が展開済みで、ルートの子ノードの訪問回数を参照することで、有望な予測手をN手取得することができます(ゲーム木が未展開の場合は、方策ネットワークの推論結果を使用)。

そこで、クラスタの親となるノードで、Stochastic Ponderを行い、その結果を利用してMulti Ponderを行うようにしました。
予測したN手以外の手が指された場合、Stochastic Ponderでも並列に探索を行っているため、Multi Ponderを使用しない場合と遜色のない手を指すことができるため、採用するデメリットはほぼないと考えました。

ただし、探索するノードが分かれることで、前回探索したノードの再利用ができなくなる場合があるため、ponderhitした場合、次の局面の指し手予測の第一候補をそのponderhitしたエンジンに割り当てることで、前回の探索結果を再利用されやすいようにしました。

大会では、親1台と子ノード8台の構成としていました。
正確には集計していませんが、ほとんどの局面でponderhitしており、定跡を抜けた後も0秒指しが続いていました。
相手が時間を使わなかった場合、一定以上は思考するためそこで初めて時間を使うという状況でした。

効果は計測できていませんが、終盤に時間を使えるようになったことで、ディープラーニング系の弱点と言われている終盤で読みが浅くなることによる読み抜けが防げていたと考えています。

まとめ

2017年に開発を始めてから目標としていた世界コンピュータ将棋選手権で優勝できたことで、一旦目標を達成できたという思いです。
dlshogiの改良を続けてきた苦労が報われてよかったです。
今後は、同じ手法の延長線で開発を続けるよりは、人間の将棋の学習に使えるようにすることや、ブレークスルーを起こせるような新たな手法を試すことに注力したいと思っています。

運営の皆様、参加者の皆様、3日間大変お疲れさまでした。