GA将?開発日記~王理のその先へ~

ネタ勢最強を目指して絶賛開発中。

リバーシの評価関数をちょっとだけ改良

 今日のコメント欄で書いた「評価項目を増やした際の過剰な学習への対策」を実装しました。

 まず、今までの実装だと学習の流れは以下の様になります。

  1. 評価値を計算する
  2. 評価値と目標値から誤差を計算する
  3. 評価値計算で使用した全パラメータに対して繰り返し
    1. パラメータに学習率×誤差×特徴量*1を加算

 で、これだと同じ学習率を使用していても、評価値計算で使用したパラメータの数が変化すると、評価関数が出力する値の変化量が変わってきます。

 なので、例えば学習率0.01の場合でも、パラメータ数が10個なら誤差が10%減りますし、20個なら誤差が20%減ります。

 こういう事情があるので、評価させる項目*2のアリ・ナシで学習結果が変わってくる可能性があります。

 それなら、学習率=誤差を減らす量になる様に、学習時にパラメータに加算する値を加減してやればいいんじゃないかというのが、今回の実装の基本的な考えです。

 具体的には、パラメータに加算する量を「学習率×誤差×特徴量/総パラメータ数」にしてやるだけです。

 今の評価関数はid:Gasyou:20070828:1188309666で書いた実装を使っているので、評価時にprocess(...)メソッド内でパラメータ数を数えて、学習時には別のクラスのprocess(...)メソッド内でパラメータ数に反比例した分だけパラメータを変化させる、っていう簡単なものです。

 これだと、単に評価値を得たいだけの場合にもパラメータ数をカウントする無駄な処理が走ってしまうのですが、カリカリに性能をチューニングする類のプログラムでもないので良しとします。

*1:上手く説明出来ない・・・リバーシの評価関数では常に1。将棋の駒割評価の場合であれば、今学習しようとしているパラメータに対応する駒の枚数。

*2:着手可能数とか開放度