ドキュメンテーション

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

長短期記憶ネットワーク

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

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

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

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

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

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

分類用の LSTM ネットワーク

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

シーケンス入力層のサイズを入力データの特徴次元に指定します。全結合層のサイズをクラスの数に指定します。

LSTM 層では、出力サイズを選択し、出力モード 'last' を指定します。

inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

sequence-to-label 分類について LSTM ネットワークに学習をさせ、新しいデータを分類する方法の例については、深層学習を使用したシーケンスの分類を参照してください。

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

inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

回帰用の LSTM ネットワーク

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

シーケンス入力層のサイズを入力データの特徴次元に指定します。全結合層のサイズを応答の数に指定します。

LSTM 層では、出力サイズを選択し、出力モード 'last' を指定します。

inputSize = 12;
outputSize = 125;
numResponses = 1;
layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(outputSize,'OutputMode','last')
    fullyConnectedLayer(numResponses)
    regressionLayer];

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

inputSize = 12;
outputSize = 125;
numResponses = 1;
layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(outputSize,'OutputMode','sequence')
    fullyConnectedLayer(numResponses)
    regressionLayer];

sequence-to-sequence 回帰について LSTM ネットワークに学習をさせて、新しいデータを予測する方法の例については、Sequence-to-Sequence Regression Using Deep Learningを参照してください。

深い LSTM ネットワーク

出力モードが 'sequence' の追加の LSTM 層を LSTM 層の前に挿入すると、LSTM ネットワークを深くできます。

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

inputSize = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits1,'OutputMode','sequence')
    lstmLayer(numHiddenUnits2,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

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

inputSize = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits1,'OutputMode','sequence')
    lstmLayer(numHiddenUnits2,'OutputMode','sequence')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

シーケンス入力層

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

LSTM 層

LSTM 層は、ネットワークで時系列データおよびシーケンス データのサポートを実現する再帰型ニューラル ネットワーク (RNN) 層です。この層により交互作用が付加され、学習中の長いシーケンスでの勾配フローの改善に役立ちます。LSTM 層は、"長期的な依存関係" (離れたタイム ステップからの依存関係) の学習に最適です。

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

双方向 LSTM 層

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

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

分類と予測

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

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

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

シーケンスの将来のタイム ステップを予測する方法を示す例については、Time Series Forecasting Using Deep Learningを参照してください。

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

ネットワークにデータが渡されるとき、各ミニバッチのシーケンスはパディング、切り捨て、または分割が行われ、指定された長さになります。シーケンス長とシーケンスのパディングに使用する値は、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 に設定した場合の効果を示しています。

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 の状態のリセット (忘却) レベルを制御
層入力 (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 はそれぞれ、入力ゲート、忘却ゲート、層入力、および出力ゲートを表します。

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

ct=ftct1+itgt,

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

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

ht=otσc(ct),

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

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

ここで、 で与えられるシグモイド関数を表します。

参照

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

参考

| | | | |

関連するトピック