Main Content

時系列時間遅れニューラル ネットワークの設計

入力にタップ付き遅延線のあるフィードフォワード ネットワークで構成された最も簡単な動的ネットワークから始めます。これは、集中時間遅れニューラル ネットワーク (FTDNN) と呼ばれます。これは、集中ネットワークと呼ばれる、動的ネットワークの一般的なクラスに含まれます。集中ネットワークでは、静的多層フィードフォワード ネットワークの入力層でのみダイナミクスが現れます。次の図は 2 層 FTDNN を示しています。

このネットワークは時系列予測に非常に適しています。次に、古典的な時系列の予測に FTDNN を使用する例を示します。

次の図は、カオス状態の遠赤外線レーザーから記録された強度データを正規化してプロットしたものです。これは、Santa Fe Time Series Competition [WeGe94] で使用された複数のデータセットの 1 つに含まれていたものです。そのコンペティションの目的は、時系列の最初の 1000 点を使用して、次の 100 点を予測することでした。ここでの目的は、単に、FTDNN を使用して予測する方法を説明することであるため、ここでは 1 ステップ先を予測するようネットワークに学習させます (結果として得られたネットワークは、その予測をネットワークの入力へと送り込み、継続的に繰り返すことで、複数ステップ先の予測に使用できます)。

最初のステップは、データを読み込み、正規化し、時間列 (cell 配列で表される) に変換することです。

y = laser_dataset;
y = y(1:600);

次に、timedelaynet コマンドを使用して FTDNN ネットワークを作成します。このコマンドは、feedforwardnet コマンドに似ていますが、タップ付き遅延線ベクトルの入力 (最初の入力) が追加されています。この例では、1 から 8 の遅延があるタップ付き遅延線を使用し、隠れ層で 10 個のニューロンを使用します。

ftdnn_net = timedelaynet([1:8],10);
ftdnn_net.trainParam.epochs = 1000;
ftdnn_net.divideFcn = '';

学習用のネットワーク入力とターゲットとを準備します。このネットワークには最大遅延が 8 のタップ付き遅延線があるため、時系列の 9 番目の値を予測することから始めます。また、タップ付き遅延線を時系列の 8 つの初期値 (変数 Pi に含まれる) と共に読み込む必要もあります。

p = y(9:end);
t = y(9:end);
Pi=y(1:8);
ftdnn_net = train(ftdnn_net,p,t,Pi);

ネットワークへの入力がターゲットと同じであることに注意してください。このネットワークには 1 タイム ステップの最小遅延があるため、これは 1 ステップ先の予測を実行することを意味します。

学習中は、次の学習ウィンドウが表示されます。

最大エポックに達したため、学習は停止しています。このウィンドウで [Time-Series Response] をクリックすると、ネットワークの応答を表示できます。次の図が表示されます。

ここで、ネットワークをシミュレートし、予測誤差を決定します。

yp = ftdnn_net(p,Pi);
e = gsubtract(yp,t);
rmse = sqrt(mse(e))

rmse =
    0.9740

(gsubtract は、cell 配列に使用できる一般的な減算関数であることに注意してください。)この結果は、線形予測子を使用して得られる結果より、はるかに優れています。以下の、前の FTDNN と同じタップ付き遅延線入力を伴う、線形フィルターを設計するコマンドによってこれを確認できます。

lin_net = linearlayer([1:8]);
lin_net.trainFcn='trainlm';
[lin_net,tr] = train(lin_net,p,t,Pi);
lin_yp = lin_net(p,Pi);
lin_e = gsubtract(lin_yp,t);
lin_rmse = sqrt(mse(lin_e))

lin_rmse =
	21.1386

線形予測子の場合、rms 誤差は 21.1386 ですが、非線形 FTDNN 予測子の場合は 0.9740 です。

FTDNN の便利な特徴の 1 つは、ネットワークの勾配を計算するために動的な逆伝播が必要ないことです。これは、タップ付き遅延線がネットワークの入力にのみ現れ、フィードバック ループや調整可能なパラメーターが含まれていないためです。そのため、このネットワークの学習が他の動的ネットワークよりも高速であることがわかります。

動的ネットワークの適用先がある場合、最初に線形ネットワーク (linearlayer) を試し、次に FTDNN (timedelaynet) を試してください。どちらのネットワークでも満足できる結果が得られない場合は、このトピックの残りの部分で説明する、より複雑な動的ネットワークのいずれかを試してください。

ニューラル ネットワークでは、学習を行うたびに異なる解が得られる可能性がありますが、これは初期の重みとバイアスの値が異なり、データの学習セット、検証セット、テスト セットへの分割が異なるためです。このため、別のニューラル ネットワークが同じ問題について学習した場合、入力が同じでも出力が異なる場合があります。ニューラル ネットワークで高い精度が得られるようにするためには、何度か再学習を行います。

高い精度が必要な場合は、初期解を改善するための手法が他にいくつかあります。詳細については、浅層ニューラル ネットワークの汎化の改善と過適合の回避を参照してください。

入力および層遅延状態の準備

前の節からわかるように、動的ネットワークの場合、ネットワークの学習やシミュレーションを行う前にかなりのデータ準備作業が必要になります。これは、ネットワークのタップ付き遅延線に必要な初期条件を入力する必要があるためです。これを行うには、元のデータセットの一部を削除およびシフトする必要があります。動的 (時系列) ネットワーク用のデータ準備を容易にするツールボックス関数として preparets があります。たとえば、次の行を

p = y(9:end);
t = y(9:end);
Pi = y(1:8);

以下で置き換えることができます。

[p,Pi,Ai,t] = preparets(ftdnn_net,y,y);

関数 preparets はネットワーク オブジェクトを使用して、タップ付き遅延線に初期条件を入力する方法と、ネットワークの学習やシミュレーションに使用する正しい入力およびターゲットを作成するためにデータをシフトする方法を決定します。preparets を呼び出す一般的な形式は次のとおりです。

[X,Xi,Ai,T,EW,shift] = preparets(net,inputs,targets,feedback,EW)

preparets の入力引数は、ネットワーク オブジェクト (net)、ネットワークへの外部 (非フィードバック) 入力 (inputs)、非フィードバック ターゲット (targets)、フィードバック ターゲット (feedback)、誤差の重み (EW) (誤差の重みを使用したニューラル ネットワークの学習を参照) です。外部信号とフィードバック信号の違いは、時系列 NARX フィードバック ニューラル ネットワークの設計で NARX ネットワークを説明するときに、より明確になります。FTDNN ネットワークの場合、フィードバック信号はありません。

preparets の戻り引数は、ネットワークの入出力間の時間シフト (shift)、学習およびシミュレーション用のネットワーク入力 (X)、入力の重み用のタップ付き遅延線を読み込むための初期入力 (Xi)、層の重み用のタップ付き遅延線を読み込むための初期層出力 (Ai)、学習ターゲット (T)、および誤差の重み (EW) です。

preparets を使用すると、入力およびターゲットを手動でシフトしてタップ付き遅延線を読み込む必要がなくなります。これは、より複雑なネットワークの場合に特に便利です。