基于深度学习的日志数据异常检测

举报
王清欢 发表于 2022/04/22 16:43:05 2022/04/22
【摘要】 数据对象智能运维(AIOps)是通过机器学习等算法分析来自于多种运维工具和设备的大规模数据。智能运维的分析数据对象多源运维数据包括系统运行时数据和历史记录数据,历史记录数据主要包含表单和系统更新文档等。与历史记录数据相比,系统运行时数据能够反映系统的动态特征及系统发生故障时的上下文信息,对未知故障具有更好的探测和表达能力。系统运行时数据主要包含监控数据和日志数据,监控数据记录的是指系统运行状...

数据对象

智能运维(AIOps)是通过机器学习等算法分析来自于多种运维工具和设备的大规模数据。智能运维的分析数据对象多源运维数据包括系统运行时数据和历史记录数据,历史记录数据主要包含表单和系统更新文档等。与历史记录数据相比,系统运行时数据能够反映系统的动态特征及系统发生故障时的上下文信息,对未知故障具有更好的探测和表达能力。

系统运行时数据主要包含监控数据和日志数据,监控数据记录的是指系统运行状态下的资源占用情况,如中央处理器使用率、内存使用率、网络流量、进程数目以及进程资源使用率等;日志数据是程序开发人员为辅助调试在程序中嵌入的打印输出代码所产生的文本数据,用以记录程序运行时的变量信息、程序执行状态等。监控数据关注系统状态和粗粒度的应用状态,如进程状态、服务状态等;而日志数据关注细粒度的应用状态和跨组件的程序执行逻辑,能够定位到特定的日志及事件信息,同时能够定位异常请求实例即分布式跨组件的日志输出序列可以在一定程度上反映该请求的执行轨迹,因此日志数据更加适用于故障诊断任务。

典型的分布式软件系统日志包括两类:事务型日志和操作型日志。事务型日志表征请求或事务执行逻辑,操作型日志表征诸如心跳、消息分派等独立事件。事务型日志之间一般存在明显因果关联关系,例如云平台中云控制器通过日志记录查找容器、解析参数以及报告请求执行状态等请求执行步骤。操作型日志之间一般是相互独立的,每一条日志代表一个独立事件,例如负责协调应用程序并跟踪程序状态的监控组件通过日志接收和保存来自其他组件的心跳。

基于日志数据的故障诊断过程

软件系统的故障诊断目的是在系统行为异常阶段,检测系统表征的异常信息,预测未来可能发生的故障,分析引发故障的根因。根因、异常和故障三个阶段之间具有时序和因果关系,已经出现的故障根因导致了系统现在的异常行为,进而在未来可能引发系统故障,其关系示意图如下所示:

基于日志数据的故障诊断过程一般以下四种关键技术,分别是日志处理与特征提取、基于日志数据的异常检 测、基于日志数据的故障预测和基于日志数据的根因分析。

日志处理与特征提取日志是程序开发人员在软件系统开发过程中为了记录系统运行状态和特殊事件而打印的文本信息,具有半结构化的特征。另外,现代软件系统的日志具有两种显著分别是大规模异构性,集群式的系统中日志规模巨大,同时由于各个组件设计各异使得其日志记录的风格和质量都有很大差异。因此,为降低日志数据的复杂性,消除大量噪音并有效提取特征,日志处理与特征提取技术利用机器学习、模式识别、统计分析、自然语言处理等方法,分析和挖掘日志数据特征信息,得到日志模板特征向量为异常检测、故障预测和根因分析提供数据基础。

基于日志数据的异常检测即在系统日志数据中发现不符合预估行为的异常模式,其输出通常是日志片段是否属于异常的标签或日志片段包含系统异常信息的概率,评测指标通常包括精确率(precision)、召回率(recall)和综合评价指标F值(F-measure)。

基于日志数据的故障预测即通过当前日志数据预测在不远的将来是否会发生系统故障。其输出通常是系统未来是否会出现故障的标签或出现故障的概率,评测指标通常包括精确率、召回率、综合评价指标F 值和前置时间(lead-time)。

基于日志数据的根因分析即通过日志数据诊断与系统故障相关的根因信息,如故障类型、故障位置、故障请求、故障代码片段等。故障根因诊断技术的输出即为多种类型的故障根因信息,评测指标通常包括精确率(precision)、召回率(recall)和综合评价指标F值(F-measure)。

日志处理与特征提取

日志处理与特征提取主要有日志模板挖掘技术和日志特征提取技术两种,用以从降低日志文本的异构复杂性、从海量日志中提取有价值的信息。日志模板挖掘关注于日志中的常量部分,日志特征提取则关注于日志中的变量部分或其他特征。日志模板挖掘技术可以划分为基于静态代码分析、基于频繁项集挖掘和基于聚类的日志模板挖掘技术;日志特征提取技术可以划分为基于自然语言处理的日志特征提取技术、基于规则的结构化日志信息提取技术和基于统计模型的日志特征提取技术,如下图所示:

Spell 基于最长公共子串的日志解析方法

01 文献来源

Du M , Li F . Spell: Online Streaming Parsing of Large Unstructured System Logs[J]. IEEE Transactions on Knowledge and Data Engineering, 2018, PP:1-1.

02 文献目标

  • 将非结构化系统日志解析为结构化数据:已经有很多研究在解决这一问题,例如,使用正则表达式,基于源代码,或者使用数据挖掘方法如聚类和迭代分区等。然而,这些方法大都需要有特定领域的知识北京,因此,不适用于组成复杂的系统日志解析。

  • 采用在线流处理的方式进行日志解析:目前的在线处理实现是先进行大量的离线处理,然后才通过离线批处理过程将日志条目与首先识别的数据结构和模式进行匹配,显然这种方法效率较低。

03 文献贡献

  • 提出了基于LCS(最长公共子序列)的日志解析方法:Spell是一种基于LCS的在线流处理日志解析方法,用于事件日志的结构化流式解析,实现了动态接受日志输入,实时处理输入,不断生成新的日志模板。

  • 实验证明Spell日志解析方法的有效性:使用三种最先进的方法自动从原始日志文件中提取消息类型和参数作为竞争基准,实验表明,与最先进的方法相比,Spell在效率和有效性方面都优于它们。

04 主要算法

基于LCS的流式日志解析方法的关键在于维护一个存储日志键和其他信息的数据结构LCSMap。LCSMap中表示每一个具体日志键内容的数据结构LCSObject包含两部分内容,一部分是已解析的LCS序列LCSseq,另一部分是记录参数位置列表的paramPos。在维护过程中,当有新的日志记录到达时,首先进行预过滤搜索前缀树中现有日志键;如果未发现匹配的日志键,进一步在倒排索引中查找匹配的日志键;最后,如果仍未找到匹配的日志键,使用简单的循环遍历方法将其与LCSMap中保存的所有日志键进行比较,并相应地更新LCSMap;如果遍历之后仍然无匹配日志键,则计算并创建一个新的LCSObject保存该日志键并插入到LCSMap中。在LCSMap的维护中可能出现日志键元素被错判断为参数和参数数量过多时参数被错判断为日志键元素的情况,这两种情况在本方法中通过定期应用拆分和合并过程以清理当前已解析的日志键。该算法具体流程如下图所示:

一个使用最长公共子序列提取日志键的示例如下图所示:


Drain 基于固定深度树的日志解析方法

01 文献来源

He P , Zhu J , Zheng Z , et al. Drain: An Online Log Parsing Approach with Fixed Depth Tree[C]// 2017 IEEE International Conference on Web Services (ICWS). IEEE, 2017.

02 文献目标

  • 系统日志数据规模扩大:一个大型服务系统每小时产生的日志数据量可以达到50GB,这让日志解析任务难以使用人工有效完成。

  • 系统日志数据多样性增加:随着开源平台和Web服务的流行,一个系统通常由许多不同开发人员编写的组件组成,则使得传统的依赖正则表达式进行日志解析的方式变得更加困难。

  • 日志语句高频率地更新:现代计算系统中,计算任务变得越来越复杂且多变,这使得多种多样的组件产生日志消息的日志语句也在频繁地更新,这让日志解析变得更加困难。

  • 在线日志解析器还存在效率与精确的缺陷:大多数现有的日志解析器都侧重于脱机、批处理,这种方法显然很低效无法及时获取日志反应的消息。当下也有一些在线日志解析器,它们不需要离线训练步骤采用流式的日志解析方式,但是它们任然存在不够精确和高效的问题。

03 文献贡献

  • 基于固定深度树的在线日志解析方法Drain:该方法能够以流的方式准确、高效的解析原始日志信息。可以从原始日志消息中自动提取日志模板,并将其分割为互不关联的日志组。使用一个具有固定深度的解析数来指导日志组搜索过程,这有效地避免了构造一个非常深且不平衡的数。另外,专门设计的解析规则被压缩编码在解析树节点中。

  • 实验证明了Drain方法的有效性:在五个真实世界的测试数据集上进行了广泛的实验,验证了Drain方法在准确性和效率方面的优势。

  • 公布了源码:https://appsrv.cse.cuhk.edu.hk/~pjhe/Drain.py

04 主要算法

日志解析的目标是将原始日志消息转换为结构化的日志消息。具体来说,原始日志消息是非结构化数据,包括时间戳和原始消息内容等。在解析过程中,解析器区分每个原始日志消息的常量部分和变量部分,常量部分是描述系统操作模板的令牌;而变量部分是其余的标记的动态运行是系统信息。典型的结构化日志消息包含匹配的日志事件和感兴趣的字段。

Drain是一种基于固定深度树的在线日志解析方法。当一个新的原始日志消息到达时,Drain将根据领域知识通过简单的正则表达式对其进行预处理。然后搜索一个日志组,即为通过遵循编码在数内部节点中的特殊设计的规则,树的叶子节点。如果找到合适的日志组,日志消息将与存储在该日志组的日志事件匹配。否则,将根据日志消息创建一个新的日志组。

基于日志数据的异常检测

基于日志数据异常检测的目的是在线地对系统进行日志收集与分析,在系统日志中找到不符合预估行为的模式。其主要思路是从系统正常运行的日志数据中学习“健康”状态模型,故障探测过程通过寻找是否有与“健康”状态模型冲突的在线数据。由于日志数据与分布式软件系统的复杂性,基于日志数据的异常检测面临两个关键性挑战。

  1. 日志数据中的异常表征复杂多样,难以有效捕获。日志数据中的异常可能包含分布异常、序列异常、变量异常等,如何构造有效的异常检测模型以捕获复杂的异常成为一个技术上的挑战。

  2. 从海量日志数据中精准发现少量异常是一个难点。日志数量庞大,异常表征往往会隐藏在海量日志中,如何构造高效的异常检模型快速过滤海量日志并发现其中的异常成为一个技术上的挑战。

现有的基于日志数据的异常检测方法主要分为3 类,分别是基于图模型的异常检测、基于概率分析的异常检测和基于机器学习的异常检测。基于图模型的异常检测对日志的序列关系、关联关系以及日志文本内容进行建模;基于概率统计的异常检测采用关联分析、对比等,计算日志与异常的关联概率;基于机器学习的异常检测采用聚类算法找到离群值或分类算法学习故障时的日志模式,判断在线日志数据是否符合这些日志模式。

基于LSTM的日志数据异常检测

主机系统运行过程中会产生各种各样的日志,日志记录了计算机运行时的状态和系统执行的各种操作,是在线监视和异常检测的良好信息来源,因此对系统日志的审计可以作为主机异常检测的重要手段。市场早已经存在各种各样的安全审计系统,比如日志审计系统、入侵检测系统(intrusion detection system,IDS)等,这些系统可以实现日志的采集、审计和异常行为挖掘的功能。但是在实际使用中,由于日志的差异和日志审计手段的单一落后,这些系统往往只适用于特定类型的主机,且能检测到的异常行为不够全面和准确。

近年来,随着机器学习的发展,数据挖掘能力进一步提升,基于机器学习进日志审计的研究成果不断出现。但是对于不同的主机系统和进程,其产生的日志类型是不一致的,传统机器学习检测方法需要对不同类型的日志使用不同的特征提取方法,需要使用者有专业的知识背景才能更好的抽取日志的特征信息。在现实情况中日志的种类和语法是在不断更新的,某一种方法无法直接应用于多个系统,需要花费大量人力成本来做更新和匹配。相对比较高级的就是使用深度学习来做异常检测。系统日志的数据量越来越大已经足够深度学习模型进行学习处理,在参数合适的情况下,几乎不需要人工提取特征,深度学习模型就能很好的完成日志检测。下面主要讨论如何利用LSTM模型来实现日志的异常检测。

DeepLog 基于LSTM深度模型的系统日志异常检测

01 文献来源

Du M , Li F , Zheng G , et al. DeepLog: Anomaly Detection and Diagnosis from System Logs through Deep Learning[C]// Acm Sigsac Conference on Computer & Communications Security. ACM, 2017.

02 文献目标

  • 非结构化的系统日志:系统日志格式和语义在不同系统之间有很大差异,一些现有的方法使用基于规则的方法来解决这个问题,但是规则的设计依赖于领域知识,例如工业界常用的正则表达式。 更重要的是,基于规则的方法对于通用异常检测来说并不适用,因为我们几乎不可能预先知道不同类型日志中的关注点是什么。

  • 时效性:为了用户能够及时的发现系统出现的异常,异常检测必须要及时,日志数据以数据流的形式输入,意味着需要对整个日志数据做分析的方法不适用。

  • 异常种类多样性:系统和应用程序可能会产生多种类型的异常。异常检测系统应该不仅针对于特定的异常类型,还能检测未知的异常。同时,日志消息中也包含了丰富的信息,比如log key、参数值、时间戳等。大多数现有的异常检测方法仅仅分析了日志消息的特定部分(比如log key),这限制了它们能检测到的异常类型。

  • 并发:基于执行路径的异常检测是依据单个任务产生的日志记录来实现的,而计算系统的并发将使得并发的线程在同一时刻产生多条日志记录,这使得基于执行路径的异常检测变得复杂。

03 文献贡献

使用LSTM神经网络设计DeepLog框架:DeepLog不仅在日志条目中使用日志键,还使用度量值进行异常检测,因此,它能够捕获不同类型的异常。 DeepLog仅取决于小的训练数据集,该数据集由一系列“正常日志条目”组成。 在训练阶段之后,DeepLog可以识别正常的日志序列,并可以以流方式用于对传入日志条目进行在线异常检测。

04 总体架构

DeepLog的总体架构如下图所示,分为训练和检测两个阶段。在训练阶段,大量的系统日志数据被日志解析器解析为日志键和一个参数值向量的组合;然后使用这些日志键序列来训练一个日志键异常检测模型,并构建用于诊断目标系统执行工作流模型。对于不用的日志键,用它们的参数值向量训练一个参数值异常检测模型来检测有这些参数值反映的系统性能异常。在检测阶段,当一个新的日志记录到达时,它也被日志解析器解析为一个日志键和一个参数值向量的组合,然后使用对应内容经过对应异常检测模型进行检测,如果任一检测模型检测结果为异常,则将其标记为异常日志记录。


Multimodal LSTM 基于系统跟踪数据的多模态深度学习的异常检测

01 文献来源

Nedelkoski, Sasho, Jorge Cardoso, and Odej Kao. "Anomaly detection from system tracing data using multimodal deep learning." 2019 IEEE 12th International Conference on Cloud Computing (CLOUD). IEEE, 2019.

02 文献目标

当前最先进的使用日志数据进行异常检测的系统将正常的系统行为建模为单一的数据类型,即文本日志关键字或真实值的性能参数。通常,他们对这两种类型的数据使用单独的模型,并建立一个集合来生成最终的预测。但是,这种加性模型没有利用数据源之间的现有相关性,仅仅从部分能够反映系统整体性能的数据中了解正常的系统行为。在系统操作执行期间收集的跟踪数据包括不同相关服务调用生成的存在因果关系的日志记录等信息和实值数据形式的服务响应时间两种形式,而利用这种多模态数据融合表示系统行为能够更好的反映系统状态,为此这篇文章研究从连续多模态数据中进行无监督异常检测的方法。

03 文献贡献

这篇文章使用LSTM神经网络和来自分布式跟踪技术的数据来解决云基础设施中的异常检测。首先,提出了一中针对时间序列学习的LSTM深度学习模型,使用单一模态、序列文本数据来模拟跟踪中服务之间的因果关系。以此为基础,扩展单模态体系结构,构建多模态体系结构利用多模态跟踪数据作为事件文本记录和实值序列的组合,该多模态方法不仅可以用于建模正常的系统行为,还可以用于检测异常,不仅考虑了服务的因果关系,还考虑了它们在跟踪中的响应时间。此外,该文章还使用该模型来重构执行路径,从而到达检测相关任务和并行任务的目的。最后,该文通过对真实生产云数据的详尽实验,验证了多模态LSTM达到了最佳的整体准确率优于基线。

04 总体架构

如下图所示,介绍的是事件文本记录数据(结构异常检测,Structural Anomaly Detection,SAD)和响应时间实值数据(响应时间异常检测,Response Time Anomaly Detection,RTAD)两种数据类型的单模态异常检测架构。模型的输入是相关服务的按时间戳事件文本记录序列,或对应服务调用的响应事件。输出是针对当前输入序列推测下一时间点发生事件或响应时间的的概率分布。检测阶段使用该模型进行预测,并将预测输出与观察到的标签值进行比较,从一系列标签中检测异常使得能够在执行期间捕获错误以及检测意外的执行路径。

基于上述两种单模态体系结构,对其进行水平拼接提出多模态LSTM体系结构。该模型的输入包含事件文本记录数据和响应时间实值数据两种数据模式。从架构的自下而上的角度来看,该模型为每个输入设置一个带有LSTM块的层,并在第二个隐藏层中执行连接,出了这一选择外,拼接可以在交叉验证选择的任何隐藏层中进行。这两种模式的合并是通过将来自第一层的LSTM输出在相同时间上被合并并转发到下一个LSTM层的相同时间步长中完成。如下图所示,颜色编码方案表示串联的对,从级联层开始,信息被联合编码并在模态之间流动,根据这种联合表示,多对多神经网络学习到输出的映射。


基于全链路追踪技术的异常检测

微服务架构被广泛应用与大规模的Web服务,策略独立的服务模块,使得服务更新和部署更加便利,但是各种各样微服务之间的复杂关系和巨大的微服务规模使得保证服务提供的可靠性更加困难。为了保证微服务架构的可靠性,需要准确高效的故障排除,而调用轨迹异常检测是该过程的重要环节。管理人员通过检测到的异常调用轨迹对故障根因进行分析和定位。

当下工业界还是以微服务调用和运行状态代码为基础,人工制定复杂的规则来检测异常的调用轨迹。对于规模越来越大、复杂度越来越高的微服务架构,这种方式显然是十分低效甚至是不可行的,为此,以全链路追踪技术为基础,设计算法可以自动化地学习复杂调用轨迹模式,并以此来识别异常调用轨迹。

分布式服务的跟踪系统需要记录在一次特定的请求后系统中完成的所有工作的信息。如下图所示展现的是一个和5台服务器相关的一个服务,包括:前端(A),两个中间层(B和C),以及两个后端(D和E)。当一个用户发起一个请求时,首先到达前端,然后发送两个RPC到服务器B和C。B会马上做出反应,但是C需要和后端的D和E交互之后再返还给A,由A来响应最初的请求。对于这样一个请求,简单实用的分布式跟踪的实现,就是为服务器上每一次你发送和接收动作来收集跟踪标识符(message identifiers)和时间戳(timestamped events)。

Dapper 大规模分布式系统的跟踪系统

01 文献来源

Sigelman, Benjamin H., et al. "Dapper, a large-scale distributed systems tracing infrastructure." (2010).

02 文献目标

Dapper的两点主要要求是:无所不在的部署,持续的监控。无所不在的重要性不言而喻,因为在使用跟踪系统的进行监控时,即便只有一小部分没被监控到,那么人们对这个系统是不是值得信任都会产生巨大的质疑。另外,监控应该是7x24小时的,毕竟,系统异常或是那些重要的系统行为有可能出现过一次,就很难甚至不太可能重现。那么,根据这两个明确的需求,Dapper的三个具体设计目标如下:

  • 低消耗:跟踪系统对在线服务的影响应该做到足够小。在一些高度优化过的服务,即使一点点损耗也会很容易察觉到,而且有可能迫使在线服务的部署团队不得不将跟踪系统关停。

  • 应用级的透明:对于应用的程序员来说,是不需要知道有跟踪系统这回事的。如果一个跟踪系统想生效,就必须需要依赖应用的开发者主动配合,那么这个跟踪系统也太脆弱了,往往由于跟踪系统在应用中植入代码的bug或疏忽导致应用出问题,这样才是无法满足对跟踪系统“无所不在的部署”这个需求。面对当下想Google这样的快节奏的开发环境来说,尤其重要。

  • 延展性:Google至少在未来几年的服务和集群的规模,监控系统都应该能完全把控住。

03 文献贡献

相较于研究型的Pinpoint、Magpie和X-Trace,Google提出的Dapper已经在大规模生产环境中摸爬滚打了多年,经过这么多生产环境的验证之后,这篇论文重点阐述在部署Dapper的过程中的设计思想,以及最有效的使用方式。Dappe作为一个平台,承载基于Dapper开发的性能分析工具,以及Dapper自身的监测工具,它的价值在于可以在回顾评估中找出一些意想不到的结果。

在分布式跟踪这个领域中,Dapper的实现包含了许多新的贡献。例如,为了实现实现低损耗,特别是在高度优化的而且趋于极端延迟敏感的Web服务中,合理的采样率是很必要的。Dapper的另一个重要的特征,是能实现应用级透明,该的组件对应用的侵入被先限制在足够低的水平上,即使想Google网页搜索这么大规模的分布式系统,也可以直接进行跟踪而无需加入额外的标注(Annotation)。

04 总体架构

Dapper设计的主要思想在于对基础RPC、线程控制和流程控制的通用组件库的值入,其中包括span的创建、采样率的设置,以及日志写入本地磁盘,以此来实现跟踪系统的低消耗和应用级透明。

Dapper使用以span为基本树节点的跟踪树构建跟踪模型,如下图所示,Dapper 为每个 span 记录了一个可读的span namespan idparent id,这样就能重建出一次分布式跟踪过程中不同 span 之间的关系。没有parent id 的 span被称为 根span。一次特定跟踪的所有相关 span 会共享同一个通用的trace id 。在一个典型的 Dapper 跟踪中,期望是每个 RPC 对应一个 span,每一个组件层对应跟踪树上的一个层级。

Dapper通过在部分通用库中进行性能测量埋点,实现应用级透明路径跟踪。(a)当一个线程处理被跟踪的控制路径时,Dapper 会把一个跟踪上下文存储到Thread Local中;跟踪上下文是一个小而容易复制的容器,里面包含了 trace id 和 span id 等 span属性。(b)当计算过程是延迟调用或异步执行时,开发者一般会使用一个通用的控制流程库来构造回调函数,并用线程池或其他 executor 来执行回调;Dapper 确保所有的回调都会存储其创建者的跟踪上下文,而当执行回调时这个跟踪上下文会关联到合适的线程上,通过这种方式,Dapper 用于重建跟踪的 ID 也能透明地用于异步控制流程。(c)Dapper 的跟踪数据是语言无关的,生产环境中的许多跟踪结合了 C++ 和 Java 进程中的数据。

Dapper 的一个关键设计目标是低损耗,Dapper跟踪系统的成本由两部分组成,一是正在被监控的系统在生成追踪和收集追踪数据的消耗导致系统性能下降;二是需要使用一部分资源来存储和分析跟踪数据。Dapper主要针对采样率进行优化,以实现低损耗,包含适应性采样应对激进采用收集过程中的额外采样三种采样策略。

最后,介绍以下Dapper的跟踪收集过程,如下图所示,Dapper 的跟踪记录和收集管道分为三个阶段。首先,把 span 数据写入(1)到本地日志文件。然后 Dapper 守护进程从所有生产主机中将他们拉取出来(2),最终写入(3) 到 Dapper 的 Bigtable 仓库中。Bigtable 中的行表示一次跟踪,列表示一个 span。Bigtable 对稀疏表格布局的支持正适合这种情况,因为每个跟踪都可能有任意多个 span。跟踪数据收集即将应用程序二进制数据传输到中央仓库,其延迟中位数小于 15 秒。98 分位延迟呈现双峰形;大约 75% 时间里,98 分位延迟小于 2 分钟,但是在另外 25% 时间里可能会涨到几小时。


TraceAnomaly 基于深度学习的调用轨迹异常检测算法

01 文献来源

Liu, Ping, et al. "Unsupervised Detection of Microservice Trace Anomalies through Service-Level Deep Bayesian Networks." 2020 IEEE 31st International Symposium on Software Reliability Engineering (ISSRE). IEEE, 2020.

02 文献目标

  • 以可解释的方式统一跟踪的响应时间和调用轨迹:

    • 由于微服务架构的复杂关系,没有异常的微服务调用也可能出现不同的响应时间,因为其响应时间不仅取决于其自身和其处于的调用轨迹也存在着重要关联。

    • 异常和正常的调用轨迹可能具有一致的调用结构,而响应时间是可能区分他们的唯一方式。

    • 检测到异常调用轨迹后要进行故障根因分析,若以现有的故障根因匹配存在一定的局限性,那就是当出现无法匹配的根因时无法正确定位故障根因,这时具有解释性的响应时间和调用轨迹将可以帮助管理人员分析根因。

  • 设计一种健壮的无监督调用轨迹特征学习体系结构:

    • 对于包含许多微服务的单个服务,可能有数百条单独的调用轨迹,因此需要根据其调用轨迹来学习数百个响应时间分配。 针对如此复杂的情况,需要一个大容量的学习模型。

    • 由于无法在如此复杂的上下文中使用大量数据来获取异常标签,因此需要使用无监督学习算法。

03 文献贡献

  • 提出了一种服务调用轨迹特征构造方法STV:该方法可以有效地对跟踪的响应时间信息和调用路径信息进行编码,并可以在服务级别进行有效学习,在跟踪级别进行准确的异常检测,并在微服务级别进行有效的定位。

  • 提出了一种针对调用轨迹异常检测的无监督学习方法TraceAnomaly:该方法以深度贝叶斯网络为基础,添加后流(posterior flows)可以使用非线性映射来增加贝叶斯网络中潜在变量的复杂度,从而允许模型以健壮,准确和无监督的方式捕获复杂调用轨迹模式。

  • 使用TrainTicket详细测试了本文提出微服务调用轨迹异常检测方法的有效性。

  • STV为基础提出了一种故障根因定位算法。

04 总体架构

TraceAnomaly通过周期性的线下训练去自动地学习调用轨迹的正常模式。在线上异常检测的时候,基于学习到的正常模式计算新的调用轨迹的异常分数。如果分数过小,则新的调用轨迹被判定为异常调用轨迹。TraceAnomaly通过基于后验流的深度贝叶斯网络设计,实现了非监督的针对Web服务调用轨迹的异常检测。如下图所示,TraceAnomaly的深度贝叶斯网络的结构,非监督学习是通过左边的编码网络和右边的解码网络实现的,其中,路径向量x表示被编码成向量的调用轨迹。编码网络的作用是将调用轨迹的模式信息编码进神经网络中,而解码网络的作用是用编码进神经网络中的信息重建输入的调用轨迹模式。这样通过编码网络和解码网络的不断迭代学习,重建出的调用轨迹模式的精度不断提升,最终,TraceAnomaly通过这种非监督的方式学习到了调用轨迹中的模式。

该深度学习算法模型分为离线训练阶段和在线检测两个阶段如下图所示。离线训练阶段,服务的调用轨迹被编码为服务轨迹向量STV,然后被喂入到深度贝叶斯网络进行训练并获得异常检测模型,为了适应潜在的服务升级,将定期对模型进行重新训练。在线检测阶段,新到的调用轨迹先被编码为服务轨迹向量STV,如果存在不可见的调用路径则视为异常,如果不存在则使用训练好的异常检测模型进行检测并计算一个异常值,当该异常值小于一定阈值时,则视该调用轨迹为异常,最后使用根因定位算法分析该异常调用轨迹的故障根因。


基于对抗网络GAN的异常检测

与传统的分类方法不同,GAN训练的鉴别器在无监督的方式下学习辨别真伪,使GAN成为异常检测的一种有吸引力的无监督机器学习技术。此外,GAN框架还产生了一个生成器,它实际上是目标系统的一个不明确模型,能够从一定的潜在空间输出正常样本。灵感来自更新从实时空间映射到某个潜在的空间来提高发电机和鉴频器的训练,研究人员最近提议培养潜在的空间可以理解GAN和无监督学习应用它的丰富的特性表征任意的数据分布。通过从潜在空间重构测试样本识别异常的可能性,应用基于GAN的异常检测策略来发现图像的意外标记,以此为启发,可以利用GAN训练过的发生器和鉴别器来更好地检测基于残差和鉴别损失的异常。

MAD-GAN 基于生成对抗网络的时间序列数据多变量异常检测

01 文献来源

Li, Dan, et al. "Anomaly detection with generative adversarial networks for multivariate time series." arXiv preprint arXiv:1809.04758 (2018).

Li, Dan, et al. "Multivariate anomaly detection for time series data with generative adversarial networks." arXiv preprint arXiv:1901.04997 (2019).

02 文献目标

Cyber-Physical Systems(CPSs)是为关键任务设计的相互连接的物理网络系统。一些CPSs的例子是水处理和分配工厂、天然气分配系统、炼油厂、发电厂、电网和自动驾驶汽车。物联网(IoT)的出现将进一步推动CPSs在各种任务中的扩散,导致许多系统和设备在网络上自动通信和操作,因此,网络攻击是CPSs最关注的潜在威胁之一。

为了解决现代物联网络日益动态和复杂的特性,导致传感器生成的多变量时间序列复杂难以分析,人们利用监督和非监督机器学习技术,从大数据中开发更智能和自适应的方法,以识别异常或入侵。但是,即使使用机器学习技术,检测时间序列中的异常仍然具有挑战性,大多数受监督的技术需要足够多的可靠正常数据和标记异常类来学习,但在实践中很少出现这种情况,因为异常通常很少见。另外,现有的无监督方法大多是通过线性投影和变换建立的,但复杂CPSs多变量时间序列隐藏的内在相关性往往存在非线性,目前的大多数技术还只是将当前状态与预测的正常范围进行简单的比较,由于控制范围不够灵活,不能有效地识别间接攻击,无法进行异常检测。

03 文献贡献

  • 针对传感器和执行器网络化的复杂多进程网络物理系统,提出了一种基于GAN的无监督异常检测方法

  • 用多变量时间序列训练GAN模型,采用长短期递归神经网络LSTM-RNN捕捉时间依赖性,将一般应用于图像生成域的GAN适应于时间序列生成

  • 统一使用高维的正规序列训练GAN模型辨别真伪,同时从特定的潜在空间重构测试序列

  • 损失计算的训练有素的鉴别器和重建之间的剩余损失和实际测试序列,使用两个训练有素的鉴别器和生成器,组合在一起来检测在高维时间序列异常点,并显示该方法在一个复杂的网络攻击安全水处理系统中异常检测上优于现有方法

04 总体架构

为了处理时间序列数据,如下图所示本文使用LSTM-RNN神经网络构造GAN的发生器G和鉴别器D。遵循典型的GAN框架,生成器G以来自随机潜在空间的序列作为其输入生成伪时间序列,并将生成的序列样本传递给鉴别器D,鉴别器D要将将生成的虚假数据序列与实际正常训练数据序列区分开来。

MAD-GAN框架不是独立处理每个数据流,而是同时考虑整个变量集,以便将变量之间的潜在交互捕获到模型中。该框架在判别前用滑动窗口将多元时间序列分成子序列,为了根据经验确定子序列表示的最佳窗口长度,使用不同的窗口大小来捕获不同分辨率下的系统状态。与标准的GAN框架一样,D和G的参数是基于D的输出来更新的,因此鉴别器D可以被训练为尽可能敏感地将正确的标签分配给真实和虚假序列,而生成器将被训练为尽可能聪明地在经过足够多轮的迭代后欺骗鉴别器,即误导D将真实标签分配给虚假序列。通过能够生成真实的样本,生成器G将已经捕获了训练序列的隐藏多元分布,并且可以被视为正常状态下系统的隐式模型。同时,得到的鉴别器D也已经被训练成能够以高灵敏度区分虚假数据和真实数据。在MAD-GAN框架中,使用G和D来完成异常检测任务的步骤分为:

  • 重构基于从实时空间到GAN潜在空间的映射,利用实时测试样本和G重构样本之间的残差

  • 鉴别用鉴别器D对时间序列进行分类。如图所示,测试样本被映射回潜在空间,以基于重建的测试样本和实际测试样本之间的差异来计算相应的重建损失。同时,测试样本还被馈送到训练好的鉴别器D,以计算鉴别损失。

  • DR值判断异常使用一种新的鉴别和重建异常分数DR-Score来组合两种损失,以检测数据中的潜在异常

05 实验源码

Anomaly detection with generative adversarial networks for multivariate time series.

AMultivariate anomaly detection for time series data with generative adversarial networks.


TadGAN 生成对抗网络的时间序列异常检测

01 文献来源

Geiger, Alexander, et al. "TadGAN: Time Series Anomaly Detection Using Generative Adversarial Networks." arXiv preprint arXiv:2009.07769 (2020).

02 文献目标

基于深度学习的方法的一个基本挑战是,它们出色的数据拟合能力带来了它们也能拟合异常数据的风险。使用L2目标函数的自动编码器可以非常精确地拟合和重建数据,从而拟合异常。另一方面,GANs在学习生成器以完全捕捉数据的隐藏分布方面可能是无效的,从而导致错误警报。本文将这两种方法混合在一起,创建了一种更细致的方法。此外,该领域的工作经常强调改进深度学习模型本身。然而,正如我们在本文中所展示的,改进后处理步骤有助于显著减少误报的数量。

03 文献贡献

  • 针对时间序列数据,本文提出了一种新的基于无监督对抗生成神经网络重构的异常检测方法,并引入了一个周期一致的GAN架构,用于时间序列到时间序列的映射。

  • 本文提出了一种新的两种时间序列相似性度量方法,利用GAN的生成器和判别器来计算每个时间步长时间序列的鲁棒异常分数,该方法适用于评估原始序列和重建序列之间的上下文相似性

  • 本文使用来自3个著名实体 (NASA、Yahoo 和 Numenta ) 的11个时间序列数据集进行了广泛的评估,证明本文提出的方法优于其他8个基线。

  • 本文研究人员开发了一个用于时间序列异常检测的基准系统。该系统是开源的,可以通过其他方法和数据集进行扩展,在撰写本文时,该基准包括9个异常检测管道、13个数据集和2个评估机制。

04 总体架构

为了捕捉时间序列分布的时间相关性,本文使用LSTM循环神经网络作为生成器和判别器的基本模型。TadGAN采用循环一致性损失进行训练,以实现有效的时间序列数据重建。除此之外,还提出了几种新的方法来计算重建误差,以及不同的方法来结合重建误差和临界输出来计算异常分数。本文利用对抗性学习方法来获得两个映射函数E和G。如下图所示,将这两个映射函数均视为生成器,E充当编码器,将时间序列映射到潜在空间;而G充当解码器,将潜在空间转换到重建的时间序列;判别器C区分来自x的真实时间序列和来自G(z)生成的虚假时间序列;而判别器Cz测量映射到潜在空间的有效性。

文中指出应用标准对抗损失的原始公式存在梯度不稳定和模式崩溃的问题。模式崩溃是指在生成器与判别器的动态博弈之后,生成器其实是更倾向于产生那些已经被发现是“好”的样本来愚弄判别器,而不愿意产生新的样本,这导致生成器产生的样本多样性不足,无法完美收敛到目标分布。因此,TadGAN的目标包括 Wasserstein loss 和 Cycle consistency loss ,前者是为了使生成的时间序列的分布与目标域的数据分布相匹配;后者是为了防止两个生成器之间产生矛盾。

05 实验源码

TadGAN: Time Series Anomaly Detection Using Generative Adversarial Networks.


基于 GAN 的发电厂多元时间序列数据异常检测与定位

01 文献来源

Choi, Yeji, et al. "Gan-based anomaly detection and localization of multivariate time series data for power plant." 2020 IEEE International Conference on Big Data and Smart Computing (BigComp). IEEE, 2020.

02 文献目标

如果将对抗训练方法 (GAN) 直接应用于LSTM-RNN模型,这会导致优化模型的巨大计算复杂性。因为基于 LSTM 的 GAN 需要一个迭代过程,该过程中通过在随机潜在空间中生成样本并将测试数据重新映射回潜在空间来更新模型,这就导致了巨大的计算复杂性。为此,本文提出了一种新的基于 GAN 的异常检测和定位框架,以及一种称为距离图像 (Distance Image) 被用于多元时间序列成像的变换方法,使得能够尽可能早地检测异常情况发生的某个时间点。

03 文献贡献

本文提出了一种新的基于对抗生成神经网络的异常检测和定位框架,以及一种用于多元时间序列成像的变换方法,称为距离图像。生成器可以学习一系列距离图像到下一个距离图像的映射,从而不仅可以分析时间序列数据的时间关联,还可以通过卷积滤波分析多变量之间的相关性。特别地,具有逐点卷积的编码器确保编码每个时间序列图像的时间信息以及每个变量之间的相互关系。在电厂真实数据上的实验证明了该方法对异常检测任务的有效性,并证实了该方法得到的异常分值是诊断异常情况的重要指标。

04 总体架构

在对多元时间序列图像进行异常检测之前,本文使用一种称为距离图像的方法用于多元时间序列成像的变换,通过测量每个时间步长的变量之间的相似性来将多变量时间序列数据转换成图像,该方法受到距离矩阵概念的启发,通过合成距离图像来表征给定持续时间内每对变量之间的相位差。这种变换不仅通过测量每个变量之间的相位差将传感器之间的相关关系编码为空间信息,而且捕获了给定时间段内的时间信息。此外,它对某些点上出现的脉冲噪声是鲁棒的,因为噪声通过时间轴上的平均处理被冲走了。多元时间序列成像转换的例子如下图所示,正常情况下的正常模式有很多种,来自异常状态的模式不同于正常样本的模式。

基于上述距离图像,本文提出的基于对抗生成神经网络的异常检测和定位框架如下图所示,首先将每个时间步长内的多元时间序列转换成距离图像,时间窗口大小为 w,然后将该序列图像馈送给GANs以生成下一个距离图像。这个过程中,在生成器的顶部使用了逐点卷积层 (Pointwise Convolution) ,以便从一系列距离图像中捕获时间信息,并使用一般的卷积层来提取表示每对变量相关性的空间信息。该框架的目标是训练一个有效的生成器,能够根据一个距离图像序列生成下一个预期的距离图像,为此,训练过程中只使用正态数据集进行训练,学习正态数据分布的潜在向量空间。生成器 G 由编码器和解码器结构组成,并使用跳跃连接来提高输出结果的质量;鉴别器 D 尽可能的区分输入图像 (真实) 和重建图像 (虚假) 。

最后结合真实距离图像和估计距离图像之间的残差损失和判别特征损失,推导出异常评分函数。为了确定给定时间序列数据对应于正常情况还是异常情况,本文定义了基于两个损失的异常评分函数,即鉴别器中的重建损失和特征损失。重建损失计算公式如下所示:

                                                                   L_{rec} = E_x||m^t-G(m^{t-w},...,m^{t-1})||_1

对于在时间步长为 t 的距离图像 mt ,在 t 时段其异常评分计算公式如下所示,其中 f 是D的最后一层特征向量,lambda是调节特征丢失对总体异常评分函数的影响的加权参数。

                                                                 L_f = ||f(m_t)-f(G(m^{t-w},...,m^{t-1}))||

                                                                                  \Phi(t) = L_{rec}^t + \lambda_fL_f^t

由于模型只学习训练数据集中正态数据的分布,当测试数据偏离正态数据分布时,重构损失会增加。此外,输入图像和生成图像的特征向量的L2距离计算特征空间中的相异度。因此,这些损失的组合可以实现测量异常的程度。当该异常分数接近0时,意味着测试时间点对应于正常状态,反之亦然。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。