ドキュメンテーション

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

長短期記憶ネットワーク

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

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

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

LSTM ネットワークの中核コンポーネントはシーケンス入力層と 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 層を使用してベクトルのシーケンスから学習するには、フラット化層の後に LSTM 層と出力層を使用します。

inputSize = [28 28 1];
filterSize = 5;
numFilters = 20;
numHiddenUnits = 200;
numClasses = 10;

layers = [ ...
    sequenceInputLayer(inputSize,'Name','input')
    
    sequenceFoldingLayer('Name','fold')
    
    convolution2dLayer(filterSize,numFilters,'Name','conv')
    batchNormalizationLayer('Name','bn')
    reluLayer('Name','relu')
    
    sequenceUnfoldingLayer('Name','unfold')
    flattenLayer('Name','flatten')
    
    lstmLayer(numHiddenUnits,'OutputMode','last','Name','lstm')
    
    fullyConnectedLayer(numClasses, 'Name','fc')
    softmaxLayer('Name','softmax')
    classificationLayer('Name','classification')];

層を層グラフに変換し、シーケンス折りたたみ層の miniBatchSize 出力をシーケンス展開層の対応する入力に結合します。

lgraph = layerGraph(layers);
lgraph = connectLayers(lgraph,'fold/miniBatchSize','unfold/miniBatchSize');

ビデオの分類用の深層学習ネットワークに学習させる方法を示す例については、Classify Videos Using Deep Learningを参照してください。

深い LSTM ネットワーク

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

関数説明

sequenceInputLayer

シーケンス入力層は、ネットワークにシーケンス データを入力します。

lstmLayer

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

bilstmLayer

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

sequenceFoldingLayer

シーケンス折りたたみ層は、イメージ シーケンスのバッチをイメージのバッチに変換します。シーケンス折りたたみ層を使用して、畳み込み演算をイメージ シーケンスのタイム ステップごとに個別に実行します。

sequenceUnfoldingLayer

シーケンス展開層は、シーケンスの折りたたみ後に入力データのシーケンス構造を復元します。

flattenLayer

フラット化層は、入力の空間次元を折りたたんでチャネルの次元にします。

wordEmbeddingLayer (Text Analytics Toolbox™)

単語埋め込み層は、単語インデックスをベクトルにマッピングします。

分類、予測および予想

新しいデータで分類または予測を行うには、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' に設定した場合の効果を示しています。

シーケンスの分割

シーケンス長を整数値に設定した場合、ミニバッチの最長のシーケンスより大きい、指定長の最も近い倍数になるように、ミニバッチのすべてのシーケンスのパディングが行われます。その後、各シーケンスが指定長のより小さなシーケンスに分割されます。分割が発生すると、追加のミニバッチが作成されます。

シーケンス全体がメモリに収まらない場合は、このオプションを使用します。または、trainingOptions'MiniBatchSize' オプションをより小さい値に設定して、ミニバッチごとのシーケンス数を減らしてみることができます。

シーケンス長を正の整数として指定している場合、連続する反復においてより小さいシーケンスが処理されます。ネットワークは、分割されたシーケンスとシーケンスの間にネットワークの状態を更新します。

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

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

ゼロ中心正規化を使用して学習時に学習データを自動的に再センタリングするには、sequenceInputLayerNormalization プロパティを 'zerocenter' に設定します。または、まず、すべてのシーケンスについて特徴あたりの平均値と標準偏差を計算することによって、シーケンス データを正規化できます。次に、各学習観測値について、平均値を減算し、標準偏差で除算します。

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

メモリ外のデータ

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

詳細は、Train Network Using Out-of-Memory Sequence DataおよびClassify Out-of-Memory Text Data Using Deep Learningを参照してください。

LSTM 層アーキテクチャ

次の図は、LSTM 層における長さ S の C 個の特徴 (チャネル) を持つ時系列 X のフローを示しています。この図で、ht および ct は、それぞれタイム ステップ t での出力 ("隠れ状態" とも呼ばれる) および "セル状態" を表しています。

最初の LSTM ブロックは、ネットワークの初期状態とシーケンスの最初のタイム ステップを使用して、最初の出力と更新後のセル状態を計算します。タイム ステップ t では、このブロックは、ネットワークの現在の状態 (ct1,ht1) とシーケンスの次のタイム ステップを使用して、出力と更新後のセル状態 ct を計算します。

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

以下のコンポーネントは、層のセル状態および隠れ状態を制御します。

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

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

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

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

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

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

ct=ftct1+itgt,

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

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

ht=otσc(ct),

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

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

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

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

参照

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

参考

| | | | | | | | |

関連するトピック