パラメータ自動学習の続き
昨日書いた内容だけでは足りなさそうな部分があるので。
まず学習の目的ですが、「評価関数が正確な値を出力する様に調整する」事です。
なので、「探索ルーチンが最善手を返す割合を高める」事を目的としている(様に見える)Bonanzaとは、学習の仕組みが根本的に異なります。
次に、評価関数の出力の目標値(出力して欲しい値)ですが、下記の様に設定しました。
要するに、先手が勝った局面なら1000で、その一手前は1000×0.995、さらに一手前は1000×0.995×0.995、… となります。
棋譜の手を指す様に学習している訳ではないので、棋譜にない手の出力に関しては計算していませんし、パラメータを修正する際にも考慮していません。
評価関数は単独の駒の絶対テーブルと持ち駒の評価を実装済みで、駒割は実装していません(この辺の話は以前書いた通りです)。
で、絶対テーブルも持ち駒もそれぞれパラメータがあって、絶対テーブルなら「x筋y段にある駒kの価値はw」、持ち駒なら「駒kのn枚目の価値はw」という感じでパラメータwを評価関数内部に持っています。
評価関数の出力を目標値に近付ける方法ですが、各パラメータについて「他のパラメータを一切修正しなかった場合に、そのパラメータの値をいくつに修正すれば目標値を出力するか」を計算し(CompositeEvaluator::changeValue()メソッド内のtarget)、そのパラメータを学習率に比例した分だけ修正します(同じくd)。
あ、変化量dには慣性項も加えていたり、変化量dは次回学習時に慣性項として使用するので保存していたりもします(同じく最終行)。
えっと後は・・・そうそう、慣性項について。
慣性項は無くても動きますが、あった方が学習が速くなります。なので、最初は慣性項を無視して読んでもいいかと思います。
大体こんな感じですね。
でも、こんな事を選手権直前に書いても誰の役にも立たないだろうなぁ・・・
*1:ここの数値は適当に調整しますが、0より大きく1より小さい値