Main Content

lstm

説明

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

メモ

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

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 演算を行った後に隠れ状態とセル状態も返します。

___ = lstm(___,Name=Value) は、1 つ以上の名前と値の引数を使用して追加のオプションを指定します。

すべて折りたたむ

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

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

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

X = randn(numFeatures,numObservations,sequenceLength);
X = 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 演算を実行します。

[Y,hiddenState,cellState] = lstm(X,H0,C0,weights,recurrentWeights,bias);

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

size(Y)
ans = 1×3

     3    32    64

dims(Y)
ans = 
'CBT'

隠れ状態とセル状態のサイズを表示します。

size(hiddenState)
ans = 1×2

     3    32

size(cellState)
ans = 1×2

     3    32

入力引数

すべて折りたたむ

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

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

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

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

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

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

初期セル状態ベクトル。形式を整えた dlarray形式を整えていない dlarray、または数値配列として指定します。

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

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

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

重み。形式を整えた dlarray、形式を整えていない dlarray、または数値配列として指定します。

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

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

再帰重み。形式を整えた dlarray、形式を整えていない dlarray、または数値配列として指定します。

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

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

バイアス。形式を整えた dlarray、形式を整えていない dlarray、または数値配列として指定します。

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

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

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: Y = lstm(X,H0,C0,weights,recurrentWeights,bias,DataFormat="CTB") は LSTM 演算を適用し、データの形式が "CTB" (チャネル、時間、バッチ) であることを指定します。

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

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

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

  • "S" — 空間

  • "C" — チャネル

  • "B" — バッチ

  • "T" — 時間

  • "U" — 指定なし

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

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

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

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

データ型: char | string

R2024a 以降

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

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

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

  • "relu" — 正規化線形ユニット (ReLU) 関数 ReLU(x)={x,x>00,x0 を使用します。

ソフトウェアは、セル状態と隠れ状態を更新する計算における関数 σc としてこのオプションを使用します。

詳細については、lstmLayer のリファレンス ページに記載された長短期記憶層の定義を参照してください。

R2024a 以降

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

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

  • "hard-sigmoid" — ハード シグモイド関数を使用します。

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

ソフトウェアは、層のゲートの計算における関数 σg としてこのオプションを使用します。

詳細については、lstmLayer のリファレンス ページに記載された長短期記憶層の定義を参照してください。

出力引数

すべて折りたたむ

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 で導入

すべて展開する