用于异常检测的递归神经网络

Recurrent Neural Network for anomaly detection

我正在实施一个异常检测系统,该系统将用于不同的时间序列(每 15 分钟一次观察,总共 5 个月)。所有这些时间序列都有一个共同的模式:工作时间高水平,否则低水平。

许多论文中提出的想法是:建立一个模型来预测未来值并根据残差计算异常分数。

我目前有什么

我使用 LSTM 来预测给定前 96(1 天的观察)的下一个时间步长,然后我计算异常分数作为残差来自残差上拟合的两个正态分布之一的可能性通过验证测试获得。我使用两种不同的分布,一种用于工作时间,一种用于非工作时间。

该模型可以很好地检测点异常,例如突然下降和高峰,但在节假日等情况下会失败。

如果一周中有假期,我希望我的模型能够检测到更多异常情况,因为这是正常工作日的不寻常日常模式。 但预测只是遵循先前的观察结果。

我的解决方案

使用第二个更轻量级的模型(基于时间序列分解),该模型由 daily 聚合而不是 15min 聚合来检测 daily异常。

问题

这两个模型的组合允许我同时拥有两个异常并且效果很好,但我的想法是只使用一个模型,因为我希望 LSTM 也能够 "learn" 每周模式。而是严格按照之前的时间步长,没有考虑到现在是工作时间,级别应该高很多。 我尝试在输入中添加外生变量(一天中的小时数、星期几),以添加层数和单元格数量,但情况并没有那么好。

如有任何考虑,我们将不胜感激。 谢谢

关于您当前方法的注释

使用 MSE 进行训练相当于在模型给出的具有固定方差和均值的高斯分布下优化数据的可能性。所以你已经在训练一个自动编码器,尽管你没有这样制定它。

关于你所做的事情

  1. 你不给 LSTM 机会

    由于您仅提供过去 24 小时的数据,因此 LSTM 不可能学习每周模式。 它最多可以了解到该值应该与 24 小时前的值相似(尽管这不太可能,请参见下一点)——然后您用周五-周六和周日-周一的数据打破它。从 LSTM 的角度来看,您的假期 'anomaly' 看起来与您在训练期间提供的周末数据几乎相同。

    所以你首先需要在学习过程中提供更长的上下文(我假设你在测试期间携带隐藏状态)。

  2. 就算你给了它机会,它也不在乎

    假设您的数据确实遵循一个简单的模式——在工作时间内且仅在工作时间内具有高价值,再加上一些较小规模的变化——对于大多数数据点,LSTM 不需要任何长期知识。发挥我所有的人类想象力,我只能设想 LSTM 在工作时间开始时从长期依赖中受益,所以只针对 96 个样本中的一两个。

    因此,即使这些点的损失值想要反向传播 > 7 * 96 个时间步来了解您的每周模式,还有 7*95 个其他损失项可能会阻止 LSTM 偏离当前局部最优。

    因此,可能有助于在工作时间开始时对样本进行更多加权,以便相应的损失实际上可以影响远期历史的表现。

  3. 你的解决方案是个好东西

    很难在单个模型中对多个尺度的序列进行建模。即使是你,作为一个人,也需要 "zoom out" 来判断长期趋势——这就是为什么所有华尔街人士都有 Month/Week/Day/Hour/... 图表来观察他们的股票价格。这种多尺度建模对于 RNN 来说尤其困难,因为它需要始终以相同的权重处理所有信息。

    如果您真的想让模型学习所有内容,那么使用某种时间卷积的深度前馈架构可能会取得更大的成功,例如。 TDNNs, Residual Memory Networks (Disclaimer: I'm one of the authors.), or the recent one-architecture-to-rule-them-all, WaveNet。由于它们在更长的时间上下文中跳过连接并在不同级别应用不同的转换,因此它们有更好的机会发现和利用这种意想不到的长期依赖性。

    GitHub 在 Keras 中有 WaveNet 的实现,例如1 or 2。我没有和他们一起玩(我实际上已经离开 Keras 一段时间了),但尤其是。第二个看起来很简单,AtrousConvolution1D.

    如果您想继续使用 RNN,Clockwork RNN 可能是满足您需求的模型。

关于您可能要考虑的问题

  • 那么是不是有两种数据分布?

    这个有点哲理。 您当前的方法表明您坚信存在两种不同的设置:工作时间和休息时间。您甚至可以根据它更改模型的一部分(高斯)。

    所以也许您的数据实际上来自两个分布,因此您应该训练两个模型并根据需要在它们之间切换?

    鉴于你告诉我们的,我实际上会选择这个(有一个理论上健全的系统)。你不能指望你的 LSTM 知道 12 月 25 日会有低值。或者有一个截止日期,这个周末纯粹是工作时间。

  • 或者异常有两种定义吗?

    多一个哲学观点。也许您个人认为有两种不同类型的异常:

    奇怪的时间轨迹、意想不到的峰值、振荡,任何在您的领域中不寻常的事情。你的 LSTM 应该已经处理了这些。

    然后,有不同的异常概念:特定时间间隔内特定界限的值。也许一个简单的线性回归/小的 MLP 不时地在这里做?

  • 让神经网络做所有的工作

    目前,您可以通过两个步骤有效地对数量分布进行建模:首先,LSTM 提供均值。其次,您提供方差。

    您可以改为让您的神经网络(连同额外的 2 个仿射变换)通过生成其均值和方差直接为您提供完整的高斯分布;很像变分自编码器(https://arxiv.org/pdf/1312.6114.pdf,附录 C.2)。然后,您需要直接优化 NN 分布下后续样本的可能性,而不仅仅是样本和 NN 输出之间的 MSE。

    这将允许您的模型告诉您何时对以下值非常严格以及何时 "any" 样本可以。

    请注意,您可以进一步采用这种方法,让您的神经网络生成 "any" 合适的分布。例如。如果你的数据实时 in-/can 被明智地转换到一个有限的域,你可以尝试通过在输出上使用 Softmax 在 space 上产生分类分布,就像 WaveNet 所做的那样(https://arxiv.org/pdf/1609.03499.pdf, 第 2.2 节).