Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

lstm

長短期記憶

R2019b 以降

説明

長短期記憶 (LSTM) 演算では、時系列データおよびシーケンス データのタイム ステップ間の長期的な依存関係をネットワークに学習させることができます。

メモ

この関数は、深層学習 LSTM 演算を dlarray データに適用します。layerGraph オブジェクト内または Layer 配列内に LSTM 演算を適用する場合は、次の層を使用します。

Y = lstm(X,H0,C0,weights,recurrentWeights,bias) は、初期隠れ状態 H0、初期セル状態 C0、およびパラメーター weightsrecurrentWeightsbias を使用して、入力 X に長短期記憶 (LSTM) 演算を適用します。入力 X は、書式化された dlarray でなければなりません。出力 Y は、X と同じ次元形式をもつ書式化された dlarray になります ('S' 次元を除く)。

関数 lstm は、双曲線正接関数 (tanh) を状態活性化関数として使用し、セル状態と隠れ状態を更新します。関数 lstm は、σ(x)=(1+ex)1 で与えられるシグモイド関数をゲート活性化関数として使用します。

[Y,hiddenState,cellState] = lstm(X,H0,C0,weights,recurrentWeights,bias) は、LSTM 演算を行った後に隠れ状態とセル状態も返します。

X が書式化されていない dlarray である場合、[___] = lstm(___,'DataFormat',FMT) は、次元形式 FMT も指定します。出力 Y は、X と同じ順序で次元が並べられた、書式化されていない dlarray になります ('S' 次元を除く)。

すべて折りたたむ

3 つの隠れユニットを使用して、LSTM 演算を実行します。

チャネル数が 10、シーケンス長が 64 である 32 個の観測値として入力シーケンス データを作成します。

numFeatures = 10;
numObservations = 32;
sequenceLength = 64;

X = randn(numFeatures,numObservations,sequenceLength);
dlX = dlarray(X,'CBT');

3 つの隠れユニットをもつ初期隠れ状態と初期セル状態を作成します。すべての観測値について、同じ初期隠れ状態と初期セル状態を使用します。

numHiddenUnits = 3;
H0 = zeros(numHiddenUnits,1);
C0 = zeros(numHiddenUnits,1);

LSTM 演算に関する学習可能なパラメーターを作成します。

weights = dlarray(randn(4*numHiddenUnits,numFeatures),'CU');
recurrentWeights = dlarray(randn(4*numHiddenUnits,numHiddenUnits),'CU');
bias = dlarray(randn(4*numHiddenUnits,1),'C');

LSTM 演算を実行します。

[dlY,hiddenState,cellState] = lstm(dlX,H0,C0,weights,recurrentWeights,bias);

dlY のサイズと次元を表示します。

size(dlY)
ans = 1×3

     3    32    64

dlY.dims
ans = 
'CBT'

hiddenState および cellState のサイズを表示します。

size(hiddenState)
ans = 1×2

     3    32

size(cellState)
ans = 1×2

     3    32

出力 hiddenState が出力 dlY の最後のタイム ステップと同じであることを確認します。

if extractdata(dlY(:,:,end)) == hiddenState
   disp("The hidden state and the last time step are equal.");
else 
   disp("The hidden state and the last time step are not equal.")
end
The hidden state and the last time step are equal.

隠れ状態とセル状態を使用すると、LSTM 演算の状態を追跡したり、シーケンス データをさらに入力したりすることができます。

入力引数

すべて折りたたむ

入力データ。書式化された dlarray、書式化されていない dlarray、または数値配列として指定します。X が書式化された dlarray でない場合、'DataFormat',FMT を使用して次元ラベルの形式を指定しなければなりません。X が数値配列の場合、少なくとも H0C0weightsrecurrentWeightsbias のいずれかが dlarray でなければなりません。

X には、"T" のラベルの付いたシーケンス次元が含まれていなければなりません。"S" のラベルが付いた空間次元が X に含まれている場合、それらは "C" チャネル次元にフラット化されます。X にチャネル次元が含まれていない場合、チャネル次元が 1 つ追加されます。"U" のラベルが付いた未指定の次元が X に含まれている場合、その次元は大きさが 1 でなければなりません。

データ型: single | double

初期隠れ状態ベクトル。書式化された dlarray、書式化されていない dlarray、または数値配列として指定します。

H0 が書式化された dlarray の場合、'C' のラベルが付いたチャネル次元が含まれていなければなりません。このとき、X'B' 次元とサイズが等しく、'B' のラベルが付いたバッチ次元を含めることもできます。H0'B' 次元が含まれていない場合、関数は、X に含まれる各観測値に対して同じ隠れ状態ベクトルを使用します。

'C' 次元のサイズによって隠れユニットの数が決定されます。H0'C' 次元のサイズは、C0'C' 次元のサイズと等しくなければなりません。

H0 が書式化された dlarray ではない場合、最初の次元のサイズによって隠れユニットの数が決定されます。このとき、最初の次元のサイズは、C0 の最初の次元または 'C' 次元のサイズと同じでなければなりません。

データ型: single | double

初期セル状態ベクトル。書式化された dlarray、書式化されていない dlarray、または数値配列として指定します。

C0 が書式化された dlarray の場合、'C' のラベルが付いたチャネル次元が含まれていなければなりません。このとき、X'B' 次元とサイズが等しく、'B' のラベルが付いたバッチ次元を含めることもできます。C0'B' 次元が含まれていない場合、関数は、X に含まれる各観測値に対して同じセル状態ベクトルを使用します。

'C' 次元のサイズによって隠れユニットの数が決定されます。C0'C' 次元のサイズは、H0'C' 次元のサイズと等しくなければなりません。

C0 が書式化された dlarray ではない場合、最初の次元のサイズによって隠れユニットの数が決定されます。このとき、最初の次元のサイズは、H0 の最初の次元または 'C' 次元のサイズと同じでなければなりません。

データ型: single | double

重み。書式化された dlarray、書式化されていない dlarray、または数値配列として指定します。

サイズが 4*NumHiddenUnitsInputSize 列の行列として weights を指定します。ここで、NumHiddenUnitsC0 および H0'C' 次元のサイズ、InputSizeX'C' 次元のサイズに X の各 'S' 次元のサイズを乗算した値です (存在する場合)。

weights が書式化された dlarray の場合、サイズが 4*NumHiddenUnits である 'C' 次元およびサイズが InputSize である 'U' 次元が含まれていなければなりません。

データ型: single | double

再帰重み。書式化された dlarray、書式化されていない dlarray、または数値配列として指定します。

サイズが 4*NumHiddenUnitsNumHiddenUnits 列の行列として recurrentWeights を指定します。ここで、NumHiddenUnitsC0 および H0'C' 次元のサイズです。

recurrentWeights が書式化された dlarray の場合、サイズが 4*NumHiddenUnits である 'C' 次元およびサイズが NumHiddenUnits である 'U' 次元が含まれていなければなりません。

データ型: single | double

バイアス。書式化された dlarray、書式化されていない dlarray、または数値配列として指定します。

長さ 4*NumHiddenUnits のベクトルとして bias を指定します。ここで、NumHiddenUnitsC0 および H0'C' 次元のサイズです。

bias が書式化された dlarray の場合、大きさが 1 でない次元は 'C' のラベルが付いていなければなりません。

データ型: single | double

データの次元の説明。文字ベクトルまたは string スカラーとして指定します。

データの形式は文字列で、各文字はデータ内の対応する次元のタイプを表します。

各文字は以下のとおりです。

  • "S" — 空間

  • "C" — チャネル

  • "B" — バッチ

  • "T" — 時間

  • "U" — 指定なし

たとえば、シーケンスのバッチを含み、1 番目、2 番目、および 3 番目の次元がそれぞれチャネル、観測値、およびタイム ステップに対応する配列の場合、"CBT" の形式で指定できます。

"S" または "U" のラベルが付いた次元については、複数回指定できます。"C""B""T" のラベルについては、1 回のみ使用できます。ソフトウェアは、2 番目の次元の後ろにある大きさ 1 の "U" 次元を無視します。

入力データが書式化された dlarray オブジェクトでない場合は、FMT オプションを指定しなければなりません。

詳細については、Deep Learning Data Formatsを参照してください。

データ型: char | string

出力引数

すべて折りたたむ

LSTM 出力。dlarray として返されます。出力 Y の基となるデータ型は、入力 X と同じです。

入力データ X が書式化された dlarray である場合、Y の次元形式は X と同じになります ('S' 次元を除く)。入力データが書式化された dlarray でない場合、Y は、入力データと同じ次元の順序をもつ書式化されていない dlarray になります。

Y'C' 次元のサイズは、H0 または C0'C' 次元のサイズで指定された隠れユニットの数と同じです。

各観測値の隠れ状態ベクトル。H0 と同じデータ型をもつ dlarray または数値配列として返されます。

入力 H0 が書式化された dlarray の場合、出力 hiddenState は、書式 "CB" をもつ書式化された dlarray になります。

各観測値のセル状態ベクトル。dlarray または数値配列として返されます。cellState は、C0 と同じデータ型で返されます。

入力 C0 が書式化された dlarray の場合、出力 cellState は、書式 'CB' をもつ書式化された dlarray として返されます。

アルゴリズム

すべて折りたたむ

長短期記憶

LSTM 演算では、時系列データおよびシーケンス データのタイム ステップ間の長期的な依存関係をネットワークに学習させることができます。詳細については、lstmLayer のリファレンス ページに記載された長短期記憶層の定義を参照してください。

深層学習配列の形式

深層学習のほとんどのネットワークと関数は、入力データの各次元に対して異なる方法で演算を行います。

たとえば、LSTM 演算は入力データの時間次元を反復処理し、バッチ正規化演算は入力データのバッチ次元を正規化します。

ラベルが付いた次元をもつ入力データ、または追加のレイアウト情報をもつ入力データを指定するには、"データ形式" を使用します。

データの形式は文字列で、各文字はデータ内の対応する次元のタイプを表します。

各文字は以下のとおりです。

  • "S" — 空間

  • "C" — チャネル

  • "B" — バッチ

  • "T" — 時間

  • "U" — 指定なし

たとえば、シーケンスのバッチを含み、1 番目、2 番目、および 3 番目の次元がそれぞれチャネル、観測値、およびタイム ステップに対応する配列の場合、"CBT" の形式で指定できます。

書式化された入力データを作成するには、dlarray オブジェクトを作成し、2 番目の引数を使用して形式を指定します。

書式化されていないデータを使用して追加のレイアウト情報を指定するには、引数 FMT を使用して形式を指定します。

詳細については、Deep Learning Data Formatsを参照してください。

拡張機能

バージョン履歴

R2019b で導入