前回記事の続き。この連載、今回で最終回。
今回は、入玉宣言勝ちについてです。
Bonanzaが最強の将棋ソフトであったころ、将棋ソフトは入玉将棋が下手だと言われていました。これは、プロの棋譜から学習させていたため、入玉のときのデータが少なかったためです。
これに対して、NDF[2014]のKPP次元下げによって、必要な教師数を大幅に減らしたのですが、それらも結局はノイズになってしまうので、その後は、自己対局によって大量の教師棋譜を生成し、その棋譜から(次元下げなしで)学習させる時代にシフトしていきました。
それでも、2016年ごろになっても将棋ソフトは入玉模様の将棋が下手(アマ高段者レベルではあるけど、プロよりは下手)でないかと言われることが多く、「入玉模様になると別のゲームになる」「入玉専用の評価関数が必要だ」などと言われていました。
入玉専用の評価関数というアイデア自体は面白いのですが、どこでその評価関数に切り替えるのかだとか、切り替えずにその評価関数の値といまの評価関数の値との内分をとるような形で評価すると、計算時間を余計に必要とするので結局は弱くなるのではないかなど、様々な問題を抱えていました。
そう考えるとNNUE評価関数は画期的です。なぜなら、入玉判定を少ないニューロンで表現できるからです。
入玉宣言ができる条件というのは、よく大会で用いられる27点法では、以下のようになっています。
「入玉宣言勝ち」の条件(第13回選手権で使用のもの):
(a) 宣言側の手番である。
(b) 宣言側の玉が敵陣三段目以内に入っている。
(c) 宣言側が(大駒5点小駒1点の計算で)
・先手の場合28点以上の持点がある。
・後手の場合27点以上の持点がある。
・点数の対象となるのは、宣言側の持駒と敵陣三段目
以内に存在する玉を除く宣言側の駒のみである。
(d) 宣言側の敵陣三段目以内の駒は、玉を除いて10枚以上存在する。
(e) 宣言側の玉に王手がかかっていない。
(詰めろや必死であることは関係ない)
入玉宣言条件はざっくり言うと、玉の位置 + それぞれの駒に定められた駒点という形になっています。
NNUE評価関数の標準的なタイプであるhalfKP256型は、K(玉の位置)×P(玉以外の駒)の組をそのニューラルネットの入力として全結合なので隠れ層の1段目のニューロン1個で上の条件のおおよその判定ができます。(例 : 先手11玉×先手33龍なら、玉が敵陣にいて、かつ、自分の大駒が敵陣にあるので5点として評価したいので、入玉判定ニューロンへの重みを5にしておくなど。)
そう考えると、わりと少ないニューロンで入玉判定ができそうです。細かい条件を無視してよければ最悪、ニューロン1個でもそれなりの精度で判定できます。
つまり、NNUE型評価関数は、通常の評価関数から入玉用の評価関数へとシームレスに接続している、うまく融合されている、とも言えます。
このことから、NNUE型評価関数の学習用の教師生成においては、入玉宣言勝ち寸前の局面まで含めてやったほうが、そこから学習させた評価関数は強くなると予想されます。
■ まとめ
ここまで4回に分けてNNUE型評価関数の特徴、従来の評価関数にない特徴などを書いてきました。
標準的なNNUE型評価関数は全結合の3層パーセプトロンというシンプルな構造ですが、それでも従来の評価関数にはない優れた特長を持っていることがわかりました。
NNUE系の評価関数は作為的に手を加えたものを除いて、個性があまり生まれにくいなんてことはあったりすんるですかね?
NNUE型は戦型の学習能力などは高いので、教師次第ではKPPTより個性的になりうるのではないかと。
rezero評価関数の個人的なファンなのですが、もうしばらくは8以降のものは公開されることはないでしょうか。
KPPTのrezero系はいまはもう育ててないので、あれで打ち止めですねぇ…(´ω`)
余裕があれば、NNUEののほうのrezero系を公開するかもです。
しかし、NNUEは育成が難しくてゲロ吐きそうです(´ω`)
ネット将棋特有のトライ勝ち(相手玉の位置に自玉が行ったら勝ち)を採用した評価値のソフトが出現する可能性もありますか?
でも、公式ルールでは勝てなくなるから作るメリットは薄いですかね
あー、トライルールを有効にして教師局面を生成して、そこから学習させた評価関数がトライを積極的に狙いにいくかという問題ですかね。NNUE型なら、たぶん狙いに行くと思いますよ…。
例えば昔の記事みたいに、特殊ルール下で教師を生成し学習させて通常ルールに戻しても、特殊ルール下での行動の影響を強く受けそうですかね?
http://yaneuraou.yaneu.com/2015/05/11/%e5%b0%86%e6%a3%8b%e3%81%8b%e3%82%89%e5%bc%95%e3%81%8d%e5%88%86%e3%81%91%e3%82%92%e3%81%aa%e3%81%8f%e3%81%99%e3%81%ab%e3%81%af%ef%bc%9f/
それは思いっきり受けるのでは…。まあ、駒の位置評価を乱さない範囲のルールでしたら影響はあまりないでしょうけども。
すると例えば詰ましたら勝ちではなく引き分けとする変則ルールにすると、中終盤以降不利な方が王を詰まされに自爆していく感じになりそうですね。
自分で作って試せという話ですが、そういう変更はソースのどの辺に手を付けるべきかさっぱりなもので…
詰み = 引き分けのルールに変更した場合、入玉宣言勝ちだけが唯一の勝ちになるので入玉だけを狙う将棋になるでしょうね。不利になったからと言って、自爆に行っても、相手も引き分けは不満なので決して詰まさず、駒だけ奪って、相手側も入玉を目指すような感じになるような…。(見てて面白いかも?)
詰み = 引き分けの時は宣言やトライ勝ちがありましたか。それも変なところでバランスが取れていて面白そうですね。NoEnteringKingとか凄そう。。
そういう変更をして棋譜を鑑賞してみたいですが、ソースのどの辺を弄ったらよさそうでしょうか。
詰みの判定はmate1ply()という関数でやってた気がするので、これ呼び出して詰みのときのスコアを返すところ(bestValue = mate_in(ss->ply) )を引き分けのスコア(drawValueTable[REPETITION_DRAW][us])を返すようにすればいいような?
やねうらおさんはnnueの教師局面生成の時にどの様なコマンドを使っていますか?今どの様にすれば良い教師局面が出来るか調べているところです。
教えていただけないでしょうか?
皆さん、普通にgensfenコマンドで生成されてるみたいです。そのときに指定する定跡ファイルが肝なんでしょうね…。