next up previous
次へ: 双曲線関数について 上へ: ニューラルネットの基本:実習編 戻る: セルフフィードバックつきのモデル

2のニューロンによる相互作用

隠れニューロンがあるもの、2 つのニューロンが相互に結合したもの、 さらに、フィードバックがあるものが考えられる。

図 3: 隠れニューロン(外部からの入力、外部への出力が無いニューロンがある場合)
\fbox{\resizebox{35mm}{!}{\includegraphics{fig3.eps}}}

図 4: 相互に結合している場合
\fbox{\resizebox{35mm}{!}{\includegraphics{fig4.eps}}}

図 5: さらに self feedback loop がある場合
\fbox{\resizebox{40mm}{!}{\includegraphics{fig5.eps}}}

課題 4:
どれか一つのプログラムを作り、結合係数の変化が出力値に与える影響を考察しなさい。

--ヒント--
ここでは Figure.4 の場合を取り上げてみます。 後で使うので、ニューロンを表現する構造体の定義を次のようにしておきます。
struct NEURON {
    double output, old_output;
    double thres;
    int    Ninp;
    double *inp_wgt;
    struct NEURON **inp_neuron;
};
typedef struct NEURON neuron;


ここで、Ninp という int 型の変数を加えました。このニューロンが いくつのニューロンからの入力を受けるかを表します。加えて、 struct NEURON **inp_neuron; というこのニューロンに対して出力を送っている ニューロンへのポインタを格納するためのポインタ(配列)を用意しておきます。 一つのニューロンを初期化する関数内では
void initialize_neuron(neuron *a, int N)
{
    int i;

    a->Ninp = N;
    a->inp_wgt = (double *)malloc(sizeof(double) * (N+1));
    for (i=0; i<=N; i++) {
        a->inp_wgt[i] = drand2();
    }
    a->inp_neuron = (neuron **)malloc(sizeof(neuron *) * (N+1));
}


のように、入力を受けるニューロン数だけ結合係数とそのニューロンの定義されている 場所を格納しておくための場所を malloc() 関数を使って確保することにします。 このようにしておくと、ニューロン数がいくつになっても対応できます。 ポインタへのポインタと、メモリの動的割り当て(malloc())と、定義済変数のサイズを 計算するための sizeof などすこし分かりづらいかも知れませんが、この方が 拡張性が高いといえます。このようにしておけば、ニューロン a とニューロンb との相互結合を次のように表現できます。
    Neuron a,b;

    initialize_neuron(&a, 2);
    initialize_neuron(&b, 2);

    a.inp_neuron[1] = &b;
    b.inp_neuron[1] = &a;






Shinichi ASAKAWA 平成14年4月30日