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

时间:2018-05-06 11:37:21

标签: python lstm prediction rnn anomaly-detection

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

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

到目前为止我有什么

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

该模型可以很好地检测出点异常,例如突然下降和峰值,但例如在假期期间它会失败。

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

我的解决方案

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

问题

这两个模型的组合允许我同时具有两个异常并且它非常有效,但我的想法是仅使用一个模型,因为我期望LSTM能够“学习”每周模式。相反,它严格遵循前面的时间步骤,而不考虑它是一个工作小时,水平应该更高。 我试图在输入中添加外生变量(一天中的小时,一周中的一天),添加图层和细胞数量,但情况并没有那么好。

任何考虑都表示赞赏。 谢谢

1 个答案:

答案 0 :(得分:2)

关于您当前方法的说明

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

关于你做的事情

  1. 你没有给LSTM一个机会

    由于您仅提供过去24小时的数据,因此LSTM无法学习每周模式。 它最多可以知道该值应该与之前24小时相似(尽管不太可能,请参见下一点) - 然后用Fri-Sat和Sun-Mon数据打破它。从LSTM的角度来看,您的假期'异常'看起来与您在培训期间提供的周末数据非常相似。

    因此,您首先需要在学习期间提供更长的上下文(我假设您在测试期间启用了隐藏状态)。

  2. 即使你给了它机会,它也不会关心

    假设您的数据确实遵循一个简单的模式 - 在工作时间和仅在工作时间内的高值,加上一些较小规模的变化 - LSTM不需要任何长期知识来处理大多数数据点。考虑到我的所有人类想象力,我只能设想LSTM在工作时间开始时受益于长期依赖性,因此只需要96个中的一个或两个样本。

    因此,即使这些点的损失值希望通过>反向传播。 7 * 96时间步以了解您的每周模式,有7 * 95其他损失条款可能会阻止LSTM偏离当前的局部最优值。

    因此,可能会帮助在工作时间开始时对样本进行加权,以便相应的损失实际上可以影响远史的表示。

  3. 您的解决方案是一件好事

    在单个模型中很难对多个尺度的序列进行建模。即使你作为一个人,也需要缩小"判断更长的趋势 - 这就是为什么所有华尔街人都有月/周/日/小时/ ...图表来观看他们的股票'价格上涨。这种多尺度建模对于RNN来说尤其困难,因为它需要始终以相同的权重处理所有信息。

    如果您真的希望模型能够全面学习,那么使用某种时间卷积的深度前馈架构可能会取得更大的成功,例如。 TDNNsResidual Memory Networks(免责声明:我是其中一位作者。),或者最近的一种架构 - 规则 - 全部,WaveNet。由于它们在较长的时间上下文中跳过连接并在不同级别应用不同的转换,因此它们有更好的机会发现和利用这种意外的长期依赖。

    在Keras中存在WaveNet的实现,例如GitHub。 12。我没有和他们一起玩(我前段时间实际上离开了Keras),但尤其是。第二个似乎很容易,AtrousConvolution1D

    如果你想留在RNN,Clockwork RNN可能是适合你需要的模型。

  4. 关于您可能需要考虑的问题

    • 那么有两个数据分布吗?

      这个有点哲学。 您当前的方法表明您非常坚信有两种不同的设置:工作时间和其他设置。你可以根据它改变模型的一部分(高斯)。

      所以也许你的数据实际上来自两个发行版,而你应该训练两个模型并在适当的时候在它们之间切换?

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

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

      更多的哲学观点。也许你个人会考虑两种不同类型的异常现象:

      奇怪的时间轨迹,意外的峰值,振荡,以及您域中的任何异常情况。你的LSTM应该已经处理好了。

      然后,有不同的异常概念:在某些时间间隔内某些界限的价值。也许从时间到价值的简单线性回归/小MLP会在这里做到吗?

    • 让NN完成所有工作

      目前,您通过两个步骤有效地为数量分配建模:首先,LSTM提供平均值。其次,你提供方差。

      你可以改为让你的NN(连同2个仿射变换)通过产生其均值和方差直接为你提供完整的高斯;与Variational AutoEncoders(https://arxiv.org/pdf/1312.6114.pdf,附录C.2)非常相似。然后,您需要直接优化NN分布下的下一个样本的可能性,而不仅仅是样本和NN输出之间的MSE。

      这将允许您的模型告诉您何时对以下值非常严格以及何时"任何"样品会好的。

      请注意,您可以进一步采用这种方法让您的NN产生"任何"适合的分布。例如。如果您的数据存在于 - /可以明智地转换为有限的域,您可以尝试通过在输出上具有Softmax来在空间上产生分类分布,就像WaveNet一样(https://arxiv.org/pdf/1609.03499.pdf,第2.2节)