lstmLayer
再帰型ニューラル ネットワーク (RNN) 用の長短期記憶 (LSTM) 層
説明
LSTM 層は、時系列データおよびシーケンス データのタイム ステップ間の長期的な依存関係を学習する RNN 層です。
この層により交互作用が付加され、学習中の長いシーケンスでの勾配フローの改善に役立ちます。
作成
説明
layer = lstmLayer(numHiddenUnits)NumHiddenUnits プロパティを設定します。
layer = lstmLayer(numHiddenUnits,Name=Value)OutputMode、活性化、状態、パラメーターと初期化、学習率および正則化、および Name の各プロパティを設定します。
プロパティ
LSTM
隠れユニットの数 (隠れサイズとも呼ばれる)。正の整数として指定します。
隠れユニットの数は、タイム ステップ間に層によって記憶された情報 (隠れ状態) の量に相当します。隠れ状態には、シーケンス長に関係なく、以前のすべてのタイム ステップからの情報を含めることができます。隠れユニットの数が大きすぎる場合、層が学習データに対して過適合する可能性があります。隠れ状態によって、1 回の反復の間に層で処理されるタイム ステップ数が制限されることはありません。
この層は、NumHiddenUnits 個のチャネルをもつデータを出力します。
LSTMLayer オブジェクトを作成する場合、このプロパティを設定するには、引数 numHiddenUnits を使用します。LSTMLayer オブジェクトの作成後、このプロパティは読み取り専用になります。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
出力モード。次のいずれかの値として指定します。
- "sequence"— シーケンス全体を出力します。
- "last"— シーケンスの最後のタイム ステップを出力します。
LSTMLayer オブジェクトは、このプロパティを文字ベクトルとして格納します。
LSTMLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。LSTMLayer オブジェクトの作成後、このプロパティは読み取り専用になります。
この プロパティ は読み取り専用です。
層への状態入力のフラグ。0 (false) または 1 (true) として指定します。
HasStateInputs プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層は HiddenState プロパティと CellState プロパティを使用して層処理を行います。
HasStateInputs プロパティが 1 (true) の場合、層は、それぞれ入力データ、隠れ状態、およびセル状態に対応する "in"、"hidden"、および "cell" という名前の 3 つの入力をもちます。この場合、層はこれらの入力に渡された値を使用して層処理を行います。HasStateInputs が 1 (true) の場合、HiddenState プロパティと CellState プロパティは空でなければなりません。
この プロパティ は読み取り専用です。
層からの状態出力のフラグ。0 (false) または 1 (true) として指定します。
HasStateOutputs プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。 
HasStateOutputs プロパティが 1 (true) の場合、層は、それぞれ出力データ、隠れ状態、およびセル状態に対応する "out"、"hidden"、および "cell" という名前の 3 つの出力をもちます。この場合、層は、計算した状態値も出力します。
この プロパティ は読み取り専用です。
 入力サイズ。正の整数または "auto" として指定します。InputSize が "auto" の場合、学習時に入力サイズが自動的に割り当てられます。
InputSize が "auto" の場合、LSTMLayer オブジェクトは、このプロパティを文字ベクトルとして格納します。
データ型: double | char | string
活性化
この プロパティ は読み取り専用です。
セル状態と隠れ状態を更新する活性化関数。次のいずれかの値として指定します。
- "tanh"— 双曲線正接関数 (tanh) を使用します。
- "softsign"— ソフトサイン関数 を使用します。
- "relu"(R2024a 以降) — 正規化線形ユニット (ReLU) 関数 を使用します。
ソフトウェアは、セル状態と隠れ状態を更新する計算における関数 としてこのオプションを使用します。
LSTM 層が活性化関数をどのように使用するかの詳細については、長短期記憶層を参照してください。
LSTMLayer オブジェクトは、このプロパティを文字ベクトルとして格納します。
ゲートに適用する活性化関数。次のいずれかの値として指定します。
- "sigmoid"— シグモイド関数 を使用します。
- "hard-sigmoid"— ハード シグモイド関数を使用します。
ソフトウェアは、層のゲートの計算における関数 としてこのオプションを使用します。
LSTMLayer オブジェクトは、このプロパティを文字ベクトルとして格納します。
LSTMLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。LSTMLayer オブジェクトの作成後、このプロパティは読み取り専用になります。
状態
層処理で使用されるセル状態。NumHiddenUnits 行 1 列の数値ベクトルとして指定します。この値は、データが層に渡されるときのセル状態の初期値に対応します。
このプロパティを手動で設定した後に関数 resetState を呼び出すと、セル状態がこの値に設定されます。
HasStateInputs が 1 (true) の場合、CellState プロパティは空でなければなりません。
データ型: single | double
層処理で使用される隠れ状態。NumHiddenUnits 行 1 列の数値ベクトルとして指定します。この値は、データが層に渡されるときの隠れ状態の初期値に対応します。
このプロパティを手動で設定した後に関数 resetState を呼び出すと、隠れ状態がこの値に設定されます。
HasStateInputs が 1 (true) の場合、HiddenState プロパティは空でなければなりません。
データ型: single | double
パラメーターと初期化
入力の重みを初期化する関数。次のいずれかに指定します。
- "glorot"– Glorot 初期化子[2] (Xavier 初期化子とも呼ばれる) を使用して入力の重みを初期化します。Glorot 初期化子は、平均 0、分散- 2/(InputSize + numOut)の一様分布から個別にサンプリングを行います。ここで、- numOut = 4*NumHiddenUnitsです。
- "he"– He 初期化子[3]を使用して入力の重みを初期化します。He 初期化子は、平均 0、分散- 2/InputSizeの正規分布からサンプリングを行います。
- "orthogonal"– 直交行列 Q を使用して入力の重みを初期化します。この直交行列は、単位正規分布に従ってサンプリングされた乱数行列 Z に対する QR 分解 Z = QR によって与えられます。[4]
- "narrow-normal"– 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、入力の重みを初期化します。
- "zeros"– 0 で入力の重みを初期化します。
- "ones"– 1 で入力の重みを初期化します。
- 関数ハンドル – カスタム関数で入力の重みを初期化します。関数ハンドルを指定する場合、関数は - weights = func(sz)という形式でなければなりません。ここで、- szは入力の重みのサイズです。
この層では、InputWeights プロパティが空の場合にのみ入力の重みが初期化されます。
LSTMLayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。
データ型: char | string | function_handle
再帰重みを初期化する関数。次のいずれかに指定します。
- "orthogonal"– 直交行列 Q を使用して入力の重みを初期化します。この直交行列は、単位正規分布に従ってサンプリングされた乱数行列 Z に対する QR 分解 Z = QR によって与えられます。[4]
- "glorot"– Glorot 初期化子[2] (Xavier 初期化子とも呼ばれる) を使用して再帰重みを初期化します。Glorot 初期化子は、平均 0、分散- 2/(numIn + numOut)の一様分布から個別にサンプリングを行います。ここで、- numIn = NumHiddenUnitsおよび- numOut = 4*NumHiddenUnitsです。
- "he"– He 初期化子[3]を使用して再帰重みを初期化します。He 初期化子は、平均 0、分散- 2/NumHiddenUnitsの正規分布からサンプリングを行います。
- "narrow-normal"– 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、再帰重みを初期化します。
- "zeros"– 0 で再帰重みを初期化します。
- "ones"– 1 で再帰重みを初期化します。
- 関数ハンドル – カスタム関数で再帰重みを初期化します。関数ハンドルを指定する場合、関数は - weights = func(sz)という形式でなければなりません。ここで、- szは再帰重みのサイズです。
この層では、RecurrentWeights プロパティが空の場合にのみ再帰重みが初期化されます。
LSTMLayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。
データ型: char | string | function_handle
バイアスを初期化する関数。次のいずれかの値として指定します。
- "unit-forget-gate"— 忘却ゲート バイアスを 1 で初期化し、残りのバイアスを 0 で初期化します。
- "narrow-normal"— 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、バイアスを初期化します。
- "ones"— 1 でバイアスを初期化します。
- 関数ハンドル — カスタム関数でバイアスを初期化します。関数ハンドルを指定する場合、関数は - bias = func(sz)という形式でなければなりません。ここで、- szはバイアスのサイズです。
この層では、Bias プロパティが空の場合にのみバイアスが初期化されます。
LSTMLayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。
データ型: char | string | function_handle
入力の重み。行列として指定します。
この入力重み行列は、LSTM 層にあるコンポーネント (ゲート) の 4 つの入力重み行列の連結です。4 つの行列は、以下の順で垂直に連結されています。
- 入力ゲート 
- 忘却ゲート 
- セル候補 
- 出力ゲート 
入力の重みは学習可能なパラメーターです。関数 trainnet を使用してニューラル ネットワークに学習させるとき、InputWeights が空でない場合、ソフトウェアは InputWeights プロパティを初期値として使用します。InputWeights が空の場合、InputWeightsInitializer によって指定された初期化子が使用されます。
学習時、InputWeights は 4*NumHiddenUnits 行 InputSize 列の行列です。
再帰重み。行列として指定します。
この再帰重み行列は、LSTM 層にあるコンポーネント (ゲート) の 4 つの再帰重み行列の連結です。4 つの行列は、以下の順で垂直に連結されています。
- 入力ゲート 
- 忘却ゲート 
- セル候補 
- 出力ゲート 
再帰重みは学習可能なパラメーターです。関数 trainnet を使用して RNN に学習させるとき、RecurrentWeights が空でない場合、ソフトウェアは RecurrentWeights プロパティを初期値として使用します。RecurrentWeights が空の場合、RecurrentWeightsInitializer によって指定された初期化子が使用されます。
学習時、RecurrentWeights は 4*NumHiddenUnits 行 NumHiddenUnits 列の行列です。
層のバイアス。数値ベクトルとして指定します。
このバイアス ベクトルは、層にあるコンポーネント (ゲート) の 4 つのバイアス ベクトルの連結です。この層は、4 つのベクトルを次の順序で垂直に連結します。
- 入力ゲート 
- 忘却ゲート 
- セル候補 
- 出力ゲート 
層のバイアスは学習可能なパラメーターです。ニューラル ネットワークに学習させるときに、Bias が空でない場合、trainnet 関数は Bias プロパティを初期値として使用します。Bias が空の場合、ソフトウェアは BiasInitializer によって指定された初期化子を使用します。
学習時、Bias は 4*NumHiddenUnits 行 1 列の数値ベクトルです。
学習率および正則化
入力の重みの学習率係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル学習率が乗算されて、層の入力の重みの学習率係数が決定されます。たとえば、InputWeightsLearnRateFactor が 2 の場合、層の入力の重みの学習率係数は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。
InputWeights に含まれる 4 つの個々の行列について学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。InputWeightsLearnRateFactor のエントリは、以下のコンポーネントの学習率係数に対応します。  
- 入力ゲート 
- 忘却ゲート 
- セル候補 
- 出力ゲート 
すべての行列に同じ値を指定するには、非負のスカラーを指定します。
例: 2
例:  [1 2 1 1] 
再帰重みの学習率係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル学習率が乗算されて、層の再帰重みの学習率が決定されます。たとえば、RecurrentWeightsLearnRateFactor が 2 の場合、層の再帰重みの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。
RecurrentWeights に含まれる 4 つの個々の行列について学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。RecurrentWeightsLearnRateFactor のエントリは、以下のコンポーネントの学習率係数に対応します。  
- 入力ゲート 
- 忘却ゲート 
- セル候補 
- 出力ゲート 
すべての行列に同じ値を指定するには、非負のスカラーを指定します。
例: 2
例:  [1 2 1 1] 
バイアスの学習率係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル学習率が乗算されて、この層のバイアスの学習率が決定されます。たとえば、BiasLearnRateFactor が 2 の場合、層のバイアスの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。
Bias に含まれる 4 つの個々のベクトルについて学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。BiasLearnRateFactor のエントリは、以下のコンポーネントの学習率係数に対応します。  
- 入力ゲート 
- 忘却ゲート 
- セル候補 
- 出力ゲート 
すべてのベクトルに同じ値を指定するには、非負のスカラーを指定します。
例:  2 
例:  [1 2 1 1] 
入力の重みの L2 正則化係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、層の入力の重みの L2 正則化係数が決定されます。たとえば、InputWeightsL2Factor が 2 の場合、層の入力の重みの L2 正則化係数は現在のグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、L2 正則化係数が決定されます。
InputWeights に含まれる 4 つの個々の行列の L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。InputWeightsL2Factor のエントリは、以下のコンポーネントの L2 正則化係数に対応します。  
- 入力ゲート 
- 忘却ゲート 
- セル候補 
- 出力ゲート 
すべての行列に同じ値を指定するには、非負のスカラーを指定します。
例: 2
例:  [1 2 1 1] 
再帰重みの L2 正則化係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、層の再帰重みの L2 正則化係数が決定されます。たとえば、RecurrentWeightsL2Factor が 2 の場合、層の再帰重みの L2 正則化係数は現在のグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、L2 正則化係数が決定されます。
RecurrentWeights に含まれる 4 つの個々の行列の L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。RecurrentWeightsL2Factor のエントリは、以下のコンポーネントの L2 正則化係数に対応します。  
- 入力ゲート 
- 忘却ゲート 
- セル候補 
- 出力ゲート 
すべての行列に同じ値を指定するには、非負のスカラーを指定します。
例: 2
例:  [1 2 1 1] 
バイアスの L2 正則化係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、この層のバイアスの L2 正則化が決定されます。たとえば、BiasL2Factor が 2 の場合、この層のバイアスの L2 正則化はグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル L2 正則化係数が決定されます。
Bias に含まれる 4 つの個々のベクトルの L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。BiasL2Factor のエントリは、以下のコンポーネントの L2 正則化係数に対応します。  
- 入力ゲート 
- 忘却ゲート 
- セル候補 
- 出力ゲート 
すべてのベクトルに同じ値を指定するには、非負のスカラーを指定します。
例:  2 
例:  [1 2 1 1] 
層
この プロパティ は読み取り専用です。
層への入力の数。
HasStateInputs プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層は HiddenState プロパティと CellState プロパティを使用して層処理を行います。
HasStateInputs プロパティが 1 (true) の場合、層は、それぞれ入力データ、隠れ状態、およびセル状態に対応する "in"、"hidden"、および "cell" という名前の 3 つの入力をもちます。この場合、層はこれらの入力に渡された値を使用して層処理を行います。HasStateInputs が 1 (true) の場合、HiddenState プロパティと CellState プロパティは空でなければなりません。
データ型: double
この プロパティ は読み取り専用です。
層の入力名。
HasStateInputs プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層は HiddenState プロパティと CellState プロパティを使用して層処理を行います。
HasStateInputs プロパティが 1 (true) の場合、層は、それぞれ入力データ、隠れ状態、およびセル状態に対応する "in"、"hidden"、および "cell" という名前の 3 つの入力をもちます。この場合、層はこれらの入力に渡された値を使用して層処理を行います。HasStateInputs が 1 (true) の場合、HiddenState プロパティと CellState プロパティは空でなければなりません。
LSTMLayer オブジェクトは、このプロパティを文字ベクトルの cell 配列として格納します。
この プロパティ は読み取り専用です。
層への出力の数。
HasStateOutputs プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。 
HasStateOutputs プロパティが 1 (true) の場合、層は、それぞれ出力データ、隠れ状態、およびセル状態に対応する "out"、"hidden"、および "cell" という名前の 3 つの出力をもちます。この場合、層は、計算した状態値も出力します。
データ型: double
この プロパティ は読み取り専用です。
層の出力名。
HasStateOutputs プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。 
HasStateOutputs プロパティが 1 (true) の場合、層は、それぞれ出力データ、隠れ状態、およびセル状態に対応する "out"、"hidden"、および "cell" という名前の 3 つの出力をもちます。この場合、層は、計算した状態値も出力します。
LSTMLayer オブジェクトは、このプロパティを文字ベクトルの cell 配列として格納します。
例
名前が "lstm1" で、隠れユニットが 100 個の LSTM 層を作成します。
layer = lstmLayer(100,Name="lstm1")layer = 
  LSTMLayer with properties:
                       Name: 'lstm1'
                 InputNames: {'in'}
                OutputNames: {'out'}
                  NumInputs: 1
                 NumOutputs: 1
             HasStateInputs: 0
            HasStateOutputs: 0
   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]layers = 
  4×1 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
sequence-to-label 分類について深層学習 LSTM ネットワークに学習をさせます。
サンプル データを WaveformData.mat から読み込みます。データは、numObservations 行 1 列のシーケンスの cell 配列です。ここで、numObservations はシーケンスの数です。各シーケンスは numTimeSteps 行 numChannels 列の数値配列です。ここで、numTimeSteps はシーケンスのタイム ステップ数、numChannels はシーケンスのチャネル数です。
load WaveformDataシーケンスの一部をプロットで可視化します。
numChannels = size(data{1},2);
idx = [3 4 5 12];
figure
tiledlayout(2,2)
for i = 1:4
    nexttile
    stackedplot(data{idx(i)},DisplayLabels="Channel "+string(1:numChannels))
    
    xlabel("Time Step")
    title("Class: " + string(labels(idx(i))))
end
クラス名を表示します。
classNames = categories(labels)
classNames = 4×1 cell
    {'Sawtooth'}
    {'Sine'    }
    {'Square'  }
    {'Triangle'}
テスト用のデータを確保します。データの 90% から成る学習セットとデータの残りの 10% から成るテスト セットにデータを分割します。データを分割するには、この例にサポート ファイルとして添付されている関数 trainingPartitions を使用します。このファイルにアクセスするには、例をライブ スクリプトとして開きます。
numObservations = numel(data); [idxTrain,idxTest] = trainingPartitions(numObservations, [0.9 0.1]); XTrain = data(idxTrain); TTrain = labels(idxTrain); XTest = data(idxTest); TTest = labels(idxTest);
LSTM ネットワーク アーキテクチャを定義します。入力サイズを入力データのチャネルの数として指定します。120 個の隠れユニットを含み、シーケンスの最後の要素を出力するように LSTM 層を指定します。最後に、クラス数と一致する出力サイズをもつ全結合層を含め、その後にソフトマックス層を含めます。
numHiddenUnits = 120; numClasses = numel(categories(TTrain)); layers = [ ... sequenceInputLayer(numChannels) lstmLayer(numHiddenUnits,OutputMode="last") fullyConnectedLayer(numClasses) softmaxLayer]
layers = 
  4×1 Layer array with layers:
     1   ''   Sequence Input    Sequence input with 3 dimensions
     2   ''   LSTM              LSTM with 120 hidden units
     3   ''   Fully Connected   4 fully connected layer
     4   ''   Softmax           softmax
学習オプションを指定します。学習率 0.01、勾配しきい値 1 で Adam ソルバーを使用して学習させます。エポックの最大数を 200 に設定し、すべてのエポックでデータをシャッフルします。既定では、ソフトウェアは GPU が利用できる場合に GPU で学習を行います。GPU を使用するには、Parallel Computing Toolbox とサポートされている GPU デバイスが必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。
options = trainingOptions("adam", ... MaxEpochs=200, ... InitialLearnRate=0.01,... Shuffle="every-epoch", ... GradientThreshold=1, ... Verbose=false, ... Metrics="accuracy", ... Plots="training-progress");
関数trainnetを使用して LSTM ネットワークに学習させます。分類には、クロスエントロピー損失を使用します。
net = trainnet(XTrain,TTrain,layers,"crossentropy",options);
テスト データを分類します。学習に使用されるサイズと同じミニバッチ サイズを指定します。
scores = minibatchpredict(net,XTest); YTest = scores2label(scores,classNames);
予測の分類精度を計算します。
acc = mean(YTest == TTest)
acc = 0.8700
分類結果を混同チャートで表示します。
figure confusionchart(TTest,YTest)

sequence-to-label 分類用の LSTM ネットワークを作成するには、シーケンス入力層、LSTM 層、全結合層、およびソフトマックス層を含む層配列を作成します。
シーケンス入力層のサイズを入力データの特徴の数に設定します。全結合層のサイズをクラスの数に設定します。シーケンス長を指定する必要はありません。
LSTM 層では、隠れユニットの数と出力モード "last" を指定します。
numFeatures = 12; numHiddenUnits = 100; numClasses = 9; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,OutputMode="last") fullyConnectedLayer(numClasses) softmaxLayer];
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];
sequence-to-one 回帰用の LSTM ネットワークを作成するには、シーケンス入力層、LSTM 層、および全結合層を含む層配列を作成します。
シーケンス入力層のサイズを入力データの特徴の数に設定します。全結合層のサイズを応答の数に設定します。シーケンス長を指定する必要はありません。
LSTM 層では、隠れユニットの数と出力モード "last" を指定します。
numFeatures = 12; numHiddenUnits = 125; numResponses = 1; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,OutputMode="last") fullyConnectedLayer(numResponses)];
sequence-to-sequence 回帰用の LSTM ネットワークを作成するには、sequence-to-one 回帰の場合と同じアーキテクチャを使用しますが、LSTM 層の出力モードを "sequence" に設定します。
numFeatures = 12; numHiddenUnits = 125; numResponses = 1; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,OutputMode="sequence") fullyConnectedLayer(numResponses)];
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];
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];
アルゴリズム
LSTM 層は、時系列データおよびシーケンス データのタイム ステップ間の長期的な依存関係を学習する RNN 層です。
層の状態は、"隠れ状態" ("出力状態" とも呼ばれる) および "セル状態" で構成されています。タイム ステップ t の隠れ状態には、このタイム ステップの LSTM 層の出力が含まれています。セル状態には、前のタイム ステップで学習した情報が含まれています。各タイム ステップで、層では情報をセル状態に追加したり、セル状態から削除したりします。その際、層では "ゲート" を使用して、これらの更新を制御します。
以下のコンポーネントは、層のセル状態および隠れ状態を制御します。
| コンポーネント | 目的 | 
|---|---|
| 入力ゲート (i) | セル状態の更新レベルを制御 | 
| 忘却ゲート (f) | セル状態のリセット (忘却) レベルを制御 | 
| セル候補 (g) | セル状態に情報を追加 | 
| 出力ゲート (o) | 隠れ状態に追加されるセル状態のレベルを制御 | 
次の図は、タイム ステップ t でのデータのフローを示しています。この図は、ゲートがセル状態や隠れ状態をどのように忘却、更新、および出力するかを示しています。

LSTM 層の学習可能なパラメーターの重みは、入力の重み W (InputWeights)、再帰重み R (RecurrentWeights)、およびバイアス b (Bias) です。行列 W、R、および b はそれぞれ、各コンポーネントの入力の重み、再帰重み、およびバイアスの連結です。この層は、次の方程式に従って行列を連結します。
ここで、i、f、g、および o はそれぞれ、入力ゲート、忘却ゲート、セル候補、および出力ゲートを表します。
タイム ステップ t でのセル状態は次で与えられます。
ここで、 はアダマール積 (ベクトルの要素単位の乗算) を表します。
タイム ステップ t での隠れ状態は次で与えられます。
ここで、 は状態活性化関数を表します。既定では、関数 lstmLayer は双曲線正接関数 (tanh) を使用して状態活性化関数を計算します。
次の式は、タイム ステップ t におけるコンポーネントを表しています。
| コンポーネント | 式 | 
|---|---|
| 入力ゲート | |
| 忘却ゲート | |
| セル候補 | |
| 出力ゲート | 
これらの計算では、 はゲート活性化関数を表します。既定では、関数 lstmLayer は  で与えられるシグモイド関数を使用して、ゲート活性化関数を計算します。
層配列内または層グラフ内の層は、形式を整えた dlarray オブジェクトとして後続の層にデータを渡します。dlarray オブジェクトの形式は文字列で、各文字はデータ内の対応する次元を表します。この形式には次の文字が 1 つ以上含まれています。  
- "S"— 空間
- "C"— チャネル
- "B"— バッチ
- "T"— 時間
- "U"— 指定なし
たとえば、4 次元配列として表された 2 次元イメージ データがあり、最初の 2 つの次元がイメージの空間次元に対応し、3 番目の次元がイメージのチャネルに対応し、4 番目の次元がバッチ次元に対応している場合、このイメージ データは "SSCB" (空間、空間、チャネル、バッチ) という形式で記述できます。
functionLayer オブジェクトを使用するか、関数 forward と関数 predict を dlnetwork オブジェクトと共に使用して、カスタム層の開発などの自動微分ワークフローで、これらの dlarray オブジェクトを操作できます。
次の表は、LSTMLayer オブジェクトでサポートされている入力形式、および対応する出力形式を示しています。ソフトウェアが nnet.layer.Formattable クラスを継承していないカスタム層、または Formattable プロパティが 0 (false) に設定された FunctionLayer オブジェクトに層の出力を渡す場合、その層は形式を整えていない dlarray オブジェクトを受け取り、この表に示された形式に従って次元が並べられます。ここには一部の形式のみを示します。層では、追加の "S" (空間) 次元または "U" (未指定) 次元をもつ形式など、追加の形式がサポートされている場合があります。
| 入力形式 | OutputMode | 出力形式 | 
|---|---|---|
| 
 | "sequence" | 
 | 
| "last" | ||
| 
 | "sequence" | 
 | 
| "last" | 
 | |
| 
 | "sequence" | 
 | 
| "last" | 
dlnetwork オブジェクトでは、LSTMLayer オブジェクトもこれらの入力形式と出力形式の組み合わせをサポートします。
| 入力形式 | OutputMode | 出力形式 | 
|---|---|---|
| 
 | "sequence" | 
 | 
| "last" | ||
| 
 | "sequence" | |
| "last" | ||
| 
 | "sequence" | |
| "last" | ||
| 
 | "sequence" | 
 | 
| "last" | 
 | |
| 
 | "sequence" | 
 | 
| "last" | 
 | |
| 
 | "sequence" | 
 | 
| "last" | 
 | |
| 
 | "sequence" | 
 | 
| "last" | ||
| 
 | "sequence" | |
| "last" | ||
| 
 | "sequence" | |
| "last" | ||
| 
 | "sequence" | 
 | 
| "last" | 
 | |
| 
 | "sequence" | 
 | 
| "last" | 
 | |
| 
 | "sequence" | 
 | 
| "last" | 
 | |
| 
 | "sequence" | 
 | 
| "last" | 
 | |
| 
 | "sequence" | 
 | 
| "last" | ||
| 
 | "sequence" | |
| "last" | ||
| 
 | "sequence" | 
 | 
| "last" | 
 | |
| 
 | "sequence" | 
 | 
| "last" | 
 | |
| 
 | "sequence" | 
 | 
| "last" | 
 | |
| 
 | "sequence" | 
 | 
| "last" | 
 | 
HasStateInputs プロパティが 1 (true) の場合、それぞれ隠れ状態とセル状態に対応する "hidden" および "cell" という名前の 2 つの入力が層に追加されます。これらの追加の入力は、"CB" (channel、batch) という入力形式を想定しています。
HasStateOutputs プロパティが 1 (true) の場合、それぞれ隠れ状態とセル状態に対応する "hidden" および "cell" という名前の 2 つの出力が層に追加されます。これらの追加の出力は、"CB" (channel、batch) という出力形式をもちます。
参照
[1] Hochreiter, S, and J. Schmidhuber, 1997. Long short-term memory. Neural computation, 9(8), pp.1735–1780.
[2] 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, 249–356. Sardinia, Italy: AISTATS, 2010. https://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
[3] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification." In 2015 IEEE International Conference on Computer Vision (ICCV), 1026–34. Santiago, Chile: IEEE, 2015. https://doi.org/10.1109/ICCV.2015.123
[4] Saxe, Andrew M., James L. McClelland, and Surya Ganguli. "Exact Solutions to the Nonlinear Dynamics of Learning in Deep Linear Neural Networks.” Preprint, submitted February 19, 2014. https://arxiv.org/abs/1312.6120.
拡張機能
使用上の注意および制限:
- コード生成では、指定なし (U) の次元をもつ - dlarrayオブジェクトをこの層に渡すことはサポートされていません。
- 一般的なコード生成では、 - HasStateInputsプロパティと- HasStateOutputsプロパティを- 0(false) に設定しなければなりません。
- コード生成では、この層への入力として、チャネル (C) の次元をもつ - dlarrayオブジェクトを渡さなければなりません。たとえば、コード生成では "SSC" や "SSCBT" などのデータ形式がサポートされます。
- Intel® MKL-DNN または ARM® Compute Library を使用してコードを生成する場合、以下のようになります。 - StateActivationFunctionプロパティを- "tanh"に設定しなければなりません。
- GateActivationFunctionプロパティを- "sigmoid"に設定しなければなりません。
 
使用上の注意および制限:
- コード生成では、指定なし (U) の次元をもつ - dlarrayオブジェクトをこの層に渡すことはサポートされていません。
- コード生成では、この層への入力として、チャネル (C) の次元をもつ - dlarrayオブジェクトを渡さなければなりません。たとえば、コード生成では "SSC" や "SSCBT" などのデータ形式がサポートされます。
- HasStateInputsプロパティと- HasStateOutputsプロパティを- 0(- false) に設定しなければなりません。
- NVIDIA® TensorRT または CUDA 深層ニューラル ネットワーク (cuDNN) ライブラリを使用してコードを生成する場合: - StateActivationFunctionプロパティを- "tanh"に設定しなければなりません。
- GateActivationFunctionプロパティを- "sigmoid"に設定しなければなりません。
 
バージョン履歴
R2017b で導入ReLU 状態活性化関数を指定するには、StateActivationFunction プロパティを "relu" に設定します。
R2019a 以降では、既定で、Glorot 初期化子を使用してこの層の入力の重みが初期化されます。この動作は、学習を安定化させるのに役立ち、通常は深層ニューラル ネットワークの学習時間を短縮します。
以前のリリースでは、既定で、平均 0、分散 0.01 の正規分布からサンプリングを行って、層の入力の重みが初期化されます。この動作を再現するには、層の InputWeightsInitializer オプションを "narrow-normal" に設定します。
R2019a 以降では、既定で、直交行列 Q を使用してこの層の再帰重みが初期化されます。この直交行列は、単位正規分布に従ってサンプリングされた乱数行列 Z に対する QR 分解 Z = QR によって与えられます。この動作は、学習を安定化させるのに役立ち、通常は深層ニューラル ネットワークの学習時間を短縮します。
以前のリリースでは、既定で、平均 0、分散 0.01 の正規分布からサンプリングを行って、層の再帰重みが初期化されます。この動作を再現するには、層の RecurrentWeightsInitializer オプションを "narrow-normal" に設定します。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)