ドキュメンテーション

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

長短期記憶ネットワーク

このトピックでは、長短期記憶 (LSTM) ネットワークを使用して、分類タスクと回帰タスク用のシーケンス データおよび時系列データを扱う方法を説明します。LSTM ネットワークを使用してシーケンス データを分類する方法を示す例については、深層学習を使用したシーケンスの分類を参照してください。

LSTM ネットワークは、再帰型ニューラル ネットワーク (RNN) の一種で、シーケンス データのタイム ステップ間の長期的な依存関係を学習できます。

LSTM ネットワーク アーキテクチャ

LSTM ネットワークの中核コンポーネントはシーケンス入力層と LSTM 層です。"シーケンス入力層" は、ネットワークにシーケンス データまたは時系列データを入力します。"LSTM 層" は、シーケンス データのタイム ステップ間の長期的な依存関係を学習します。

次の図は、分類用のシンプルな LSTM ネットワークのアーキテクチャを示しています。このネットワークはシーケンス入力層で始まり、その後に LSTM 層が続きます。クラス ラベルを予測するために、このネットワークは全結合層、ソフトマックス層、および分類出力層で終わります。

次の図は、回帰用のシンプルな LSTM ネットワークのアーキテクチャを示しています。このネットワークはシーケンス入力層で始まり、その後に LSTM 層が続きます。このネットワークは全結合層と回帰出力層で終わります。

分類用の LSTM ネットワーク

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];

回帰用の LSTM ネットワーク

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 回帰を参照してください。

深い LSTM ネットワーク

出力モードが '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];

シーケンス入力層

シーケンス入力層は、ネットワークにシーケンス データを入力します。シーケンス入力層は、sequenceInputLayer を使用して作成できます。

LSTM 層

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

lstmLayer を使用して LSTM 層を作成します。

双方向 LSTM 層

双方向 LSTM (BiLSTM) 層は、タイム ステップ間の双方向の長期的な依存関係を学習する RNN 層です。これらの依存関係は、各タイム ステップで時系列全体からネットワークに学習させる場合に役立ちます。

bilstmLayer を使用して BiLSTM 層を作成します。

分類と予測

新しいデータで分類または予測を行うには、classify および predict を使用します。

LSTM ネットワークは予測間のネットワークの状態を記憶できます。ネットワークの状態は、時系列全体が事前に存在しない場合や長い時系列について複数の予測が必要な場合に役に立ちます。

時系列の一部について予測して分類し、ネットワークの状態を更新するには、predictAndUpdateStateclassifyAndUpdateState を使用できます。予測間のネットワークの状態をリセットするには、resetState を使用します。

シーケンスの将来のタイム ステップを予測する方法を示す例については、深層学習を使用した時系列予測を参照してください。

シーケンスのパディング、切り捨て、および分割

LSTM ネットワークは、シーケンス長が異なる入力データをサポートしています。ネットワークにデータが渡されるとき、各ミニバッチのシーケンスはパディング、切り捨て、または分割が行われ、指定された長さになります。シーケンス長とシーケンスのパディングに使用する値は、trainingOptions の名前と値のペアの引数 SequenceLength および SequencePaddingValue を使用して指定できます。

長さでのシーケンスの並べ替え

シーケンスのパディングまたは切り捨ての際に、パディングまたは破棄するデータの量を減らすには、シーケンス長でデータを並べ替えてみてください。シーケンス長でデータを並べ替えるには、まず cellfun を使用してすべてのシーケンスに size(X,2) を適用することによって各シーケンスの列数を取得します。次に、sort を使用してシーケンス長を並べ替え、2 番目の出力を使用して元のシーケンスを並べ替えます。

sequenceLengths = cellfun(@(X) size(X,2), XTrain);
[sequenceLengthsSorted,idx] = sort(sequenceLengths);
XTrain = XTrain(idx);

次の図は、並べ替えたデータと並べ替えていないデータのシーケンス長を棒グラフで示しています。

シーケンスのパディング

シーケンス長 'longest' を指定した場合、各ミニバッチで、そのミニバッチにある最長のシーケンスと同じ長さになるようにシーケンスのパディングが行われます。このオプションは既定値です。

次の図は、'SequenceLength''longest' に設定した場合の効果を示しています。

シーケンスの切り捨て

シーケンス長を 'shortest' に指定した場合、各ミニバッチで、そのミニバッチにある最短のシーケンスと同じ長さになるようにシーケンスの切り捨てが行われます。シーケンスの残りのデータは破棄されます。

次の図は、'SequenceLength''shortest' に設定した場合の効果を示しています。

シーケンスの分割

シーケンスをその長さが整数値であるように指定した場合、各ミニバッチで最長のシーケンスと同じ長さになるようにシーケンスのパディングが行われた後、それらのシーケンスがより小さな、指定長のシーケンスに分割されます。分割が発生すると、追加のミニバッチが作成されます。

次の図は、'SequenceLength' を 5 に設定した場合の効果を示しています。

シーケンス データの正規化

シーケンス データを正規化するには、まず、すべてのシーケンスについて特徴あたりの平均値と標準偏差を計算します。次に、各学習観測値について、平均値を減算し、標準偏差で除算します。

mu = mean([XTrain{:}],2);
sigma = std([XTrain{:}],0,2);
XTrain = cellfun(@(X) (X-mu)./sigma,XTrain,'UniformOutput',false);

メモリ外のデータ

データが大きすぎてメモリに収まらない場合や、データのバッチを読み取る際に特定の演算を実行する場合、シーケンス データ、時系列データ、および信号データについてカスタム ミニバッチ データストアを使用します。

カスタム ミニバッチ データストアを開発する方法については、カスタム ミニバッチ データストアの開発を参照してください。

LSTM 層アーキテクチャ

次の図は、LSTM 層における長さ S の D 個の特徴を持つ時系列 X のフローを示しています。この図で、h は出力 ("隠れ状態" とも呼ばれる) を表し、c は "cell 状態" を表しています。

最初の LSTM ブロックは、ネットワークの初期状態とシーケンス X1 の最初のタイム ステップを取り、最初の出力 h1 と更新後の cell 状態 c1 を計算します。タイム ステップ t では、このブロックは、ネットワークの現在の状態 (ct1,ht1) とシーケンスの次のタイム ステップ Xt を取り、出力 ht と更新後の cell 状態 ct を計算します。

層の状態は、"隠れ状態" ("出力状態" とも呼ばれる) および "cell 状態" で構成されています。タイム ステップ t の隠れ状態には、このタイム ステップの LSTM 層の出力が含まれています。cell 状態には、前のタイム ステップで学習した情報が含まれています。各タイム ステップで、層では情報を cell 状態に追加したり、cell 状態から削除したりします。その際、層では "ゲート" を使用して、これらの更新を制御します。

次の表は、層の cell 状態および隠れ状態を制御するコンポーネントをまとめたものです。

コンポーネント目的
入力ゲート (i)cell 状態の更新レベルを制御
忘却ゲート (f)cell 状態のリセット (忘却) レベルを制御
cell 候補 (g)cell 状態に情報を追加
出力ゲート (o)隠れ状態に追加される cell 状態のレベルを制御

次の図は、タイム ステップ t でのデータのフローを示しています。この図は、ゲートが cell 状態や隠れ状態をどのように忘却、更新、および出力するかを示しています。

LSTM 層の学習可能な重みは、入力の重み W (InputWeights)、再帰重み R (RecurrentWeights)、およびバイアス b (Bias) です。行列 W、R、および b はそれぞれ、各コンポーネントの入力の重み、再帰重み、およびバイアスの連結です。これらの行列は、次のように連結されます。

W=[WiWfWgWo],R=[RiRfRgRo],b=[bibfbgbo],

ここで、i、f、g、および o はそれぞれ、入力ゲート、忘却ゲート、cell 候補、および出力ゲートを表します。

タイム ステップ t での cell 状態は次で与えられます。

ct=ftct1+itgt,

ここで、 はアダマール積 (ベクトルの要素単位の乗算) を表します。

タイム ステップ t での隠れ状態は次で与えられます。

ht=otσc(ct),

ここで、σc は状態活性化関数を表します。関数 lstmLayer は既定で、状態活性化関数として双曲線正接関数 (tanh) を使用します。

次の表は、タイム ステップ t での各コンポーネントの式を示しています。

コンポーネント
入力ゲートit=σg(Wixt+Riht1+bi)
忘却ゲートft=σg(Wfxt+Rfht1+bf)
cell 候補gt=σc(Wgxt+Rght1+bg)
出力ゲートot=σg(Woxt+Roht1+bo)

これらの計算では、σg はゲート活性化関数を表します。関数 lstmLayer は既定で、ゲート活性化関数として σ(x)=(1+ex)1 で与えられるシグモイド関数を使用します。

参照

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

参考

| | | | |

関連するトピック