kkana's blog

新米コーダーの忘れそうなことメモ

nature of code : 今日の練習「ビークルの訓練」

前回作成したのは教師あり学習(正解があって、結果と正解から誤差を計算し重みを調整する)だったが
今回は簡易的な強化学習(結果から誤差を計算し、環境に対応する)を作ってみる練習。

今回のビークルにはbrainプロパティがあって、操舵力を決めるときにbrainから処理された操舵力を受け取って それに従って運動させる。

See the Pen ビークルの訓練 by kanaparty (@kanaparty) on CodePen.

環境(黄色い点)から受ける力をbrainに渡して処理してもらい、 その結果が画面の中心(灰色の点)からどれだけ離れているかをエラーとしてトレーニングしている。今回は活性化関数がない。

ビークル

//操舵力を計算
steer(target){
  var force = [];
  for (var i = 0; i < target.length; i++) {
    force[i] = this.seek(target[i]);
  }
  //ターゲットから受ける力をbrainプロパティに渡して結果をもらう
  var result = this.brain.feedfoward(force);
  this.applyForce(result);
  //トレーニング
  var error = Vector.sub(this.desired, this.position);
  this.brain.train(force, error);
}

brain内では受け取った力の分だけ重み(今回は位置なのでxとyの2つ分)を調整している。

//調整
train(forces, error){
  for (var i = 0; i < this.weightLength; i++) {
    this.weight[i] += this.c * error.x * forces[i].x;
    this.weight[i] += this.c * error.y * forces[i].y;
  }
}

1000回トレーニングを繰り返したら、点の位置を変える。
位置が切り替わった直後は前の位置のときに調整した重みに従って動くので目標がわからなくてフラフラしているように見えるが、
まただんだん調整されて画面の真ん中を目指すようになる。

the nature of codeの一番最初の課題はランダムウォークだった。
ついに動きをつける対象にbrainが〜!!すごい、私も進化してきた感がある。