手駒の価値を正しく学習させる

知っての通り、Bonanza6では、手駒の価値は駒割の値 + KPのP=手駒としての値の合計値となる。(実際にはKPPの一つ目のPと二つ目のPが等しいときのKPと、 KKPのP=手駒のほうとがあるが、細かい話は割愛する)


さて、駒割の値というのは、盤上の駒と手駒をひっくるめて、歩 = 100点のように点数化してある。


KPのP=手駒というのは、「先手の持ち駒の歩が0枚」「先手の持ち駒の歩が1枚」「先手の持ち駒の歩が2枚」のような状態を一つの駒(P)とみなしてある。


1枚目の歩だけ価値が100点よりは少し高く120点の価値があるとしよう。そうすると「先手の持ち駒の歩が1枚」のKP値には20点がつくことになる。


2枚目の歩は逆に80点の価値しかないとしよう。そうすると「先手の持ち駒の歩が2枚」の価値は-20点がつくことになる。


以下、同様であるのだが、歩を10枚以上持っているような局面はなかなか出てこないので、「先手の持ち駒の歩が10枚」のKP値は0に収束する。(出現しない特徴は0に収束する!)


そうすると、先手の持ち駒の歩が10枚の局面は駒割の100点×10枚 = 1000点がつくことになる。これが正しいのかどうかという問題について考えなくてはならない。


【手駒の価値モデルを考える】


1枚目の持ち駒の歩が100点だとしよう。2枚目の持ち駒の歩はそれより低い価値であるはずだ。0枚と1枚の差は明瞭だが、1枚と2枚の差は前者ほどのインパクトはないからだ。だから、ここは仮に80点だとしよう。問題は3枚目の持ち駒の歩は80点より低いのかどうかということだ。


仮に、3枚目は60点、4枚目が40点、5枚目は20点、6枚目は0点、7枚目は-20点みたいな点数だとしたら、7枚目の歩はむしろないほうが良いことになってしまう。これはおかしい。


そこで、3枚目の歩が2枚目の歩より価値が下がるとしても、どこかに収束するはずだ。すなわち、3枚目は70点、4枚目は65点、5枚目以降は60点、みたいな点数が正しい。(と思われる)


つまり
・0枚 = 0点
・1枚 = 100点
・2枚 = 100点 + 80点 = 180点
・3枚 = 100点 + 80点 + 70点 = 250点
・4枚 = 100点 + 80点 + 70点 + 65点 = 315点
・5枚 = 100点 + 80点 + 70点 + 65点 + 65点 = 380点
のように合計値はなる。


Bonanzaは駒割の点数自体も棋譜からの学習により調整するので、この場合、
・歩の駒割 = 60点
・KPのP=1枚目の持ち駒の歩 = 40点
・KPのP=2枚目の持ち駒の歩 = 60点
・KPのP=3枚目の持ち駒の歩 = 70点
・KPのP=4枚目の持ち駒の歩 = 75点
・KPのP=5枚目の持ち駒の歩 = 80点
・6枚目以降 = 80点


のような点数がつけば、辻褄が合うのだが、よく考えて欲しい。6枚目以降として80点がつかなければならない。ところが6枚以上の歩を手持ちにする局面というのはあまり存在しない。10枚以上などとなるとなおさらだ。そうなると、この評価因子は0に収束してしまう。ゆえに歩の枚数が多くなってくると、このような点数のつきかたでは手駒の枚数が多いときに破綻するのだ。


そこで、実際は、
・歩の駒割 = 80点
・KPのP=1枚目の持ち駒の歩 = 20点
・KPのP=2枚目の持ち駒の歩 = 20点
・KPのP=3枚目の持ち駒の歩 = 10点
・KPのP=4枚目の持ち駒の歩 = -5点
・KPのP=5枚目の持ち駒の歩 = -20点
のような点数がつく。こちらのほうが、それぞれの因子の絶対値の合計値がさきほどの点数より小さい。しかしこの場合であれ、やはり手駒が多い場合には、さきほどと同じ問題がある。


このように考えていくと、Bonanzaのように駒割 + 手駒N枚を一つの(KPの)Pとみなすような因子分解をするモデルを(出現頻度が少ない因子が0に行くような)機械学習で学習させると枚数が手駒の枚数が多い場合にうまく機能しない。(うまく機能しなくとも、そのような局面はなかなか実戦で出現しないのであまり表面化しないという見方もあるにはあるが…)


これに対して、先日紹介した「make_listの38要素化」*1であれば、歩を2枚手駒にしている状況であれば、「駒割 + 歩が手駒に1枚ある(というKPのP) + 歩が手駒に2枚ある(というKPのP)」という点数になる。


歩が手駒に10枚ある(というKPのP)に対しては、ほとんど棋譜に出現しないのでゼロに収束するだろうが、ここがゼロになったとしても、手駒が10枚あるという状況は、
・駒割 + 歩が手駒に1枚ある(というKPのP) + 歩が手駒に2枚ある(というKPのP) + …(中略)… + 歩が手駒に9枚ある(というKPのP) + 歩が手駒に10枚ある(というKPのP)
という合計値であり、あまり問題とならない。


要するに、「make_listの38要素化」してある状態で学習させたほうが駒割に対しては適切な値に収束すると思われる。


このことはPonanzaの山本君やAperyの平岡さんも同じ主張をしていたので、上位ソフトの開発者間では常識とみなされていることだとは思うが、比較実験をした人がいないので本当のところはよくわからない。


また、本当に、1枚目の歩の価値 > 2枚目の歩の価値 > 3枚目の歩の価値 > 4枚目の歩の価値 > … のような順序関係が成り立つなら、棋譜からの学習時にここ(「歩が手駒にN枚ある(というKPのP)」)にそのような制約条件を入れてやることで、より適切な値に収束するはずであるが、手駒の部分があまり適切な値に収束してなくとも、他の部分でうまく辻褄が合うように調整されるのが評価因子の多い大規模な機械学習の世界であるから、こういうところにいろいろ気を回しても結局は棋力にはあまり影響なかったりするのが現実である。