向时间序列模型LSTM添加功能


42

一直在阅读有关LSTM及其在时间序列上的用法的文章,虽然有趣但同时又很困难。我一直难以理解的一件事是向时间序列功能列表中添加其他功能的方法。假设您的数据集是这样的:

t-3,t-2,t-1,输出

现在说您知道您有一个确实会影响输出的功能,但不一定是时间序列功能,比如说外面的天气。您可以添加一下这些内容吗,LSTM就能区分出时间序列方面和什么方面?


我喜欢你的问题。但是,您能否根据主题知识来详细说明此非时间序列特征如何影响时间t处的输出。
horaceT

Answers:


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 ],
    ...
]

因此绝对可以在每个时间步上具有多个功能。在我看来,天气是时间序列的特征:我居住的地方恰好是时间的函数。因此,将天气信息编码为每个时间步中的一项功能是非常合理的(使用适当的编码,例如,多云= 0,晴天= 1等)。

如果您有非时间序列数据,那么通过LSTM传递数据就没有任何意义。也许LSTM仍然可以工作,但是即使可以,它也可能以每次训练时间损失更高/准确性更低为代价。

或者,您可以通过其他层将这种“额外”信息引入LSTM之外的模型中。您可能会有这样的数据流:

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

因此,您可以将辅助输入合并到LSTM输出中,然后从那里继续网络。现在,您的模型就是简单的多输入。

例如,假设在您的特定应用程序中,您仅保留LSTM输出序列的最后一个输出。假设它是一个长度为10的向量。您的辅助输入可能是您编码的天气(标量)。你的合并层可以简单地辅助气象信息附加到LSTM输出向量的末尾以产生长度为11的单个向量但你并不需要只保留最后LSTM输出时间步:如果LSTM输出100时步,每个具有10个向量的要素,您仍然可以使用辅助天气信息,从而获得100个时间步长,每个时间步长包含11个数据点的向量。

有关功能API的Keras文档对此进行了很好的概述。

在其他情况下,正如@horaceT指出的那样,您可能希望将LSTM限制在非时间数据上。例如,在给定位置的情况下,预测明天的天气。在这种情况下,以下是三个建议,每个建议都带有正面/负面的含义:

  1. 让第一时间步包含您的条件数据,因为它可以有效地“设置” RNN的内部/隐藏状态。坦率地说,出于种种原因,我会这样做:您的条件数据必须与其余功能的形状相同,这使得创建有状态RNN更加困难(就非常谨慎地跟踪数据的馈送方式而言)进入网络),网络可能会以足够的时间(例如长训练序列或长预测序列)等“忘记”条件数据。

  2. 将数据包括为时间数据本身的一部分。因此,在特定时间步长的每个特征向量都包含“大部分”时间序列数据,但随后会将条件数据附加到每个特征向量的末尾。网络会学会识别这一点吗?可能,但即使如此,您仍在使用非序列信息污染序列数据,从而创建了一项难度更大的学习任务。所以我也不要这样做

  3. 也许最好的办法是直接影响在时间零RNN的隐藏状态。这是由所采用的方法Karpathy和费-费和由Vinyals等。它是这样工作的:

    1. 对于每个训练样本,请使用条件变量。X
    2. 使用仿射变换对条件变量进行变换/重塑,以使其成为RNN的内部状态正确的形状:(这些和是可训练的权重。您可以在keras中使用Dense层获得它。 Wbv=w ^X+bw ^b
    3. 对于第一个时间步,在计算RNN的值时,将添加到RNN的隐藏状态。v

    此方法是最“理论上正确”的方法,因为它可以在非时间输入上适当地调整RNN,自然解决形状问题,还可以避免使用其他非时间信息污染输入时间步长。缺点是这种方法通常需要对体系结构进行图形级别的控制,因此,如果使用的是Keras等更高级别的抽象,除非添加自己的图层类型,否则很难实现。


1
很好的建议,但是如果LSTM的输出对非时间序列预测变量具有结构依赖性,该怎么办。
horaceT

你能举个例子吗?
亚当·西普涅夫斯基

6
好的,这是一个非常人为的示例。假设您要根据最近n个时间步的观测值来尝试预测时间t的天气。天气取决于您所处的世界。如果是北半球的夏季,则是南半球的冬季。因此,应该考虑这个北/南因素。您可以将其合并到LSTM吗?
horaceT '17

1
好问题!我已包含修改内容以解决此问题。
亚当Sypniewski

编辑和两个参考。非常有用。
horaceT


0

keras LSTM中有一个功能reset_states(states)

但是,参数状态是两个状态的隐藏,即隐藏状态h和单元状态。

States = [h, c]

知道您是否应该初始化hc根据上述论文中的方法将很有趣。


0

这可能不是最有效的方法,但是可以使用将静态变量重复到时间序列长度tf.tile()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.