浅層ニューラル ネットワークの時系列予測およびモデル化
動的ニューラル ネットワークは、時系列予測に適しています。開ループ形式、閉ループ形式、および開/閉ループ複数ステップ予測で適用されている NARX ネットワークの使用例については、ニューラル ネットワークの複数ステップの予測を参照してください。
ヒント
時系列データを使用した深層学習については、代わりに深層学習を使用したシーケンスの分類を参照してください。
たとえば、pH 中和プロセスから得られたデータがあるとします。過去の pH 値、過去の酸性値、およびタンクへの基本流量からタンク内の溶液の pH を予測できるネットワークを設計する必要があります。これらの列をもつ合計 2001 個のタイム ステップがあります。
この問題は 2 つの方法で解くことができます。
ニューラル ネット時系列アプリを使用した時系列データへの当てはめの説明に従って、ニューラル ネット時系列アプリを使用。
コマンド ライン関数を使用した時系列データへの当てはめの説明に従って、コマンド ライン関数を使用。
メモ
深層学習ニューラル ネットワークの構築、可視化、および学習を対話的に行うには、ディープ ネットワーク デザイナー アプリを使用します。詳細については、ディープ ネットワーク デザイナー入門を参照してください。
通常、はじめにアプリを使用し、次にアプリを使用してコマンド ライン スクリプトを自動的に生成することをお勧めします。どちらの方法を使用する場合にも、まずデータセットを選択することによって問題を定義します。それぞれのニューラル ネットワーク アプリからいくつかの標本データ セットにアクセスし、これらを使用してツールボックスを試すことができます (浅いニューラル ネットワーク用の標本データセットを参照してください)。特定の問題を解く必要がある場合、独自のデータをワークスペースに読み込むことができます。
時系列ネットワーク
3 タイプの時系列問題の求解をニューラル ネットワークに学習させることができます。
NARX ネットワーク
最初のタイプの時系列問題では、時系列 y(t) の将来の値を、この時系列の過去の値および 2 番目の時系列 x(t) の過去の値から予測します。この形式の予測は、外因的 (外部) 入力を使用した非線形自己回帰 (NARX) と呼ばれており (時系列 NARX フィードバック ニューラル ネットワークの設計を参照してください)、次のように記述できます。
y(t) = f(y(t – 1), ..., y(t – d), x(t – 1), ..., (t – d))
このモデルは、失業率、GDP などの経済変数に基づく将来の株価や債券価格の予測に使用します。また、このモデルをシステム同定に使用して、化学プロセス、製造システム、ロボティクス、航空宇宙機などの動的システムを表すモデルを開発することもできます。
NAR ネットワーク
2 番目のタイプの時系列問題では、時系列を 1 つだけ使用します。時系列 y(t) の将来の値を、その時系列の過去の値のみから予測します。この形式の予測は、非線形自己回帰 (NAR) と呼ばれており、次のように記述できます。
y(t) = f(y(t – 1), ..., y(t – d))
このモデルは金融商品の予測に使用できますが、この場合には対になる系列を使用しません。
非線形入出力ネットワーク
3 番目の時系列問題は、2 つの時系列 (入力時系列 x(t) および出力時系列 y(t)) を使用する最初のタイプと似ています。ここでは、y(t) の前の値に関する情報がない状態で、x(t) の前の値から y(t) の値を予測する必要があります。この入出力モデルは次のように記述できます。
y(t) = f(x(t – 1), ..., x(t – d))
NARX モデルでは y(t) の前の値に含まれる追加の情報が使用されるため、この入出力モデルより精度の高い予測が行われます。ただし、アプリケーションによっては y(t) の前の値を使用できないことがあります。このような場合にのみ、NARX モデルではなく入出力モデルを使用する必要があります。
問題の定義
ツールボックスに対して時系列問題を定義するには、一連の時系列予測子ベクトルを cell 配列の列として配置します。次に、別の一連の時系列応答ベクトル (各予測子ベクトルの正しい応答ベクトル) を 2 番目の cell 配列に配置します。さらに、必要なのは応答データ セットのみである場合があります。たとえば、時系列の前の値を使用して次の値を予測する、以下の時系列問題を定義できます。
responses = {1 2 3 4 5};
次の節では、ニューラル ネット時系列アプリを使用して、時系列データ セットに当てはまるようにネットワークに学習させる方法を説明します。この例では、ツールボックスに用意されているサンプル データを使用します。
ニューラル ネット時系列アプリを使用した時系列データへの当てはめ
この例では、"ニューラル ネット時系列" アプリを使用して、時系列データに当てはまるように浅層ニューラル ネットワークに学習させる方法を説明します。
ntstool
を使用して "ニューラル ネット時系列" アプリを開きます。
ntstool
ネットワークの選択
"ニューラル ネット時系列" アプリを使用して、3 種類の時系列問題を解くことができます。
最初のタイプの時系列問題では、時系列 の将来の値を、この時系列の過去の値および 2 番目の時系列 の過去の値から予測します。この形式の予測は、外因的 (外部) 入力を使用した非線形自己回帰ネットワーク (NARX) と呼ばれています。
2 番目のタイプの時系列問題では、時系列を 1 つだけ使用します。時系列 の将来の値を、その時系列の過去の値のみから予測します。この形式の予測は、非線形自己回帰 (NAR) と呼ばれています。
3 番目の時系列問題は、2 つの時系列 (入力時系列 (予測子) および出力時系列 (応答) ) を使用する最初のタイプと似ています。ここでは、 の前の値に関する情報がない状態で、 の前の値から の値を予測する必要があります。
この例では、NARX ネットワークを使用します。[ネットワークの選択]、[NARX ネットワーク] をクリックします。
データの選択
"ニューラル ネット時系列" アプリには、ニューラル ネットワークの学習を始めるのに役立つサンプル データが用意されています。
サンプルの pH 中和プロセス データをインポートするには、[インポート]、[その他のサンプル データセット]、[pH 中和データセットのインポート] を選択します。このデータ セットを使用して、酸と塩基の溶液の液流に基づいて溶液の pH を予測するように、ニューラル ネットワークに学習させることができます。ファイルまたはワークスペースから自分のデータをインポートする場合は、予測子と応答を指定しなければなりません。
インポートしたデータに関する情報は、[モデルの概要] に表示されます。このデータ セットには 2001 個のタイム ステップが含まれています。予測子は 2 つの特徴 (酸と塩基の溶液の液流) をもち、応答は 1 つの特徴 (溶液の pH) をもちます。
データを学習セット、検証セット、テスト セットに分割します。既定の設定はそのままにします。データを以下のように分割します。
学習用に 70% を使用。
ネットワークが汎化されていることを検証し、過適合の発生前に学習を停止するために 15% を使用。
ネットワークの汎化の独立したテスト用に 15% を使用。
データ分割の詳細については、ニューラル ネットワークの最適な学習のためのデータの分割を参照してください。
ネットワークの作成
標準的な NARX ネットワークは、隠れ層にシグモイド伝達関数、出力層に線形伝達関数を使用した 2 層フィードフォワード ネットワークです。このネットワークでは、 シーケンスおよび シーケンスの過去の値を格納するタップ付き遅延線も使用されます。 は の関数であるため、NARX ネットワークの出力 が (遅延によって) ネットワークの入力にフィードバックされることに注意してください。ただし、学習の効率化のために、このフィードバック ループを開にすることができます。
ネットワークの学習中は真の出力が使用できるため、下記の開ループ アーキテクチャを使用できます。この場合、推定された出力をフィードバックするのではなく、真の出力が使用されます。これには 2 つの利点があります。1 つ目は、フィードフォワード ネットワークへの入力の精度が高くなることです。2 つ目は、結果として得られるネットワークが純粋なフィードフォワード アーキテクチャを持つようになり、より効率的なアルゴリズムを学習に使用できることです。このネットワークについては、時系列 NARX フィードバック ニューラル ネットワークの設計で詳しく説明します。
[層のサイズ] の値は、隠れニューロンの数を定義します。既定の層のサイズ (10
) はそのままにします。[時間遅延] の値を 4
に変更します。ネットワークの学習性能が低い場合、これらの数を調整することもできます。
ネットワーク アーキテクチャは [ネットワーク] ペインで確認できます。
ネットワークの学習
ネットワークの学習を行うには、[学習]、[レーベンバーグ・マルカート法を用いた学習] を選択します。これは既定の学習アルゴリズムで、[学習] をクリックした場合と同じです。
レーベンバーグ・マルカート法 (trainlm
) による学習は、ほとんどの問題に対して推奨されます。ノイズを含む問題や小規模な問題の場合は、ベイズ正則化 (trainbr
) を使用することで、かかる時間は長くなりますが、より良い解が得られます。大規模な問題の場合には、スケーリング共役勾配法 (trainscg
) を使用することをお勧めします。この方法では、他の 2 つのアルゴリズムで使用されるヤコビアン計算よりメモリ効率の高い勾配計算が使用されるためです。
[学習] ペインで学習の進行状況を確認できます。いずれかの停止条件が満たされるまで学習が続行されます。この例では、6 回の反復の間に検証誤差が連続して増加するまで ("検証基準に適合" するまで) 学習が続行されます。
結果の解析
[モデルの概要] に、学習アルゴリズムの情報および各データ セットに対する学習結果が表示されます。
プロットを生成すると、結果をさらに詳しく解析できます。誤差自己相関をプロットするには、[プロット] セクションで [誤差自己相関] をクリックします。自己相関プロットは、予測誤差と時間との関連性を示します。完全な予測モデルの場合、自己相関関数の値はゼロ ラグにおける値 (平均二乗誤差) を除き、すべてゼロになります。これは、予測誤差が相互に完全に無相関 (ホワイト ノイズ) であることを意味します。予測誤差に有意な相関がある場合、通常はタップ付き遅延線の遅延の数を増やすことによって、予測を改善できます。この場合、ゼロ ラグの相関を除く相関がゼロ付近の 95% 信頼限界の範囲内にほぼあるため、適切なモデルであると考えられます。より正確な結果が必要な場合は、ネットワークの再学習を行えます。これによってネットワークの初期の重みとバイアスが変更されるため、再学習後に改善されたネットワークが生成される可能性があります。
入力誤差の相互相関プロットを表示して、ネットワーク性能をさらに詳しく検証します。[プロット] セクションで [入力誤差相関プロット] をクリックします。入力誤差の相互相関プロットは、誤差と入力シーケンス がどのように相関しているのかを示します。完全な予測モデルの場合、すべての相関がゼロになります。入力と誤差に相関がある場合、通常はタップ付き遅延線の遅延の数を増やすことによって、予測を改善できます。この場合、ほとんどの相関がゼロ付近の信頼限界の範囲内にあります。
[プロット] セクションで [応答] をクリックします。時間に対する出力、応答 (ターゲット)、および誤差が表示されます。さらに、学習、テスト、および検証に対してどの時点が選択されたかを示します。
ネットワーク性能に満足できない場合、次のいずれかを行うことができます。
ネットワークに再度学習させる。
隠れニューロンの数を増やす。
より大規模な学習データ セットを使用する。
学習セットでの性能は良好であるにもかかわらず、テスト セットでの性能が低い場合は、モデルが過適合となっている可能性があります。層のサイズを小さくすると、ニューロンの数が減って過適合が軽減されます。
追加のテスト セットでネットワーク性能を評価することもできます。ネットワークを評価するための追加のテスト データを読み込むには、[テスト] セクションで [テスト] をクリックします。[モデルの概要] に、追加のテスト データの結果が表示されます。プロットを生成して追加のテスト データの結果を解析することもできます。
コードの生成
[コード生成]、[単純な学習スクリプトを生成] を選択して MATLAB コードを作成することにより、コマンド ラインで以前に実行したステップを再現できます。MATLAB コードの作成は、ツールボックスのコマンド ライン機能を使用して学習プロセスをカスタマイズする方法を学ぶ必要がある場合に便利です。コマンド ライン関数を使用した時系列データへの当てはめでは、生成されるスクリプトについてさらに詳しく説明します。
ネットワークのエクスポート
学習済みネットワークをワークスペースまたは Simulink® にエクスポートできます。MATLAB Compiler™ ツールなどの MATLAB コード生成ツールを使用してネットワークを展開することもできます。学習済みネットワークとその結果をエクスポートするには、[モデルのエクスポート]、[ワークスペースにエクスポート] を選択します。
コマンド ライン関数を使用した時系列データへの当てはめ
ツールボックスのコマンド ライン機能の使用方法を学ぶ最も簡単な方法は、アプリからスクリプトを生成し、これらのスクリプトを変更してネットワークの学習をカスタマイズすることです。例として、前の節で ニューラル ネット時系列アプリを使用して生成した簡単なスクリプトを見てみましょう。
% Solve an Autoregression Problem with External Input with a NARX Neural Network % Script generated by Neural Time Series app % Created 13-May-2021 17:34:27 % % This script assumes these variables are defined: % % phInputs - input time series. % phTargets - feedback time series. X = phInputs; T = phTargets; % Choose a Training Function % For a list of all training functions type: help nntrain % 'trainlm' is usually fastest. % 'trainbr' takes longer but may be better for challenging problems. % 'trainscg' uses less memory. Suitable in low memory situations. trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation. % Create a Nonlinear Autoregressive Network with External Input inputDelays = 1:4; feedbackDelays = 1:4; hiddenLayerSize = 10; net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize,'open',trainFcn); % Prepare the Data for Training and Simulation % The function PREPARETS prepares timeseries data for a particular network, % shifting time by the minimum amount to fill input states and layer % states. Using PREPARETS allows you to keep your original time series data % unchanged, while easily customizing it for networks with differing % numbers of delays, with open loop or closed loop feedback modes. [x,xi,ai,t] = preparets(net,X,{},T); % Setup Division of Data for Training, Validation, Testing net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100; % Train the Network [net,tr] = train(net,x,t,xi,ai); % Test the Network y = net(x,xi,ai); e = gsubtract(t,y); performance = perform(net,t,y) % View the Network view(net) % Plots % Uncomment these lines to enable various plots. %figure, plotperform(tr) %figure, plottrainstate(tr) %figure, ploterrhist(e) %figure, plotregression(t,y) %figure, plotresponse(t,y) %figure, ploterrcorr(e) %figure, plotinerrcorr(x,e) % Closed Loop Network % Use this network to do multi-step prediction. % The function CLOSELOOP replaces the feedback input with a direct % connection from the output layer. netc = closeloop(net); netc.name = [net.name ' - Closed Loop']; view(netc) [xc,xic,aic,tc] = preparets(netc,X,{},T); yc = netc(xc,xic,aic); closedLoopPerformance = perform(net,tc,yc) % Step-Ahead Prediction Network % For some applications it helps to get the prediction a timestep early. % The original network returns predicted y(t+1) at the same time it is % given y(t+1). For some applications such as decision making, it would % help to have predicted y(t+1) once y(t) is available, but before the % actual y(t+1) occurs. The network can be made to return its output a % timestep early by removing one delay so that its minimal tap delay is now % 0 instead of 1. The new network returns the same outputs as the original % network, but outputs are shifted left one timestep. nets = removedelay(net); nets.name = [net.name ' - Predict One Step Ahead']; view(nets) [xs,xis,ais,ts] = preparets(nets,X,{},T); ys = nets(xs,xis,ais); stepAheadPerformance = perform(nets,ts,ys)
スクリプトを保存し、コマンド ラインから実行して、前のアプリ セッションの結果を再現できます。スクリプトを編集して、学習プロセスをカスタマイズすることもできます。この場合、スクリプトの各ステップに従います。
データの選択
このスクリプトは、予測子ベクトルと応答ベクトルがワークスペースに読み込み済みであると仮定しています。データが読み込まれていない場合、次のように読み込むことができます。
load ph_dataset
pHInputs
と応答 pHTargets
をワークスペースに読み込みます。このデータ セットは、ツールボックスに含まれる標本データ セットの 1 つです。使用可能なデータ セットの詳細については、浅いニューラル ネットワーク用の標本データセットを参照してください。help nndatasets
コマンドを入力することによって、使用可能なすべてのデータ セットの一覧を表示することもできます。独自の変数名を使用して、これらのデータ セットから変数を読み込むことができます。たとえば、次のコマンド
[X,T] = ph_dataset;
X
に読み込み、pH データ セットの応答を cell 配列 T
に読み込みます。学習アルゴリズムの選択
学習アルゴリズムを定義します。ネットワークの学習には、既定のレーベンバーグ・マルカート法アルゴリズム (trainlm
) を使用します。
trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation.
レーベンバーグ・マルカート法によって目的どおりの正確な結果を生成できない問題の場合にはネットワーク学習関数をベイズ正則化 (trainbr
) に、あるいは、データが大規模な問題の場合にはネットワーク学習関数をスケーリング共役勾配法 (trainscg
) に設定することを検討してください。
net.trainFcn = 'trainbr'; net.trainFcn = 'trainscg';
ネットワークの作成
ネットワークを作成します。NARX ネットワーク narxnet
は、隠れ層に既定の正接シグモイド伝達関数、出力層に線形伝達関数を使用したフィードフォワード ネットワークです。このネットワークには 2 つの入力があります。1 つは外部入力で、もう 1 つはネットワーク出力からのフィードバック接続です ネットワークの学習が終わったら、このフィードバック接続を閉にすることができます。これについては、後の手順で説明します。これらの各入力について、前の値を格納するタップ付き遅延線があります。NARX ネットワークのネットワーク アーキテクチャを割り当てるには、各タップ付き遅延線に関連付けられた遅延に加え、隠れ層ニューロンの数も選択しなければなりません。次の手順では、入力遅延およびフィードバック遅延を 1 ~ 4 の範囲に割り当て、隠れニューロンの数を 10 に割り当てます。
inputDelays = 1:4;
feedbackDelays = 1:4;
hiddenLayerSize = 10;
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize,'open',trainFcn);
メモ:
ニューロンの数および遅延の数を増やすと、必要な計算量が多くなります。数が多すぎる場合にはデータへの過適合が生じる可能性が高くなりますが、そのネットワークを使用して、より複雑な問題を解けるようになります。層の数を増やすと、必要な計算量が多くなりますが、複雑な問題をそのネットワークでより効率的に解けるようになる可能性があります。複数の隠れ層を使用するには、隠れ層のサイズを narxnet
コマンドの配列の要素として入力します。
学習用データの準備
学習用のデータを準備します。タップ付き遅延線を含むネットワークの学習を行う場合、ネットワークの予測子と応答の初期値を使って遅延を入力する必要があります。このプロセスを容易にするツールボックス コマンドとして、preparets
があります。この関数には、ネットワーク、予測子、および応答の 3 つの入力引数があります。初期条件が削除されている場合、この関数は、タップ付き遅延線をネットワーク、変更された予測子シーケンスおよび応答シーケンスに入力するために必要な初期条件を返します。この関数は次のように呼び出すことができます。
[x,xi,ai,t] = preparets(net,X,{},T);
データの分割
データの分割を設定します。
net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100;
これらの設定では、データはランダムに分割されます。70% は学習、15% は検証、および 15% はテストに使用されます。
ネットワークの学習
ネットワークに学習をさせます。
[net,tr] = train(net,x,t,xi,ai);
学習中は、次の学習ウィンドウが開きます。このウィンドウには学習の進行状況が表示されます。停止ボタン をクリックして、任意の時点で学習を中断できます。
この学習は、6 回の反復の間に検証誤差が連続して増加したときに停止しています。
ネットワークのテスト
ネットワークをテストします。ネットワークの学習が終わったら、これを使用してネットワークの出力を計算できます。次のコードでは、ネットワークの出力、誤差、および全体的な性能が計算されます。タップ付き遅延線を使用してネットワークのシミュレーションを行うには、これらの遅延信号に初期値を割り当てる必要があります。これを行うには、初期の段階で preparets
によって提供される入力の状態 (xi
) および層の状態 (ai
) を使用します。
y = net(x,xi,ai); e = gsubtract(t,y); performance = perform(net,t,y)
performance = 0.0042
ネットワークの表示
ネットワーク図を表示します。
view(net)
結果の解析
性能学習記録をプロットして、過適合の可能性がないか確認します。
figure, plotperform(tr)
この図は、強調表示されているエポックまで学習および検証の誤差が減少したことを示しています。検証誤差はこのエポックまでに増加していないため、過適合は発生していないと考えられます。
検証ステップおよびテスト ステップを含むすべての学習が、開ループ (直並列アーキテクチャとも呼ばれます) で行われています。典型的なワークフローでは、ネットワークを完全に開ループで作成し、(検証ステップおよびテスト ステップを含めて) このネットワークの学習を行った後でのみ、複数ステップ先の予測を行うために閉ループに変換します。同様に、開ループの学習結果に基づいて、ニューラル ネット時系列アプリの R
値が計算されます。
閉ループ ネットワーク
NARX ネットワークでループを閉にします。NARX ネットワークでフィードバック ループが開になっている場合、1 ステップ先の予測を実行しています。y(t) および x(t) の前の値から、y(t) の次の値を予測しています。閉になっているフィードバック ループを使用すると、複数ステップ先の予測を実行できます。これは、y(t) の実際の将来値の代わりに y(t) の予測が使用されるためです。次のコマンドを使用して、ループを閉にし、閉ループの性能を計算できます。
netc = closeloop(net);
netc.name = [net.name ' - Closed Loop'];
view(netc)
[xc,xic,aic,tc] = preparets(netc,X,{},T);
yc = netc(xc,xic,aic);
closedLoopPerformance = perform(net,tc,yc)
closedLoopPerformance = 0.4014
ステップ先行予測ネットワーク
1 タイム ステップ前の予測を行うには、ネットワークから遅延を削除します。
nets = removedelay(net);
nets.name = [net.name ' - Predict One Step Ahead'];
view(nets)
[xs,xis,ais,ts] = preparets(nets,X,{},T);
ys = nets(xs,xis,ais);
stepAheadPerformance = perform(nets,ts,ys)
stepAheadPerformance = 0.0042
この図から、各タップ付き遅延線から 1 つの遅延が削除されていることを除き、ネットワークは前述の開ループ ネットワークと同じであることがわかります。そのため、ネットワークの出力は y(t) ではなく y(t + 1) になります。これは、ネットワークを特定のアプリケーションに対して展開するときに役立つ場合があります。
次のステップ
ネットワーク性能が十分ではない場合、次のいずれかの方法を試してください。
コマンド ライン操作に慣れるため、次のタスクを試してみましょう。
学習中にプロット ウィンドウ (誤差相関プロットなど) を開き、アニメーションを見る。
plotresponse
、ploterrcorr
、plotperform
などの関数を使用して、コマンド ラインからプロットする
ニューラル ネットワークでは、学習を行うたびに異なる解が得られる可能性がありますが、これは初期の重みとバイアスの値がランダムであり、学習セット、検証セット、テスト セットへのデータの分割が異なるためです。このため、別のニューラル ネットワークが同じ問題について学習した場合、入力が同じでも出力が異なる場合があります。ニューラル ネットワークで高い精度が得られるようにするためには、何度か再学習を行います。
高い精度が必要な場合は、初期解を改善するための手法が他にいくつかあります。詳細については、浅層ニューラル ネットワークの汎化の改善と過適合の回避を参照してください。
参考
ニューラル ネット フィッティング | ニューラル ネット時系列 | ニューラル ネット パターン認識 | ニューラル ネット クラスタリング | train
| preparets
| narxnet
| closeloop
| perform
| removedelay