Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

長短期記憶ネットワーク

このトピックでは、長短期記憶 (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 lstmLaye (numFeatures)r(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 lstmLaye (numFeatures)r(numHiddenUnits,'OutputMode','sequence') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];

回帰用の LSTM ネットワーク

sequence-to-one 回帰用の LSTM ネットワークを作成するには、シーケンス入力層、LSTM 層、全結合層、および回帰出力層を含む層配列を作成します。

シーケンス入力層のサイズを入力データの特徴の数に設定します。全結合層のサイズを応答の数に設定します。シーケンス長を指定する必要はありません。

LSTM 層では、隠れユニットの数と出力モード'last'を指定します。

numFeatures = 12; numHiddenUnits = 125; numResponses = 1; layers = [...sequenceInputLayer lstmLaye (numFeatures)r(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numResponses) regressionLayer];

sequence-to-sequence 回帰用の LSTM ネットワークを作成するには、sequence-to-one 回帰の場合と同じアーキテクチャを使用しますが、LSTM 層の出力モードを'sequence'に設定します。

numFeatures = 12; numHiddenUnits = 125; numResponses = 1; layers = [...sequenceInputLayer lstmLaye (numFeatures)r(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',“输入”) 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');

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

深い LSTM ネットワーク

出力モードが'sequence'の追加の LSTM 層を LSTM 層の前に挿入すると、LSTM ネットワークを深くできます。過適合を防止するために、LSTM 層の後にドロップアウト層を挿入できます。

sequence-to-label 分類ネットワークでは、最後の LSTM 層の出力モードは'last'でなければなりません。

numFeatures = 12; numHiddenUnits1 = 125; numHiddenUnits2 = 100; numClasses = 9; layers = [...sequenceInputLayer lstmLaye (numFeatures)r(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 lstmLaye (numFeatures)r(numHiddenUnits1,'OutputMode','sequence') dropoutLayer(0.2) lstmLayer(numHiddenUnits2,'OutputMode','sequence') dropoutLayer(0.2) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];

説明

sequenceInputLayer

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

lstmLayer

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

bilstmLayer

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

gruLayer

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

convolution1dLayer

1 次元畳み込み層は、1 次元入力にスライディング畳み込みフィルターを適用します。

maxPooling1dLayer

1 次元最大プーリング層は、入力を 1 次元のプーリング領域に分割し、各領域の最大値を計算することによって、ダウンサンプリングを実行します。

averagePooling1dLayer

1 次元平均プーリング層は、入力を 1 次元のプーリング領域に分割し、各領域の平均値を計算することによって、ダウンサンプリングを実行します。

globalMaxPooling1dLayer

1 次元グローバル最大プーリング層は、入力の時間次元または空間次元の最大値を出力することによって、ダウンサンプリングを実行します。

sequenceFoldingLayer

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

sequenceUnfoldingLayer

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

flattenLayer

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

wordEmbeddingLayer(Text Analytics Toolbox)

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

分類、予測および予想

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

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

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

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

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

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

ネットワークの学習後、関数classifypredictclassifyAndUpdateStatepredictAndUpdateState、およびactivationsの使用時に同じミニバッチ サイズとパディング オプションを使用します。

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

シーケンスのパディングまたは切り捨ての際に、パディングまたは破棄するデータの量を減らすには、シーケンス長でデータを並べ替えてみてください。シーケンス長でデータを並べ替えるには、まず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 に設定した場合の効果を示しています。

パディングの方向の指定

パディングと切り捨ての位置は、学習、分類、および予測の精度に影響する可能性があります。trainingOptions'SequencePaddingDirection'オプションを'left'または'right'に設定してみて、どちらがデータに適しているかを確認します。

LSTM 層は 1 タイム ステップずつシーケンス データを処理するため、層のOutputModeプロパティが'last'の場合、最後のタイム ステップでパディングを行うと層の出力に悪影響を与える可能性があります。シーケンス データの左側に対してパディングまたは切り捨てを行うには、'SequencePaddingDirection'オプションを'left'に設定します。

sequence-to-sequence ネットワークの場合 (各 LSTM 層についてOutputModeプロパティが'sequence'である場合)、最初のタイム ステップでパティングを行うと、それ以前のタイム ステップの予測に悪影響を与える可能性があります。シーケンスの右側に対してパディングまたは切り捨てを行うには、'SequencePaddingDirection'オプションを'right'に設定します。

次の図は、シーケンス データの左側および右側のパディングを示しています。

次の図は、シーケンス データの左側および右側の切り捨てを示しています。

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

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

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

メモリ外のデータ

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

詳細は、メモリ外のシーケンス データを使用したネットワークの学習および深層学習を使用したメモリ外のテキスト データの分類を参照してください。

可視化

関数activationsを使用して活性化を抽出することによって、シーケンス データと時系列データから LSTM ネットワークによって学習された特徴を調べて可視化します。詳細については、LSTM ネットワークの活性化の可視化を参照してください。

LSTM 層アーキテクチャ

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

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

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

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

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

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

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

W = [ W i W f W g W o ] , R = [ R i R f R g R o ] , b = [ b i b f b g b o ] ,

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

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

c t = f t c t 1 + i t g t ,

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

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

h t = o t σ c ( c t ) ,

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

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

コンポーネント
入力ゲート i t = σ g ( W i x t + R i h t 1 + b i )
忘却ゲート f t = σ g ( W f x t + R f h t 1 + b f )
セル候補 g t = σ c ( W g x t + R g h t 1 + b g )
出力ゲート o t = σ g ( W o x t + R o h t 1 + b o )

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

参照

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

参考

||||||||||(Text Analytics Toolbox)|

関連するトピック