ボナンザメソッドで微分するとき

IT

2022-01-15

いわゆるボナンザメソッドで、ある局面のミニマックス値と、評価関数の評価値との差を最小化するよう調整するとき、評価値の差をシグモイド関数の微分係数に変換して、評価関数の重みを増減させる。

しかしシグモイド関数はゆるやかな増加関数なので、微分係数は常に正になる。これではミニマックス値と評価値の差が負のとき重みを調整できないので、評価値の差の符号に応じて微分係数の符号も変える。しかしこんなことがなかなかわからなくて、ずいぶんと回り道をしてしまった。


//評価関数の評価値と一致するよう重みを調整する
 diff=eval-pro_eval;
 符号
 if(diff>0) {
   sign=1;
 }else {
   sign=-1;
 }
//シグモイド関数の微分係数
 diff=sign*diffSigmoid((double)diff);//これを重みに足す

 シグモイド関数の微分
 double diffSigmoid(double eval) {
  double v=0;
  v=(1-sigmoid(eval))*sigmoid(eval);
 return v;
 }


image
シグモイド関数

シグモイド関数の微分の公式はよくネットに出ているし、そのグラフも出ているのだが、シグモイド関数をσ(x)とすると、0<σ(x)<1なので、σ'(x)=σ(x)(1-σ(x))というのはどうやっても0<σ'(x)<1なのでは…と思うのだが。実際には0<σ'(x)<0.25だけど。

image
シグモイド関数の微分係数

機械学習ではシグモイド関数を活性化関数に使うことが多いが、損失関数がたとえば二次関数だと微分係数は正負の値をとるので簡単だが、損失関数をシグモイド関数にすると符号の問題が起こってくると思う。

私は文系学部出身なので、「差が負のときは微分係数にマイナスをかけないとダメだろう」と半信半疑に思っていたのだが、ネット上の論文とかをあれこれ調べてみても見つからなかった。こんなことは理系出身者には当然すぎることなんですかねえ…