メインコンテンツ

LSTM 投影層をもつネットワークの学習

LSTM 投影層をもつ深層学習ネットワークに sequence-to-label 分類を学習させます。

深層学習ネットワークを圧縮するには、"投影層" を使用できます。この層は、学習可能なプロジェクター行列 Q を導入し、形式 Wx の乗算 (W は学習可能な行列) を乗算 WQQx に置き換え、W を格納する代わりに QW=WQ を格納します。Q を使用して x をより低次元の空間に投影すると、通常、学習可能なパラメーターを格納するために必要なメモリが少なくなり、同等の高い予測精度が得られます。

LSTM 層の隠れユニットの数を減らすのではなく、LSTM 層を投影して学習可能なパラメーターの数を減らすと、層の出力サイズが維持され、結果として下流層のサイズも維持されるため、予測精度の向上が期待できます。

次のグラフは、この例で学習させる LSTM ネットワークと投影された LSTM ネットワークのテスト精度と学習可能なパラメーターの数を比較しています。

この例では、シーケンス分類用に LSTM ネットワークに学習させ、次に LSTM 投影層をもつ同等のネットワークに学習させます。次に、各ネットワークのテスト精度と学習可能なパラメーターの数を比較します。

学習データの読み込み

[1] および [2] で説明されている Japanese Vowels データ セットを読み込みます。これには、LPC ケプストラム係数に対応する 12 個の特徴と、ラベル 1、2、...、9 の categorical ベクトルをもつ、270 個の可変長シーケンスが含まれています。シーケンスは行列で、行数が 12 (特徴ごとに 1 行) で、列数が可変 (タイム ステップごとに 1 列) です。

load japaneseVowelsTrainData.mat

最初の時系列をプロットで可視化します。各ラインは特徴に対応しています。

figure
plot(XTrain{1}')
title("Training Observation 1")
numFeatures = size(XTrain{1},1);
legend("Feature " + string(1:numFeatures),Location="northeastoutside")

ネットワーク アーキテクチャの定義

LSTM ネットワーク アーキテクチャを定義します。

  • 入力データの特徴の数に一致する入力サイズをもつシーケンス入力層を指定する。

  • シーケンスの最後の要素を出力する、100 個の隠れユニットをもつ LSTM 層を指定する。

  • クラスの数に等しいサイズの全結合層を指定し、その後にソフトマックス層を配置する。

inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;

layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,OutputMode="last")
    fullyConnectedLayer(numClasses)
    softmaxLayer];

学習オプションの指定

学習オプションを指定します。

  • Adam ソルバーを使用して学習させます。

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

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

  • ミニバッチが小さく、シーケンスが短いため、学習には CPU が適しています。CPU を使用して学習させます。

  • 学習の進行状況をプロットに表示し、詳細出力を非表示にします。

maxEpochs = 50;
miniBatchSize = 27;

options = trainingOptions("adam", ...
    MiniBatchSize=miniBatchSize, ...
    MaxEpochs=maxEpochs, ...
    InputDataFormats="CTB", ...
    ExecutionEnvironment="cpu", ...
    Plots="training-progress", ...
    Verbose=false);

ネットワークの学習

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

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

ネットワークのテスト

テスト イメージを分類します。複数の観測値を使用して予測を行うには、関数minibatchpredictを使用します。予測スコアをラベルに変換するには、scores2label 関数を使用します。関数 minibatchpredict は利用可能な GPU がある場合に自動的にそれを使用します。GPU を使用するには、Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。そうでない場合、関数は CPU を使用します。

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

load japaneseVowelsTestData.mat
scores = minibatchpredict(net,XTest,MiniBatchSize=miniBatchSize,InputDataFormats="CTB");
YTest = scores2label(scores,categories(TTest));
acc = sum(YTest == TTest)./numel(TTest)
acc = 0.9405

analyzeNetwork 関数を使用して、ネットワークの学習可能なパラメーターの数を表示します。

analyzeNetwork(net)

各ネットワークの学習可能なパラメーターの総数を比較するために、学習可能なパラメーターの総数を変数に格納します。

totalLearnables = 46100;

投影 LSTM ネットワークの学習

LSTM 層の代わりに LSTM 投影層をもつ同一のネットワークを作成します。

LSTM 投影層について、以下のようにします。

  • LSTM 層と同じ数の隠れユニットを指定する

  • 出力プロジェクターのサイズを、隠れユニットの数の 25% に指定する。

  • 入力プロジェクターのサイズを入力サイズの 75% に指定する。

  • 出力プロジェクターと入力プロジェクターのサイズが正の値となるように、各サイズと 1 の間の最大値をとる。

outputProjectorSize = max(1,floor(0.25*numHiddenUnits));
inputProjectorSize = max(1,floor(0.75*inputSize));

layersProjected = [ ...
    sequenceInputLayer(inputSize)
    lstmProjectedLayer(numHiddenUnits,outputProjectorSize,inputProjectorSize,OutputMode="last")
    fullyConnectedLayer(numClasses)
    softmaxLayer];

同じデータと学習オプションを使用して、投影された LSTM ネットワークに学習させます。

netProjected = trainnet(XTrain,TTrain,layersProjected,"crossentropy",options);

投影ネットワークのテスト

テスト データに対する予測の分類精度を計算します。

scores = minibatchpredict(netProjected,XTest,MiniBatchSize=miniBatchSize,InputDataFormats="CTB");
YTest = scores2label(scores,categories(TTest));
accProjected = sum(YTest == TTest)./numel(TTest)
accProjected = 0.8865

analyzeNetwork 関数を使用して、ネットワークの学習可能なパラメーターの数を表示します。

analyzeNetwork(netProjected)

各ネットワークの学習可能なパラメーターの総数を比較するために、学習可能なパラメーターの総数を変数に格納します。

totalLearnablesProjected = 17500;

ネットワークの比較

各ネットワークのテスト精度と学習可能なパラメーターの数を比較します。投影サイズによっては、投影ネットワークの学習可能なパラメーターが大幅に少なくても、高い予測精度を維持できる可能性があります。

各ネットワークのテスト精度を示す棒グラフを作成します。

figure
bar([acc accProjected])
xticklabels(["Unprojected","Projected"])
xlabel("Network")
ylabel("Test Accuracy")
title("Test Accuracy")

各ネットワークのテスト精度と学習可能なパラメーターの数を示す棒グラフを作成します。

figure
bar([totalLearnables totalLearnablesProjected])
xticklabels(["Unprojected","Projected"])
xlabel("Network")
ylabel("Number of Learnables")
title("Number of Learnables")

参考文献

  1. M. Kudo, J. Toyama, and M. Shimbo. "Multidimensional Curve Classification Using Passing-Through Regions." Pattern Recognition Letters. Vol. 20, No. 11–13, pages 1103–1111.

  2. UCI Machine Learning Repository: Japanese Vowels Dataset. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

参考

| | | | | | | |

トピック