やあshi3zだ。
いよいよ夏休みになった人も多いんじゃないかな?
さて、今日のテーマは人工知能だ。
難しそうだって?
いや、実をいうと単純な人工知能なら、3Dプログラミングよりもずっと簡単なんだ。
と言ってもにわかに信じられないかもしれないね。
さて、人工知能とは、文字通りヒトの知能を人工的に作ろうとしたものなんだけど、実際のところ、人間が行うような思考の大部分はまだ未解明なんだ。ただ、記憶と学習のメカニズムに人間の脳が大きく寄与しているらしいことはわかって来ている。
そこで、ここ数十年の人工知能の研究は、主に記憶と学習に焦点をあてて研究されているんだよ。
人工知能にはいろいろな考え方、アプローチがあるんだけど、今回は脳細胞をモデル化するニューラルネットワークというやり方について紹介する。
人間の脳は140億個の神経細胞(ニューロン)から出来ている。
この神経細胞をさらに細かくみていくと、神経は核から軸索(axon)がのびており、これがほかの神経細胞と結合してネットワークを形成する。
こういう構造をコンピュータの内部に作り出して、人間の神経細胞がやるのと同様の処理をさせてみよう、というのがニューラルネットワークによる人工知能研究なわけだ。
このニューラルネットの研究には長い歴史があって、様々な方式が生み出されてきた。それぞれの方法に長所と短所があるのだけど、今回紹介するのは中野馨博士が1972年に発明したアソシアトロンという連想記憶ニューラルネットだ。
これは角ニューロンが-1、0、1の三状態を持つニューラルネットで、本来の人間の神経細胞は0か1の二状態だから厳密には人間の脳細胞を完全にモデル化しているわけではない。
けれども非常に興味深い性質を持っているんだ。
以下のプログラムで実際に試してみてほしい。
このアソシアトロンは、-1、0、1の三状態を、次のようなグラフィックで表現している。
黒が-1、赤が1、白が0、というわけだ。
クリックすると、色が黒→白→赤→黒と順番に変わっていくので、これを使って、例えば下図のような絵を描いてみる。
ここではwise9のwと9を描いてみた。
書いたら「記憶する」という部分をクリックする。
すると記憶されるので、今度は意図的にこの画像にノイズを入れてみる。
この状態で「思い出す」をクリックすると、見事にもとの状態が復元される。
本当に「思い出してる」わけだ。
まあここまでは単にセーブとロードをしているだけだ、と思うかもしれない。
そこで次に、ほかの図形を描いてみる。
たとえばこんな図形を描いてみる。
ここまでボロボロに情報を欠損させてもちゃんと復元する。
もちろん最初に覚えさせたWと9の字も忘れていない。
このくらいのヒントでも
きちんと復元する。
この不思議なアソシアトロンだが、構造は極めてシンプルだ。
上図はアソシアトロンにおけるニューロンと軸索(axon)の関係だ。
紫色で示したのは、左上のニューロンにつながっている軸索(axon)だ。
アソシアトロンではひとつのニューロンがすべてのニューロンと軸索で結合されている。
そのため、このプログラムではひとつのNewronクラスの中に、すべてのNewronインスタンスと接続される軸索(axon)配列を持っている。
initialize: function(x, y,flag){
enchant.Sprite.call(this);
this.image = game.assets['fruits.png'];
this.x = x;this.y = y;
this.width = 16;this.height = 16;
this.flag = flag;
this.nextFlag = flag;
this.frame=this.flag+1;
//軸索(axon)配列
this.axon = new Array(size);
for(var i=0;i<size;i++)this.axon[i]=0;
this.addEventListener('touchend',function(){ // 触られたら状態を変化させる
this.flag++;
if(this.flag==2)this.flag=-1;
this.frame=this.flag+1;
});
},
reflesh:function(){
this.flag = this.nextFlag;
this.frame=this.flag+1;
}
});
これを前提に「記憶する」を押したときに呼び出される関数memorizeの内容は以下のようになる
for(var i=0;i<grid.length;i++)
for(var j=0;j<grid.length;j++)
grid[i].axon[j] += grid[i].flag * grid[j].flag;
alert("覚えました");
}
このとき、gridは、Newronクラスの入った配列だ。
すべてのニューロンがほかのすべてのニューロンとaxonで接続される。
そのときaxonの太さ(傾向)をすべてのニューロンの積分値で覚えておく訳だ。
そして思い出すとき呼び出される関数remindをみてみよう。
if(a<0)return -1;
if(a>0)return 1;
return 0;
}
function remind(){
for(var i=0;i<grid.length;i++){
var a=0;
for(var j=0;j<grid.length;j++)
a += grid[j].flag * quantize(grid[j].axon[i]);
grid[i].nextFlag = quantize(a);
}
for(var i=0;i<grid.length;i++)
grid[i].reflesh();
}
これもまた非常にシンプル。
思い出そうとするとき、相互のニューロンの状態をヒントにしている。
そしてすべてのニューロンと軸索の乗算を積分し、いわば多数決で「思い出すべき」状態を復元しているのだ。
要するに「左上のこの部分が赤い場合は、たぶん十字じゃなくてWだなあ」などと判断するわけだ。
そのために、「黒(-1)でも赤(1)でもない、わからない(0)状態」というのが非常に有効なのである。
間違った記憶をしていると、多数決でそのニューロンが反対にまわり、正しい答えが導きだせない。
わからないものは明確にわからない(0)状態を作ることで、ほかの多数決を邪魔しないようになるわけだ。いわばこの「わからない」状態は、多数決を棄権する、ということに相当するだろう。
また、学習回数にも関係がある。
たとえばW9の9を6に変えたものを記憶させてみる。
多数決で記憶するので、わずかな部分だけ変化したものを見分けるような用途にはアソシアトロンは非常に弱い。
しかしこれが実に人間の記憶と似ていると思わないだろうか。
「あの人、山川さんだっけなー、それとも山下さんだっけなー」
そんな風に記憶が混乱するのはよくあることだ。
新しい情報を覚えれば覚えるほど、記憶をはっきりと思い出すのは難しくなってくる。
実際、アソシアトロンで「記憶する」を何回押してもメモリが一杯になったりはしない。単に軸索(axon)に新しい記憶が積分されるだけだ。
遠い過去の記憶ほど、正確には思い出されにくい。
最近の真新しい記憶とごっちゃになってくることも少なくない。
「記憶する」と「思い出す」を繰り返すうちに、なにか人間くさいものを感じざるを得ない。
アソシアトロンは、実際の神経細胞とは異なる原理に基づいてはいるものの、非常に人間くさい動きをするので、中野馨博士を始めとした研究者の研究対象になっている。
Related posts:
Post a Comment