メインコンテンツ

深層学習ネットワークを使用した Simulink での時系列の予測

この例では、Simulink® モデル内で LSTM 深層学習ネットワークを使用し、エンジンの残存耐用年数 (RUL) を予測する方法を示します。ここでは、Stateful Predict ブロックを使用してこのネットワークを Simulink モデルに組み込み、シミュレーション ステップごとに RUL を予測させます。

この例では、[1] に記載のある "Turbofan Engine Degradation Simulation Data Set" のデータを使用します。この例では、エンジンのさまざまなセンサーを表す時系列データを与えてサイクル単位で測定されるエンジンの RUL を予測 (予知保全) するよう学習させた LSTM ネットワークを使用します。ネットワークの学習に使用するデータには、100 台のエンジンについてシミュレートされた時系列データが含まれています。各シーケンスには長さが異なる 17 個の特徴があり、故障するまで使用 (RTF) した事例全体に対応します。このネットワークに学習させる方法の詳細については、深層学習を使用した sequence-to-sequence 回帰を参照してください。

データのダウンロード

Turbofan Engine Degradation Simulation データ セットをダウンロードして解凍します。

Turbofan Engine Degradation Simulation データ セットの各時系列は、それぞれ異なるエンジンを表します。開始時点では、各エンジンの初期摩耗の程度や製造上の差異は不明です。各時系列の開始時、エンジンは正常に運転していますが、時系列のある時点で故障が発生します。学習セットでは、システム障害が発生するまで、故障の規模が大きくなります。

このデータには、スペースで区切られた 26 列の数値のある zip 圧縮されたテキスト ファイルが含まれています。各行は 1 回の運転サイクルの間に取得されたデータのスナップショットで、各列は異なる変数です。各列は以下に対応します。

  • 列 1 – ユニット番号

  • 列 2 – サイクル単位の時間

  • 列 3 ~ 5 – 運転設定

  • 列 6 ~ 26 – センサー測定値 1 ~ 21

Turbofan Engine Degradation Simulation データ セットを格納するディレクトリを作成します。

dataFolder = "data";
if ~exist(dataFolder,"dir")
    mkdir(dataFolder);
end

Turbofan Engine Degradation Simulation データ セットをダウンロードして解凍します。

filename = matlab.internal.examples.downloadSupportFile("nnet","data/TurbofanEngineDegradationSimulationData.zip");
unzip(filename,dataFolder)

データの準備

processTurboFanDataTrain 補助関数を使用してデータを読み込みます。processTurboFanDataTrain 関数は、filenamePredictors からデータを抽出し、学習予測子のデータが格納された cell 配列 XTrain を返します。

filenamePredictors = fullfile(dataFolder,"train_FD001.txt");
[XTrain] = processTurboFanDataTrain(filenamePredictors);

定数値を持つ特徴の削除

このネットワークは、すべてのタイム ステップで値が一定になるわけではない特徴を使用して学習されているため、すべてのタイム ステップで値が一定になる特徴は予測から除外する必要があります。最小値と最大値が同じになるデータの行を見つけ、それらの行を削除します。

m = min([XTrain{:}],[],2);
M = max([XTrain{:}],[],2);
idxConstant = M == m;

for i = 1:numel(XTrain)
    XTrain{i}(idxConstant,:) = [];
end

学習予測子の正規化

ゼロ平均と単位分散を持つように学習予測子を正規化します。すべての観測値について平均値と標準偏差を計算するために、シーケンス データを水平方向に連結します。

mu = mean([XTrain{:}],2);
sig = std([XTrain{:}],0,2);

for i = 1:numel(XTrain)
    XTrain{i} = (XTrain{i} - mu) ./ sig;
end

1 つのエンジンのデータの抽出

この Simulink モデルでは、1 つのエンジンのみの RUL を計算します。この例では、XTrain の 9 番目の要素を抽出し、SensorData という変数に格納します。XTrain cell 配列から他のエンジンを選択できます。SensorData は、サイズが 17 行 201 列の double 型の配列です。各行は 1 つの特徴に対応し、各列は特定のサイクルでのセンサーの読み取り値に対応します。

SensorData = XTrain{9};

Simulink モデルはシミュレーション時間に関連付けられています。この例ではエンジン サイクルに関連付ける必要があります。そのため、Simulink モデルへの読み込みが可能な timeseries オブジェクトとしてセンサー データを保存する EngineData という名前の時系列を定義します。Simulink の既定のシミュレーション時間は 10.0 で、エンジンは 201 サイクル実行されるため、EngineDataTime フィールドは、値が 0 から 10 まで線形に増加する 201 行 1 列の配列である必要があります。

Time = linspace(0,10,201)';
EngineData = timeseries(SensorData',Time);

この図の上のパネルには各サイクルでの各センサーからのセンサー読み取り値が表示されており、下のパネルにはサイクル単位でのエンジンの RUL が表示されています。201 サイクル後、エンジンは動作を停止します。なお、エンジンごとに動作サイクル数が異なるため、XTrain データから別のエンジンを選択した場合は、それに応じて EngineDataTime フィールドを調整する必要があります。

RUL を予測するための Simulink モデル

Simulink モデル RULPredictionLSTM.slx を読み込みます。

modelName = 'RULPredictionLSTM';
open_system(modelName);

RULPredictionLSTM.png

EngineData は、From Workspace ブロックを使用してベース ワークスペースから読み込まれます。この例では、EngineData のタイム ステップは 0.05 です。そのため、From Workspace ブロックのサンプル時間を 0.05 に設定します。このとき、ブロックは最初のステップで EngineData の最初の行を出力し、2 番目のステップで 2 番目のエンジン サイクルに対応する 2 番目の行を出力して、以下同様に出力します。XData から別のエンジンを選択した場合、ブロックのサンプル時間をそれに応じて更新する必要があります。

set_param([modelName,'/From Workspace'],'SampleTime','0.05');

Stateful Predict ブロックは、turbofanNet MAT ファイル内の事前学習済みの LSTM ネットワークを読み込み、出力端子で RUL を返します。Stateful Predict ブロックは、予測を行うたびにネットワークの状態を更新し、現在の RUL の予測を改善します。Half Gauge ブロックは、シミュレーション中に計算された (エンジン サイクル単位の) RUL の値を表示します。

RUL_sigSpec = Simulink.HMI.SignalSpecification;
RUL_sigSpec.BlockPath = Simulink.BlockPath('RULPredictionLSTM/Stateful Predict');
set_param('RULPredictionLSTM/Half Gauge','Binding',RUL_sigSpec)

シミュレーションの実行

シミュレーションは MATLAB® ワークスペースからデータを読み取るため、非常に高速に実行されて追跡が難しい場合があります。シミュレーションの速度を遅くするには、[シミュレーション ペーシング] オプションを 0.5 に設定します。

set_param(modelName,'EnablePacing','on');
set_param(modelName,'PacingRate',0.5);

RUL を計算するため、シミュレーションを実行しします。

sim(modelName);

RULPredictionLSTMOutput.png

この図は実行中のモデルを示しています。ゲージには推定 RUL が表示されます。この場合は 90 サイクルに相当します。シミュレーションが終了すると、各シミュレーションの反復で計算された値を含む単一の配列の形式で、ベース ワークスペースに RUL が返されます。

このシステムをより大きなフレームワークに組み込むことができます。たとえば、エンジンの状態を継続的に監視し、RUL がユーザー定義で与えられる値を下回った場合に予防措置を講じるシステムに組み込むことができます。

参考文献

  1. Saxena, Abhinav, Kai Goebel, Don Simon, and Neil Eklund. "Damage propagation modeling for aircraft engine run-to-failure simulation." In Prognostics and Health Management, 2008. PHM 2008. International Conference on, pp. 1-9. IEEE, 2008.

参考

| | |

トピック