LSTM 投影層をもつネットワークの学習
LSTM 投影層をもつ深層学習ネットワークに sequence-to-label 分類を学習させます。
深層学習ネットワークを圧縮するには、"投影層" を使用できます。この層は、学習可能なプロジェクター行列 を導入し、形式 の乗算 ( は学習可能な行列) を乗算 に置き換え、 を格納する代わりに と を格納します。 を使用して をより低次元の空間に投影すると、通常、学習可能なパラメーターを格納するために必要なメモリが少なくなり、同等の高い予測精度が得られます。
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")

参考文献
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.
UCI Machine Learning Repository: Japanese Vowels Dataset. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels
参考
lstmProjectedLayer | trainnet | trainingOptions | dlnetwork | sequenceInputLayer | lstmLayer | bilstmLayer | gruLayer | convolution1dLayer