流行りの機械学習をフル活用して棋力スカウター開発してみた話(前編)

歴代の名人と今の名人はどちらが強いのか。将棋が強くなる上で必要な力は何であるか。女流棋士は此処数年でどのぐらい強くなったのか。アマチュアトップとプロの実力差はどのぐらいなのか。

 

こうした問題の答えを得ることは、将棋AIに期待されている大きな仕事の1つです。人間であれば手の評価にブレが出てしまったり、そもそも巨大な棋譜のデータを読み切る事自体が困難であるという問題があります。しかし、コンピュータであれば大量のデータを均一な品質で評価することが可能です。しかも、幾つもの技術的な幸運により昨今の将棋AIは1秒未満の計算でもかなり正確な(ほぼ全ての人間に余裕で勝ち越せるレベルの)盤面評価を行うことが出来ます。

本シリーズでは令和時代の機械学習技術(?)を総動員してできるだけ少ない棋譜で正確に棋力を推定できるエンジンの開発を目指していきます。前編では先行研究の検証を通じてデータの可視化の重要さをお見せすると同時に、勝率ベースの手の評価に潜む落とし穴について検証します。

 

【データ収集と解析方法】

解析はwebから集めた人間の対局棋譜を対象としています。思考エンジンにはやねうら王、評価関数にはorqha、解析はノード数400000で上位10手の評価値を出力しています。

 

【悪手率(評価値の差分)】

将棋AIによる盤面評価、棋力評価は長い研究の歴史があります。特に有名なものとしてはYSS、AobaZeroの開発者である山下氏の研究があります。この研究ではBonanzaから計算した悪手率を用いて、大山15世名人と羽生九段の棋力を予測しています。

この研究ではプレイヤーの実力はAIが導き出した最善手を指したときの評価値と、実際に指された手の評価値の差分の平均(厳密には初手40手を削ったり、形作りを除去したりしている)を棋力の指標に用いています。本手法で将棋倶楽部24のレートをある程度の精度で予測できているとのことなので、まずはこれを検証します。

f:id:qhapaq:20200229220511p:plain

横軸はプレイヤーのレーティング、縦軸は評価値差分の平均(高いほど強い)

先行研究と同様にレートの上昇に応じて概ね評価値の差分が減っていることがわかります。先行研究に比べレート1000〜1500付近での悪手率の増加が著しくなっていますが、これは計算条件の違い(形作りの定義が先行研究から定まりきらなかった and 実装が面倒くさかったので手数のフィルタだけにしてる)や評価エンジンの違いと思われます。

しかし、評価値の差分はレーティングの指標としては不安定な側面があります。下図は1つの対局で得られる評価値差分平均から推定されたレートのヒストグラムです(図面上部に書かれているのが正しいレート、横軸が1つの対局から予測されたレート、縦軸がその分布です)

f:id:qhapaq:20200229221238g:plain

レート分布のアニメーション

評価値差分は大量の棋譜の平均で見れば良い指標であると言えますが、ヒストグラムでみるとコブが二つあることがわかります。レートが1000前後のプレイヤーでも時折レート3000前後のスコアが出ているのは相手が先に致命的なミスをした結果、ミスらしいミスをする前に対局が終わってしまったことを示唆しています。

 

【悪手率(勝率に変換したもの)】

評価値の差分ベースで悪手率を計算すると、評価値が3000の局面から評価値を500損するのと、評価値が0の局面から評価値を500損するのを同じレベルの損失であるとみなしてしまいます。

将棋ソフトの評価値と勝率の関係はシグモイド関数に似ていることが実験的に知られているため(下図参照)、評価値が0から-500になるのは3000から2500になるよりも損と言えます。

f:id:qhapaq:20200229222011j:plain

例:elmoでの評価値と勝率の関係図。横軸が評価値、縦軸が勝率、バーは分散

ならば、評価値の差分の代わりに、評価力計算できる勝率の差分の平均を取ったほうが良いのではないか。と思うのは割と自然な発想と言えます.....が

f:id:qhapaq:20200229222324p:plain

横軸はレート、縦軸は勝率ベースで見た差分の平均(高いほど強い)

 

f:id:qhapaq:20200229222451g:plain

レート分布のアニメーション for 勝率差分

ご覧の有様です。特にレート1000前後の領域で勝率差分平均が殆ど変わっていないことがわかります。高レート領域でのグラフについても評価値の差分の方が滑らかであり、棋力の指標として扱う際には評価値は勝率に変換しないほうが良いことが示唆されました。これは筆者にとっても少し意外でしたが、互角の局面であろうと優劣がついた局面であろうとミスの価値は変わらないということでしょう。

 

【後半の予告】

此処までの研究で、意外にも(?)評価値を勝率に変換しないほうが棋力を見る上では適切であるという説が得られました。昨今の将棋中継では評価値を勝率に変換したものもありますが、どうやら棋力を見る上では素の値のままのほうが良さそうという大胆な仮説にも繋がるような面白い発見であると思います。

さて、後編ではKaggleでおなじみの手法を駆使してレートの分布をより美しくしていきます。何処まで綺麗にできるかは今後の頑張り次第ですが、現状フタコブを消すところまでは成功しています。

f:id:qhapaq:20200229231321g:plain

Kaggleで出てくるおなじみの技術を活用しまくった結果(仮)

ご期待下さい!