忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

かんたん!制限付きボルツマンマシン実装 (C#) バイナリ(0と1)バージョン [Deep Learningシリーズ]

Implementing Restricted Boltzmann Machine(RBM) in C#

YUSUKE SUGOMORIさんのjavaコードやその他のコードいろいろを参考にしてC#で制限付きボルツマンマシンを実装してみました。
私好みに書き換えていくとだいぶプログラムの行数が無駄に膨れ上がってしまいましたが、まあよしとしましょう。


拍手[3回]

PR

[Deep Learningシリーズ] かんたんHopfieldネットワーク

Deep Learning

最近Deep Learningというものが話題になっています。
Deep Learningはコンピュータの学習手法の一つです。
一年ほど前(2012年)GoogleがコンピュータにたくさんのYoutube画像を見せネコの顔を自発的に学ばせたということで有名ですね。
人工知能学会誌には現在ディープラーニングの解説が連載中です。
Deep Learningはコンピュータ関係で現在最もホットな話題の一つといえるでしょう。

というわけでこのブログでもDeep Learningを取り上げてみたいと思います。
しかしいきなりDeep Learningの全容に迫るのは難しいのでまずは簡単な話から始めましょう。
今回はHopfield(ホップフィールド)ネットワークです。

拍手[6回]


植物 vs 動物 かんたんシミュレーション(ロトカ=ヴォルテラ方程式の解っぽい)

植物 vs 動物

植物と動物の簡単なシミュレーションを作ってみました。
緑が植物、赤が動物です。

シミュレーション画面をクリックすると一時停止、もう一度クリックすると再開します。


植物も動物も自分から動きまわることはせず、ぶつかり合うだけですが、それで十分です。
ぶつかったとき、捕食が起きます。
動物が植物からエネルギーを吸い取るのです。
動物と動物、植物と植物では何も起きません。
なお、エネルギーが空になった個体は消滅します。
ちなみに植物は何も起きなくともエネルギーを得ることができます。

さて、このシミュレーションを動かすと、動物と植物の数が増減を繰り返します。
これはロトカ=ヴォルテラの方程式の解にそっくりですね。
つまり、
植物が増えると、動物が増え、
動物が増えると、植物が減り、
植物が減ると動物が減り
動物が減ると植物が増える
をくりかえすのです。

パラメーターには次のようなものがあります:
  • Reproduction Cost : 繁殖すると失われるエネルギー(ただしそのあとさらにエネルギーの半分が子に奪われる)
  • Reproduction Threashold : 繁殖するのに必要なエネルギー。これだけエネルギーを持っていないと繁殖しない。別に繁殖するとこれが失われるわけではない。というのがReproduction Costとのちがい。
  • Plant Energy Supply : 植物に1フレーム間に与えられるエネルギー。
  • Animal Energy Consumption : 動物が1フレーム間に失うエネルギー。
  • Animal Energy Drain : 動物が植物と接触したときに吸い取るエネルギー。

おまけ
プロジェクトファイルです。

















拍手[0回]


Silverlightでニューラルネットワーク(バックプロパゲーション)

今回はニューラルネットワークです。
バックプロパゲーションという、「ある出力を出すように学習する」ネットワークです。
ここではXORを学習させることにします。

XOR

0 0 -> 0
0 1 -> 1
1 0 -> 1
1 1 -> 0


なぜXORなのか?

もともとこれは普通のシンプルなニューラルネットワークである2層の単純パーセプトロンで、XORを学習できないことから考えだされました。
単純なXORさえできないからニューラルネットワークはもうダメだ!ということが昔言われていたのです。
これを言ったのはミンスキーという人で、このおかげで研究が下火になったといいます。
しかし、3層のバックプロパゲーションで、今までうまく出来なかったXOR計算ができるようになった!
そこでバックプロパゲーションの例題としてXORを学習することが多いのです。

かつてニューラルネットワーク研究を復活させたバックプロパゲーション。
それをSilverlightで再現してみました。



左は入力、右の数字は出力です。
はじめのうちは出力の数字は適当です。
しかし右の学習ボタンを押すと、次第に出力値が補正されていき、最後にはほとんどXORのようになります。
学習が終わるとストップします。

ただ、最初の結合の重み(ランダムに割り当てられる)によっては、上手く学習が進まないこともあります。
その時はリセットボタンを押して結合荷重をリセットしてください。


おまけ

プロジェクトファイルです。

拍手[0回]


Silverlightで遺伝的アルゴリズム

Silverlightで仮想のロボットを、光を追いかけるように進化させました。



赤い丸が光で、黒い丸(に矢印がついたもの)がロボットです。
光はマウスポインタで操作することができます。

ロボットははじめのうちは光を追いかけようとはしません。
しかし世代を経るにつれてだんだんと光を追いかけるようになっていきます(数分くらいかかります)。
右上のグラフはそのスコア(を上下に反転したもの)です。

時間が経つに連れてスコアが良くなっていくのがわかると思います。
また、ロボットがより効率良くマウスポインタを追いかけるようになるのもわかると思います。

ロボットの仕組みはこうなっています。
ロボットには8つの光センサーと2つのタイヤがついています。
8つのセンサーからの出力は重み付けられた和となってタイヤに与えられます。
シンプルな構成です。

この重みをこのSilverlightでは変化させていくのです。
結果ロボットは光を追いかけるようになっていきます。

おまけ

プロジェクトファイルです。

拍手[0回]