LSTM 在序列内事件预测中的最佳使用

机器算法验证 时间序列 深度学习 罕见事件 lstm 顺序模式挖掘
2022-03-21 02:31:02

假设以下一维序列:

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所描述的 Connectionist Temporal Classification 。

然而,在目前投入过多之前,我正在寻找更容易和更快的实验来感受 LSTM 在这里的适用性。Tensorflow 会在某个时候看到一个CTC 示例,但还没有。

所以我的(子)问题是:

  1. 鉴于上述问题,我想尝试 LSTM,是否值得尝试 char-rnn 类型的方法,我应该硬着头皮掌握 CTC,还是有更好的起点。
  2. 您将如何明确合并事件间时间信息。使用带有无操作事件的固定时钟显然有效,但看起来很难看。
  3. 假设我设法训练了 LSTM,有没有办法检查模型以查看它拾取了什么样的事件“主题”?(即,类似于卷积网络中的过滤器)

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

编辑:只是补充一点,序列中有一些噪音。有些事件可以安全地忽略,但哪些事件并不总是可以预先说清楚。因此,理想情况下,模型(以及从中派生的图案)对此具有鲁棒性。

2个回答

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

这些表示将是你的主题。

参考:

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

Srivastava, N.、Mansimov, E. 和 Salakhutdinov, R. (2015)。使用 LSTM 对视频表示进行无监督学习。arXiv 预印本 arXiv:1502.04681。

最重要的部分是你如何“表达”分类问题,这意味着你如何表示输入以及你想要输出什么。看到你有这么多不同的事件类型,你需要学习这些的嵌入。这可以直接在例如 Keras 中完成。你可以看到这个例子关于如何直接从数据中学习嵌入。另一种方法是使用无监督方法(例如 word2vec)预先学习嵌入。但是,这需要您做更多的工作,因为您需要提出相关任务并对其进行训练以生成嵌入。鉴于您有足够的数据,直接学习嵌入会更容易(尽管效率稍低)。对于输出,我不会预测所有不同类型的事件,而只会预测特殊事件和“背景类”来保持问题的可行性。如果您真的希望能够预测每个类,那么您需要使用一些技巧(看看 word2vec 是如何做到的)。

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

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