next up previous
次へ: セルフフィードバックつきのモデル 上へ: ニューラルネットの基本:実習編 戻る: 簡単なニューロンのモデル

減衰項付のニューロンモデル

時定数 $ \tau$ で減衰する項と外部入力に応じて増減する項との 和で表せるとする以下の微分方程式に従うモデル

$\displaystyle \tau\frac{d\mu(t)}{dt} = -\mu(t) + \sum_{i=1}^{n}w_ix_i - h$ (11)

を作ってみましょう。時間$ t$ $ 0\le t\le 100$ の間とし、この間の外部入力は 一定であるとします。

先程の例から数箇所変更すればすぐできます。

main の部分の loop を入力を表す $ x$ から時間を表す意味で $ t$ に変更しておきます。

#define FROM   0.0
#define TO   100.0
#define STEP   0.01

#define INPUT  0.1
#define INITIAL_VALUE -10.0

int main(int argc, char **argv)
{
    neuron a;
    double t;

    initialize_neuron(&a);
    t = FROM;
    while ( t <= TO ){
        update_neuron(&a, INPUT);
        printf("%f %f\n", t, a.output);
        t += STEP;
    }
}


課題 1 の例では入力が $ x$ が変化したのですが、今回は時間が変化するので注意してください。 すなわち変数 $ x$ が、前例では while 文の繰り返し制御のための変数であり、 かつ、ニューロンへの入力値を表していたのですが、この例では新たに入力を表す 定数 INPUT を定義しています。

さらに initialize_neuron() 関数と update_neuron() 関数の内容を変更すれば完成です。 initialize_neuron() では初期値を与える必要があるので

void initialize_neuron(neuron *x)
{
    x->thres = 0.0;
    x->inp_wgt = 1.0;
    x->output = 0.0;
    x->inner_state = INITIAL_VALUE;
}


のように初期化ルーチンで INITIAL_VALUE を与えておくことにします。

課題 2:
(1) update_neuron() を変更しプログラムを完成させなさい。

--ヒント--
どこかに STEP が入ります。
$\displaystyle \tau\frac{d\mu(t)}{dt}$ $\displaystyle =$ $\displaystyle -\mu(t) + \sum_{i=1}^{n}w_ix_i - h$ (12)
$\displaystyle \tau d\mu(t)$ $\displaystyle =$ $\displaystyle \Brc{-\mu(t) + \sum_{i=1}^{n}w_ix_i - h }dt$ (13)

という変形に注してください

(2) 初期値をプログラムの引数として与えられるようにプログラムを変 更してください。

--ヒント--
#include <stdio.h>

int main(int argc, char **argv)
{
    int i=0;
    fprintf(stderr,"argc=%d\n",argc);
    while ( i < argc ){
        fprintf(stderr,"argv[%d]=%s\n", i, argv[i]);
        i++;
    }
    return 0;
}


のような簡単なプログラムを使って適当な引数をつけて実行してみてください。 argv[i] という変数に i 番目の引数が格納されているのが わかるはずです。あとはこの変数を倍精度実数 doubleatof() などを 使って変換して用いればよいです。


(3) 初期値を変更すると $ t=100$ のときの値はどのように変化するでしょうか
(4) sigmoid 関数の傾きが大きくなると変化の仕方はどのようになるでしょうか


Shinichi ASAKAWA 平成14年4月30日