ドキュメンテーション

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

lstmLayer

長短期記憶 (LSTM) 層

説明

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

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

作成

説明

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

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

プロパティ

すべて展開する

LSTM

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

隠れユニットの数は、タイム ステップ間に記憶された情報 (隠れ状態) の量に相当します。隠れ状態には、シーケンス長に関係なく、以前のすべてのタイム ステップからの情報を含めることができます。隠れユニットの数が大きすぎる場合、層が学習データに対して過適合する可能性があります。この値は数十から数千までさまざまな数になります。

隠れ状態によって、1 回の反復で処理されるタイム ステップ数が制限されることはありません。シーケンスを学習用のより小さいシーケンスに分割するには、trainingOptions'SequenceLength' オプションを使用します。

例: 200

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

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

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

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

例: 100

活性化

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

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

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

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

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

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

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

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

    を使用します。

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

状態

セル状態の初期値。NumHiddenUnits 行 1 列の数値ベクトルとして指定します。この値は、タイム ステップ 0 でのセル状態に対応します。

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

隠れ状態の初期値。NumHiddenUnits 行 1 列の数値ベクトルとして指定します。この値は、タイム ステップ 0 での隠れ状態に対応します。

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

パラメーターと初期化

入力の重みを初期化する関数。次のいずれかに指定します。

  • 'glorot' – Glorot 初期化子 [4] (Xavier 初期化子とも呼ばれる) を使用して入力の重みを初期化します。Glorot 初期化子は、平均 0、分散 2/(InputSize + numOut) の一様分布から個別にサンプリングを行います。ここで、numOut = 4*NumHiddenUnits です。

  • 'he' – He 初期化子 [5] を使用して入力の重みを初期化します。He 初期化子は、平均 0、分散 2/InputSize の正規分布からサンプリングを行います。

  • 'orthogonal' – 直交行列 Q を使用して入力の重みを初期化します。この直交行列は、単位正規分布からサンプリングされた乱数行列 Z に対する Z = QR の QR 分解によって与えられます。[6]

  • 'narrow-normal' – 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、入力の重みを初期化します。

  • 'zeros' – 0 で入力の重みを初期化します。

  • 'ones' – 1 で入力の重みを初期化します。

  • 関数ハンドル – カスタム関数で入力の重みを初期化します。関数ハンドルを指定する場合、関数は weights = func(sz) という形式でなければなりません。ここで、sz は入力の重みのサイズです。

この層では、InputWeights プロパティが空の場合にのみ入力の重みが初期化されます。

データ型: char | string | function_handle

再帰重みを初期化する関数。次のいずれかに指定します。

  • 'orthogonal' – 直交行列 Q を使用して再帰重みを初期化します。この直交行列は、単位正規分布からサンプリングされた乱数行列 Z に対する Z = QR の QR 分解によって与えられます。[6]

  • 'glorot' – Glorot 初期化子 [4] (Xavier 初期化子とも呼ばれる) を使用して再帰重みを初期化します。Glorot 初期化子は、平均 0、分散 2/(numIn + numOut) の一様分布から個別にサンプリングを行います。ここで、numIn = NumHiddenUnits および numOut = 4*NumHiddenUnits です。

  • 'he' – He 初期化子 [5] を使用して再帰重みを初期化します。He 初期化子は、平均 0、分散 2/NumHiddenUnits の正規分布からサンプリングを行います。

  • 'narrow-normal' – 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、再帰重みを初期化します。

  • 'zeros' – 0 で再帰重みを初期化します。

  • 'ones' – 1 で再帰重みを初期化します。

  • 関数ハンドル – カスタム関数で再帰重みを初期化します。関数ハンドルを指定する場合、関数は weights = func(sz) という形式でなければなりません。ここで、sz は再帰重みのサイズです。

この層では、RecurrentWeights プロパティが空の場合にのみ再帰重みが初期化されます。

データ型: char | string | function_handle

バイアスを初期化する関数。次のいずれかに指定します。

  • 'unit-forget-gate' – 忘却ゲート バイアスを 1 で初期化し、残りのバイアスを 0 で初期化します。

  • 'narrow-normal' – 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、バイアスを初期化します。

  • 'ones' – 1 でバイアスを初期化します。

  • 関数ハンドル – カスタム関数でバイアスを初期化します。関数ハンドルを指定する場合、関数は bias = func(sz) という形式でなければなりません。ここで、sz はバイアスのサイズです。

この層では、Bias プロパティが空の場合にのみバイアスが初期化されます。

データ型: char | string | function_handle

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

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

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

入力の重みは学習可能なパラメーターです。ネットワークの学習時に、InputWeights が空ではない場合、trainNetworkInputWeights プロパティを初期値として使用します。InputWeights が空の場合、trainNetworkInputWeightsInitializer によって指定された初期化子を使用します。

学習時、InputWeights4*NumHiddenUnitsInputSize 列の行列です。

再帰重み。行列として指定します。

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

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

再帰重みは学習可能なパラメーターです。ネットワークの学習時に、RecurrentWeights が空ではない場合、trainNetworkRecurrentWeights プロパティを初期値として使用します。RecurrentWeights が空の場合、trainNetworkRecurrentWeightsInitializer によって指定された初期化子を使用します。

学習時、RecurrentWeights4*NumHiddenUnitsNumHiddenUnits 列の行列です。

LSTM 層の層のバイアス。数値ベクトルとして指定します。

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

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

層のバイアスは学習可能なパラメーターです。ネットワークの学習時に、Bias が空ではない場合、trainNetworkBias プロパティを初期値として使用します。Bias が空の場合、trainNetworkBiasInitializer によって指定された初期化子を使用します。

学習時、Bias4*NumHiddenUnits 行 1 列の数値ベクトルです。

学習率および正則化

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

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

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

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

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

例: 2

例: [1 2 1 1]

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

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

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

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

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

例: 2

例: [1 2 1 1]

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

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

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

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  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. セル候補

  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. セル候補

  4. 出力ゲート

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

例: 2

例: [1 2 1 1]

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

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

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

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

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

例: 2

例: [1 2 1 1]

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

データ型: char | string

層の入力の数。この層は単一の入力のみを受け入れます。

データ型: double

層の入力名。この層は単一の入力のみを受け入れます。

データ型: cell

層の出力の数。この層には単一の出力のみがあります。

データ型: double

層の出力名。この層には単一の出力のみがあります。

データ型: cell

すべて折りたたむ

名前が '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.9351

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 ネットワークを深くできます。過適合を防止するために、LSTM 層の後にドロップアウト層を挿入できます。

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

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

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

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

詳細

すべて展開する

互換性の考慮事項

すべて展開する

R2019a での動作変更

R2019a での動作変更

参照

[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.

[4] Glorot, Xavier, and Yoshua Bengio. "Understanding the difficulty of training deep feedforward neural networks." In Proceedings of the thirteenth international conference on artificial intelligence and statistics, pp. 249-256. 2010.

[5] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving deep into rectifiers: Surpassing human-level performance on imagenet classification." In Proceedings of the IEEE international conference on computer vision, pp. 1026-1034. 2015.

[6] Saxe, Andrew M., James L. McClelland, and Surya Ganguli. "Exact solutions to the nonlinear dynamics of learning in deep linear neural networks." arXiv preprint arXiv:1312.6120 (2013).

R2017b で導入