代码之家  ›  专栏  ›  技术社区  ›  cventr

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

  •  2
  • cventr  · 技术社区  · 6 年前

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

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

    到目前为止我拥有的

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

    该模型可以很好地检测到点异常,例如突然下降和峰值,但在节假日时就失效了。

    如果假日在一周内,我希望我的模型能检测到更多的异常,因为这是一个与正常工作日不同的日常模式。 但这些预测只是遵循了之前的观察结果。

    我的解决方案

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

    问题是

    这两个模型的组合允许我同时拥有两个异常,而且效果很好,但我的想法是只使用一个模型,因为我希望LSTM也能够“学习”每周模式。相反,它严格遵循之前的时间步骤,而没有考虑到这是一个工作时间,而且水平应该更高。 我试图向输入中添加外部变量(一天中的小时数、一周中的天数),以添加层和单元数,但情况并没有那么好。

    任何考虑都将不胜感激。 非常感谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   dedObed    6 年前

    关于您当前方法的说明

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

    关于你所做的事情

    1. 你没有给LSTM一个机会

      由于您只提供过去24小时的数据,LSTM不可能了解每周模式。 它最多可以了解到该值应该与24小时前的值相似(虽然这不太可能,请参见下一点),然后使用Fri-Sat和Sun-Mon数据将其打破。从LSTM的角度来看,你的假期“异常”与你在训练期间提供的周末数据几乎相同。

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

    2. 即使你给它一个机会,它也不会在乎

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

      因此,即使点处的损失值希望通过>7*96时间步为了了解您的每周模式,还有7*95个其他损失条款可能会防止LSTM偏离当前的局部最优值。

      因此 可能有帮助 在工作时间开始时对样品进行更多称重,以便相应的损失能够实际影响远古时期的表现。

    3. 你的解决方案是件好事

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

      如果您真的想在模型上了解所有内容,那么使用某种时间卷积的深度前馈架构可能会更成功,例如。 TDNNs ,则, Residual Memory Networks (免责声明:我是作者之一。),或者是最近的一种架构来统治他们, WaveNet 。由于它们跳过了较长时间上下文的连接,并在不同级别应用了不同的转换,因此它们有更好的机会发现和利用这种意外的长期依赖关系。

      GitHub上有Keras中WaveNet的实现,例如:。 1 2 .我没有和他们一起玩(实际上我很久以前就离开了Keras),但特别是第二个似乎很容易,因为 AtrousConvolution1D

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

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

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

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

      因此,可能您的数据实际上来自两个分布 因此,您应该培训两个模型 并酌情在它们之间切换?

      考虑到你告诉我们的,我实际上会选择这个(理论上有一个健全的系统)。你不能指望你的LSTM知道12月25日会有低值。或者有一个最后期限,而这个周末只包括工作时间。

    • 或者异常有两种定义?

      还有一个哲学观点。也许您个人会考虑两种不同类型的异常:

      奇怪的时间轨迹,意想不到的峰值,振荡,任何在你的领域中不寻常的东西。你的LSTM应该已经处理好了。

      然后,有不同的异常概念:特定时间间隔内的特定界限值。也许从时间到价值的简单线性回归/小MLP在这里就可以了?

    • 让NN完成所有工作

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

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

      这将允许您的模型告诉您何时对以下值非常严格,何时“任何”样本都可以。

      请注意,您可以进一步采用这种方法,并让您的NN生成“任何”合适的分布。E、 g.如果您的数据存在于一个有限的域中/可以合理地转换为一个有限的域,那么您可以尝试通过在输出上设置Softmax来在该空间上生成分类分布,就像WaveNet一样( https://arxiv.org/pdf/1609.03499.pdf ,第2.2节)。