忍者ブログ

Memeplexes

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

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


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回]

PR

Silverlightで遺伝的アルゴリズム

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



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

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

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

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

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

おまけ

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

拍手[0回]


Silverlightで『模型は心を持ちうるか』ver2

模型は心を持ちうるか』という人工知能の本があります。
私はまだろくに読んでないのですが、一部だけ見た感じだと、こんな感じのようです:

こんなロボットがあったとします。
(リンク先から引用)

Vehicle2.JPG



このロボットは本体+2つのセンサーと2つの車輪からなっています。
上にある手のように見えるものは実は手ではなく光センサーです。
そこから信号を伝える電線が下の車輪に伸びています。

このとき、電線のつなぎ方は2通りあります。
平行に繋ぐ方法とクロスさせる方法。
aとbはその2通りのつなぎ方を表しています。

実は、このつなぎ方によって振る舞いに大きな違いが生まれるのです。
というか、単にセンサーと車輪をつなぐだけでも、面白い振る舞いが生まれます。

Vehicle2Behavior.JPG

このとおり、aのようなつなぎ方をすると光を恐れるようになり、bのようなつなぎ方をすると光を追いかけるようになります。
単純な仕掛けから高等に見えるふるまいが出てくる。
人工知能のエッセンスですね。

さてこれをSilverlightで再現してみました。



このSilverlightでは光ではなくマウスポインタを追いかけます。
チェックボックスにチェックを入れると内部の配線が切り替わり、今度は逆に光から逃げるようになります。


おまけ

プロジェクトファイルです。
このようなケースでMVVMを使うのは難しいですね。











拍手[1回]


Silverlightで細胞の分化をシミュレート(ブーリアンネットワーク)

細胞の状態のシミュレーター

Silverlightで ブーリアンネットワークというもののシミュレーターを作ってみました。
これは細胞の状態の単純化されたシミュレーションです。



このページを開くとすると模様が現れます。
(現れない場合は[新規作成]を押してください。最初の状態はランダムに決まるので、模様が生まれない場合があるのです)

その模様が一種類の細胞に相当します。
ある模様は皮膚の細胞かもしれませんし、別の模様は神経の細胞かもしれません。

模様は周期的です。
短い目で見ればある細胞の内部状態は変動しています。
しかし長い目で見れば変わりません。
たとえば皮膚を作る細胞がいきなり神経細胞に変わったりはしないのです。

青で縁どられている四角形をクリックしてみてください(一番上です)。
するとその場所の黒と白が反転します。
結果、次の2つのうちどちらかが起こります。

1.模様が一時的にかき乱されるが、次第に元の模様に戻っていく。
2.模様がかき乱され、以後全く別の模様になる。

1が何を意味しているかというと、細胞の自己復元機能のようなものです。
2は、細胞の分化(ES細胞が皮膚や神経の細胞に変わるようなこと)を意味しています。

場合によっては2は起こりにくいかもしれません。
その時は[新規作成]で別のネットワークにするか、複数の四角形を同時にクリックしてみてください(ポーズボタンは右下です)

ブーリアンネットワークとは

人間の細胞にはいろいろな種類があります。
皮膚の細胞、内臓の細胞、骨の細胞、さまざまです。
それらは内部の状態が違っています。

内部の状態が違うのは違うタンパク質が作られているから。
そしてタンパク質を作り出すのは遺伝子です。
遺伝子が、細胞をいろいろな種類にわけているのです。

普通私たちプログラマは状態の遷移をStateパターンなんかを使って実装しますが、細胞は違います。
無数の遺伝子がお互いをスイッチONしたりスイッチOFFしたりして状態が決まります。

遺伝子はタンパク質を作り出すだけが能ではありません。
他の遺伝子が「オン」になるかどうかを調節したりもするのです。
オンになった遺伝子は効力を発揮し、タンパク質を作ったり、あるいは別の遺伝子のオンオフを替えたりします。
遺伝子の集まり=ゲノムは状態を制御するネットワークなのです。

複雑系の研究者スチュアート・カウフマンがその著書の中で次のようにモデル化したのを紹介しています:
(彼の言ったままではありませんがだいたいそういうことです)

「ひとつの遺伝子をboolとする。そしてその状態は、以前の自分や他の遺伝子の状態によって決まる」

遺伝子の調節ネットワークを、相互作用するboolのネットワークとしてみたのです。
具体的には遺伝子a、遺伝子b, 遺伝子cがあったとすると:

a = and(b, c)
b = xor(c, a)
c = or(a, b)

というような具合です。(右辺は直前の状態)
ここではandやxorやorなどと言っていますが、実際には16種類のブール関数何でもかまいません。
2つのboolから一つのboolを導き出すやり方は全部で16種類ありますからね。

(厳密には16である必要すらありません。
2つより多い数の遺伝子の情報をとって次の状態を計算してはなぜいけないのでしょうか?
残念ながら、3つ以上の遺伝子の情報を取るとまずいことになる理由があります。
どうも数を増やすと振る舞いがカオスになりやすいのです。
秩序がなくなってしまうのです。
(逆に数を2より減らすと動きが凍り付いてしまいます。おもしろくありません)
そういうわけで、2つの遺伝子にのみ依存するようにここではプログラムしました)

遺伝子一つ一つをboolに見立て、次々と状態をアップデートしていくのがブーリアンネットワークです。
これは上で述べたように、細胞の恒常性(ちょっとばかり状態が変わっても、元の状態に戻ろうとする力)、分化(細胞が別のタイプに変わること)のような現象が現れます。

なお、このネットワークは幾つかの安定した状態を取りますが、それはだいたい√遺伝子数 です。
このシミュレーターでは最初10個の遺伝子ですが、つまり大体3つの状態を取るはずだ、ということです。

ちなみに人間の遺伝子の数は約2万2000個。
平方根をとると148です。
実際の人間の細胞の種類はたしか2百数十種類です。
完全に一致とは言えませんが、オーダーはだいたい合っているようですね。
ちょっと多めになっているのは自然淘汰の力でしょう。
本来作れる状態よりちょっと多めに状態を作り出せるよう、遺伝子が調節されているものと思われます。
たとえば動物なんかだとひとつの遺伝子が複数の形態を取ることがあるようです。


おまけ

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

























































拍手[0回]


Silverlightで生き物の模様をシミュレート(チューリングパターン)

このサイトを参考に、生き物の模様を描き出すSilverlightを作ってみました。
ちょっと前NHKのサイエンスZero「シリーズ・細胞の世界(1)体をつくる不思議な“波”」でやっていたものです。

チューリングパターンと言って、2種類の化学物質の反応と拡散をシミュレートすると、生き物の模様が再現できるそうです。
(正確には、これはGray-Scottモデルといいます。)
何を言っているのかちょっとよくわかりませんが、百聞は一見にしかずです。



初めは血のりが飛んでるような絵ですが、
Resumeボタンを押すと、このようにゼブラフィッシュのような模様が出来ます。
zebrafish.JPG
模様ができたら、マウスでドラッグしてみてください。
模様が撹乱されますが、すぐに再生しておもしろいです。

「スパイラルウェーブ」を選択すると青い領域が全滅することがあります。
(スパイラルウェーブはチューリング・パターンではありません)
そういう時はコンボボックスで「青塗り」を選択。
適当に塗りたくっていると復活します。


元ネタのサイトのシミュレータにはない機能も付けてみました。
コンボボックスで「壁作り」を選択するとマウスでピンクの壁を作れます。

GrayScottWithWall.JPG

壁は化学物質を通しません。
波が壁を回りこむようになります。


もともとこれはコンピュータサイエンス界では有名なアラン・チューリングが考えだした理論です(だからチューリング・パターンというのですね)。
長らくホコリをかぶっていたようですが、日本の研究者が実証したとかで再び注目されたようです。

おまけ

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

拍手[3回]