#freeze
#contents
**エルマンネットワーク [#i8b17418]
-[[リファレンス:http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/nnet/?/matlab/support/manual/r13/toolbox/nnet/recur93.shtml#136]] - [[関数newelmのドキュメント:http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/nnet/?/matlab/support/manual/r13/toolbox/nnet/newelm.shtml]]、[[応用例 波動の振幅の検出:http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/nnet/?/matlab/support/manual/r13/toolbox/nnet/appl1110.shtml]]も参照してください。~
-エルマンネットワークは、時系列学習ができるリカレントネットワークの一種です。~
-単語獲得、文法獲得のモデルとしても研究されています。
--[[エルマンネットの学習事例:http://www.twcu.ac.jp/~asakawa/chiba2002/lect4-SRN/recurrent-net.pdf]](東京女子大 浅川先生)
--[[子供の語彙獲得戦略のモデル化に関する研究:http://kussharo.complex.eng.hokudai.ac.jp/~taka/papers/ShimotomaiThesis2003finald.pdf]](北海道大 下斗米先生)
-【例1】 過去の時系列データの学習
--例えば、以下のような入力ベクトルに対して、~
INPUT =
0 1 1 0 1 1 1 1 0
以下のような応答を得たいとします。~
OUTPUT =
0 0 1 0 0 1 1 1 0
すなわち、「入力ベクトルで1が2回以上連続して与えられたときだけ、1を出力する」ルールを学習させます。
--エルマンネットワークの訓練は、以下のようにします。~
#geshi(matlab){{
%入力ベクトルを作成
P = [0 1 1 0 1 1 1 1 0]
Pseq = con2seq(P) %Pをエルマンネットワークで使用可能なセル配列形式に変換
%ターゲットベクトル(教師データ、望ましい応答のベクトル)を作成
T = [0 (P(1:end-1)+P(2:end) == 2)] %P内で2回続けて1があるときには1、それ以外では0と定義
Tseq = con2seq(T) %Tをエルマンネットワークで使用可能なセル配列形式に変換
%ネットワークを生成
%入力ベクトルは0から1の範囲内、5個の中間層tansigニューロンと1個のlogsig出力層をもつ
net = newelm([0 1],[5 1],{'tansig','logsig'});
%訓練
net.trainParam.epochs = 100; %訓練回数100エポック(全ての入力ベクトルを100回繰り返し入力)
net = train(net,Pseq,Tseq);
%結果を確認
P = [0 1 1 0 1 0 1 1 0 1 1 0]
Pseq = con2seq(P);
Yseq = sim(net,Pseq);
Y = seq2con(Yseq); %セル配列形式を同時形式に変換
Y = Y{1,1} %結果を出力
}}
--学習結果は以下のようになります。(入力ベクトル=P、ネットワークの出力例=Y)
P =
0 1 1 0 1 0 1 1 0 1 1 0
Y =
0.1431 0.1036 0.6315 0.2082 0.5628 0.1791 0.3931 0.7862 0.2651 0.4113 0.7701 0.2473
--1が2回以上連続して与えられたとき、Yの応答値が大きくなっていることが分かります。
--同じ入力ベクトル「1」に対する応答でも、毎回値が異なっていることが分かります。これは、エルマンネットワークの中間層が、前回の入力ベクトルに対する応答状態を保持しているためです。
-【例2】 将来の入力データの予測
--例えば、以下のような入力ベクトルに対して、以下のような応答を得たいとします。~
INPUT =
0 1 1 0 1 1 1 1 0
OUTPUT =
1 1 0 1 1 1 1 0 0
OUTPUTは次回のINPUTの値です。すなわち、「1が与えられたときは、高い確率で次の入力も1」というルールを学習させます。
--エルマンネットワークの訓練は、以下のようにします。~
#geshi(matlab){{
%入力ベクトルを作成
P = [0 1 1 0 1 1 1 1 0]
Pseq = con2seq(P)
%ターゲットベクトル(教師データ、望ましい応答のベクトル)を作成
T = [1 1 0 1 1 1 1 0 0]
Tseq = con2seq(T)
%ネットワークを生成
net = newelm([0 1],[5 1],{'tansig','logsig'});
%訓練
net.trainParam.epochs = 100;
net = train(net,Pseq,Tseq);
%結果を確認
P = [0 1 1 0 1 0 1 1 0 1 1 0]
Pseq = con2seq(P);
Yseq = sim(net,Pseq);
Y = seq2con(Yseq);
Y = Y{1,1} %結果を出力
}}
--学習結果は以下のようになります。(入力ベクトル=P、ネットワークの出力例=Y)
P =
0 1 1 0 1 0 1 1 0 1 1 0
Y =
0.7188 0.9724 0.3087 0.9880 0.9699 0.9570 0.9935 0.3696 0.9934 0.9791 0.8621 0.9093
--次回に1が与えられるとき、Yの応答値が大きくなっていることが分かります。
-【例3】 単語境界の獲得シミュレーション
**LVQ [#j564318b]
-[[リファレンス:http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/nnet/?/matlab/support/manual/r13/toolbox/nnet/selfor16.shtml#8056]]