2014年6月10日火曜日

人口知能 ニューロン (余談)

自分で作ろう!弁護士向けソフト の
FileMakerでのデータベースは、Navレイアウトに移植中です。
(しばらくお時間をください)



Wise9で面白いものを見つけました。


中野馨博士が1972年に発明したアソシアトロン(連想記憶ニューラルネット)


 こう云えば、こう答える、という下手なアルゴリズムで人口知能を作るのではなく、もっと人に近い記憶技術を考えるということです。


 ニューロン(神経細胞)を真似てプログラムを開発するという試みです。


 人間の脳は140億個の神経細胞(ニューロン)があるらしいです。この神経細胞をさらに細かくみていくと、神経は核から軸索(axon)がいくつものびており、これがほかの神経細胞と結合してネットワークを形成するらしいんだけど、神経細胞へ入力刺激が入ってきた場合に、活動電位を発生させ、他の細胞に変化する情報を伝達させて記憶させているらしいです。

人の神経細胞は主に3つの部分に区分けされ、細胞核のある細胞体、他の細胞からの入力を受ける樹状突起、他の細胞に出力する軸索に分けられます。
細胞の軸索終末と後ろの細胞の樹状突起の間の情報を伝達する部分には、微小な間隙を持つシナプスと呼ばれる化学物質による伝達構造が形成されています。


なんだか難しい話なので、いったんスルー。





ここに面白いゲームがあります。
遊んでください。



カタカナの「タ」のつもりで書いてみました。(下手くそだけど・・・)
そして「記憶」ボタンを押してみました。



書きなおしてみました。矢印マーク。

そして「思い出す」を押すと




復元されました!

大した事がないように思いますが、実はこれ、メモリに記憶されているわけでもハードディスクに記憶されていた分けでもないんです。
どのようにして、復元されたかというと



ニューロンと軸索(axon)が、いや、黒い●達が

「こうだった筈だよ」
「いや、違うべ」
「みんな、どう思うよ」

と云って多数決で決めた結果、復元されたということです。



解説によると・・・

これは角ニューロンが-1、0、1(黒が-1、赤が1、白が0)の三状態の変化を「こうじゃないか」と復元させたもの。本来の人間の神経細胞は0か1の二状態だから厳密には人間の脳細胞を完全にモデル化しているわけではないけれど、ニューロンと軸索の乗算を積分し、「思い出すべき」状態を復元しているのだ。

人は、神経細胞へ入力刺激が入ってきた場合に、活動電位を発生させ、他の細胞に変化する情報を伝達させるが、
このプログラムではひとつのNewronクラスの中に、すべてのNewronインスタンスと接続される軸索(axon)配列を持っていて、変化を軸策の乗算積分で記憶している。


JavaScript

<Newron配列>


var Neuron = enchant.Class.create(enchant.Sprite, {
    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>


var memorize = function(){
    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("覚えました");
}





<思い出すとき呼び出される関数remind>


function quantize(a){
    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();
}


解説によると・・・・・

わからないものは明確にわからない(0)状態を作ることで、ほかの多数決を邪魔しないようになる。「わからない」状態は、多数決を棄権する、ということに相当するらしい。
多数決で記憶するので、わずかな部分だけ変化したものを見分けるような用途にはアソシアトロンは非常に弱いという。
記憶の回数にも影響されるらしい。

いつも会ってるひとの名前は田中さんと覚えられるが、一度しか会ってない人は忘れる。
「たぶん、あの方だったと思う・・・」

これこそが人間くさい人口知能なのではないか。

新しい情報を覚えれば覚えるほど、記憶をはっきりと思い出すのは難しくなってくる。
実際、アソシアトロンで「記憶する」を何回押してもメモリが一杯になったりはしない。
単に軸索(axon)に新しい記憶が積分されるだけだ。

昔の記憶はなかなか思い出せない。
「記憶する」と「思い出す」を繰り返すうちに、人に近くなってくる。


面白いです。

遊んでください。






0 件のコメント:

コメントを投稿

最適化してますか?

 まるで入院していた患者が退院して元気に復活するような機能。 クラウドを使用するユーザーさんがほとんどなのですが、このゴールデンウィーク中は 最適化のメンテしときます。 データがピチピチしちゃいますよぅ。