Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ニューラル ネットワークの複数ステップの予測

開ループ モードの設定

narxnetnarnet ニューラル ネットワークなど、フィードバックのある動的ネットワークは、関数 openloopcloseloop により開ループと閉ループのモード間の変換が可能です。閉ループ ネットワークは複数ステップの予測を行います。つまり、外部フィードバックが失われると、内部フィードバックを使用して予測を続けます。

ここでは、ニューラル ネットワークに学習させて磁気浮上システムをモデル化し、既定の開ループ モードでシミュレーションを行います。

[X,T] = maglev_dataset;
net = narxnet(1:2,1:2,10);
[x,xi,ai,t] = preparets(net,X,{},T);
net = train(net,x,t,xi,ai);
y = net(x,xi,ai);
view(net)

初期条件からの複数ステップの閉ループ予測

ニューラル ネットワークのシミュレーションを閉ループ形式のみで行い、ある外部入力系列と初期条件に対して、ニューラル ネットワークの予測を入力系列のタイム ステップ数と同じ回数行うこともできます。

netc = closeloop(net);
view(netc)

ここでは、学習データを使用して、入力 x、初期入力状態および初期層遅延状態 xi および ai を定義します。ただし、これらは、任意の入力系列および初期状態に対して複数の予測が得られるように定義できます。

[x,xi,ai,t] = preparets(netc,X,{},T);
yc = netc(x,xi,ai);

既知のシーケンス後の複数ステップの閉ループ予測

学習済みのニューラル ネットワークについて、今現在ある時間列の既知の値をすべて使用して開ループ モードでシミュレーションを行ってから、閉ループ モードに切り替えてシミュレーションを継続し、将来の予測を必要な数だけ得るのが便利な場合もあります。

openloopcloseloop を使用して開ループと閉ループのニューラル ネットワーク間を変換できるのと同じように、これらを使用すると、開ループと閉ループのネットワークの状態を変換できます。これらの関数のインターフェイス全体を次に示します。

[open_net,open_xi,open_ai] = openloop(closed_net,closed_xi,closed_ai);
[closed_net,closed_xi,closed_ai] = closeloop(open_net,open_xi,open_ai);

磁気浮上の動作の記録が 20 タイム ステップあり、さらに先の 20 タイム ステップについて予測する場合を考えます。

まず、最初の 20 ステップの入力とターゲットを定義し、既知の出力がターゲット t で定義される 20 タイム ステップを表します。次の 20 タイム ステップの入力を定義し、ネットワークを使用して 20 個の出力を予測します。このとき、毎回の予測フィードバックを使用して、次の予測を実行できるようにします。

x1 = x(1:20);
t1 = t(1:20);
x2 = x(21:40);

このデータに対して、開ループ ニューラル ネットワークのシミュレーションを行います。

[x,xi,ai,t] = preparets(net,x1,{},t1);
[y1,xf,af] = net(x,xi,ai);

次に、ネットワークから返された最終の入力と層の状態が、ネットワークと共に閉ループ形式に変換されます。開ループ ネットワークの最終の入力状態 xf と層の状態 af が、閉ループ ネットワークの初期の入力状態 xi と層の状態 ai になります。

[netc,xi,ai] = closeloop(net,xf,af);

通常は、preparets を使用して初期の入力と層の状態を定義します。これらは、開ループ シミュレーションの最後で既に得られているため、閉ループ ネットワークの 20 ステップの予測を継続するために preparets を使用する必要はありません。

[y2,xf,af] = netc(x2,xi,ai);

x2 に別の入力シーケンスを設定すると、予測を行うタイム ステップ数に関係なく別のシナリオをテストできることに注意してください。たとえば、磁気浮上システムの動作を予測するために、10 個のランダムな入力を使用する場合は次のようになります。

x2 = num2cell(rand(1,10));
[y2,xf,af] = netc(x2,xi,ai);

閉ループ シミュレーション後の開ループ シミュレーション

閉ループ形式でネットワークのシミュレーションを行った後、そこから開ループ形式でシミュレーションを継続できます。ここで、閉ループの状態は開ループの状態に戻されます (元の開ループ ネットワークが既にあるので、ネットワークを変換して開ループ形式に戻す必要はありません)。

[~,xi,ai] = openloop(netc,xf,af);

これで、外部入力と開ループ フィードバックの継続を定義し、開ループ ネットワークのシミュレーションを行うことができます。

x3 = num2cell(rand(2,10));
y3 = net(x3,xi,ai);

このようにして、開ループ方式と閉ループ方式の間でシミュレーションを切り替えることができます。これの応用の 1 つとして、センサーの時系列予測が挙げられます。この場合、最終センサー値が通常わかっているため、次のステップで開ループ予測を行うことができます。ただし、センサーの読み取り値を使用できない場合、または値が間違っていることがわかっている場合は、閉ループ予測ステップが必要です。前のステップのセンサー読み取り値を使用できるかどうかによって、開ループ形式と閉ループ形式を切り替えて予測を行うことができます。