一、背景与挑战
在传统的监控、智能运维领域,用户想去监控某一个业务指标往往采用环比、同比的阈值配置方式。这在实践中面临不少问题:
阈值应该配成多少,不同的业务甚至不同的时间段都需要不同的阈值
业务总是出现周期性的趋势,规则配置极易产生误报
特殊的业务场景例如活动引起的冲高回落、大促的冲击都会引起大量误报
对大量维度的业务,比如上百/上千个不同类型的错误码,大量接口调用量等指标该如何分别配置?
复杂的业务衍生出了对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%的数据分布在距平均值三个标准差以内。如果我们的数据服从一定分布,就可以从分布曲线推断出现当前值的概率。
反映到监控场景中,如果某一个业务数据服从一定分布(例如正态分布),那么当前数据如果超过N-sigma,则可以判断为异常,一个简要的检测可以描述为:
step1:取历史附近时间窗口内的N个数值作为样本M
- step1:取历史附近时间窗口内的N个数值作为样本M
- step2:计算样本的M的均值、标准差
- step3:
Grubbs' Test\ESD Test等假设检验方法
Grubbs' Test常被用来检验正态分布数据集中的单个异常值,ESD(Extreme Studentized Deviate test)则将Grubbs' Test扩展到k个异常值检测,以Grubbs' Test为例,其算法步骤为:
总结
统计概率模型初步解决了一个模型如何泛化到其他业务的问题,但也有相应缺陷:
大部分方法存在分布假设。但实际中即使是一个小窗口里的数据分布也很复杂,更可能服从混合正态分布而不是单一的正态分布
涉及部分阈值、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):
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的公式可以表示为:
在实践中HW的性能消耗不多,模型中的参数也可以通过实时拟合获取,即模型可以是实时训练的。
lstm
解决时序预测的问题。不同于单维的时序预测模型,lstm在预测时候可以考虑多维的信息,因此比较适合与复杂场景下的时序预测。lstm在监控场景之外已经的得到了广泛的运用,比如在视频,文本的领域,都取得了显著的效果。
在异常监控下,lstm可以用来做指标的未来预测,以及用在异常监测问题上。这两类的问题的输入都为时间序列(一条或多条),经过lstm网络,而输出则根据希望解决的问题不同。在时序预测上,输出的是未来一个时间片段上的预测,而对于有监督的异常监测问题,则是一个二分类问题。
总结
一个实践中的问题是不同业务、不同阶段可能适合不同的预测算法。例如对于规律较强的业务可能不需要做实时预测,昨日的曲线就是较好的基线;对于常见的每天有一定波动和量级浮动的业务,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是一个二叉树结构,其实现步骤如下:
one-class svm
ocsvm也是一种无监督方案,算法希望学习一个超平面将数据尽可能包在一起,从而识别新的数据和已有训练数据是否相似。该问题的优化目标与二分类SVM略微不同,但依然很相似:
dbscan
异常检测和聚类是两项很相关的任务,聚类获得的孤立点往往也是异常检测领域下的异常点。
dbscan (density-based spatial clustering of applications with noise)[10] 是一种常用的基于密度的聚类方法,任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。重复该过程直到所有核心对象都有类别为止。对于不在任何一个类别内的点被标记为噪音点。
dbscan 有两个主要参数,密度和簇内最小样本数,决定最终的聚类结果。
总结
无监督算法在监控初期可以不借助外界反馈,快速通过数据的自身分布识别异常点。如果在特征工程阶段能根据业务场景构造特征,可以构造不同业务目的的模型。无监督算法另一个特点是需要较多的业务训练数据,但准确率较高。
其存在的问题是识别效果,尤其是召回率上的表现往往不够理想。对于部分业务监控而言,一些故障在数据上可能远不能被称为“离群点”、“孤立点”,可能只是稍微偏离了预估值,这在无监督中难以识别,也会存在调整松紧系数的困境。
4. 有监督算法
有监督算法将用户反馈、算法优化形成一个良性循环圈,用户的标注代表了用户对异常的判断标准,异常检测问题也比较自然地转化为二分类问题求解。
模型构建可以采用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.