充分利用LSTM进行序列内事件预测


9

假设以下一维序列:

A, B, C, Z, B, B, #, C, C, C, V, $, W, A, % ...

A, B, C, ..这里的字母代表“普通”事件。

#, $, %, ...这里的符号代表“特殊”事件

所有事件之间的时间间隔是不均匀的(从几秒到几天),尽管过去的事件越远,影响未来事件的可能性就越小。理想情况下,我可以明确考虑这些时间延迟。

大约有10000个普通事件类型,而有大约100个特殊事件类型。特殊事件之前的普通事件数量有所不同,但不太可能超过100-300。

从根本上讲,我对在普通事件序列中寻找最终可预测特殊事件的模式感兴趣。

现在,您可以用不同的方法来实现:创建特征向量+标准分类,关联规则学习,HMM等。

在这种情况下,我对于基于LSTM的网络最适合的情况感到好奇。直截了当就是做类似Karparthy的char-rnn的事情,并根据历史预测下一个事件。然后换一个新序列

C, Z, Q, V, V, ... , V, W

您可以在模型中运行它,然后查看最有可能发生的特殊事件。但这并不太合适。

由于这是一个时间分类问题,因此似乎应该做的正确的事情是使用Alex Graves所描述的连接主义时间分类。

但是,在此刻投入过多之前,我正在寻找更容易,更快捷的方法来进行试验,以了解LSTM在这里的适用性。Tensorflow将会在某个时候看到CTC示例,但尚未出现。

所以我的(子)问题是:

  1. 鉴于上述问题,我想尝试使用LSTM值得尝试char-rnn类型的方法,是我该硬着头皮掌握CTC,还是有一个更好的起点。
  2. 您将如何明确纳入事件间计时信息。使用带有无操作事件的固定时钟显然可以,但是很难看。
  3. 假设我设法训练了LSTM,是否可以检查模型以查看其发生了哪种事件“主题”?(即类似于卷积网络中的过滤器)

任何示例代码(首选python)总是有帮助的。

编辑:只是要补充一下,序列中有一些噪音。有些事件可以安全地忽略,但是确切地说哪些事件并非总是可以预先说出来的。因此,理想情况下,模型(及其衍生的主题)对此具有鲁棒性。


这是什么样的数据集?
pir

@felbo:很遗憾,我不能明确地说,但是它的数据来自硬件,而不是财务/销售/广告/ ..
dgorissen

好。实际上,如果您有约1万个事件类型,那么一键编码(在我的回答中)可能会出现问题。您也许可以按照word2vec的方式执行某些操作,因此您只有约300个输入维度。同样,从1万个选项中预测下一个事件类型可能也会有问题。取而代之的是,重新组织问题以仅预测100个特殊类型,然后预测所有10k个正常事件的“正常事件”类将是有意义的。
pir 2015年

只是要清楚一点:我假设您有大量数据可以解决此类问题。
pir 2015年

@felbo:的确如此。曾经想过只使用索引,学习像word2vec这样的矢量嵌入,或者将事件分组到类中以降低维数。预测方面也是如此。
dgorissen

Answers:


4

您的数据似乎只是令牌序列。尝试构建一个LSTM自动编码器,让编码器学习序列第一部分的一些固定表示,然后让解码器预测剩余的内容。

这些表示将是您的主题。

参考:

Bahdanau,D.,Cho,K.和Bengio,Y.(2014年)。通过共同学习对齐和翻译神经机器翻译。arXiv预印本arXiv:1409.0473。

Srivastava,N.,Mansimov,E.,&Salakhutdinov,R.(2015年)。使用LSTM无监督学习视频表示形式。arXiv预印本arXiv:1502.04681。


1

最重要的部分是如何“解决”分类问题,即如何表示输入和要输出的内容。既然您有许多不同的事件类型,则需要学习这些事件的嵌入。这可以直接在例如Keras中完成。你可以看到这个例子关于如何直接从数据中学习嵌入的信息。另一种方法是使用诸如word2vec之类的无监督方法事先学习嵌入。但是,这需要您做更多的工作,因为您需要提出一个相关的任务并对其进行培训以生成嵌入。鉴于您有足够的数据,直接学习嵌入会更容易(尽管效果稍差)。对于输出,我不会预测所有不同类型的事件,而只能预测特殊事件和“背景类”以使问题可行。如果您真的希望能够预测每个类,那么您需要使用一些技巧(研究word2vec的工作方式)。

关于事件之间的时间。您可以简单地将其作为附加维度添加到LSTM中(例如,有关在Keras中执行此操作的示例,请参见此示例)。这将很容易做到,并且将允许LSTM考虑时间差异。

我不知道通过“展开”网络的时间性质来形象化图案的任何方法。您可能可以使用生成网络生成一些图案,但是可能很难解释。探索主题的一种方法可能是简单地找到前100000个最常见的非特殊事件序列,例如长度20-100,将它们输入训练后的模型中,并从最终softmax层中提取概率输出。这样,您可以找到与某些特殊事件相关的序列。但是,如果不查看数据,很难说出这种主题方法是否可行/有用。


只是要清楚。在主题方面,您的意思是查看原始数据并提取特定最小长度的最常见子序列(或使用频繁的项目集挖掘来生成它们),然后查看特殊事件预测在哪里最大?在那种情况下,将其作为标准分类问题似乎更容易些,不是吗?
dgorissen

我希望循环模型的时间依赖性可以允许某种有用的检查。另外,也许要做的就是将模型反向运行。最大限度地提高每种特殊事件类型的预测置信度,并查看导致哪种序列。但是,不太确定这将如何工作,可能还需要生成模型。
dgorissen

1
请查看我更新的答案。是的,我的意思是根据原始数据查看“特殊事件预测的最大值”。我不明白您将其作为标准分类问题的意思是什么:)
pir
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.