時系列モデルLSTMへの機能の追加


43

LSTMと時系列でのLSTMの使用について少し読んでおり、興味深いが同時に難しかった。私が理解するのに苦労したことの1つは、既に時系列機能のリストであるものに追加機能を追加するアプローチです。データセットが次のようになっていると仮定します。

t-3、t-2、t-1、出力

次に、出力に影響する機能があることを知っていると言いましょうが、必ずしも時系列機能であるとは限りません。外の天気を言ってみましょう。これはあなたがただ追加できるもので、LSTMは時系列の側面とそうでないものを区別することができますか?


あなたの質問が好きです。ただし、主題の知識に基づいて、この非時系列機能が時刻tの出力にどのように影響するかを詳しく説明できます。
horaceT

回答:


39

RNN(LSTMやGRUなど)の場合、レイヤー入力タイムステップのリストであり、各タイムステップ特徴テンソルです。これは、次のような入力テンソルを持つことができることを意味します(Python表記):

# Input tensor to RNN
[
    # Timestep 1
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    # Timestep 2
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    # Timestep 3
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    ...
]

したがって、絶対に、各タイムステップで複数の機能を使用できます。私の考えでは、天気は時系列機能です。私が住んでいる場所では、たまたま時間の関数です。したがって、各タイムステップで天気情報を特徴の1つとしてエンコードすることは非常に合理的です(cloudy = 0、sunny = 1などの適切なエンコードを使用)。

ただし、非時系列データがある場合、それをLSTMに渡すのは実際には意味がありません。とにかくLSTMが機能する可能性はありますが、機能する場合でも、トレーニング時間あたりの損失が大きくなり、精度が低下する可能性があります。

または、追加のレイヤーを使用して、この種の「追加」情報をLSTMの外部のモデルに導入できます。次のようなデータフローがあります。

TIME_SERIES_INPUT ------> LSTM -------\
                                       *---> MERGE ---> [more processing]
AUXILIARY_INPUTS --> [do something] --/

したがって、補助入力をLSTM出力にマージし、そこからネットワークを継続します。これで、モデルは単純に複数入力になりました。

たとえば、特定のアプリケーションでは、LSTM出力シーケンスの最後の出力のみを保持するとします。長さ10のベクトルだとしましょう。補助入力は、エンコードされた天気(スカラー)かもしれません。マージレイヤーは、補助気象情報をLSTM出力ベクトルの最後に追加して、長さ11の単一ベクトルを生成できます。ただし、最後のLSTM出力タイムステップだけを保持する必要ありません。LSTMが100タイムステップを出力した場合、 10個のベクトルのフィーチャを使用すると、補助的な気象情報を追加することができ、それぞれが11個のデータポイントのベクトルで構成される100個のタイムステップになります。

機能的なAPIに関するKerasのドキュメントには、この概要が記載されています。

その他の場合、@ horaceTが指摘しているように、非一時的なデータに基づいてLSTMを調整することもできます。たとえば、場所を指定して明日の天気を予測します。この場合、次の3つの提案があり、それぞれに正/負があります。

  1. 最初のタイムステップには、RNNの内部/非表示の状態を効果的に「設定」するため、コンディショニングデータを含めます。率直に言って、多くの理由でこれを行いません:コンディショニングデータは、他の機能と同じ形状である必要があるため、ステートフルRNNを作成するのが難しくなります(データのフィード方法を本当に注意深く追跡するという点で)ネットワークに))、ネットワークは十分な時間(たとえば、長いトレーニングシーケンス、または長い予測シーケンス)で条件付けデータを「忘れる」ことがあります。

  2. テンポラルデータ自体の一部としてデータを含めます。そのため、特定のタイムステップでの各特徴ベクトルには「ほぼ」時系列データが含まれますが、各特徴ベクトルの最後に条件付けデータが追加されます。ネットワークはこれを認識することを学習しますか?おそらく、しかしそれでも、シーケンスデータを非シーケンシャル情報で汚染することにより、より難しい学習タスクを作成していることになります。それで私もこれを落胆させます。

  3. おそらく最良のアプローチは、時間ゼロでRNNの隠された状態に直接影響を与えることでしょう。これは、カルパシーとフェイ・フェイ、およびヴィニャールらによって取られたアプローチです。これがどのように機能するかです:

    1. トレーニングサンプルごとに、条件変数取得します。x
    2. アフィン変換を使用して条件変数を変換/変形し、RNNの内部状態として適切な形状にします。(これらのおよびは訓練可能な重みです)。ケラスの密なレイヤーで取得できます。 Wbv=Wx+bWb
    3. 最初のタイムステップでは、値を計算するときにRNNの非表示状態にを追加します。v

    このアプローチは最も「理論的に」正しいものです。非一時的な入力でRNNを適切に調整し、形状の問題を自然に解決し、追加の非一時的な情報で入力タイムステップを汚染することも回避するためです。欠点は、このアプローチでは多くの場合、アーキテクチャのグラフレベルの制御が必要になるため、Kerasのような高レベルの抽象化を使用している場合、独自のレイヤータイプを追加しない限り実装が難しいことがわかります。


1
良い提案ですが、LSTMの出力が非時系列予測子に構造的に依存している場合はどうでしょう。
horaceT

例を挙げていただけますか?
アダムSypniewski

6
OK、これは非常に人為的な例です。最後のn個のタイムステップの観測値に基づいて、時刻tの天気を予測しようとしているとします。天気は、あなたがいる世界の一部に依存します。北半球の夏なら、南半球の冬です。したがって、この北/南の要因を考慮する必要があります。LSTMに組み込むことができますか?
horaceT

1
いい質問です!これに対処するための編集を含めました。
アダムSypniewski

編集と2つの参照をありがとう。とても便利です。
horaceT


0

keras LSTMには関数がありreset_states(states)ます。

ただし、パラメーターの状態は、非表示状態hとセル状態の2つの状態の連結です。

States = [h, c]

初期化する必要があるのhc、上記の論文のアプローチに従っているのかを知ることは興味深いでしょう。


0

これはおそらく最も効率的な方法ではありませんが、を使用して静的変数を時系列の長さまで繰り返すことができますtf.tile()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.