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つの提案があり、それぞれに正/負があります。
最初のタイムステップには、RNNの内部/非表示の状態を効果的に「設定」するため、コンディショニングデータを含めます。率直に言って、多くの理由でこれを行いません:コンディショニングデータは、他の機能と同じ形状である必要があるため、ステートフルRNNを作成するのが難しくなります(データのフィード方法を本当に注意深く追跡するという点で)ネットワークに))、ネットワークは十分な時間(たとえば、長いトレーニングシーケンス、または長い予測シーケンス)で条件付けデータを「忘れる」ことがあります。
テンポラルデータ自体の一部としてデータを含めます。そのため、特定のタイムステップでの各特徴ベクトルには「ほぼ」時系列データが含まれますが、各特徴ベクトルの最後に条件付けデータが追加されます。ネットワークはこれを認識することを学習しますか?おそらく、しかしそれでも、シーケンスデータを非シーケンシャル情報で汚染することにより、より難しい学習タスクを作成していることになります。それで私もこれを落胆させます。
おそらく最良のアプローチは、時間ゼロでRNNの隠された状態に直接影響を与えることでしょう。これは、カルパシーとフェイ・フェイ、およびヴィニャールらによって取られたアプローチです。これがどのように機能するかです:
- トレーニングサンプルごとに、条件変数取得します。x⃗
- アフィン変換を使用して条件変数を変換/変形し、RNNの内部状態として適切な形状にします。(これらのおよびは訓練可能な重みです)。ケラスの密なレイヤーで取得できます。 W → bv⃗ =Wx⃗ +b⃗ Wb⃗
- 最初のタイムステップでは、値を計算するときにRNNの非表示状態にを追加します。v⃗
このアプローチは最も「理論的に」正しいものです。非一時的な入力でRNNを適切に調整し、形状の問題を自然に解決し、追加の非一時的な情報で入力タイムステップを汚染することも回避するためです。欠点は、このアプローチでは多くの場合、アーキテクチャのグラフレベルの制御が必要になるため、Kerasのような高レベルの抽象化を使用している場合、独自のレイヤータイプを追加しない限り実装が難しいことがわかります。