時系列予測入門
この例では、ディープ ネットワーク デザイナー アプリを使用して、時系列データを予測するためのシンプルな長短期記憶 (LSTM) ネットワークを作成する方法を示します。
LSTM ネットワークは、タイム ステップ全体にわたってループ処理して RNN の状態を更新することにより入力データを処理する再帰型ニューラル ネットワーク (RNN) です。RNN の状態には、前のすべてのタイム ステップで記憶された情報が含まれています。LSTM ニューラル ネットワークを使用して、前のタイム ステップを入力として使用して、時系列またはシーケンスの後続の値を予測できます。

シーケンス データの読み込み
サンプル データを WaveformData から読み込みます。このデータにアクセスするには、例をライブ スクリプトとして開きます。この波形データ セットには、3 つのチャネルの異なる波長の合成生成波形が格納されています。この例では、前のタイム ステップからの値を与えて波形の将来の値を予測するように LSTM ニューラル ネットワークに学習させます。
load WaveformDataシーケンスの一部を可視化します。
idx = 1;
numChannels = size(data{idx},2);
figure
stackedplot(data{idx},DisplayLabels="Channel " + (1:numChannels))この例では、補助関数 prepareForecastingData (この例にサポート ファイルとして添付) を使用して、学習用のデータを準備します。この関数は次の手順を使用してデータを準備します。
シーケンスの将来のタイム ステップの値を予測するには、1 タイム ステップ分シフトした値を持つ学習シーケンスとしてターゲットを指定します。入力シーケンスの各タイム ステップで、次のタイム ステップの値を予測するように LSTM ニューラル ネットワークに学習させます。学習シーケンスには最終タイム ステップを含めないでください。
データの 90% から成る学習セットとデータの 10% から成るテスト セットにデータを分割します。
[XTrain,TTrain,XTest,TTest] = prepareForecastingData(data,[0.9 0.1]);
良好な適合を実現し、学習の発散を防ぐには、チャネルがゼロ平均と単位分散をもつように予測子とターゲットを正規化できます。予測を行うときは、学習データと同じ統計を使用してテスト データも正規化しなければなりません。詳細については、ディープ ネットワーク デザイナーを使用した時系列予測ネットワークの構築を参照してください。
ネットワーク アーキテクチャの定義
ネットワークを構築するには、ディープ ネットワーク デザイナー アプリを開きます。
deepNetworkDesigner
シーケンス ネットワークを作成するには、[Sequence-to-Sequence 分類ネットワーク (未学習)] セクションで、[LSTM] をクリックします。

これにより、シーケンス分類の問題に適したプリビルド ネットワークが開きます。最終層を編集することで、分類ネットワークを回帰ネットワークに変換できます。
まず、ソフトマックス層を削除します。

次に、波形データ セットに適するように層のプロパティを調整します。時系列の将来のデータ点を予測することが目的なので、出力サイズは入力サイズと同じでなければなりません。この例では、入力データに 3 つの入力チャネルがあるため、ネットワーク出力にも 3 つの出力チャネルがなければなりません。
シーケンス入力層 input を選択し、[InputSize] を 3 に設定します。

全結合層 fc を選択し、[OutputSize] を 3 に設定します。

ネットワークの学習の準備が整っていることを確認するには、[解析] をクリックします。深層学習ネットワーク アナライザーによってエラーや警告が報告されていないため、ネットワークの学習の準備は整っています。ネットワークをエクスポートするには、[エクスポート] をクリックします。アプリはネットワークを変数 net_1 に保存します。

学習オプションの指定
学習オプションを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、実験マネージャーアプリを使用できます。再帰層は 1 タイム ステップずつシーケンス データを処理するため、最後のタイム ステップでパディングを行うと層の出力に悪影響を与える可能性があります。SequencePaddingDirection オプションを "left" に設定し、シーケンス データの左側に対してパディングまたは切り捨てを行います。
options = trainingOptions("adam", ... MaxEpochs=300, ... SequencePaddingDirection="left", ... Shuffle="every-epoch", ... Plots="training-progress", ... Verbose=false);
ニューラル ネットワークの学習
関数trainnetを使用してニューラル ネットワークに学習させます。回帰が目的なので、平均二乗誤差 (MSE) 損失を使用します。
net = trainnet(XTrain,TTrain,net_1,"mse",options);
将来のタイム ステップの予測
閉ループ予測では、前の予測を入力として使用して、シーケンスの後続のタイム ステップを予測します。
最初のテスト観測値を選択します。resetState 関数を使用して状態をリセットし、RNN の状態を初期化します。次に、predict関数を使用して初期予測 Z を作成します。入力データのすべてのタイム ステップを使用して、RNN の状態を更新します。
X = XTest{1};
T = TTest{1};
net = resetState(net);
offset = size(X,1);
[Z,state] = predict(net,X(1:offset,:));
net.State = state;さらに予測を続行するには、タイム ステップ全体にわたってループ処理し、predict 関数と前のタイム ステップで予測された値を使用して予測を行います。各予測の後、RNN の状態を更新します。RNN に前の予測値を繰り返し渡すことにより、次の 200 タイム ステップを予測します。RNN はさらに予測を行うための入力データを必要としないため、予測するタイム ステップには任意の数を指定できます。初期予測の最後のタイム ステップが最初の予測タイム ステップになります。
numPredictionTimeSteps = 200; Y = zeros(numPredictionTimeSteps,numChannels); Y(1,:) = Z(end,:); for t = 2:numPredictionTimeSteps [Y(t,:),state] = predict(net,Y(t-1,:)); net.State = state; end numTimeSteps = offset + numPredictionTimeSteps;
予測を入力値と比較します。
figure l = tiledlayout(numChannels,1); title(l,"Time Series Forecasting") for i = 1:numChannels nexttile plot(X(1:offset,i)) hold on plot(offset+1:numTimeSteps,Y(:,i),"--") ylabel("Channel " + i) end xlabel("Time Step") legend(["Input" "Forecasted"])

この予測方法は閉ループ予測と呼ばれます。時系列予測と開ループ予測の実行の詳細については、深層学習を使用した時系列予測を参照してください。
参考
dlnetwork | trainingOptions | trainnet | scores2label | ディープ ネットワーク デザイナー