See the Pen 選択的遺伝 by kanaparty (@kanaparty) on CodePen.
9章でやり残してしまっていた課題。
自分で適応度を変更して次の世代のパターンを作る。
例は顔みたいな図形だったけど、タータンチェックのパターンで作ってみた。
See the Pen 選択的遺伝 by kanaparty (@kanaparty) on CodePen.
9章でやり残してしまっていた課題。
自分で適応度を変更して次の世代のパターンを作る。
例は顔みたいな図形だったけど、タータンチェックのパターンで作ってみた。
脳に基づいて特定の問題を解決するための計算モデル。複雑系の一種
ニューロン...細胞網に存在している単一細胞で、入力を受け取り、処理し、出力を生成する。
コネクショニスト計算系...情報がネットワーク全域で集合的に並列で処理される
ニューラルネットワークの主な要素の一つ。
(ニューラルネットワークは単なる複雑系にあらず。内部を流れる情報に基づいて構造を変化させることができる複雑適応系)
普通は重み(二つのニューロン間の信号を制御する数値)を調整することで適合させる。
ニューラルネットワークが適していない出力を使た場合はこの重みを変更して後続の結果を改善する。
教師あり学習
ネットワークのだした答えと、正しい答え(教師)を比較して誤差にあわせて調整する。
教師なし学習
既知の答えのデータがない場合に行う。隠されたパターンを検索するイメージ。適用例にクラスタリングがある。
強化学習
観察に基づいた方法。結果に従って判断し、環境の観察をする。ロボット工学で広く使われている。
最も単純なニューラルネットワーク。単一ニューロンの計算モデル。
1つか複数の入力、プロセッサー、出力で構成される。
フィードフォワードモデル(送信、処理、出力)?
パーセプトロンを使って、単純なパターン認識をする。
与えられた座標が線より上にあるか、下にあるか判断するパーセプトロンを作る。
できたもの↓
See the Pen シンプルパーセプトロン by kanaparty (@kanaparty) on CodePen.
正しい線は背景にうっすら見える紺色の線。
点は教師。1フレームづつ教師の入力をパーセプトロンに渡して訓練させる。
紺色の点は線より上に、黄色い点は線より下にあるとパーセプトロンが判断した位置。
これが正しい線にだんだん近づけば訓練が成功している!
登場人物は2つ。
パーセプトロン
入力には3つの値(x、yと、バイアス)
バイアスは(0,0)の位置にあるときにつねに0を返すのを防ぐため。
パーセプトロン自身は重みを知っている。(そのため重みプロパティはパーセプトロンクラスに格納する)
教師(2000個)
パーセプトロンに正しい答えを用意してある入力をわたす。
ニューラルネットワークが正しい判断をしているかがわかる。
推測が正しくなければ重みを調整する。
エラー = 適切な出力 - 推測の出力
新しい重み = 今の重み + 重みの変化量
(重みの変化量 = エラー * 入力)
学習定数(ビークルの操舵のときに出てきたmaxSpeedのような感じで、最大力を制御する変数)を加えると答えに行き着くまでの時間を調整することができる。
学習定数が大きいと短時間で済むが微調整が難しい。小さいと時間がかかるが正確性が増す。
線の上にあるか下にあるかは線の関数を使って調べればよい。f(x)のyよりの上にあるか、ないか。
たしかこの章を読み始めたのは7月だったはず・・・。
私には難しくて危うく積ん読になってしまうところだった。
のこす課題はあと3つ。
それにしても教師オブジェクト2000個でも正しい斜めのラインぴったりにはなかなかならないのだなぁ。
↑昨年イテレータについて後日読もうと思っていたんですが、ようやくその「後日」が来ました。
イテレータ・ジェネレータ(ついでにシンボルもちょっとだけ)について覚えたことをメモ。
自分でIterableなオブジェクトを書いてもいいし、arrayやstringにはそもそも備わっているということで
なんだ〜となりました。もっと早くちゃんと読んでおけばよかったなと思った次第です。
繰り返し処理を行うための決まりに従った実装。
繰り返し処理を適用したときの挙動 → Iteration
Iterable = Iteratorを備えた(Symbol.iteratorプロパティにIteratorを返すメソッドを実装している)オブジェクト。Iteratorを備えているのでfor-ofで処理できる。
Iterator = next()メソッドを実装したオブジェクト。nextメソッドを呼ぶと以下2つのプロパティをもったオブジェクトを返す。
はじめからSymbol.iteratorプロパティにIteratorを返すメソッドが実装されているもの
など。
たとえば文字列で順番にとりだしたいとき以下のように書ける
const s = 'javascript'; const sIterator = s[Symbol.iterator](); sIterator.next();//Object {value: "j", done: false} sIterator.next();//Object {value: "a", done: false} sIterator.next();//Object {value: "v", done: false} sIterator.next();//Object {value: "a", done: false} sIterator.next();//Object {value: "s", done: false} sIterator.next();//Object {value: "c", done: false} sIterator.next();//Object {value: "r", done: false} sIterator.next();//Object {value: "i", done: false} sIterator.next();//Object {value: "p", done: false} sIterator.next();//Object {value: "t", done: false} sIterator.next();//Object {value: undefined, done: true}
for-ofを使ってとりだすとき
const a = ['j','a','v','a','s','c','r','i','p','t']; const aIterator = a[Symbol.iterator](); for (variable of aIterator) { console.log(variable); } //j //a //v //a //s //c //r //i //p //t
使い方はここ qiita.com
がとてもまとまってました。ありがとうございます。
オブジェクトに対して、ある状況に応答するためのインターフェースを組み込む(プロトコルを定義する)ために使う。
const sym = Symbol();
で生成できる。newをつけない。
常に別々のユニークな値として生まれる。
オブジェクトのプロパティとして使うとObject.keys()などで無視される。
グローバルスコープを越えて共有されるSymbolの領域。
iframeなどを隔てたとしても同じSymbolを共有することができる。
Symbol.for(key)メソッドを使うと
keyとして渡した値を持ったSymbolがGlobalSymbolRegistryに存在しなければ、新しく生成したSymbolを生成して返す。
処理を途中で抜けられる。そのときに値を取り出すことができる。 Generatorオブジェクトはnextメソッドを呼びだすと、 yieldの後に置かれている処理を評価するところまで進み、その評価結果を返す。 返ってくるオブジェクトの中身は
function* generatorFunc() { yield 1; yield 2; return 3; } var g = generatorFunc(); console.log(g.next()); //Object {value: 1, done: false} console.log(g.next()); //Object {value: 2, done: false} console.log(g.next()); //Object {value: 3, done: true}
function* と記述すると定義できる。
See the Pen Minesweeper(vue.js) by kanaparty (@kanaparty) on CodePen.
See the Pen PzJZNz by kanaparty (@kanaparty) on CodePen.
あとで
See the Pen 障害物を避けて進化 by kanaparty (@kanaparty) on CodePen.
前回
のコードをベースに、障害物を設置してそれを避けて通るように進化させる課題。
前回のコードとの大きな違いは、ビークルの表現のクラスのなかの、適応度を更新する部分。
//適応度を更新 updateFitness() { this.fitness = Math.pow(1 / this.RecordDistance * this.finishTime, 4); if(this.hitObstcle){ this.fitness *= 0.01; } else if(this.hitTarget){ this.fitness *= 2; } }
前回はライフサイクルが終了した時のビークルの位置を見て適応度としていたが、
今回はライフサイクル中に一番近い付いたときの距離と、そのサイクル数の短さが適応度に反映されるようにする。
また、ターゲットにぶつかったときは2倍の適応度に、障害物にぶつかったときは10分の1の適応度にすることで重みをつけている。
この課題、写経なのでなんとなくできている感のある動きになってはいるものの、
適応度を図る部分や突然変異率、母数などちょっとしたことが与える影響がかなり大きくて
自分一人で1から組み立てチューニングできるようになるのは大変なんじゃないかな、と思ったり。。