Lego蚂蚁智能监控中异常检测算法的探索与思考

简介: 在传统的监控、智能运维领域,用户想去监控某一个业务指标往往采用环比、同比的阈值配置方式。这在实践中面临不少问题:阈值应该配成多少,不同的业务甚至不同的时间段都需要不同的阈值业务总是出现周期性的趋势,规则配置极易产生误报特殊的业务场景例如活动引起的冲高回落、大促的冲击都会引起大量误报对大量维度的业务,比如上百/上千个不同类型的错误码,大量接口调用量等指标该如何分别配置?


一、背景与挑战

在传统的监控、智能运维领域,用户想去监控某一个业务指标往往采用环比、同比的阈值配置方式。这在实践中面临不少问题:

阈值应该配成多少,不同的业务甚至不同的时间段都需要不同的阈值

业务总是出现周期性的趋势,规则配置极易产生误报

特殊的业务场景例如活动引起的冲高回落、大促的冲击都会引起大量误报

对大量维度的业务,比如上百/上千个不同类型的错误码,大量接口调用量等指标该如何分别配置?

image.png

复杂的业务衍生出了对AIOps领域异常检测算法的需求,借助算法做自动的异常检测,解放对人工经验阈值的配置是一个切实可行的方向。互联网行业中天然沉淀的大量业务数据为算法提供了数据基础,业务人员日常的反馈为算法提供了标注,借此契机智能运维也在近几年飞速发展。

本文结合业界常用的AIOps时间序列异常检测算法和它们在蚂蚁\支付宝业务域中的实践,阐述Lego蚂蚁智能监控算法的部分探索与演变。


二、时序异常检测算法总览

对业界常用时序异常检测算法进行梳理,大致可以归纳为统计分析模型、时间序列(预测)、无监督、有监督、关系型模型等几个方向。各个算法模块从不同角度考虑时序异常检测问题,模块之间也可以嵌套、串行完成整个异常检测流程。

从思路上看:

时间序列相关模型主要用来提取时序信息、对时间序列进行实时预测。如果将异常监控拆分为:异常监控=预测值+和预测值的差距是否异常,那么时间序列预测的准确性就很大程度影响异常检测的效果。时间序列预测算法较多,可以考虑基于统计学的时序建模方法Holt-winters等,也可以考虑xgboost等回归类的机器学习方法,深度学习领域也有适用于序列的rnn类方法[1,2]。

统计分析模型和无监督模型从数据分布上考虑,假如正常数据遵循一定的规律,那么就可以从概率分布等方向入手将边界值归为异常。例如较常用的3-sigma准则、isolation-forest[3]、GAN[4]等算法。

有监督模型将异常检测转化为0/1二分类问题,将用户的反馈和算法形成闭环,让用户来定义异常边界,常用的分类算法例如树模型、svm以及深度网络DNN[5]等都可以用来尝试。

关系型模型试图引入更多外界信息,例如知识图谱、复杂网络等算法运用图信息,关联分析等算法寻找业务之间的关联关系等。

其他:在整个异常检测过程中还需要许多辅助模型,例如当用户反馈的样本量不足时如何解决,如何寻找历史上最合适的参考日期,如何对业务进行分类划分适配不同异常检测模型等。


三、Lego蚂蚁智能监控的实践

Lego是蚂蚁金服内部致力于业务异常发现的智能监控平台:

一方面,相对传统型监控”提供一个平台(工具)-->用户自己配置-->用户自己运维监控效果“的模式,Lego不再只是专注于工具本身的发展,而是延伸到“监控效果”环节,比如故障的发现质量,以及从发现到定位,再到业务恢复的完整应急体系。

另一方面,平台基于智能监控算法自动部署监控,不需要用户配置阈值甚至配置规则。算法学习业务过去的波动、趋势,结合其他相关业务指标,决策目前是否出现了异常。

Lego在智能监控的道路上经历一段时间的探索和实践,算法上经历了从基线到有监督算法的逐步改进,业务上也深入理解并解决了较多的复杂场景。以下对其中的智能算法进行部分介绍。

1. 统计概率模型

初期,借助统计概率模型是比较直接的异常检测思路,数据往往具有其分布规律,如果落在分布边界则触发了小概率事件,可能产生了异常。

N-sigma

正态分布中,99.73%的数据分布在距平均值三个标准差以内。如果我们的数据服从一定分布,就可以从分布曲线推断出现当前值的概率。

image.gifimage.png

反映到监控场景中,如果某一个业务数据服从一定分布(例如正态分布),那么当前数据如果超过N-sigma,则可以判断为异常,一个简要的检测可以描述为:

step1:取历史附近时间窗口内的N个数值作为样本M

  • step1:取历史附近时间窗口内的N个数值作为样本M
  • step2:计算样本的M的均值image.gif、标准差image.gif
  • step3:image.gif

Grubbs' Test\ESD Test等假设检验方法

Grubbs' Test常被用来检验正态分布数据集中的单个异常值,ESD(Extreme Studentized Deviate test)则将Grubbs' Test扩展到k个异常值检测,以Grubbs' Test为例,其算法步骤为:

image.pngimage.gif

总结

统计概率模型初步解决了一个模型如何泛化到其他业务的问题,但也有相应缺陷:

大部分方法存在分布假设。但实际中即使是一个小窗口里的数据分布也很复杂,更可能服从混合正态分布而不是单一的正态分布

涉及部分阈值、N的确定。例如一个业务说它是3-sigma,换个业务说它是2-sigma,同样容易陷入调阈值的怪圈忽略了时间序列本身的周期波动,损失了信息。

2. 时序序列预测模型

统计概率模型没有考虑时间序列上的信息,因此推动我们考虑先做时间序列预测。传统时间序列预测有许多非常好的框架和平滑方法,例如时间序列拆解本身就是一个较好的框架,里面的各个分项可以去做不同模型的尝试。我们先做一个简单的方法总结:

平滑类的方法,例如移动平均及在此基础上的优化,包括加权移动平均、指数平滑、二次指数平滑、三次指数平滑(Holt-Winters)等。平滑方法的基本思想是“融合”新信息和老信息,同时通过加入时间、季节趋势统计项,既体现趋势性又体现季节性。

ARMA/ARIMA[8]等线性模型。AR、MA部分和平滑方法思想比较相近,用过去序列或白噪声序列的线性组合预测未来,I部分将非平稳序列转化为平稳序列,ARIMA是比较典型常用的时序模型,。

STL等时序分解方法,时序分解类的方法将时间序列分解为T+S+R,分别指代趋势、季节和残差

将数据进行变换,提取时序特征;或将数据集转化为有监督数据集,采用xgboost、lstm等机器学习及深度学习方法

其他:例如随机游走、卡尔曼滤波、状态空间模型等其他时序模型

在这里我们尝试了STL[6]、Holt-winters、arima等算法。

STL

STL  (Seasonal-Trend decomposition procedure based on  Loess)为时序分解中一种常见的算法,基于LOESS将某时刻的数据YvYv分解为趋势分量(trend  component)、周期分量(seasonal component)和余项(remainder component):

image.pngimage.gif

STL分为内循环与外循环,其中内循环来负责趋势、周期分量的计算;外层循环主要用于调节robustness weight:

outer loop:

  • 计算robustness weight;

inner loop:

  • Step 1 去趋势;
  • Step 2 周期子序列平滑;
  • Step 3 周期子序列的低通量过滤;
  • Step 4 去除平滑周期子序列趋势;
  • Step 5 去周期;
  • Step 6 趋势平滑;

此处不再赘述。

Holt-winters

Holt-winters即三次指数平滑,指数平滑法都要更新上一时间步长的计算结果,并使用当前时间步长的数据中包含的新信息,它们通过“混合”新信息和旧信息来实现。各种方法的不同之处在于它们跟踪的量的个数和对应的拌和参数的个数。三次指数平滑法,功能最强大,既能体现趋势性又能体现季节性。以乘法公式为例,Holt-winters的公式可以表示为:

image.pngimage.gif

在实践中HW的性能消耗不多,模型中的参数也可以通过实时拟合获取,即模型可以是实时训练的。

lstm

解决时序预测的问题。不同于单维的时序预测模型,lstm在预测时候可以考虑多维的信息,因此比较适合与复杂场景下的时序预测。lstm在监控场景之外已经的得到了广泛的运用,比如在视频,文本的领域,都取得了显著的效果。

在异常监控下,lstm可以用来做指标的未来预测,以及用在异常监测问题上。这两类的问题的输入都为时间序列(一条或多条),经过lstm网络,而输出则根据希望解决的问题不同。在时序预测上,输出的是未来一个时间片段上的预测,而对于有监督的异常监测问题,则是一个二分类问题。

image.gifimage.png

总结

一个实践中的问题是不同业务、不同阶段可能适合不同的预测算法。例如对于规律较强的业务可能不需要做实时预测,昨日的曲线就是较好的基线;对于常见的每天有一定波动和量级浮动的业务,STL等时序分解的方法具有较好的效果;对于规律非常弱的业务,实时的曲线平滑是较好的方案,因此整体可以考虑一些集成方案。

3. 无监督算法

解决了时序预测问题之后我们实际上没有完成完整异常检测,因为还没有回答和预测值差距多少才叫异常。

一个简单的思路是结合1和2,在时间序列预测后对残差嵌套统计分析模型,例如基于ESD检验拓展的S- ESD (Seasonal ESD)与S-H-ESD (Seasonal Hybrid ESD)算法,就将ESD扩展到时间序列数据上。

但我们更希望把这个过程交给用户,让用户来确定异常的边界在哪里。

可是在监控建立的初期,用户的反馈是非常稀少珍贵的,在没有标记反馈的情况下,如何让用户快速享受智能服务?无监督算法可能是一个解法方案。

isolation-forest

iForest 适用连续数据的异常检测,其识别的主要是孤立点——可以理解为分布稀疏且离密度高的群体较远的点。用统计学来解释,在数据空间里面,分布稀疏的区域表示数据发生在此区域的概率很低,因而可以认为落在这些区域里的数据是异常的。

它的直观理解是这样的:假如我们用一个超平面来随机切割空间,第一步切将整体空间分为2个子空间,第二步我们再用随机超平面来切割每个子空间,以此循环下去直到子空间里都只剩下一个数据点位置。我们可以想象,对于那些相当聚集、密度相对较高的数据点,他们需要被切割很多次才能独居一个子空间;相对的对于那些稀疏、密度相对较低的数据点,则很容易就在循环中找到了自己的空间。再用随机模拟的过程反复进行这个过程,就形成了iForest的整体实现思想。iForest  由t个iTree(Isolation Tree)孤立树 组成,每个iTree是一个二叉树结构,其实现步骤如下:

image.pngimage.gif

one-class svm

ocsvm也是一种无监督方案,算法希望学习一个超平面将数据尽可能包在一起,从而识别新的数据和已有训练数据是否相似。该问题的优化目标与二分类SVM略微不同,但依然很相似:

image.pngimage.pngimage.gif


image.gif


dbscan

异常检测和聚类是两项很相关的任务,聚类获得的孤立点往往也是异常检测领域下的异常点。

dbscan  (density-based spatial clustering of applications with noise)[10]  是一种常用的基于密度的聚类方法,任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。重复该过程直到所有核心对象都有类别为止。对于不在任何一个类别内的点被标记为噪音点。

dbscan 有两个主要参数,密度和簇内最小样本数,决定最终的聚类结果。

image.pngimage.gif

总结

无监督算法在监控初期可以不借助外界反馈,快速通过数据的自身分布识别异常点。如果在特征工程阶段能根据业务场景构造特征,可以构造不同业务目的的模型。无监督算法另一个特点是需要较多的业务训练数据,但准确率较高。

其存在的问题是识别效果,尤其是召回率上的表现往往不够理想。对于部分业务监控而言,一些故障在数据上可能远不能被称为“离群点”、“孤立点”,可能只是稍微偏离了预估值,这在无监督中难以识别,也会存在调整松紧系数的困境。

4. 有监督算法

有监督算法将用户反馈、算法优化形成一个良性循环圈,用户的标注代表了用户对异常的判断标准,异常检测问题也比较自然地转化为二分类问题求解。

image.pngimage.gif

模型构建可以采用LR\xgboost\random forest\svm等常用模型,特征的构造和模型构建不再赘述,在这里总结几个问题:

  • 当问题转化为分类问题时,异常检测领域存在的黑白样本浓度不均匀就会突显出来,这也是有监督模型在异常检测领域的主要问题。
  • 有监督的方案往往不支持单个业务拥有自己的模型,积累样本需要借助伙伴们共同建设样本集的力量。

四、结束语

今天的我们还在途中,仍然存在许多不足、存在许多困难需要攻克。在AIOps的道路上也欢迎更多对智能监控感兴趣的小伙伴加入我们,一起努力。


参考文献:

[1]Connor  J T, Martin R D, Atlas L E. Recurrent neural networks and robust time  series prediction[J]. IEEE transactions on neural networks, 1994, 5(2):  240-254.

[2]Karim  F, Majumdar S, Darabi H, et al. LSTM fully convolutional networks for  time series classification[J]. IEEE Access, 2017, 6: 1662-1669.

[3]Liu  F T, Ting K M, Zhou Z H. Isolation forest[C]//2008 Eighth IEEE  International Conference on Data Mining. IEEE, 2008: 413-422.

[4]Radford  A, Metz L, Chintala S. Unsupervised representation learning with deep  convolutional generative adversarial networks[J]. arXiv preprint  arXiv:1511.06434, 2015.

[5]Wang  Z, Yan W, Oates T. Time series classification from scratch with deep  neural networks: A strong baseline[C]//2017 international joint  conference on neural networks (IJCNN). IEEE, 2017: 1578-1585.

[6]Cleveland  R B, Cleveland W S, McRae J E, et al. STL: a seasonal-trend  decomposition[J]. Journal of official statistics, 1990, 6(1): 3-73.

image.gifimage.gif


相关文章
|
15天前
|
机器学习/深度学习 算法 决策智能
智能解决装箱问题:使用优化算法实现高效包装
装箱问题(Bin Packing Problem)是组合优化领域中的一个经典问题,主要涉及如何将一系列对象高效地装入有限数量的容器(或“箱”)中,同时满足特定的约束条件。这个问题的目标是最小化所需使用的箱子数量或者最大化箱子的装载效率,以减少空间或资源的浪费。
|
17天前
|
JSON 监控 算法
员工上网行为监控:利用Scala编写数据处理和分析算法
企业在数字化时代利用Scala进行员工上网行为监控,以确保合规和网络安全。通过Scala的数据处理和分析能力,读取CSV日志数据转换为DataFrame,分析员工行为,如统计最常访问网站。此外,还展示了将监控数据以JSON格式提交至公司网站的函数,实现实时信息更新与安全防护。
61 5
|
20天前
|
存储 Rust 监控
Rust代码编写高性能屏幕监控软件的核心算法
本文介绍了使用Rust编写的高性能屏幕监控软件的实现方法。核心算法包括:1) 使用`image`和`winit`库捕获并转换屏幕图像;2) 对图像进行处理,检测特定对象或活动;3) 利用Rust的并发性并行处理多个帧以提高效率;4) 提取数据后,通过`reqwest`库自动提交到网站进行分析或存储。通过结合Rust的高性能和丰富的库,可构建满足各种需求的高效屏幕监控工具。
64 5
|
2月前
|
机器学习/深度学习 运维 算法
大模型开发:描述一种用于异常检测的技术或算法。
LOF算法是一种无监督异常检测技术,通过比较数据点局部密度识别离群点。它计算每个点的局部离群因子得分,得分高则异常可能性大。主要步骤包括:距离度量、k近邻搜索、计算局部可达密度和LOF得分,然后设定阈值识别异常点。适用于入侵检测、故障检测等场景,Python中可使用scikit-learn库实现。
22 1
|
3天前
|
算法
【智能算法】11种混沌映射算法+2种智能算法示范【鲸鱼WOA、灰狼GWO算法】
【智能算法】11种混沌映射算法+2种智能算法示范【鲸鱼WOA、灰狼GWO算法】
配电网多目标pareto重构+智能算法matlab
配电网多目标pareto重构+智能算法matlab
|
6天前
|
数据采集 缓存 Rust
通过Rust实现公司电脑监控软件的性能优化算法
使用Rust语言开发高效的公司电脑监控软件,通过实时监测CPU、内存、网络等性能数据,确保企业环境的稳定性。文中通过代码示例展示了数据采集模块,如读取CPU使用率,并利用缓存机制减少文件系统访问,提升性能。此外,还介绍了如何将监控数据通过HTTP客户端提交到网站进行分析和管理,以优化运维流程。
41 3
|
11天前
|
机器学习/深度学习 运维 算法
【Python机器学习专栏】异常检测算法在Python中的实践
【4月更文挑战第30天】本文介绍了异常检测的重要性和在不同领域的应用,如欺诈检测和网络安全。文章概述了四种常见异常检测算法:基于统计、距离、密度和模型的方法。在Python实践中,使用scikit-learn库展示了如何实现这些算法,包括正态分布拟合、K-means聚类、局部异常因子(LOF)和孤立森林(Isolation Forest)。通过计算概率密度、距离、LOF值和数据点的平均路径长度来识别异常值。
|
12天前
|
算法 数据可视化 数据挖掘
R语言平滑算法LOESS局部加权回归、三次样条、变化点检测拟合电视节目《白宫风云》在线收视率
R语言平滑算法LOESS局部加权回归、三次样条、变化点检测拟合电视节目《白宫风云》在线收视率
|
13天前
|
机器学习/深度学习 人工智能 运维
人工智能平台PAI 操作报错合集之请问Alink的算法中的序列异常检测组件,是对数据进行分组后分别在每个组中执行异常检测,而不是将数据看作时序数据进行异常检测吧
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。