読者です 読者をやめる 読者になる 読者になる

kkana's blog

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

nature of code : 今日の練習「単純なパーセプトロン」

あたらしく覚えた! nature of code

ニューラルネットワークとは

脳に基づいて特定の問題を解決するための計算モデル。複雑系の一種

ニューラルネットワーク - Wikipedia

ニューロン...細胞網に存在している単一細胞で、入力を受け取り、処理し、出力を生成する。
コネクショニスト計算系...情報がネットワーク全域で集合的に並列で処理される

ニューラルネットワークの学習機能

ニューラルネットワークの主な要素の一つ。
ニューラルネットワークは単なる複雑系にあらず。内部を流れる情報に基づいて構造を変化させることができる複雑適応系
普通は重み(二つのニューロン間の信号を制御する数値)を調整することで適合させる。
ニューラルネットワークが適していない出力を使た場合はこの重みを変更して後続の結果を改善する。

いろいろな学習方法

  • 教師あり学習
    ネットワークのだした答えと、正しい答え(教師)を比較して誤差にあわせて調整する。

  • 教師なし学習
    既知の答えのデータがない場合に行う。隠されたパターンを検索するイメージ。適用例にクラスタリングがある。

  • 強化学習
    観察に基づいた方法。結果に従って判断し、環境の観察をする。ロボット工学で広く使われている。

ニューラルネットワークの代表的な使用方法

  • パターン認識(顔認識)
  • 時系列予測(明日の天気など)
  • 信号処理(補聴器のノイズの除去など・・・)
  • 制御(自動運転など)
  • ソフトセンサー(複数の個別センサーを処理して総合的に判断したり)
  • 異常検出

パーセプトロンとは

最も単純なニューラルネットワーク。単一ニューロンの計算モデル。
1つか複数の入力、プロセッサー、出力で構成される。
フィードフォワードモデル(送信、処理、出力)?

入力から出力まで

  1. 入力を受けとる
  2. 重みを入力する(特定のあたいをかける。通常は最初ランダムな0〜1の値で行う。)
  3. 入力に重みをかける
  4. 重み付けされたすべての入力を合計する
  5. 出力を生成する(活性化関数を通じて合計値を渡す。出力するかどうかをパーセプトロンに通知する。)

実装した単純なパーセプトロン

パーセプトロンを使って、単純なパターン認識をする。
与えられた座標が線より上にあるか、下にあるか判断するパーセプトロンを作る。

できたもの↓

See the Pen シンプルパーセプトロン by kanaparty (@kanaparty) on CodePen.

正しい線は背景にうっすら見える紺色の線。
点は教師。1フレームづつ教師の入力をパーセプトロンに渡して訓練させる。
紺色の点は線より上に、黄色い点は線より下にあるとパーセプトロンが判断した位置。
これが正しい線にだんだん近づけば訓練が成功している!

登場人物は2つ。

処理の流れ

  1. 答えが用意されている入力をパーセプトロンにわたす
  2. 答えを推測
  3. エラーを計算(正しいか、間違っているか)
  4. エラーに従ってすべての重みを計算する
  5. (繰り返し)

エラーの定義と重さの定義

  • エラー = 適切な出力 - 推測の出力

  • 新しい重み = 今の重み + 重みの変化量

(重みの変化量 = エラー * 入力)

  • 新しい重み = 重み + エラー * 入力

学習定数(ビークルの操舵のときに出てきたmaxSpeedのような感じで、最大力を制御する変数)を加えると答えに行き着くまでの時間を調整することができる。
学習定数が大きいと短時間で済むが微調整が難しい。小さいと時間がかかるが正確性が増す。

教師オブジェクト

線の上にあるか下にあるかは線の関数を使って調べればよい。f(x)のyよりの上にあるか、ないか。


おしまい

たしかこの章を読み始めたのは7月だったはず・・・。
私には難しくて危うく積ん読になってしまうところだった。 のこす課題はあと3つ。

それにしても教師オブジェクト2000個でも正しい斜めのラインぴったりにはなかなかならないのだなぁ。

参考にしたサイト

ニューラルネットワーク

hokuts.com