リバーシの評価関数をちょっとだけ改良
今日のコメント欄で書いた「評価項目を増やした際の過剰な学習への対策」を実装しました。
まず、今までの実装だと学習の流れは以下の様になります。
- 評価値を計算する
- 評価値と目標値から誤差を計算する
- 評価値計算で使用した全パラメータに対して繰り返し
- パラメータに学習率×誤差×特徴量*1を加算
で、これだと同じ学習率を使用していても、評価値計算で使用したパラメータの数が変化すると、評価関数が出力する値の変化量が変わってきます。
なので、例えば学習率0.01の場合でも、パラメータ数が10個なら誤差が10%減りますし、20個なら誤差が20%減ります。
こういう事情があるので、評価させる項目*2のアリ・ナシで学習結果が変わってくる可能性があります。
それなら、学習率=誤差を減らす量になる様に、学習時にパラメータに加算する値を加減してやればいいんじゃないかというのが、今回の実装の基本的な考えです。
具体的には、パラメータに加算する量を「学習率×誤差×特徴量/総パラメータ数」にしてやるだけです。
今の評価関数はid:Gasyou:20070828:1188309666で書いた実装を使っているので、評価時にprocess(...)メソッド内でパラメータ数を数えて、学習時には別のクラスのprocess(...)メソッド内でパラメータ数に反比例した分だけパラメータを変化させる、っていう簡単なものです。
これだと、単に評価値を得たいだけの場合にもパラメータ数をカウントする無駄な処理が走ってしまうのですが、カリカリに性能をチューニングする類のプログラムでもないので良しとします。