一个Bug损失200亿!如何搭建业务异常检测系统?( 三 )


对新来的数据点,根据数据点偏离正常表现模型的程度来判定是否为异常 。

一个Bug损失200亿!如何搭建业务异常检测系统?

文章插图
 
比如最简单的算法模型是高斯分布,假设该指标数据符合高斯分布,就可以通过历史数据点估计出高斯分布的 mea n和期望(均数)μ 和标准差 σ,进而对新的数据点判定 。
如果偏离期望多于三个标准差则该数据点不能被模型解释的概率为 99.7%,我们就可以判定其为异常 。
然而实际情况是,大部分数据都无法简单地表现为高斯分布 。因此,首先我们需要根据数据本身来自动选择最适合的算法模型 。
这也是很多开源的异常检测算法直接被拿来使用往往得不到满意效果的一个原因 。
因为他们一般假设数据的底层表现是平稳的(Stationary),并且数据是规则取样的(Regular Sampling),若使用不适合的算法模型对数据建模会得到非常不好的效果,甚至完全无法使用 。
因此 DataPipeline 开发了一个算法,可以自动根据数据的表现形式选择最合适的算法进行拟合 。最常用的算法可以分为基于统计模型的算法和深度学习的算法 。
统计模型算法:除了上面提到的高斯分布,比较常用的模型有基于指数平滑(Exponential Smoothing)的模型,实际是对过去的数据进行平均来预测未来的数据,只是给时间上更靠近当下的数据点更大的权重 。
比较经典的有 Holt-Winters,ARIMA 等,这些还可以将周期性的规律考虑进去 。
深度学习算法:对于不符合规则取样和不表现为 Staionary 的数据,深度学习算法的效果更好 。
LSTM(Long Short-Term Memory)是最常用的算法,而当下许多最新的算法都是基于 LSTM 上的变种 。
然而深度学习算法很难做到实时训练,即模型随新的数据点实时更新,而且当监控数据量大的时候非常耗费 CPU 。
算法自动选择出最合适的模型后,系统便可根据历史数据拟合模型,估计出模型参数,进而针对每个数据点给出预测 。
对于实际数据点和预测数据点的差异(error)我们可以用高斯分布来模拟,利用高斯模型计算出一个置信区间,当新数据的 error 偏离置信区间过大时将其判断为异常 。
周期性学习
许多指标数据都表现出明显的周期性,而周期性学习对异常检测的准确性至关重要 。
最常见的自动学习周期性方法是自相关学习(Autocorrelation) 。简言之,该算法是将数据向过去平移一个时间差(Lag),然后计算平移后的数据和原来数据的统计相关性 。
如果某一个 Lag 平移后的数据和原数据相关性很大,则认为该 Lag 就是数据的周期性 。此算法的主要问题是计算量较大,因为要对多个 Lag 进行计算 。
鉴于上面提到的实时性和可扩展要求,DataPipeline 对该算法用 Subsampling 的方法进行优化,降低了计算复杂度 。
相关性学习
之前提到为解决告警洪流问题,我们需要一个算法可以自动化计算指标间的相关性,在多个异常同时出现时,可以将反映同个业务问题的异常关联在一起,给用户一个汇总的告警 。
针对这类问题,一般传统的方法是采取多变量分析(Multivariate Analysis),即将所有时序数据当成互相有关联的多变量一起建模,然后在整体层面检测异常 。
该方法的主要问题是很难规模化,且当出现异常时检测结果的解释性较差 。
一个Bug损失200亿!如何搭建业务异常检测系统?

文章插图
 
因此,在 DataPipeline,我们采用单变量分析对每个指标进行异常检测,然后利用大规模聚类算法将相关度较高的指标进行聚类(如上图) 。
这样每个指标的机器学习和相关性学习两部分可以各自规模化,使得整个系统计算效率更高 。
而聚类算法通过几类特征来进行计算:
异常表现的相似度:简言之,如果两个指标多次、同时出现异常,则认为两者更相关 。
我们可以生成一个异常表现的特征向量,若在某个时间点该指标表现正常便设置为 0,若表现异常则设置为异常的打分(算法根据异常的严重程度自动打分) 。
统计模型的相似度:即指标的数值是否有相似的模式 。其中计算两个时序数据数值相似度最常见的算法是 Pearson Correlation Coefficient 。
元数据相似度和人工反馈:DataPipeline 还根据元数据的拓扑关系来判断相关性 。
比如同一个指标的多个维度生成的多个子指标会被认为更相关 。此外,用户也可自己输入一些信息告诉系统哪些指标更相关 。


推荐阅读