TD法を用いた将棋の評価関数の学習(小谷研究室)

以前、国会図書館でコピーしてきた論文です。
前に読んだときは、あまり理解できませんでしたが、
Bonanzaの発表を見て、土日にうんうん悩んだ末に読むと「あ!」って感じでした。


ここでは、駒の価値、持ち駒の価値、王の周囲の利きの数の得点、互いの王との距離による加点
これらの要素の重みを、TD法で学習している。
結果的にはシミュレーションする度に収束値が変化したりして、
あまり上手くいかなかったとのことである。


GPWでは、保木さんは先行したTD法の学習では、駒割も上手く求められなかったという話しをされていたと思う。
改めて見てみると、
評価関数を、E=Σw(j)x(j)と定義し(jは0〜評価関数の要素数)、0〜1で扱うためにシグモイド関数を使っている。


P(E)=シグモイド( Σw(j)x(j) )


そうか。そういえばシグモイド関数微分ができるのである。
p=1/(1+exp(-x)を微分すると、微分された導関数はP'=p(1-p)である。



ということは、目的関数のw(評価関数の重み)に関する微分は、


∂P(E)/∂w(j) = P' * x(j)
∂P(E)/∂w(j) = p(1-p) * x

この微分値がゼロに収束すれば、そこは極限と言える。


歩の価値についてだけなら
歩の駒割の特徴ベクトルの重みの差分計算は、


Δw += アニーリング定数 * sigmoid(eval()) * ( 1- sigmoid(eval()) * 歩の盤上の数

※歩の盤上の数は、=相手の歩の数−自分の歩の数


要するに、sigmoid(eval())が1に近づいても(∞)0に近づいても(-∞)、上記は全体で0に近づく。
0.5のときは0.25
sigmodi(eval())が0.40に下がると、0.4*0.6=0.24


評価関数が下がったときに、歩の盤上の数が正数なら(敵歩の数の方がが多い)、歩の価値を増やす
評価関数が下がったときに、歩の盤上の数が負数なら(敵歩の数の方がが少ない)、歩の価値を減らす


先手番から見て、評価関数が下がっているのにも関わらず自分の歩の方が多いなら、歩の価値は減らすべき
という考え方になると思う。


これなら学習できるような気がする!(とかいいつつ、論文ではなかなか上手くいっていない)


問題は、
これを対戦での学習ではなくて、Bonanzaのように棋譜の手と他の全合法手との「兄弟モデル」として学習すれば、
駒割の学習は成功するのではないだろうか?


とりあえずやってみるしか。