Main Content

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

自己符号化器とウェーブレットを使用した異常検出

この例では、ウェーブレット機能を使用して DC システムのアーク故障を検出する方法を示します。DC 配電システムを安全に動作させるには、経年劣化、磨耗、げっ歯類の咬傷などによる電線の絶縁劣化に起因して起こる可能性のあるアーク故障や予兆信号を識別することが重要です。これらのアーク故障は、マイクログリッド内で感電、火災、システム障害を引き起こす可能性があります。AC 配電システムの障害信号とは異なり、これらのアーク フラッシュ予兆信号は、回路ブレーカーをトリガーするほどの大きな電力を生成しないため、識別するのが困難です。その結果、これらの信号は検出されずに何時間もシステム内に存在する可能性があります。

ウェーブレット変換を使用したアーク故障検出は [1] で研究されました。この例は、その研究で詳述されている特徴抽出手順に従います。この手順は、Daubechies db3 ウェーブレットを使用した負荷信号のフィルター処理とそれに続く正規化で構成されます。さらに、通常条件における信号特徴を使用して学習させた自己符号化器を使用して、負荷信号内のアーク故障を検出します。故障信号の生成に使用した DC アーク モデルと、アーク故障の検出に使用した事前学習済みネットワークは、サンプル フォルダーにあります。より大きな信号のアーク検出に向けたネットワークの学習には非常に長いシミュレーション時間がかかる可能性があるため、この例では検出結果のみを報告します。

学習とテストの設定

自己符号化器には、通常条件、つまりアーク故障がない条件で Simulink® モデル DCNoArc によって生成した負荷信号を使用して学習させます。モデル DCNoArc は、Simscape™ Electrical™ Specialized Power Systems ライブラリのコンポーネントを使用して作成されました。

図 1: 通常条件の負荷信号を生成する DCNoArc モデル。

電圧源は次のパラメーターを使用してモデル化されます。

  • AC 高調波ソース 1: AC 電圧 10 V、周波数 120 Hz

  • AC 高調波ソース 2: AC 電圧 20 V、周波数 2000 Hz

  • DC 電圧源: 1000 V

モデル DCArcModelFinal では、すべての負荷分岐にアーク故障の生成を追加します。このモデルは、合成アーク故障生成に Cassie アーク モデルを使用します。このアーク モデルは、接点離脱時にアークが発火するまでは理想的なコンダクタンスのように機能します。

図 2: アーク故障を含む負荷信号を生成する DCArcModelFinal モデル。

Cassie アーク モデルは、合成アークを生成するために最も研究されているブラック ボックス モデルの 1 つです。モデルは次の微分方程式で記述されます。

dgdt=gτ(u2Uc2-1)

ここで、

  • g はアークのコンダクタンス (ジーメンス単位)

  • τ はアーク時定数 (秒単位)

  • u はアークにかかる電圧 (ボルト単位)

  • Uc は定アーク電圧 (ボルト単位)

Cassie アーク モデルは、次のパラメーター値を使用して Simulink® で実装されました。

  • 初期コンダクタンス g(0) は 1e4 ジーメンス

  • 定アーク電圧 Uc = 100 V

  • アーク時定数は 1.2e-6 秒

アーク モデルの接点離脱時間はランダムに選択されます。すべてのパラメーターは、[モデル設定] タブの [モデル プロパティ]PreLoadFcn コールバックに読み込まれています。

数学的 Cassie アーク モデルにかかる電圧は、接点離脱時にいくらか低下し、残りのシミュレーション期間中もその値のままになります。しかし、実際の電力系統の分岐では、アークは短い時間間隔で持続します。Cassie アーク モデルにかかる電圧が実際のアーク故障の動作を確実にエミュレートするために、各モデルにスイッチを使用してアーク時間を制限します。DCArcModelFinal モデルを使用して、自己符号化器をテストするための故障負荷信号を生成します。

すべての負荷分岐のアーク故障を同時に検出するために、検知システムは各分岐の負荷電圧を測定します。検知システムは負荷電圧を結合し、結果の信号を特徴生成ブロックに送信します。生成された特徴は、深層ネットワークを使用してすべての分岐のアーク故障を検出するために使用されます。

自己符号化器を使用した異常検知

自己符号化器は、信号内の異常を検出するために使用されます。自己符号化器には、異常のないデータで学習させます。その結果、学習済みのネットワーク重みにより、アーク故障のない負荷信号の再構成誤差が最小限に抑えられます。学習データに対する再構成誤差の統計は、自己符号化器の検出性能を決定する異常検出ブロックのしきい値を選択するために使用できます。検出ブロックは、しきい値を超える再構成誤差が発生した場合に、異常の存在を宣言します。この例では、再構成誤差メトリクスとして平方根平均二乗誤差 (RMSE) を使用しました。

この例では、アーク故障のない通常条件の負荷信号を使用して 2 つの自己符号化器に学習させました。1 つの自己符号化器には、生の負荷信号を学習データとして使用して学習させました。この符号化器は、生の故障負荷信号を使用してアーク故障を検出します。2 番目の自己符号化器には、ウェーブレット機能を使用して学習させました。アーク故障検出は、生データではなくウェーブレット特徴に対して続行されます。ネットワークの学習とテストでは、ランダムに選択された抵抗値をもつ 10 個の並列抵抗分岐で負荷が構成されていると仮定します。アーク故障信号生成のために、すべての負荷分岐に Cassie アーク モデルを追加します。モデルの接点離脱時間は、シミュレーション期間全体を通じてランダムにトリガーされるように設定されています。リアルタイム DC システムと同様に、通常条件と故障条件の両方からの負荷信号によってホワイト ノイズが付加されます。

特徴抽出

ウェーブレットベースの自己符号化器は、離散ウェーブレット変換 (DWT) を使用してフィルター処理した信号で学習およびテストを行いました。[1] に従い、Daubechies db3 ウェーブレットを使用しました。

次の図は、通常条件と故障条件におけるウェーブレット フィルター処理済みの負荷信号を示しています。ウェーブレット フィルター処理済みの故障信号は、アーク故障による変動をとらえています。学習用とテスト用に、ウェーブレット フィルター処理済みの信号は 100 個のサンプル フレームに分割されます。

図 3: 通常条件における生の負荷信号とウェーブレット フィルター処理済みの信号。

図 4: 故障条件における生の負荷信号とウェーブレット フィルター処理済みの信号。

モデルの学習

自己符号化器には、通常条件における負荷信号からウェーブレット フィルター処理された特徴を使用して学習させます。学習段階では次の 2 つのオプションがあります。

  1. 独自の自己符号化器に学習させ、ネットワークを DCArcModelFinal モデルの予測ブロックに読み込む。

  2. サンプル フォルダーの netData.mat ファイルで利用可能な事前学習済みモデルをプリロードした DCArcModelFinal モデルを使用する。

独自の自己符号化器に学習させるには、次の手順を使用できます。

  • まず、DCNoArc モデルを使用して、通常の動作条件の負荷信号を生成します。次のコマンドを使用して、モデルを読み込み、開き、実行します。シミュレーション出力から負荷信号を抽出します。

load_system('DCNoArc.slx');
open_system('DCNoArc.slx');
out = sim('DCNoArc.slx');

% extract normal load signal from the simulation output
xn = out.xn; 
  • 次に、負荷信号からウェーブレット フィルター処理済みの特徴を抽出します。特徴を自己符号化器への入力として使用します。

% training data: load voltage under normal conditions 
featureDimension = 100;
xn = sigresize(xn,featureDimension);

% Obtain training features
trnd4 = getDet(xn);
trainData = getFeature(trnd4, featureDimension);

事前学習済みの自己符号化器には、次のネットワーク層と学習オプションを使用して学習させました。

% Create network layers
layers = [ sequenceInputLayer(1,Name='in')
    bilstmLayer(32,Name='bilstm1')
    reluLayer(Name='relu1')
    bilstmLayer(16,Name='bilstm2')
    reluLayer(Name='relu2')
    bilstmLayer(32,Name='bilstm3')
    reluLayer(Name='relu3')
    fullyConnectedLayer(1,Name='fc')
    regressionLayer(Name='out') ];

% Set options
options = trainingOptions('adam', ...
    MaxEpochs=20, ...
    MiniBatchSize=16, ...
    Plots='training-progress');

この学習の手順は数分かかります。ネットワークに学習させる場合は、trainingFlag = "Train network" を選択します。次に、学習済みのネットワークを、DCArcModelFinal モデルで使用されている Deep Learning Toolbox™ から Predict ブロックに読み込むことができます。

trainingFlag = "Use pretrained network"

if trainingFlag == "Train network"
    % training network
    net = trainNetwork(trainData,trainData,layers,options);
    save('network.mat','net');
end

学習手順をスキップしたい場合は、netData.mat の事前学習済みネットワークを読み込んだ DCArcModelFinal モデルを実行して、負荷信号のアーク故障を検出できます。

trainingProgress.png

図 5: 自己符号化器の学習の進行状況。

この図は、入力を学習データとした場合の自己符号化器によって生成された再構成誤差のヒストグラムを示しています。再構成誤差の統計を使用して、検出しきい値を選択できます。たとえば、検出しきい値として、再構成誤差の標準偏差の 3 倍となる値を選択します。

図 6: 入力を学習データとした場合の自己符号化器によって生成された再構成誤差のヒストグラム。

自己符号化器を使用した異常検出用モデル

DCArcModelFinal モデルは、DC 負荷信号におけるアーク故障のリアルタイム検出に使用されます。モデルを実行する前に、ワークスペース変数 t にシミュレーションの停止時間を秒単位で指定しなければなりません。

図 7: アーク故障検出用の DCArcModelFinal

最初のブロックは、連続時間内にアーク故障を伴うノイズを含む DC 負荷信号を生成します。次に、負荷電圧は、DSP System Toolbox™ の Rate transition ブロックによって 20 kHz でサンプリングされた離散時間信号に変換されます。次に、離散時間信号は LWTFeatureGen ブロックにバッファーされ、前処理後に目的のレベル 4 詳細投影が取得されます。次に、詳細投影は、Predict ブロックのテスト特徴である 100 個のサンプル フレームにセグメント化されます。Predict ブロックには、通常条件における負荷信号を使用して事前学習させたネットワークがプリロードされています。次に、異常検出ブロックは各フレームの平方根平均二乗誤差 (RMSE) を計算し、誤差が事前定義済みのしきい値を超えている場合にアーク故障の存在を宣言します。

次のプロットは、ウェーブレット フィルター処理された特徴を使用した場合にネットワークが予測した領域を示しています。自己符号化器は、10 個のアーク故障領域すべてを正しく検出できました。つまり、この場合は 100% の検出確率が得られました。

図 8: ウェーブレット フィルター機能を使用した自己符号化器の検出性能。

次のプロットは、生データで学習させた自己符号化器 (netDataRaw.mat に含まれる事前学習済みネットワーク) の異常検出性能を示しています。異常検出に生データを使用した場合、符号化器は 10 個の領域のうち 7 つを正しく識別できました。

図 9: 生の負荷信号を使用した自己符号化器の検出性能。

40 個のアーク故障領域を含む 50 秒の長さの異常信号を生成しました (このデータは例には含まれていません)。生の信号を学習させた自己符号化器を使用してテストした場合、アーク領域は 57.85% の検出確率で検出されました。対照的に、ウェーブレット フィルター処理された信号を学習させた自己符号化器は、97.52% の検出確率でアーク故障領域を検出できました。

また、負荷信号の正規化が自己符号化器の異常検出性能に及ぼす影響も調査しました。この目的を達成するために、入力データが入力層を介して順方向に伝播されるときに正規化されるように、自己符号化器モデルのシーケンス入力層を変更しました。この目的のために 'zscore' 正規化を選択しました。変更した自己符号化器の層は次のとおりです。

layers = [ sequenceInputLayer(1,Name='in',Normalization='zscore')
bilstmLayer(32,Name='bilstm1')
reluLayer(Name='relu1')
bilstmLayer(16,Name='bilstm2')
reluLayer(Name='relu2')
bilstmLayer(32,Name='bilstm3')
reluLayer(Name='relu3')
fullyConnectedLayer(1,Name='fc')
regressionLayer(Name='out') ];

前の実験設定と同様に、一方の自己符号化器に生データを学習させ、他方の自己符号化器に通常条件におけるウェーブレット フィルター処理済みの負荷信号を学習させました。次に、両方の自己符号化器の異常検出性能を監視しました。シミュレーションは 5 分間実行しました。故障負荷信号は、ランダムな時点で発生する 50 個のアーク故障を含んでいます。生データを学習させた自己符号化器は、80% の検出確率を達成しました。対照的に、ウェーブレット フィルター処理された信号を学習させた自己符号化器は、96% の検出確率でアーク故障領域を検出できました。

まとめ

この例では、自己符号化器を使用して DC システムのアーク故障を識別する方法を示しました。生の負荷信号と通常条件におけるウェーブレット フィルター処理済みの負荷信号の両方を、自己符号化器に学習させるための特徴として使用できます。これらの異常検出メカニズムを使用すると、アーク故障をタイムリーに検出し、異常によって引き起こされる損傷から DC システムを保護できます。

参考文献

[1] Wang, Zhan, and Robert S. Balog. “Arc Fault and Flash Signal Analysis in DC Distribution Systems Using Wavelet Transformation.” IEEE Transactions on Smart Grid 6, no. 4 (July 2015): 1955–63. https://doi.org/10.1109/TSG.2015.2407868

補助関数

getDet - この関数は、ウェーブレット フィルター処理された正常な負荷信号を取得し、それらを正規化します。

function d4 = getDet(x)
% This function is only intended to support examples in the Wavelet
% Toolbox. It may be changed or removed in a future release.

LS = liftingScheme(Wavelet='db3');
[ca4,cd4]= lwt(x,Level=4,LiftingScheme=LS);
D4 = lwtcoef(ca4,cd4,LiftingScheme=LS,OutputType="projection",...
    Type="detail");
d4 = normalize(D4);
end

getFeature - この関数は、ウェーブレット フィルター処理されたデータをサイズ featureDimension の特徴にセグメント化します。

function feature = getFeature(x, sz)
% This function is only intended to support examples in the Wavelet
% Toolbox. It may be changed or removed in a future release.

n = floor(length(x)/sz);
feature = cell(n,1);

for ii = 1:n
    c1 = 1+((ii-1)*sz);
    c2 = sz+((ii-1)*sz);
    ind = c1:c2;
    feature{ii} = transpose(x(ind,:));
end
end

sigresize - この関数は、負荷信号の過渡部分を削除します。

function xn = sigresize(x,sz)
% This function is only intended to support examples in the Wavelet
% Toolbox. It may be changed or removed in a future release.

n = floor(length(x)/sz);
lf = n*sz;
xn = zeros(lf,1);
xn(1:lf) = x(1:lf);
end

参考

(Deep Learning Toolbox)