Main Content

1 次元畳み込みを使用した sequence-to-sequence 分類

この例では、一般的な時間的畳み込みネットワーク (TCN) を使用してシーケンス データの各タイム ステップを分類する方法を説明します。

sequence-to-sequence のタスクは一般的に再帰型ニューラル ネットワーク アーキテクチャを使って解きますが、典型的なシーケンス モデリングのタスクにおいては畳み込みニューラル ネットワークでも再帰型ネットワークと同等あるいはそれ以上の性能を発揮できることが Bai et al. [1] によって示されています。畳み込みネットワークを使用する潜在的な利点は、並列処理に優れること、受容野のサイズの制御に優れること、学習中のネットワークのメモリ フットプリントの制御に優れること、および勾配が安定していることです。再帰型ネットワークと同様に、畳み込みネットワークは可変長の入力シーケンスに対する操作が可能で、sequence-to-sequence や sequence-to-one のタスクのモデル化に使用できます。

この例では、スマートフォンを体に装着している人の活動を認識するように TCN に学習させます。3 方向の加速度計の測定値を表す時系列データを使用してネットワークに学習させます。

学習データの読み込み

行動認識データを読み込みます。このデータには、体に装着したスマートフォンから得られたセンサー データの 7 つの時系列が含まれています。各シーケンスには 3 つの特徴があり、長さはさまざまです。3 つの特徴は、3 方向の加速度計の測定値に対応します。

s = load("HumanActivityTrain.mat");
XTrain = s.XTrain;
TTrain = s.YTrain;

学習データに含まれている観測値の数を表示します。

numObservations = numel(XTrain)
numObservations = 
6

学習データ内のクラスの数を表示します。

classes = categories(TTrain{1});
numClasses = numel(classes)
numClasses = 
5

学習データの特徴の数を表示します。

numFeatures = size(s.XTrain{1},1)
numFeatures = 
3

1 つの学習シーケンスをプロットで可視化します。最初の学習シーケンスの特徴と対応する行動をプロットします。

figure
for i = 1:3
    X = s.XTrain{1}(i,:);

    subplot(4,1,i)
    plot(X)
    ylabel("Feature " + i + newline + "Acceleration")
end

subplot(4,1,4)

hold on
plot(s.YTrain{1})
hold off

xlabel("Time Step")
ylabel("Activity")

subplot(4,1,1)
title("Training Sequence 1")

深層学習モデルの定義

TCN の主な基本構成は、膨張因果的畳み込み層です。この層は各シーケンスのタイム ステップ全体にわたり演算を行います。このコンテキストにおける "因果的" とは、特定のタイム ステップに対して計算された活性化が、未来のタイム ステップからの活性化に依存できないことを意味します。

前のタイム ステップからコンテキストを構築するために、通常は複数の畳み込み層が互いに積み重ねられます。大きなサイズの受容野を得るには、下図に示すように、後続の畳み込み層の膨張係数を指数的に増加させます。k 番目の畳み込み層の膨張係数が 2(k-1)、ストライドが 1 と仮定すると、そのようなネットワークの受容野のサイズは R=(f-1)(2K-1)+1 で計算できます。ここで、f はフィルター サイズ、K は畳み込み層の数です。フィルター サイズと層の数を変更することで、使用するデータやタスクの必要に合わせて、受容野のサイズや学習可能パラメーターの数を簡単に調整できます。

再帰型ネットワークと比較した場合の TCN の欠点の 1 つは、推論中のメモリ フットプリントが大きいことです。次のタイム ステップの計算には生のシーケンス全体が必要です。推論時間とメモリ消費量を削減するために、特にステップ先行の予測では、受容野の最小の妥当なサイズ R で学習させ、入力シーケンスの最後の R タイム ステップでのみ予測を実行します。

一般的な TCN アーキテクチャ ([1] を参照) は、複数の残差ブロックで構成されています。それぞれのブロックには、同じ膨張係数をもつ膨張因果畳み込み層の 2 つのセットが含まれ、その後に正規化層、ReLU 活性化層、および空間ドロップアウト層が続きます。ネットワークは、各ブロックの入力をブロックの出力に追加し (入力と出力のチャネル数が一致しない場合は入力の 1 x 1 の畳み込みも含む)、最終的な活性化関数を適用します。

これらの残差ブロックを 4 つ直列に含み、それぞれが前の層の 2 倍の膨張係数を持ち、膨張係数 1 で始まるネットワークを定義します。残差ブロックには、フィルター サイズを 5、空間ドロップアウト層のドロップアウト係数 0.005 として、1 次元畳み込み層向けに 64 個のフィルター数を指定します。

ディープ ネットワーク デザイナーアプリを使用してこのネットワークを構築することもできます。ディープ ネットワーク デザイナーのスタート ページの [Sequence-to-Sequence 分類ネットワーク (未学習)] セクションで、[TCN] をクリックします。

numFilters = 64;
filterSize = 5;
dropoutFactor = 0.005;
numBlocks = 4;

net = dlnetwork;

layer = sequenceInputLayer(numFeatures,Normalization="rescale-symmetric",Name="input");

net = addLayers(net,layer);

outputName = layer.Name;

for i = 1:numBlocks
    dilationFactor = 2^(i-1);
    
    layers = [
        convolution1dLayer(filterSize,numFilters,DilationFactor=dilationFactor,Padding="causal",Name="conv1_"+i)
        layerNormalizationLayer
        spatialDropoutLayer(Probability=dropoutFactor)
        convolution1dLayer(filterSize,numFilters,DilationFactor=dilationFactor,Padding="causal")
        layerNormalizationLayer
        reluLayer
        spatialDropoutLayer(Probability=dropoutFactor)
        additionLayer(2,Name="add_"+i)];

    % Add and connect layers.
    net = addLayers(net,layers);
    net = connectLayers(net,outputName,"conv1_"+i);

    % Skip connection.
    if i == 1
        % Include convolution in first skip connection.
        layer = convolution1dLayer(1,numFilters,Name="convSkip");

        net = addLayers(net,layer);
        net = connectLayers(net,outputName,"convSkip");
        net = connectLayers(net,"convSkip","add_" + i + "/in2");
    else
        net = connectLayers(net,outputName,"add_" + i + "/in2");
    end
    
    % Update layer output name.
    outputName = "add_" + i;
end

layers = [
    fullyConnectedLayer(numClasses,Name="fc")
    softmaxLayer];

net = addLayers(net,layers);
net = connectLayers(net,outputName,"fc");

ネットワークをプロットで表示します。

figure
plot(net)
title("Temporal Convolutional Network")

学習オプションの指定

学習に使用するオプションのセットを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、実験マネージャーアプリを使用できます。

  • Adam オプティマイザーを使用して学習させます。

  • ミニバッチ サイズを 1 として 60 エポック学習させます。

  • 学習データには、チャネルとタイム ステップにそれぞれ対応する行と列を含むシーケンスがあるため、入力データ形式 "CTB" (チャネル、時間、バッチ) を指定します。

  • 学習の進行状況をプロットで表示し、精度を監視します。

  • 詳細出力を無効にします。

options = trainingOptions("adam", ...
    MaxEpochs=60, ...
    miniBatchSize=1, ...
    InputDataFormats="CTB", ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=0);

モデルの学習

関数trainnetを使用してニューラル ネットワークに学習させます。既定では、関数 trainnet は利用可能な GPU がある場合にそれを使用します。GPU での学習には、Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。そうでない場合、関数 trainnet は CPU を使用します。実行環境を指定するには、ExecutionEnvironment 学習オプションを使用します。

net = trainnet(XTrain,TTrain,net,"crossentropy",options);

モデルのテスト

各タイム ステップの真のラベルをもつホールド アウトされたテスト セットの予測を比較して、モデルの分類精度をテストします。

テスト データを読み込みます。

s = load("HumanActivityTest.mat");
XTest = s.XTest;
TTest = s.YTest;

テスト イメージを分類します。複数の観測値を使用して予測を行うには、関数minibatchpredictを使用します。予測スコアをラベルに変換するには、関数 scores2label を使用します。関数 minibatchpredict は利用可能な GPU がある場合に自動的にそれを使用します。そうでない場合、関数は CPU を使用します。

scores = minibatchpredict(net,XTest,InputDataFormats="CTB");
YPred = scores2label(scores,classes);

予測とプロット内の対応するテスト データを比較します。

figure
plot(YPred,".-")
hold on
plot(TTest{1})
hold off

xlabel("Time Step")
ylabel("Activity")
legend(["Predicted" "Test Data"],Location="northeast")
title("Test Sequence Predictions")

混同行列で予測を可視化します。

figure
confusionchart(TTest{1},YPred)

予測とテスト ラベルを比較して、分類の精度を評価します。

accuracy = mean(YPred == TTest{1})
accuracy = 
0.9905

参考文献

[1] Bai, Shaojie, J. Zico Kolter, and Vladlen Koltun. "An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling." Preprint, submitted April 19, 2018. https://arxiv.org/abs/1803.01271.

[2] Oord, Aaron van den, Sander Dieleman, Heiga Zen, Karen Simonyan, Oriol Vinyals, Alex Graves, Nal Kalchbrenner, Andrew Senior, and Koray Kavukcuoglu. "WaveNet: A Generative Model for Raw Audio." Preprint, submitted September 12, 2016. https://arxiv.org/abs/1609.03499.

[3] Tompson, Jonathan, Ross Goroshin, Arjun Jain, Yann LeCun, and Christoph Bregler. "Efficient Object Localization Using Convolutional Networks." 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 648–56. https://doi.org/10.1109/CVPR.2015.7298664.

参考

| | | | | | | |

関連するトピック