ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

lstmLayer

長短期記憶 (LSTM) 層

説明

LSTM 層は、時系列データおよびシーケンス データのタイム ステップ間の長期的な依存関係を学習します。

この層により交互作用が付加され、学習中の長いシーケンスでの勾配フローの改善に役立ちます。

作成

構文

layer = lstmLayer(numHiddenUnits)
layer = lstmLayer(numHiddenUnits,Name,Value)

説明

layer = lstmLayer(numHiddenUnits) は、LSTM 層を作成し、NumHiddenUnits プロパティを設定します。

layer = lstmLayer(numHiddenUnits,Name,Value) は、1 つ以上の名前と値のペアの引数を使用して、追加の NameOutputMode活性化、および 学習率および L2 係数 プロパティを設定します。複数の名前と値のペアの引数を指定できます。各プロパティ名を引用符で囲みます。

プロパティ

すべて展開する

LSTM パラメーター

層の名前。文字ベクトルとして指定します。Name'' に設定されている場合、学習時に名前が自動的に割り当てられます。

データ型: char

入力サイズ。正の整数または 'auto' として指定します。InputSize'auto' の場合、学習時に入力サイズが自動的に割り当てられます。

例: 100

隠れユニットの数 (隠れサイズとも呼ばれる)。正の整数として指定します。

例: 200

出力の形式。次のいずれかに指定します。

  • 'sequence' – シーケンス全体を出力します。

  • 'last' – シーケンスの最後のタイム ステップを出力します。

活性化

cell 状態と隠れ状態を更新する活性化関数。次のいずれかに指定します。

  • 'tanh' – 双曲線正接関数 (tanh) を使用します。

  • 'softsign' – ソフトサイン関数 softsign(x)=x1+|x| を使用します。

層は、cell 状態と隠れ状態を更新する計算における関数 σc としてこのオプションを使用します。LSTM 層での活性化関数の使用方法の詳細は、長短期記憶層を参照してください。

ゲートに適用する活性化関数。次のいずれかに指定します。

  • 'sigmoid' – シグモイド関数 σ(x)=(1+ex)1 を使用します。

  • 'hard-sigmoid' – ハード シグモイド関数

    σ(x)={00.2x+0.51if x<2.5if2.5x2.5if x>2.5.

    を使用します。

層は、入力ゲート、出力ゲート、および忘却ゲートの計算における関数 σg としてこのオプションを使用します。LSTM 層での活性化関数の使用方法の詳細は、長短期記憶層を参照してください。

学習率および L2 係数

バイアスの学習率係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。

この係数にグローバル学習率が乗算されて、この層のバイアスの学習率が決定されます。たとえば、BiasLearnRateFactor が 2 の場合、層のバイアスの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定された設定に基づいて、グローバル学習率が決定されます。

Bias に含まれる 4 つの個々の行列について学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。BiasLearnRateFactor のエントリは以下の学習率係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. cell 候補

  4. 出力ゲート

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

バイアスの L2 正則化係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。

この係数にグローバル L2 正則化係数が乗算されて、この層のバイアスの学習率が決定されます。たとえば、BiasL2Factor が 2 の場合、この層のバイアスの L2 正則化はグローバル L2 正則化係数の 2 倍になります。グローバル L2 正則化係数は、関数 trainingOptions を使用して指定できます。

Bias に含まれる 4 つの個々の行列の L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。BiasL2Factor のエントリは以下の L2 正則化係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. cell 候補

  4. 出力ゲート

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

入力の重みの学習率係数。数値スカラーまたは 1 行 4 列の数値ベクトルとして指定します。

この係数にグローバル学習率が乗算されて、層の入力の重みの学習率係数が決定されます。たとえば、InputWeightsLearnRateFactor が 2 の場合、層の入力の重みの学習率係数は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定された設定に基づいて、グローバル学習率が決定されます。

InputWeights に含まれる 4 つの個々の行列について学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。InputWeightsLearnRateFactor のエントリは以下の学習率係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. cell 候補

  4. 出力ゲート

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

入力の重みの L2 正則化係数。数値スカラーまたは 1 行 4 列の数値ベクトルとして指定します。

この係数にグローバル L2 正則化係数が乗算されて、層の入力の重みの L2 正則化係数が決定されます。たとえば、InputWeightsL2Factor が 2 の場合、層の入力の重みの L2 正則化係数は現在のグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定された設定に基づいて、L2 正則化係数が決定されます。

InputWeights に含まれる 4 つの個々の行列の L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。InputWeightsL2Factor のエントリは以下の L2 正則化係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. cell 候補

  4. 出力ゲート

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

再帰重みの学習率係数。数値スカラーまたは 1 行 4 列の数値ベクトルとして指定します。

この係数にグローバル学習率が乗算されて、層の再帰重みの学習率が決定されます。たとえば、RecurrentWeightsLearnRateFactor が 2 の場合、層の再帰重みの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定された設定に基づいて、グローバル学習率が決定されます。

RecurrentWeights に含まれる 4 つの個々の行列について学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。RecurrentWeightsLearnRateFactor のエントリは以下の学習率係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. cell 候補

  4. 出力ゲート

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

再帰重みの L2 正則化係数。数値スカラーまたは 1 行 4 列の数値ベクトルとして指定します。

この係数にグローバル L2 正則化係数が乗算されて、層の再帰重みの L2 正則化係数が決定されます。たとえば、RecurrentWeightsL2Factor が 2 の場合、層の再帰重みの L2 正則化係数は現在のグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定された設定に基づいて、L2 正則化係数が決定されます。

RecurrentWeights に含まれる 4 つの個々の行列の L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。RecurrentWeightsL2Factor のエントリは以下の L2 正則化係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. cell 候補

  4. 出力ゲート

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

状態パラメーター

cell 状態の初期値。NumHiddenUnits 行 1 列の数値ベクトルとして指定します。この値はタイム ステップ 0 での cell 状態に対応します。predictAndUpdateStateclassifyAndUpdateState の使用時には、このプロパティの値が変化する可能性があります。

このプロパティの設定後に関数 resetState を呼び出すと、cell 状態がこの値に設定されます。

隠れ状態の初期値。NumHiddenUnits 行 1 列の数値ベクトルとして指定します。この値はタイム ステップ 0 での隠れ状態に対応します。predictAndUpdateStateclassifyAndUpdateState の使用時には、このプロパティの値が変化する可能性があります。

このプロパティの設定後に関数 resetState を呼び出すと、隠れ状態がこの値に設定されます。

重み

LSTM 層の層のバイアス。4*NumHiddenUnits 行 1 列の数値ベクトルとして指定します。

このバイアス ベクトルは、LSTM 層にあるコンポーネント (ゲート) の 4 つのバイアス ベクトルの連結です。4 つのベクトルは、以下の順で垂直に連結されています。

  1. 入力ゲート

  2. 忘却ゲート

  3. cell 候補

  4. 出力ゲート

入力の重み。4*NumHiddenUnitsInputSize 列の行列として指定します。

この入力重み行列は、LSTM 層にあるコンポーネント (ゲート) の 4 つの入力重み行列の連結です。4 つの行列は、以下の順で垂直に連結されています。

  1. 入力ゲート

  2. 忘却ゲート

  3. cell 候補

  4. 出力ゲート

再帰重み。4*NumHiddenUnitsNumHiddenUnits 列の行列として指定します。

この再帰重み行列は、LSTM 層にあるコンポーネント (ゲート) の 4 つの再帰重み行列の連結です。4 つの行列は、以下の順で垂直に連結されています。

  1. 入力ゲート

  2. 忘却ゲート

  3. cell 候補

  4. 出力ゲート

すべて折りたたむ

名前が 'lstm1' で、隠れユニットが 100 個の LSTM 層を作成します。

layer = lstmLayer(100,'Name','lstm1')
layer = 
  LSTMLayer with properties:

                       Name: 'lstm1'

   Hyperparameters
                  InputSize: 'auto'
             NumHiddenUnits: 100
                 OutputMode: 'sequence'
    StateActivationFunction: 'tanh'
     GateActivationFunction: 'sigmoid'

   Learnable Parameters
               InputWeights: []
           RecurrentWeights: []
                       Bias: []

   State Parameters
                HiddenState: []
                  CellState: []

  Show all properties

Layer 配列に LSTM 層を含めます。

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

layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer]
layers = 
  5x1 Layer array with layers:

     1   ''   Sequence Input          Sequence input with 12 dimensions
     2   ''   LSTM                    LSTM with 100 hidden units
     3   ''   Fully Connected         9 fully connected layer
     4   ''   Softmax                 softmax
     5   ''   Classification Output   crossentropyex

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

[1] および [2] の説明に従って、Japanese Vowels データセットを読み込みます。XTrain は、特徴次元 12 の可変長の 270 個のシーケンスが含まれる cell 配列です。Y は、ラベル 1、2、...、9 の categorical ベクトルです。XTrain のエントリは行列で、行数が 12 (特徴ごとに 1 行) で、列数が可変 (タイム ステップごとに 1 列) です。

[XTrain,YTrain] = japaneseVowelsTrainData;

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

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

LSTM ネットワーク アーキテクチャを定義します。入力サイズを 12 (入力データの特徴の数) に指定します。100 個の隠れユニットを含み、シーケンスの最後の要素を出力するように LSTM 層を指定します。最後に、サイズが 9 の全結合層を含めることによって 9 個のクラスを指定し、その後にソフトマックス層と分類層を配置します。

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

layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer]
layers = 
  5x1 Layer array with layers:

     1   ''   Sequence Input          Sequence input with 12 dimensions
     2   ''   LSTM                    LSTM with 100 hidden units
     3   ''   Fully Connected         9 fully connected layer
     4   ''   Softmax                 softmax
     5   ''   Classification Output   crossentropyex

学習オプションを指定します。ソルバーを 'adam''GradientThreshold' を 1 に指定します。ミニバッチ サイズを 27、エポックの最大回数を 100 に設定します。

ミニバッチが小さく、シーケンスが短いため、学習には CPU が適しています。'ExecutionEnvironment''cpu' に設定します。GPU が利用できる場合、GPU で学習を行うには、'ExecutionEnvironment''auto' (既定値) に設定します。

maxEpochs = 100;
miniBatchSize = 27;

options = trainingOptions('adam', ...
    'ExecutionEnvironment','cpu', ...
    'MaxEpochs',maxEpochs, ...
    'MiniBatchSize',miniBatchSize, ...
    'GradientThreshold',1, ...
    'Verbose',false, ...
    'Plots','training-progress');

学習オプションを指定して LSTM ネットワークに学習させます。

net = trainNetwork(XTrain,YTrain,layers,options);

テスト セットを読み込み、シーケンスを話者別に分類します。

[XTest,YTest] = japaneseVowelsTestData;

テスト データを分類します。学習に使用されるサイズと同じミニバッチ サイズを指定します。

YPred = classify(net,XTest,'MiniBatchSize',miniBatchSize);

予測の分類精度を計算します。

acc = sum(YPred == YTest)./numel(YTest)
acc = 0.9270

sequence-to-label 分類用の LSTM ネットワークを作成するには、シーケンス入力層、LSTM 層、全結合層、ソフトマックス層、および分類出力層を含む層配列を作成します。

シーケンス入力層のサイズを入力データの特徴の数に指定します。全結合層のサイズをクラスの数に指定します。シーケンス長を指定する必要はありません。

LSTM 層では、隠れユニットの数と出力モード 'last' を指定します。

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

sequence-to-label 分類について LSTM ネットワークに学習をさせ、新しいデータを分類する方法の例については、深層学習を使用したシーケンスの分類を参照してください。

sequence-to-sequence 分類用の LSTM ネットワークを作成するには、sequence-to-label 分類の場合と同じアーキテクチャを使用しますが、LSTM 層の出力モードを 'sequence' に設定します。

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

sequence-to-one 回帰用の LSTM ネットワークを作成するには、シーケンス入力層、LSTM 層、全結合層、および回帰出力層を含む層配列を作成します。

シーケンス入力層のサイズを入力データの特徴の数に指定します。全結合層のサイズを応答の数に指定します。シーケンス長を指定する必要はありません。

LSTM 層では、隠れユニットの数と出力モード 'last' を指定します。

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numResponses)
    regressionLayer];

sequence-to-sequence 回帰用の LSTM ネットワークを作成するには、sequence-to-one 回帰の場合と同じアーキテクチャを使用しますが、LSTM 層の出力モードを 'sequence' に設定します。

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(numResponses)
    regressionLayer];

sequence-to-sequence 回帰について LSTM ネットワークに学習をさせて、新しいデータを予測する方法の例については、深層学習を使用した sequence-to-sequence 回帰を参照してください。

出力モードが 'sequence' の追加の LSTM 層を LSTM 層の前に挿入すると、LSTM ネットワークを深くできます。

sequence-to-label 分類ネットワークでは、最後の LSTM 層の出力モードは 'last' でなければなりません。

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits1,'OutputMode','sequence')
    lstmLayer(numHiddenUnits2,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

sequence-to-sequence 分類ネットワークでは、最後の LSTM 層の出力モードは 'sequence' でなければなりません。

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits1,'OutputMode','sequence')
    lstmLayer(numHiddenUnits2,'OutputMode','sequence')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

詳細

すべて展開する

参照

[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

[3] Hochreiter, S, and J. Schmidhuber, 1997. Long short-term memory. Neural computation, 9(8), pp.1735–1780.

R2017b で導入