Hatena::ブログ(Diary)

Bonanzaソース完全解析ブログ

2014-10-20

やね裏評価関数とは何か?

やね裏評価関数とは何か?を含むブックマーク やね裏評価関数とは何か?のブックマークコメント

電王トーナメントのアピール文書、「やる予定」「やる予定だけど効果かどうかはわからん」みたいな書き方をしているものもたくさんありますが、ソフトがアピール文通りになっていないからと言って罰則があるわけではないのでそれを見越してやねうら王は適当ぶっこいてるんだろうと邪推している人もおられるかも知れません。


今年はどうなるかはわかりませんが、しかし、去年は私は書いている通りのことはすべてやりました。


そのなかでも一つ説明を書いていなかった、去年の電王トーナメントのときの「やね裏評価関数」について、そろそろオープンにしてもいいかと思い、これについてざっと技術的な説明をします。


Bonanzaの三駒関係では盤上の駒だけでなく、手駒もひとつの駒とみなします。「歩が3枚」「香が0枚」「桂が4枚」というような駒が存在しているものとみなします。なので、KPP(玉と2駒)のときに、「先手88の玉」×「後手の歩が0枚」×「先手の香が1枚」のような3駒関係についても評価因子としてあります。これにより、「歩切れの後手に対して先手が香を持っている」というような評価が出来るという仕組みです。


この盤上+手駒のリストを配列に格納する処理としてBonanzaではmake_listという処理があります。これは「盤上99の先手の香」「盤上89の先手の桂」…「先手の歩が0枚」「先手の香が3枚」…「後手の角が0枚」「後手の飛車が1枚」のように、盤上すべての駒と、先手・後手のすべての駒(7種×2 = 14駒あるものとして扱う)を配列に格納します。盤上最大38枚+手駒14駒 = 最大52駒となります。将棋の開始局面では52駒あることになります。


ところが、この手駒の0枚という手駒、実は消去できます。これについて最初に言い出したのはaki.さん(Ponanzaチーム下山さん)だったと思いますが、簡単に言えばmake_listするときに0枚の手駒は配列に突っ込まないという処理にします。


make_listするときに0枚の手駒を配列に突っ込まないようにして棋譜からの学習をすれば良いわけですが、たかだかこのためだけに棋譜からの学習をやりなおすのは結構な手間だったので、Bonanzaのfv.bin(評価関数パラメーター)を何とか変形してこのときの評価関数パラメーターを導けないかを考えました。


そうすると、Bonanzaのfv.binをごちゃごちゃやると全く等価な後者の形式の評価関数パラメーターが導けて、KKに応じた定数項がただ一つだけ余分に出てくることが(数学的に)証明できました。これが「やね裏評価関数」の正体です。


序盤では52枚から38枚に減るため、KPPの計算が激減します。終盤で盤上の駒が減ると配列に突っ込まれる駒数がずいぶんと減るため、評価関数の計算コストがさらに小さくなります。


(つづく)