将棋が強くなりたいならとにかく詰め将棋をやれ仮説

「将棋がどうやったら強くなるか」は将棋指しにとって長年の議題であると言えましょう。将棋が強くなる方法論にフォーカスした考察は詰め将棋や戦型の解説本に比べれば数は少ないものの、昭和から令和まで続く一大コンセプトになっています。

 

将棋の勉強方法として最も長く親しまれているのは詰め将棋でしょう。多くの詰め将棋本が棋力向上を謳っていますし、今最も熱い棋士である藤井聡太七段も詰将棋解答選手権を5連覇中であると同時に、詰め将棋に立脚した終盤の正確さに定評があります。

 

一方で、詰め将棋が棋力向上に本当に役に立つかについては、長らく懐疑的な意見もでています。最近の有名な記事でいえば若手強豪の一人である増田六段がマイナビのインタビューで挙げた「詰め将棋意味ない説」あたりが解りやすいです。

 

book.mynavi.jp

 

詰め将棋が意味があるのか、ないのか。はたまた、将棋は終盤勝負なのか、序盤や中盤の作戦勝負なのか。記事を調べれば調べるほど頭がこんがらがるこの問題を、今回はコンピュータに聞いてみたいと思います。

 

【解析方法】

インターネット対局の棋譜に対して、棋力別、局面の進行度別にコンピュータ将棋を用いた手の評価を行いました。各盤面でコンピュータが導き出した最善手の評価値と、実際に指された手の評価値の差分を悪手度とし、棋力毎にどういった局面で悪手を指しやすいかを評価してきます。

 

【悪手度とレーティングの相関】

f:id:qhapaq:20200709085927p:plain

 

横軸が段位から推定されるレーティング(強さ、右に行くほど強い)で縦軸は悪手度(上に行くほど悪手が少なくて強い)です。初手から40手目まで(序盤)、40手目から80手目まで(中盤)、80手目以降(終盤)の悪手度をプロットしたものです。

 

棋力はレーティング1500ぐらいでアマ初段、レーティング3000を超えるとセミプロ〜プロと言われています。

 

さて、このグラフを見るとアマ初段ぐらいまでは序盤の悪手度が高いことが解ります。初心者のうちは序盤の重要な定跡を覚えておらず、序盤で大ポカをしてしまう危険があることを示唆しています。多くの戦型解説書が「アマ初段ぐらいまで」をターゲットとしてるのは極めて理にかなってると言えましょう。

 

中盤、終盤の悪手度を比べると、中盤は棋力向上に対して改善が緩やかなのに対し、終盤は急激に良くなっていくのが解ります。特に注目するべきはプロレベルになってくると、中盤の悪手度は終盤の悪手度とほぼ並ぶ点です。増田六段がインタビューで述べてた「詰め将棋は意味ない」というのは「詰め将棋は(プロレベルになって以降は終盤よりも中盤のミスのほうが響くことが多いので相対的に)意味ない」ということだったのかも知れません。

 

【詰め将棋で上がる勝率は1〜2割?】

さて、プロレベルの人間を除けば将棋のミスの最も大きな部分が終盤にあることが示唆されました。では終盤における詰め将棋の重要度はいかほどなのでしょうか。本稿ではこれを「詰め将棋が完璧なら勝てた対局の割合」を用いて評価していきます。

より具体的には、相手玉に詰みがある局面で手を間違えて自分が不利(評価値-2000以下)な局面にしてしまった対局 + 自分が有利な局面(評価値+2000以上)で手を間違えて自玉が詰みになってしまった対局の割合を段位毎にプロットしていきます。結果がこちら(横軸がレーティング、縦軸が詰め将棋が完璧だったら勝てた試合の割合)。

 

f:id:qhapaq:20200709090808p:plain

 

驚くべきことにも(?)アマ数段レベルに至るまで、詰め将棋が完璧ならば勝てたであろう試合は1割程度あるという予想が得られました。

 

この勝率変化をどう捉えるかは人次第なところではあると思いますが、棋譜ビッグデータ解析(?)をする限りでは、「プロ級でない限りは詰め将棋をとにかくやれ」が結論のようです。

角換わりの銀の行き場のナッシュ均衡

本稿はQhapaq Research Lab棋譜検索ツールの宣伝記事です。

 

今では序盤研究のお供としても活用されるようになったコンピュータ将棋ですが、コンピュータ将棋同士の対局での序盤研究では長らく勝率ベースの定跡作成が用いられています。高精度な昨今の評価関数でも序盤の評価値の微妙な差は見分け難いので、沢山戦わせて勝ちやすい戦型を選ぼうというわけです。

ではここで問題、居飛車角換わりには棒銀、腰掛け銀、早繰り銀がありますが、一番勝率が高いのはどれでしょう.....?

 

というわけで実際に検索してみましょう。QRLでは将棋ソフトのレート測定に用いた棋譜のデータベースがあります。そしてそのデータベースでは様々な戦型を検索することが出来ます。角換わりの棋譜数を戦型別に検索することで勝率の高い戦型を探すことが可能です。

 

QRL棋譜検索エンジン(正式名称:棋譜の名は)

Qhapaq Research Lab kifu_no_na wa

検索できるタグ一覧

コンピュータ将棋の棋譜検索 in Qhapaq Research Lab - django-\/\/ i K |

 

 【解析結果】

 

f:id:qhapaq:20200605214705p:plain

角換わりの銀の行き場別勝率

 

この表において特筆すべき点は3つです。

1.後手腰掛け銀(特に相腰掛け銀)の引き分け率が高い

2.相早繰り銀の先手勝率が低い(こちらは統計誤差的にちと怪しいが)

3.腰掛け銀 vs 棒銀も引き分け率が高い(これも統計誤差的に怪しいが)

 

表を眺めながら角換わりの銀のナッシュ均衡を考えると恐らく以下のようになります。

 

1.先手は腰掛け銀にする

先手は銀の態度を先に決めることになりがち故に、相早繰り銀になるリスクを考えると腰掛け銀。相早繰り銀で後手腰掛け銀への勝率を上げる、引き分け率を下げるという手もあるが、どちらも増分は微々たるもの。

 

2.後手は引き分けを狙いたければ腰掛け銀か棒銀、引き分けを避けたいなら早繰り銀

引き分けを勝ちと考えるか負けと考えるかで最適解が変わります。角換わりの銀は三すくみなどと言われてましたが今の将棋ソフトにとってはどれも大差ないようです。実戦的には先手は腰掛け銀、後手は自分の研究手をぶつけるといった形になりそうです。先手のほうが対策しなければならない手が広い分、事前研究コスト的な意味ではしんどいと思われます。

 

 

というわけで、角換わりの銀ですが、先手はとりあえず腰掛けましょう。後手は好きにしてくださいでFA。

 

【追記:本研究の課題】

この研究ではどのソフトの棋譜であるかは加味していません。QRL棋譜データに入ってるソフトは新しめのものが多く、人間よりは強いだろうとは思います。が、強いソフトと弱いソフトのレート差は数百程度あるので、特定の強いソフトが特定の戦略を取りやすい場合、勝率にブレが生じる可能性が有ります。

気になる人はソフト名も含めて絞り込み検索をしてみると良いでしょう(読者の課題とするってやつです。言ってみたかったんだ

 

【追記2:個人的な疑問】

人間視点で見た角換わりの戦型ってどうなってるんでしょう。最近は角換わりブームも少し落ち着いた気がしますが、先手側で対応しなければならないことが増えすぎて、角換わりを先手が拒否する傾向が出てきた......とか?

Qhapaq Research Labに棋譜検索機能が実装されました

Qhapaq Research Labの棋譜レーティングシステムを大幅に更新しました。具体的には各ソフトの棋譜や戦型別の棋譜を検索できるようになりました。ベータ版ではあるものの戦型別勝率などの使いみちがあるので簡単に紹介したいと思います。

 

棋譜検索ページはこちらから入れます

各ソフトのリンクをクリックするとそのソフトの棋譜(ただし、2018年以前の棋譜はuuunuuunさんのページのものなので現時点では閲覧できません。大雑把に言ってQQR以降の棋譜のみの対応です)をみることが出来ます。

 

ページ上部にあるテキストボックスに検索ワードを入れることで、その条件を満たす棋譜を検索することが出来ます(ワードはスペース区切り、AND検索)。現時点で以下のワードに対応しています。

 

【各種戦型】

・角換わり .... 20手目以内に角を交換

・相掛かり ... 双方が飛車先を交換した上で20手目までに横歩を取らない

・横歩 ... 先手が横歩をとる

・後手横歩 ... 後手が横歩くとる

・先手/後手向かい飛車 ... 先手/後手が20手目まで向かい飛車にする

・先手/後手三間飛車 ... 先手/後手が20手目まで三間飛車にする

・先手/後手四間飛車 ... 先手/後手が20手目まで四間飛車にする

・先手/後手中飛車 ... 先手/後手が20手目まで中飛車にする

・先手/後手矢倉 ... 78金、77銀の構えを作る、かつ、角を手持ちにしていない

 

【試合結果】

・先手勝ち

・後手勝ち

・引き分け

 

【各種プレイヤー名の状態】

・orqha1018

・orqha1018勝ち

・orqha1018負け

・orqha1018引き分け

・orqha1018先手

・orqha1018後手

 

【年号】

2019年、2018年...

 

【検索実施例】

条件を満たす棋譜の数を調べることで、棋譜のメタゲームの推移を見ることが可能です。

 

f:id:qhapaq:20200511224053p:plain

これが



f:id:qhapaq:20200511224113p:plain

こうなる

【Q1. 将棋ソフトは角換わりが増えているのか】

角換わり 2019年 -> ヒット件数: 7575

2019年 -> ヒット件数: 13645

 

2018年 角換わり -> ヒット件数: 8909

2018年 -> ヒット件数: 26093

 

2018年は角換わり率が35%程度だったのに対し、2019年は50%を超えており滅茶苦茶増えています。

 

【Q2. 横歩の後手は勝てないのか】

横歩 -> ヒット件数: 10215

横歩 後手勝ち ->ヒット件数: 3857

横歩 引き分け -> ヒット件数: 389

全然勝てません。勝率4割未満です。

 

角換わり -> ヒット件数: 16484

角換わり 後手勝ち -> ヒット件数: 6953

角換わり 引き分け -> ヒット件数: 1073

因みに角換わりだとこんな感じ。引き分けが多い

 

【Q3. 向かい飛車 vs 三間飛車 vs 四間飛車 vs 中飛車 in 後手】

後手向かい飛車 -> 22/78 (勝率)

後手三間飛車 -> 112/317

後手四間飛車 -> 242/848

後手中飛車 -> 12/44

 

三間飛車の優勝。時代は三間飛車

 

【最後に宣伝】

QRLでは将棋ソフトの対局結果を募集しています。以下の条件を満たす棋譜がありましたら、ぜひ分けていただけると幸いです。

 

・一手あたりの読みの深さが、やねうら王+初期局面で一手1700万ノード以上となるような計算条件

・公開されている将棋ソフトを利用する

 

興味がある方は開発者までご連絡ください(twitterのDMがおそらく一番早いです)。

Qhapaq from NeoSaitamaの評価関数(やねうら版)を公開します

WCSCオンラインで使ったQhapaq from NeoSaitamaの評価関数を公開します。

 

github.com

 

本評価関数はhalfkpe9版となっております。halfkpe9に対応したやねうら王はtttakさんのgithubなどから取得できます。

 

今回のqhapaqの関数は平たく言えばorhqa-halfkpe9です。めきっと氏が開発したillqha-halfkpe9に対してillqha->orqhaで施した学習をした結果、長い持ち時間でやねうら系列に勝ち越すようになりました。

 

【強さ】

具体的には32スレ4秒(kristallweizen側で凡そ1手6000万ノード)+定跡オフの対局で

62-30 vs kristallweizen

60-32 vs illqha-halfkpe9

 

となる程度。halfkpe9系の評価関数は、総じて持ち時間が長いと強くなる傾向にあるようです。

大会最終成績4位、優勝した水匠に勝利と第一線でも使える強さであると自負しています。

 

【Qhapaq本番環境を復元】

探索部は上記tttakさんのものをそのまま使っています。preponder入りのクラスタ(96スレ*6)で動かしました。定跡は最終的にオフになりました。

 

github.com

【詫び石】

散々ディープを使う言うたのに、使わなかったことお詫び申し上げます。

本評価関数はいうなれば詫び石です。他の関数よりも弱い可能性がありますが、詫び石が渋いのはよくあることなので許してください。

WCSCオンラインでのメタゲームの変遷とQhapaqの記録

世界コンピュータ将棋選手権オンラインverを視聴してくださった皆様、ありがとうございました。我々のチームはQhapaq_from_NeoSaitama(チーム:オムラインダストリ将棋部)で参加し、4位となりました。

 

本大会はNNUEの発展やディープ勢の躍進など複数のメタゲームが入り乱れる大会となりましたが、Qhapaqチーム視点で見た感想を述べていきたいと思います。

 

【0.ディープを使えなかったことへのお詫び】

まず最初に皆様に謝らなければなりません。アピール文書ではdlshogiベースのエンジンを用意している、昨年準優勝ソフトと同じ程度の強さになったと書いていましたが、結局大会ではディープを使いませんでした。それには以下の理由があります。

 

1.dlshogiをforkして作った探索部が稀にクラッシュする問題を解決しきれなかった

2.計算資源の調達に失敗した

3.やねうら王ベースの評価関数もdlshogiベースのエンジンと同等程度(値段vs強さでみたらこっちのほうが圧倒的に強い)に強いのができた

4.deep用の定跡を用意する暇がなかった(結局やね側も最後は定跡を使わなかったのですが)

5.やねベースの評価関数のほうがユーザにとって使いやすく、勝てたときの宣伝上の価値が大きいと思った

 

寸前までとても迷ったのですが、皆様の期待に添えなくて申し訳ないと思います。

 

以下、本大会で面白いと思ったメタゲームの変遷を解説します。

 

【1.min-max vs mcts

本大会で大きな注目を浴びたのはディープ+mctsを基調としたエンジンです。特にdlshogiはhoneywaffle(探索部はやねうら王、評価関数の強さは白ビールと同等らしい)に勝利しています。floodgateでもやねうら系列のソフトを駆逐しており今後ディープ軸が優勝争いに絡んでくることが大いに期待されます。

ディープ系のソフトの読みはやねうら王などのmin-max系のエンジンと良くも悪くも異質であり、レートの高いソフトに勝てる一方、レートの低いソフトにあっさり負ける可能性もあります(floodgateのdlshogiの棋譜を見ると解りやすいでしょう)。wcscのように全ての試合に勝たないと優勝できない大会だと、勝ちを落としにくいソフトのほうが有利な面があるのがディープ勢にとっては辛いところです。

あと、単純にGPUを使った開発戦争はカネがかかる

 

【2.amd vs クラウド

昨年の大会はクラスタ祭りでしたが、今年の大会は"自宅PC"勢が増えました。amdの最新のCPUはクラウドで調達できるCPUにも匹敵するスレッド数やクロックを持つ上にキャッシュメモリが大きいため、NNUEの計算が特に早くなるという特徴がありました(私はこの辺詳しくないですが)。

単純なNPSでいえばamdの方に分があったと思われますが、Ryzen Threadripper 3990Xはクラスタを作るのには適さず、クラウド勢が使っていたようなmultiponderは組み難いです。今後Ryzen Threadripperのクラウドサービスみたいなのが出てくれば可能でしょうが、クラウド市場的には微妙な気がします。

Ryzen Threadripperを買えば学習などにも流用できるのですが、上記ディープ勢が来るかもしれないことを考えるとお払い箱になる可能性もあり、開発者の財布に大いなる悩みを与えることでしょう。

 

【3. 定跡と戦型選び】

今期は過去2年に比べ角換わりが減ったように見えます。角換わりが減った関係で千日手も減ったように見えます。代わりに相掛かりと矢倉が増えたようです。なぜ、今まで角換わりばかり指されたかというと、2018-2019年の時点では先手勝率は

横歩>>角換わり>相掛かり/矢倉・雁木(後手だけ角道を塞ぐものは含まない)

となっており、後手は横歩を避けたい、そして、先手は相掛かりや矢倉は組みたくなかったからです。しかし、今年の角換わりには二つの逆風がありました。一つは、2019年にやねうら王が編み出したテラショック定跡(様々な局面を事前に評価し、最善手を導き出しておくことで時間を稼ぐ作戦)です。テラショック定跡(やそれに似た戦略)では戦型指定するのは人的コストが高すぎるためテラショック+角換わりはやりにくかったのです。もう一つはソフトや人間が延々と角換わりを研究したことです。相手の研究にのるリスクや千日手の可能性を加味すると、先手視点でムリに角換わりを推す理由も減ってしまいました。

私が思う、今(そして今後)の定跡の二大トレンドは角換わり vs 矢倉相掛かりではなく、作るか vs 作らないかです。定跡を最低限にし浮いた時間で評価関数や探索部を強くするか、定跡に伸びしろを求めるか。定跡巧者相手に定跡を外す戦略も今後大きなトレンドになると見ています。

 

 

【以下、qhapaqの感想戦(と書いてポエム)】

今回のqhapaqの関数は平たく言えばorhqa-halfkpe9です。めきっと氏が開発したillqha-halfkpe9に対してillqha->orqhaで施した学習をした結果、長い持ち時間でやねうら系列に勝ち越すようになりました。具体的には32スレ4秒(kristallweizen側で凡そ1手6000万ノード)+定跡オフの対局で

62-30 vs kristallweizen

60-32 vs illqha-halfkpe9

程度の成績を上げるようになりました。しかしこの関数、1手300万ノード程度の試合ではkristallweizenに負け越すし、互角局面を用意して戦わせるとレートが60ぐらい下がると色々問題も抱えていました。

 

余談ですが、qhapaqのディープ軸は

1手約6000030000ノード(deep、V100を利用) vs やね(32スレ4秒)で6:4でディープが勝ち越すぐらいであった一方、やね側のノード数を下げても、ディープ側はあまり勝率が上がらなかったので(逆にノード数を上げても勝率はそんなに減らない)、読み筋が異質であるという印象を受けました。ディープにクラッシュする危険があること、カネがかかることを考え、泣く泣くやね軸を使うことにしました。

 

関数が4月頃に出来たので定跡を作る暇はなく、世に転がってた定跡を適当にかき集めて使いました。クラスタも昨年使ったpreponder入りのものを使い、ハード構成もほぼ同じもの(96スレ*6)を使いました。

 

以下、大会結果と感想。棋譜こちらから

1戦目 vs argo(先手、勝利)

横歩の展開。青野流から飛車を切った攻めが強烈に刺さりそのまま勝利。argoの強気プレイにぎょっとしたし、飛車を切った責めは胃に悪かったが横歩先手は勝ちというトレンドに従い無事に勝利。

 

2戦目 vs 習甦 (後手、敗北)

角換わりで22金が壁になる形。手損はないが玉の形が悪い...など考えていたら、あっという間に玉を寄せられて敗北。ジリジリ悪くなるというよりは急激に反省した形(qhapaqは途中まで自分良しと言っていた)となり、読みの異質さをブツけられた展開。

 

3戦目 vs HoneyWaffle (後手、勝利)

先手中飛車を相手にする。互角な局面が長く続いてドキドキしたが、寄せ合いになる前に模様を良くすることに成功。その後玉が延々と詰まず、316手目で勝利。320手まで行ったら引き分けだったので危ない勝利。

 

4戦目 vs GCT (後手、勝利)

矢倉。中盤で模様を良くしてそのまま押し勝ち。ディープ系は読み筋が異質なので、勝つ寸前まで安心できない相手でしたが、事故は起こらず勝利。やね系以外の相手は胃に良くない

 

5戦目 vs novice (先手、敗北)

相掛かりからひねり飛車で歩を得する展開。指しやすいかと思ったが先手の有利を拡大できないまま、100手目あたりでねじり合いに負けて、一気に-300ぐらいまで評価値を悪くし、そのまま敗北。

 

6戦目 vs ichibinichi (先手、勝利)

再び相掛かりからのひねり飛車。先程のように負けるのではとヒヤヒヤしたが、40手目辺りでqhapaqが模様を良くしたようでそのまま勝ち。最後は玉頭戦になったためこれも大変胃に悪かった。

 

===

ここで、qhapaqのレート測定に使ってた棋譜は角換わりや雁木が多かったのに対し、使っている定跡が相掛かりをよく選ぶことに気付く。定跡の相性が悪いのではと考え、ここから定跡をoffにする。今大会でも相手の多くはpreponderを使っていなかったので、序盤で時間を使っても相対的な消費時間で損することはないだろうと踏んでの作戦。

===

 

7戦目 vs dlshogi (後手、勝利)

雁木がでてホッとする。ジリジリした展開が長く続いたが、dlshogiが長考を連打したお陰で時間差を確保、終盤で競り勝ってそのまま勝利。今日の勝ち戦では一番胃に良くなかった。

 

8戦目 vs 水匠(先手、勝利)

水匠は優勝確定、qhapaqも仮に勝ったとしても3位以上は他力と消化試合感があったが、水匠の全勝優勝は避けねばならぬ。水匠の定跡が長く50手目ぐらいまで付き合わされたものの、定跡を抜けた時点でqhapaqは少し有利(評価値200前後)となっていた上に、水匠の長考にpreponderが刺さりそのまま勝利。優勝ソフトにこう言っては何だが、評価値推移だけで言えば今日の勝ち戦で一番胃に優しい勝ち方だった。定跡はイラン子だったんや......

 

【まとめ】

最終順位は4位でした。自己ベスト(5位)を更新する良い結果です。ご視聴いただいた皆様、誠にありがとうございました。来年もよろしくお願いします。

 

halfkpe9勢、もっとたくさん出てくると思いましたが自分の他に居なかったかもしれません(少ないもののいた模様。要検証)。NNUEのアーキテクチャの改造も今後のトレンドになることでしょう......

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

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

前回に引き続きこの壮大な問に挑戦するべく、棋力スカウターの開発をしていきます。今回はKaggleなどで使われる技術をフル活用して回帰精度を上げていきます。今回用いた技術の大半は以下の書籍から学ぶことが出来ます。実際お勧め。

【前回までの進捗】
前回までの進捗を簡単に纏めると以下のようになります。

・人間の棋譜と各局面での評価値をやねうら王で計算したものから対局者のレーティングをあてるのが目標
・先行研究で使われていた、最善手と実際の指し手の評価値の差分の平均値からレートを計算する機能を実装
・評価値の差分の平均値とレートの間に強い相関があることを再現
・一方、1局毎の評価値差分の平均は人によってブレが大きいことを確認。特に相手が勝手に自滅した場合にフタコブになってしまう
・評価値の差分ではなく、評価値から計算される勝率の差分を指標にするのは良くないことがわかった

qhapaq.hatenablog.com

この面倒な問題に流行りの機械学習技術をフル活用すると果たしてどうなるのでしょうか。


【今回の棋力測定戦略】
今回は「局面毎にレートを推定し、各種モデルのアンサンブルを取って最終予想とする」という戦略を用います。

教師データとしてプレイヤーの棋譜を見た場合、プレイヤーによって棋譜の数が変わり、更に、棋譜によって手数が変わります。可変長のデータを扱う方法としては、RNNなどの自然言語処理向けの技術が知られていますが、これらの手法は往々にして計算量が多く、今回のような教師データが少ない系にはあまり適していません。

そのため、前回紹介した評価値差分平均と同様に、局面毎に手の質を計算しその平均からレートを計算することにします。手の質は色々な評価方法が考えられますが、ここでは評価値の分布から指し手のレートを予測する問題を教師あり学習で解かせて、レートの予測値を手の質とみなすことにします。回帰モデルには機械学習コンペでよく用いられる勾配ブースティング(XGBoost、NGBoost)とニューラルネットワークの二つを用いました。

最終的なレートは各種モデルが予測したレートの合議で決定します。合議の方法についても勾配ブースティングによる教師あり学習を用いました。

全体の学習の流れは以下のようになります。

f:id:qhapaq:20200301192659p:plain
棋力スカウターの学習フロー


【各種モデルの回帰結果】
以下に各種モデルの回帰結果を紹介します。

【XGBoost】

f:id:qhapaq:20200304083045p:plain
xgboostによる棋力予想。横軸がレート(右ほど強い)、縦軸が棋力(上ほど強い)

f:id:qhapaq:20200304083608g:plain
図面上部に書かれているのが正しいレート、横軸が1つの対局から予測されたレート、縦軸がその分布

グリッドサーチでハイパラチューニングをしたり、考慮に入れる手の順位を弄ったりしましたが、予測精度には殆ど差は出ませんでした。評価値差分のときに比べフタコブが大分緩和されているのが解ります。どこをみてコブを消したのかが凄く知りたいですが、勾配ブースティングの判断基準の可視化って難しい。

【NGBoost】
NGBoostは予測の不確かさも同時に出力できる、新型の勾配ブースティングです。かの有名なAndrew Ngも開発に絡んでいるのでこの名前になっているようです。中身の概要を知りたい人にはAI Scholarの記事がおすすめです。

挙動としてはXGBoostとほぼ同じです。NGBoostにはweightの調整機能などの気の利いた処理がないにもかかわらずXGBoostに比べても悪くない結果が出ています。不確かさが出るのも用途によってはものすごく便利でしょう。


f:id:qhapaq:20200304084237p:plain
横軸が実際のレート、縦軸が棋力 in NGBoost

f:id:qhapaq:20200304084402g:plain
図面上部に書かれているのが正しいレート、横軸が1つの対局から予測されたレート、縦軸がその分布

ニューラルネット
MSEという観点ではニューラルネットが一番いいスコアが出ていました。

f:id:qhapaq:20200304084537p:plain
ニューラルネットによる棋力予想 横軸が実際のレート、縦軸が予測された棋力

やはり、フタコブはある程度解消されています

f:id:qhapaq:20200304084716g:plain
図面上部に書かれているのが正しいレート、横軸が1つの対局から予測されたレート、縦軸がその分布


【アンサンブル】
今まで作ったモデルをよく眺めると、モデルによって一長一短があることが解ります。例えば、レート上位層の予測については単純な評価値差分が良いように見えますし、フタコブをなくすという意味では勾配ブースティング系が良さそうです。そして、単純なmseではニューラルネットが良さそうです。

そこで、これらの意見のいいとこ取りをするために、各種モデルの予測値をあつめ、これらを合議することで最終的なレートを予測し直すことを考えます。Kagglerにとってはおなじみの合議です。

まずは単純な線形足し合わせ。フタコブがかなり解消され滑らかになっているのが解ります。

f:id:qhapaq:20200304090924g:plain
図面上部に書かれているのが正しいレート、横軸が1つの対局から予測されたレート、縦軸がその分布

XGBoostを使って回帰した場合。更にピークがシャープになっています。

f:id:qhapaq:20200304090957g:plain
図面上部に書かれているのが正しいレート、横軸が1つの対局から予測されたレート、縦軸がその分布


棋力の予測値が全体的に2000によっているのが気になる(二乗誤差を基準にしたのが悪い)ので、実際にレートを予測する場合は「予測値*3 - 4000」みたいな式を挟む必要があるでしょう(二乗誤差よりも優れた評価関数があればもっと精度は上がるのでしょうけど、あまりそのへん詳しくないので詳しい人良ければ教えてください

【まとめと課題】
棋譜の特徴量抽出+各種非線形モデリング+アンサンブルというKaggleでおなじみの技法をフル活用して棋力スカウターを作ってみました。モデルを増やしアンサンブルを取ることで予測精度が向上することが確認できました。未解決の課題としては以下のようなものがあります。

・本当に過学習していないかを確認する
・プロ棋士やコンピュータなど教師データよりも強いプレイヤーの棋力を見積もれるか


【次回予告?】
スカウターの骨組みが完成したので、これを使ってプロ棋士やコンピュータの棋譜を解析していきます。冒頭で述べたような壮大な問は解けるのか....ご期待ください!

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

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

 

こうした問題の答えを得ることは、将棋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で出てくるおなじみの技術を活用しまくった結果(仮)

ご期待下さい!