0 概论
1 基于隔离森林的异常检测算法
2 基于LOF的异常检测算法
3 基于One-Class SVM的异常检测算法
4 基于高斯概率密度异常检测算法
5 Opprentice——异常检测经典算法最终篇
6 基于重构概率的 VAE 异常检测
7 基于条件VAE异常检测
8 Donut: 基于 VAE 的 Web 应用周期性 KPI 无监督异常检测
9 异常检测资料汇总(持续更新&抛砖引玉)
10 Bagel: 基于条件 VAE 的鲁棒无监督KPI异常检测
11 ADS: 针对大量出现的KPI流快速部署异常检测模型
12 Buzz: 对复杂 KPI 基于VAE对抗训练的非监督异常检测
13 MAD: 基于GANs的时间序列数据多元异常检测
14 对于流数据基于 RRCF 的异常检测
15 通过无监督和主动学习进行实用的白盒异常检测
16 基于VAE和LOF的无监督KPI异常检测算法
17 基于 VAE-LSTM 混合模型的时间异常检测
18 USAD:多元时间序列的无监督异常检测
19 OmniAnomaly:基于随机循环网络的多元时间序列鲁棒异常检测
20 HotSpot:多维特征 Additive KPI 的异常定位
相关:
VAE 模型基本原理简单介绍
GAN 数学原理简单介绍以及代码实践
单指标时间序列异常检测——基于重构概率的变分自编码(VAE)代码实现(详细解释)
论文下载:netman | ieee.org 下载后排版有一定偏差,但内容相同。
论文发表于 IEEE Access 2018
源码地址:暂时没有找到源码
首先必须说明的是,该论文提出的算法与本系列其他算法有很大的不同,包括:
当异常发生后,我们需要找到异常发生的根因(root cause),也就是定位到具体哪个KPI表现出异常,即找出根本原因。
这里举个例子,对于某一个特定业务,需要用到的中间件包括 mysql, redis, es,对应的微服务包括 service1, service2,我们对提供服务的各个阶段都采集 KPI 数据,当异常发生时,我们需要快速找到究竟是谁出了问题。这里需要强调 root cause 的含义,当我们发现某个服务模块有问题而这个服务模块包括 redis 与 mysql 以及服务提供逻辑代码,我们需要进一步确定到底哪块出问题,而不是笼统地回答。
因此,算法的应用场景也比较清楚,该场景满足以下三个条件:
论文用到的最核心的算法应当包括:
关于这两个方法如何应用在论文中在后面做详细介绍,目前给一个粗略的答复。
论文提出了采用 MCTS 方法 的 HotSpot 框架(在异常定位文献中首次出现),可以捕捉异常是如何从根本原因在整个聚合层次结构中传播的(确定异常根因),并且论文提出了一种分层剪枝的方法来进一步缩小搜索空间以节省搜索时间,提高算法速率。
比如 page view, revenue, traffic volume,大概可以理解为数值类型的。事实上后来的很多KPI异常检测论文默认数据对象就是数值类型的。
多特征additive KPI 异常定位问题是识别最有可能导致总 KPI 值异常变化的模块及其元素。论文原文使用的是长方体(cuboid)来表示模块的概念,如图一所示:
蒙特卡洛树搜索(MCTS)是一种启发式搜索算法,适用于某些类型的决策过程,尤其是游戏中使用的决策过程(例如AlphaGo)。
这部分的资料比较多,感兴趣的可以自行搜索,可以参考一下 https://blog.csdn.net/qq_24178985/article/details/121803376。
不过也可以不急着深入理解这个方法,继续看其他部分。
这里跳几个比较重要的部分进行介绍
此部分描述了论文解决的是一个什么样的问题,先从定义出发:
这里是指接下来的论文、实验中可能用到的条目(term)的介绍说明,在公式中也会用到,这里我们详细介绍一下:
条目 | 定义 | 标识 | 举例 |
---|---|---|---|
属性 | 每条PV记录的信息类别 | - | Province (P), ISP(I), DC(D), Channel(C) \text{Province (P), ISP(I), DC(D), Channel(C)} Province (P), ISP(I), DC(D), Channel(C) |
属性值 | 每个属性的候选值 | - | Beijing, Shanghai, Guangdong for Province(P) \text{{Beijing, Shanghai, Guangdong} for Province(P)} Beijing, Shanghai, Guangdong for Province(P) |
元素 | 每个属性的不同值的组合向量 | e = ( p , i , d , c ) e=(p,i,d,c) e=(p,i,d,c) | (Beijing,*,*,*), (*,Mobile,*,*), (Beijing, Mobile,*,*) \text{(Beijing,*,*,*), (*,Mobile,*,*), (Beijing, Mobile,*,*)} (Beijing,*,*,*), (*,Mobile,*,*), (Beijing, Mobile,*,*) |
PV值 | 根据元素的访问日志数 | v ( e i ) v(e_i) v(ei) | v ( Beijing,*,*,* ) v(\text{Beijing,*,*,*}) v(Beijing,*,*,*) |
数据立方体 | 多维数据的数据结构 | n − d c u b e {n-d} \ cube n−d cube | 维度为{P,I,D,C}的四维数据立方体 |
长方体Cuboids | 长方体是一个数据立方体,其维度在所有给定维度的子集中 | B i B_i Bi | { B P , B P , I , B P , I , D , . . . } \{B_P, B_{P,I}, B_{P,I,D},...\} {BP,BP,I,BP,I,D,...} for the 4-d data cube with the dimensions {P, I, D, C} \text{\{P, I, D, C\}} {P, I, D, C} |
潜在得分Potential Score | 衡量一组元素成为根本原因的潜力的概念 | p s ps ps | p s ( S ) ps(S) ps(S), S = { (Beijing, *, *, *), (*, Mobile, *, *) } S=\{\text{(Beijing, *, *, *), (*, Mobile, *, *)}\} S={(Beijing, *, *, *), (*, Mobile, *, *)} |
下面的两个表用来表示 PV 例子,网站上的PV记录可以有几个属性。 例如,“10:00:01(时间戳); 北京、移动、DC1、Channel1“为记录,北京、移动、DC1、Channel1分别根据地区§、ISP(I)、数据中心(D)和频道©四个属性为候选值,其中 P = { p } P=\{p\} P={p}、 I = { i } I=\{i\} I={i}、 D = { d } D=\{d\} D={d}、 C = { c } C=\{c\} C={c} 分别为地区、ISP、数据中心和 ADS 频道的36、10、6、10个不同值的集合。 P P P 和 I I I 的值基于客户端 IP,并分别使用 IP 到地理定位数据库和 BGP 表进行解析。 每个地区的 ISP 都是一个独立的公司,因此相同的 ISP 名称在不同的地区往往表现不同。 渠道是不同广告市场的标签,如医疗或教育。 表2 显示了PV记录的一些示例。
不同属性值组合的向量在本文中称为元素(element),表示为 e = ( p , i , d , c ) e=(p,i,d,c) e=(p,i,d,c),其中 p ∈ P p\in P p∈P 或者 p = ∗ p = * p=∗, i ∈ I i \in I i∈I 或者 i = ∗ i = * i=∗, d ∈ D d\in D d∈D 或者 d = ∗ d = * d=∗, c ∈ C c\in C c∈C 或者 c = ∗ c = * c=∗, 这里的 ∗ * ∗ 是通配符,当 e = ( p , i , d , c ) e=(p, i, d, c) e=(p,i,d,c)在每一个时间尺度(如本文中的尺度为每分钟)中,我们根据一个元素 e e e 来计算 PV 记录的数目,并将这个数字称为该元素的 PV 值,用 v ( e ) v(e) v(e) 表示,即 v ( e ) = v(e)= v(e)= 在特定时间尺度上的#个记录。 表3 显示了与表2中的PV记录相对应的PV值。
所有这些最细粒度元素的集合,如表3 中的元素,用叶子表示: LEAF = { e ∣ e = ( p , i , d , c ) , p ≠ ∗ , i ≠ ∗ , d ≠ ∗ , c ≠ ∗ } \text{LEAF}=\{e|e=(p,i,d,c), p \neq*, i \neq *, d \neq * , c \neq * \} LEAF={e∣e=(p,i,d,c),p=∗,i=∗,d=∗,c=∗}。当一个或多个属性值为 * 时,其他元素都可以基于 Leaf 中的元素求和。例如,对于表 3 中 10:00(从10:00:00到10:00:59) 的三个元素,我们可以获得更粗粒度元素的值,例如:
v ( Beijing, Mobile, D C 1 , ∗ ) = 2 + 1 = 3 , v ( Bei jing , ∗ , ∗ , ∗ ) = 2 + 1 + 3 = 6. \begin{array}{c} v\left(\text { Beijing, Mobile, } D C_{1}, *\right)=2+1=3, \\ v(\text { Bei jing }, *, *, *)=2+1+3=6 . \end{array} v( Beijing, Mobile, DC1,∗)=2+1=3,v( Bei jing ,∗,∗,∗)=2+1+3=6.
根据聚集程度的不同,我们将元素划分为不同的集合,每个集合对应一个长方体。 长方体是数据立方体的子立方体,数据立方体是一种数据结构,允许在多维度上建模和查看数据[3],例如,叶的元素构成一个4-D数据立方体,如图所示 1. 长方体表示为 B i B_i Bi( i i i 可以是 P P P、 I I I、 D D D 和 C C C 中的任意组合),例如, B P B_P BP 是一维长方体, B P , I , D B_{P,I,D} BP,I,D 是三维长方体。 长方体的元素集 B i B_i Bi 用 E ( B i ) E(B_i) E(Bi) 来表示,比如, E ( B P ) = { e ∣ e = ( p , ∗ , ∗ , ∗ ) , p ≠ ∗ } E\left(B_{P}\right)=\{e \mid e=(p, *, *, *), p \neq *\} E(BP)={e∣e=(p,∗,∗,∗),p=∗}, E ( B P , I , D ) = { e ∣ e = ( p , i , d , ∗ ) , p ≠ ∗ , i ≠ ∗ , d ≠ ∗ } E\left(B_{P, I, D}\right)=\{e \mid e=(p, i, d, *), p \neq *, i \neq *, d \neq *\} E(BP,I,D)={e∣e=(p,i,d,∗),p=∗,i=∗,d=∗}, L E A F = E ( B P , I , D , C ) LEAF=E\left(B_{P, I, D, C}\right) LEAF=E(BP,I,D,C)。
此外,我们构造长方体并为其标记层ID,如图所示 2. 另外,我们让 B P B_P BP 或 B I B_I BI 是 B P I B_{PI} BPI 的父长方体, B P , I B_{P,I} BP,I 是 B P B_P BP 或 B I B_I BI 的子长方体。 因此,长方体的元素都具有父子结点关系,比如 ( p , ∗ , ∗ , ∗ ) ( ∈ E ( B P ) ) (p, *, *, *)\left(\in E\left(B_{P}\right)\right) (p,∗,∗,∗)(∈E(BP)) 和 ( p , i , ∗ , ∗ ) ( ∈ E ( B P , I ) ) (p, i, *, *)\left(\in E\left(B_{P, I}\right)\right) (p,i,∗,∗)(∈E(BP,I))。
论文中使用 e ′ = ( p ′ , i ′ , d ′ , c ′ ) e^{\prime}=\left(p^{\prime}, i^{\prime}, d^{\prime}, c^{\prime}\right) e′=(p′,i′,d′,c′) 表示 e = ( p , i , d , c ) e=(p,i,d,c) e=(p,i,d,c) 的后代,其中 e ≠ e ′ e\neq e^{\prime} e=e′, p ′ = p p^{\prime} = p p′=p 或者 p = ∗ p=* p=∗ , i ′ = i i^{\prime} = i i′=i 或者 i = ∗ i=* i=∗ , d ′ = d d^{\prime} = d d′=d 或者 d = ∗ d=* d=∗ , c ′ = c c^{\prime} = c c′=c 或者 c = ∗ c=* c=∗ 。 D e s c ( e ) = { e ′ ∣ e ′ Desc(e)=\{e^{\prime} | e^{\prime} Desc(e)={e′∣e′ 是 e e e 的后代 } \} }, D e s c ′ ( e ) = { e ′ ∣ e ′ = ( p , i , d , c ) ∈ L E A F , p ≠ ∗ , i ≠ ∗ , d ≠ ∗ , c ≠ ∗ } {Desc}^{\prime}(e)=\{ e^{\prime} | e^{\prime} =(p,i,d,c) \in LEAF, p\neq *, i \neq *, d \neq *, c \neq *\} Desc′(e)={e′∣e′=(p,i,d,c)∈LEAF,p=∗,i=∗,d=∗,c=∗}。如果 e ∈ L E A F e \in LEAF e∈LEAF,PV 值 v ( e ) v(e) v(e)可以直接评估,否则
v ( e ) = ∑ e ′ ∈ Desc ′ ( e ) v ( e ′ ) (1) v(e)=\sum_{e^{\prime} \in \operatorname{Desc}^{\prime}(e)} v\left(e^{\prime}\right) \tag{1} v(e)=e′∈Desc′(e)∑v(e′)(1)
比如,
v ( Beijing , ∗ , ∗ , ∗ ) = ∑ j , k , h v ( Beijing , i j , d k , c h ) (2) v(\text { Beijing }, *, *, *)=\sum_{j, k, h} v\left(\text { Beijing }, i_{j}, d_{k}, c_{h}\right) \tag{2} v( Beijing ,∗,∗,∗)=j,k,h∑v( Beijing ,ij,dk,ch)(2)
Total P V = v ( ∗ , ∗ , ∗ , ∗ ) = ∑ i , j , k , h v ( p i , i j , d k , c h ) (3) \text { Total } P V=v(*, *, *, *)=\sum_{i, j, k, h} v\left(p_{i}, i_{j}, d_{k}, c_{h}\right) \tag{3} Total PV=v(∗,∗,∗,∗)=i,j,k,h∑v(pi,ij,dk,ch)(3)
addictive KPI(多维属性)异常定位问题是识别最有可能导致总KPI值异常变化的长方体及其元素。
为了陈述清楚这个问题,我们在表4 和 表5 中举了一个简单的例子。表4表示了一个2维属性 PV 结构。 存在两个一维长方体, B P B_P BP和 B I B_I BI,一个二维长方体 B P I B_{PI} BPI。 每个长方体包含一组元素,即 E ( B P ) = { B e i j i n g , ∗ ) , ( S h a n g h a i , ∗ ) , ( g u a n g d o n g , ∗ ) } E(B_{P})=\{Beijing,*),(Shanghai,*),(guangdong,*)\} E(BP)={Beijing,∗),(Shanghai,∗),(guangdong,∗)}, E ( B I ) = { ( ∗ , M o b i l e ) , ( ∗ , U n i c o m ) } E(B_I)=\{(*, Mobile),(*, Unicom)\} E(BI)={(∗,Mobile),(∗,Unicom)} , L e a f = E ( B P , I ) = { ( B e i j i n g , M o b i l e ) , ( S h a n g h a i , M o b i l e ) , ( g u a n g d o n g , M o b i n e ) , ( B e i j i n g , U n i c o m ) , ( S h a n g h a i , U n i c o m ) , ( G u a n g d o n g , U n i c o m ) } Leaf=E(B_{P,I})=\{(Beijing,Mobile),(Shanghai,Mobile),(guangdong,Mobine),(Beijing,Unicom),(Shanghai,Unicom),(Guangdong,Unicom)\} Leaf=E(BP,I)={(Beijing,Mobile),(Shanghai,Mobile),(guangdong,Mobine),(Beijing,Unicom),(Shanghai,Unicom),(Guangdong,Unicom)}。 v ( p , i ) v(p,i) v(p,i) 显示在表格的单元格中,例如 v ( B e i j i n g , M o b i l e ) = 20 v(Beijing, Mobile)=20 v(Beijing,Mobile)=20, v ( B e i j i n g , ∗ ) = 30 v(Beijing, *)=30 v(Beijing,∗)=30。
当总PV异常时,PV变化如表5所示。在每个单元格中,第一个数字是预测PV值 f ( p , i ) f(p, i) f(p,i),第二个数字是实际PV值 v ( p , i ) v(p,i) v(p,i)(如何检测总PV和计算元素的预测值将在 第四节 A 中介绍)。总 PV 的预测值为100,而实际 PV 值仅为75(表5的右下角)。因此,由于总PV的异常变化 v ( ∗ , ∗ ) = 75 v(*,*)=75 v(∗,∗)=75 比触发异常定位的 f ( ∗ , ∗ ) = 100 f(*,*)=100 f(∗,∗)=100 小得多,因此触发异常定位。
对于 B P B_P BP B I B_I BI 和 B P , I B_{P,I} BP,I 三个长方体,它们可以从不同的角度表达 PV KPI。当总PV发生异常变化时,这三个长方体中的每一个都受到影响。如表5所示,每个长方体(阴影细胞)中都有一些异常元素。 在现实中,操作员需要确定哪个长方体和这个长方体的哪些元素是这种异常的最潜在的根本原因。 然后他们可以开始尝试修复异常并减轻损失。 因此,对于可加性KPI的异常定位问题可以重述如下:
有效和高效地识别总KPI值异常的最潜在的根本原因,即 一个特定长方体 B i B_i Bi 的元素子集。 根因集合 R S e t ⊆ E ( B i ) RSet \subseteq E\left(B_{i}\right) RSet⊆E(Bi)。
注意,这个定义允许在同一个长方体中的多个元素作为根本原因集。 例如,表5 中示例的根本原因集是 R S e t = { ( Beijing , ∗ ) , ( Shanghai , ∗ ) } RSet =\{(\text { Beijing }, *),(\text { Shanghai }, *)\} RSet={( Beijing ,∗),( Shanghai ,∗)} 。但这一定义排除了多个长方体同时存在根源的情况,这在现实中极为罕见。 还要注意,我们只处理总KPI值异常的情况。
论文提出了潜在得分(Potential Score)作为度量函数,并应用蒙特卡罗树搜索(MCTS)算法和分层剪枝策略克服了搜索空间过大的问题。
在我们的异常定位问题中,一个可以用来“全局”比较不同元素集的根本原因“潜力”的度量。 然而,正如第一个挑战所示,这样的度量并不容易开发,简单的度量也不起作用。
我们对这个潜在得分的想法是基于以下直觉:当根原因元素的KPI值发生变化时,它的所有后代叶元素的KPI值也相应地发生变化。 因此,候选根本原因元素的“潜在得分”是用来衡量该元素的后代叶元素的预期变化和实际变化之间的差异。 详见§IV-B2。 另外,MCTS需要潜在分数作为一个价值函数来指导搜索。
该问题的搜索空间巨大,需要一种有效的搜索算法。 本文的思路是采用一些已知的善于在大空间中搜索的先进算法,而不是像文献 [1]、[2] 那样在小得多的搜索空间中用它们更简单的异常定位来发展有机的启发式算法。 受 AlphaGo 在围棋中成功采用 MCTS 算法文献[4]、[5]的启发,本文的核心思想是将 MCTS 算法作为异常定位算法的基础。 然而,在采用 MCTS 方面仍然存在一个剩余的挑战,我们现在总结我们的核心思想来解决这些问题。
来自图 2我们可以看到,当我们从低层到高层时,长方体中元素 n n n 的数量变得越来越多。例如,在 B P B_P BP 中有36个元素, B P , I B_{P,I} BP,I 中有 36 ∗ 10 36*10 36∗10, B P , I , D , C B_{P,I,D,C} BP,I,D,C 中有 36 ∗ 10 ∗ 6 ∗ 10 36*10*6*10 36∗10∗6∗10。回想根本原因集是长方体的(2n-1)个子集之一。 即使对MCTS来说,搜索如此巨大的空间也不是一件容易的事情。
为了进一步缩小搜索空间,Hotspot 采用了分层剪枝策略。 基本思想是,在搜索较低层之后,HotSpot 会剪除一些不太可能是根本原因元素的元素(在较高层)。 直觉是,如果父元素有一个非常低的潜在得分,每个子元素不太可能是根本原因元素,因此可以剪枝。 这种方法在精神上与关联规则挖掘中的Apriori原理非常相似[3]。 我们称我们的剪枝方法为层次剪枝,因为它的剪枝策略利用了层的层次信息。
HotSpot的核心思想概括如下。 我们把这种异常定位看作是一个空间很大的搜索问题; 采用MCTS作为基本搜索算法; 提出了一个对异常定位具有物理意义的潜在得分度量作为每一集合的潜在度量和MCTS中的值函数; 应用分层剪枝方法(类似于Apriori原则)来减少搜索空间。 搜索从第1层开始,逐层进行,在每个长方体内应用MCTS,如图所示 3.
本部分介绍了Hotspot的详细设计。 HotSpot逐层搜索长方体的集合,即从第1层到第L层(L为层数)。 对于给定层的每一个长方体,Hotspot应用MCTS寻找其具有最大潜在得分(PS)的子集,称为该长方体的最佳集(缩写为BSet)。 当从一层到下一层时,使用分层剪枝。我们重复这个过程,直到层 L L L 被搜索,或者得到根本原因集 R S e t RSet RSet ( p s ( R S e t ) > P T ps(RSet) > PT ps(RSet)>PT),其中 P T PT PT 是指 p s ps ps 的阈值。当 p s > P T ps > PT ps>PT 时,我们认为它足够大,可以被视为根本原因集。最终输出 R S e t RSet RSet 是算法生成的所有 B S e t BSet BSet 中 p s ps ps 最大的 B S e t BSet BSet 。接下来,我们描述一种检测总KPI和预测本节中元素的方法。 然后给出了热点的各个组成部分,即潜在得分、MCTS和分层剪枝。
HotSpot 需要一个异常检测算法(1)来检测总KPI中的异常,算法(2)来计算其他元素的预测值。
我们采用了业界广泛使用的统计算法对总KPI进行异常检测文献 [6]。 均值 μ \mu μ 和标准差 σ \sigma σ 在一个周期中一个时间间隔进行计算(在我们的案例中间隔为 1 分钟),其中的 μ \mu μ 被视为预测值。阈值( T l T_l Tl和T_u分别代表下限和上限)定义如下:
T l = μ − c × σ , T u = μ + c × σ (4) T_l = \mu - c \times \sigma ,\ T_u = \mu + c \times \sigma \tag{4} Tl=μ−c×σ, Tu=μ+c×σ(4)
其中 c c c 是确定上下限的程度的参数(通常设置为2.0)参考文献 [6]。请注意,阈值是定期更新的。 如果实际值超过阈值,则检测异常。 该算法适合于我们的场景,因为1)它非常适合于 addictive KPI数据,因为大多数加性KPI数据是周期性的;2)它计算效率高。
(1) 波纹效应(Ripple effect):我们在表VI中使用了一个新的异常案例来说明根本原因元素的KPI变化是如何根据我们总结的“涟漪效应”传播到其他元素的。 ( B e i j i n g , ∗ ) (Beijing, *) (Beijing,∗) 的 PV 值从 30( f ( B e i j i n g , ∗ ) f(Beijing, *) f(Beijing,∗))下降到 12,并且 ( B e i j i n g , ∗ ) (Beijing, *) (Beijing,∗) 是本例中唯一一个 根因元素(其他的没有变化)。由于 v ( B e i j i n g , ∗ ) v(Beijing,*) v(Beijing,∗) 是由它的后代元素 v ( B e i j i n g , M o b i l e ) v(Beijing,Mobile) v(Beijing,Mobile) 和 v ( B e i j i n g , U n i c o m ) v(Beijing, Unicom) v(Beijing,Unicom) 聚合而成的,它们一定发生了相应的变化。 注意它们的变化值, h ( B e i j i n g , ∗ ) = 18 h(Beijing, *) =18 h(Beijing,∗)=18, h ( B e i j i n g , M o b i l e ) = 12 h(Beijing, Mobile)=12 h(Beijing,Mobile)=12, h ( B e i j i n g , U n i c o m ) = 6 h(Beijing, Unicom) = 6 h(Beijing,Unicom)=6。我们通过公式 f ( B e i j i n g , M o b i l e ) − h ( B e i j i n g , ∗ ) × f ( B e i j i n g , M o b i l e ) f ( B e i j i n g , ∗ ) f(Beijing, Mobile)- h(Beijing,*)\times \frac{f(Beijing, Mobile)}{f(Beijing, *)} f(Beijing,Mobile)−h(Beijing,∗)×f(Beijing,∗)f(Beijing,Mobile) 可以得出实际值 v ( B e i j i n g , M o b i l e ) = 8 v(Beijing, Mobile)=8 v(Beijing,Mobile)=8 的比例份额。此外, h ( B e i j i n g , M o b i l e ) h(Beijing, Mobile) h(Beijing,Mobile) 反过来也促进了 v v v 的变化 v ( ∗ , M o b i l e ) v( *, Mobile) v( ∗,Mobile)。
上面的示例说明了根本原因元素是如何影响其后代元素(在LEAF中)和其他共享其共同后代元素的元素的。通常,当根本原因元素的值增加或减少时,它遵循如下波动效应特性:
设 x x x 表示不在 L E A F LEAF LEAF 中的元素,即 x ∉ L E A F x \notin LEAF x∈/LEAF。设 x i ′ x_{i}^{\prime} xi′ 表示 x x x 在 L E A F LEAF LEAF 中的后代元素,即 x i ′ ∈ D e s c ′ ( x ) x_{i}^{\prime} \in {Desc}^{\prime}(x) xi′∈Desc′(x)。当 x x x 的 PV 值通过 h ( x ) h(x) h(x) 改变以后,即 h ( x ) = f ( x ) − v ( x ) h(x)=f(x)-v(x) h(x)=f(x)−v(x), x i ′ x^{\prime}_i xi′ 将根据他们的预测值的比例得到其 h ( x ) h(x) h(x) 的份额,即,
v ( x i ′ ) = f ( x i ′ ) − h ( x ) × f ( x i ′ ) f ( x ) , ( f ( x ) ≠ 0 ) . (5) v\left(x_{i}^{\prime}\right)=f\left(x_{i}^{\prime}\right)-h(x) \times \frac{f\left(x_{i}^{\prime}\right)}{f(x)},(f(x) \neq 0) . \tag{5} v(xi′)=f(xi′)−h(x)×f(x)f(xi′),(f(x)=0).(5)
然后使用 公式 1 更新 x i ′ x_{i}^{\prime} xi′ 祖先的所有其他元素 e e e。上面的涟漪效应描述了根本原因只包含一个元素的情况。 当涉及到一个集合(两个或多个元素)时,我们可以为每个元素重用该属性。
(2) 潜在得分(Potential Score): 涟漪效应揭示了根本原因集如何影响许多其他元素的值。 因此,为了衡量一个集合的潜在性是根本原因,我们建议1)假设集合 S S S 是根本原因,2) 根据波纹效应推导叶中后代元素的新PV值,3) 将所有实际PV值与新推导的叶元素PV值进行比较。 两种值越接近,该集合就越有可能成为根本原因集。
设 y 1 , y 2 , y 3 , … , y n y_{1}, y_{2}, y_{3}, \ldots, y_{n} y1,y2,y3,…,yn 表达 L E A F LEAF LEAF 中所有元素。我们用 a ( y i ) a(y_i) a(yi) 表示一个假定的根因集 S S S 的新推导的 PV 值。我们计算两种条件下的 a ( y i ) a(y_i) a(yi) 的值:
设 a ⃗ \vec{a} a 表示 a ( y i ) a(y_i) a(yi) 组成的向量,即 a ⃗ = [ a ( y 1 ) , a ( y 2 ) , … , a ( y n ) ] \vec{a} = [a(y_1), a(y_2), \ldots ,a(y_n)] a=[a(y1),a(y2),…,a(yn)]。类似地,设 v ⃗ = [ v ( y 1 ) , v ( y 2 ) , … , v ( y n ) ] \vec{v} =[v(y_1), v(y_2), \ldots ,v(y_n)] v=[v(y1),v(y2),…,v(yn)], f ⃗ = [ f ( y 1 ) , f ( y 2 ) , … , f ( y n ) ] \vec{f}=[f(y_1), f(y_2), \ldots ,f(y_n)] f=[f(y1),f(y2),…,f(yn)]。
接着我们定义集合 S S S 的潜在得分(Potential Score, ps)为:
P o t e n t i a l S c o r e = max ( 1 − d ( v ⃗ , a ⃗ ) d ( v ⃗ , f ⃗ ) , 0 ) (6) Potential Score =\max \left(1-\frac{d(\vec{v}, \vec{a})}{d(\vec{v}, \vec{f})}, 0\right) \tag{6} PotentialScore=max(1−d(v,f)d(v,a),0)(6)
其中, d ( u ⃗ , w ⃗ ) d(\vec{u}, \vec{w}) d(u,w) 表示向量 u ⃗ \vec{u} u 和 w ⃗ \vec{w} w 之间的距离。这里我们采用欧几里得距离:
d ( u ⃗ , w ⃗ ) = ∑ i ( u i − w i ) 2 (7) d(\vec{u}, \vec{w})=\sqrt{\sum_{i}\left(u_{i}-w_{i}\right)^{2}} \tag{7} d(u,w)=i∑(ui−wi)2(7)
集合的潜在得分范围为0~1,即[0,1]。 如果一个集合有更高的得分,它将被认为有更高的潜力成为根本原因。
上述潜在分数的定义是“全局”的,即任意两个元素集都可以比较它们的潜在分数,以确定哪一个具有更大的潜在分数。 这在MCTS中起到了很好的价值函数的作用。
当两个元素集具有相同的潜在得分时,我们遵循一个“简洁”原则。 也就是说,元素数目较少的元素获胜,要么遵循奥卡姆剃刀原理[1],要么因为一个集合中的元素集体是另一个集合中的元素的祖先(首选为根本原因)。
(3) 一个示例:现在我们说明如何根据 表5 中案例的潜在得分来找到根本原因。长方体由 B p B_p Bp, B I B_I BI 和 B P , I B_{P,I} BP,I 组成。 首先会找到每个长方体的最佳集合(这个长方体潜在得分最大的子集)。 接下来,我们通过比较最佳集合来选择根本原因集合。 y ⃗ \vec{y} y 按照如下顺序代表:[(Bei jing;Mobile); (Shanghai;Mobile); (Guangdong;Mobile); (Bei jing;Unicom); (Shanghai;Unicom); (Guangdong;Unicom )], f ⃗ = ( 20 , 15 , 10 , 10 , 25 , 20 ) \vec{f}=(20,15,10,10,25,20) f=(20,15,10,10,25,20), v ⃗ = ( 14 , 9 , 10 , 7 , 15 , 20 ) \vec{v}=(14,9,10,7, 15, 20) v=(14,9,10,7,15,20)。对于长方体 B P B_P BP,它包含三个元素(Beijing,*)、(Shanghai,*)和 (Guanguone,*),所以所有的子集都是 S p 1 = { ( B e i j i n g , ∗ ) } S_{p1}=\{(Beijing,*)\} Sp1={(Beijing,∗)}, S p 2 = { ( S h a n g h a i , ∗ ) } S_{p2}=\{(Shanghai,*)\} Sp2={(Shanghai,∗)}, S p 3 = { ( G u a n g d o n g , ∗ ) } S_{p3}=\{(Guangdong,*)\} Sp3={(Guangdong,∗)},KaTeX parse error: Expected '}', got 'EOF' at end of input: …,(shanghai,*)\}, S p 5 = { ( B e i j i n g , ∗ ) , ( g u a n g u o n , ∗ ) } S_{p5}=\{(Beijing,*),(guanguon,*)\} Sp5={(Beijing,∗),(guanguon,∗)}, S p 6 = { ( S h a n g h a i , ∗ ) , ( g u a n g u o n , ∗ ) } S_{p6}=\{(Shanghai,*),(guanguon,*)\} Sp6={(Shanghai,∗),(guanguon,∗)} 和 S p 7 = { ( B e i j i n g , ∗ ) , ( s h a n g h a i , ∗ ) , ( g u a n g u o n , ∗ ) } S_{p7}=\{(Beijing,*),(shanghai,*),(guanguon,*)\} Sp7={(Beijing,∗),(shanghai,∗),(guanguon,∗)}。 以集合 S p 1 S_{p1} Sp1 为例,根据公式 5 我们可以推导出 a ⃗ ( S p 1 ) ) = ( 14 , 15 , 10 , 7 , 25 , 20 ) \vec{a}(S_{p1})) =(14,15,10,7,25,20) a(Sp1))=(14,15,10,7,25,20),从而可以计算 p s ( S p 1 ) = 0.13. ps(S_{p1})=0.13. ps(Sp1)=0.13.。实际上,我们可以发现 S p 4 S_{p4} Sp4 和 S p 7 S_{p7} Sp7 都有最大的 p s ps ps 值, p s ( S p 4 ) = p s ( S p 7 ) = 1 ps(S_{p4})=ps(S_{p7})=1 ps(Sp4)=ps(Sp7)=1。 总而言之, S p 4 S_{p4} Sp4 是 B p B_p Bp 中最好的集合。类似地,可以得到 B I B_I BI 和 B P , I B_{P,I} BP,I 中的最佳集合, S i 3 = { ( ∗ , M o b i l e ) , ( ∗ , U n i c o m ) } S_{i3}=\{(*, Mobile), (*, Unicom)\} Si3={(∗,Mobile),(∗,Unicom)}, p s ( S i 3 ) = 0.47 ps(S_{i3})=0.47 ps(Si3)=0.47( a ⃗ ( S i 3 ) = ( 14 , 9 , 10 , 7 , 15 , 20 ) \vec{a}(S_i3)=(14,9,10,7,15,20) a(Si3)=(14,9,10,7,15,20)), S p i 1 = { ( B e i j i n g , M o b i l e ) , ( B e i j i n g , U n i c o m ) , ( S h a n g h a i , M o b i l e ) , ( S h a n g h a i , U n i c o m ) } S_{pi1}=\{(Bei jing,Mobile), (Bei jing,Unicom), (Shanghai,Mobile), (Shanghai,Unicom)\} Spi1={(Beijing,Mobile),(Beijing,Unicom),(Shanghai,Mobile),(Shanghai,Unicom)}, p s ( S p i 1 ) = 1 ps(S_{pi1})=1 ps(Spi1)=1( a ⃗ ( S p i 1 ) = ( 14 , 9 , 10 , 7 , 15 , 20 ) \vec{a}(S_{pi1})=(14,9,10,7,15,20) a(Spi1)=(14,9,10,7,15,20))。比较三个最优集, S p 4 S_{p4} Sp4 是 p s ps ps 最大、最简洁的结果集。
上面的例子说明了我们使用潜在分数来识别根本原因集的核心思想。 实际上,元素太多了,所以可能的集合数量非常大,尤其是在较高层的长方体中。 为了解决这个问题,我们采用了MCTS算法和层次剪枝策略,这将在下面介绍。 同时,利用这两种方法可以得到简洁的结果。
对于给定的长方体 B B B,我们想要获得最佳集(这个长方体潜在得分最大的子集)。 假定 E ( B ) E(B) E(B) 中有 n n n 个元素。 在B中对根原因集的搜索空间是2n-1,对于大 n n n 来说,这显然是非常大的。 HotSpot 采用 MCTS 主要是为了应对搜索空间爆炸的挑战。
MCTS是一种启发式方法,通过在决策空间中抽取随机样本,根据已有的随机样本的结果建立搜索树,在给定的决策域中搜索最优决策。 在很高的层次上,MCTS试图平衡沿着那些有希望的分支的开发和沿着那些未被开发的分支的开发。 它在人工智能(AI)领域被广泛应用于可以表示为顺序决策树的领域,特别是游戏和规划问题[4],如 AlphaGo[5]。
在MCTS中,每个节点代表一个状态 S S S(根可以看作是️ ∅ \varnothing ∅)。 一个行动空间 A ( S ) A(S) A(S) 包含在 S S S 上可以采取的所有法律行动。 通过采取合适的行动,算法可以经过路径 ( s , a ) (s, a) (s,a) 从一个状态 s s s 移动到另外一个,记作 a ∈ A ( s ) a \in A(s) a∈A(s)。可以有与边相关联的变量,算法使用这些变量来指示在状态 s s s 采取行动 A A A 的 “value”。
我们采用MCTS来解决长方体的异常定位问题,如下所示。 我们首先对这个长方体中的每个 e e e 计算 p s ( e ) ps(e) ps(e) ,并根据 p s ( e ) ps(e) ps(e) 对所有 e e e 进行排序。每个状态 s s s 对应于当前正在探索的候选根本原因集 S ( s ) S(s) S(s)。 N ( s ) N(s) N(s) 是 s s s 被访问的次数。 我们为每个边 ( s , a ) (s,a) (s,a) 设置三个变量。 N ( s , a ) N(s,a) N(s,a) 是访问计数,即该边(s,a)被访问的次数。 p s ( S ( s ) ) ps(S(s)) ps(S(s)) 是集合 S ( s ) S(s) S(s) 的得分。 假定 S S S 在 ( S , A ) (S,A) (S,A) 之后跃迁到 S ′ S^\prime S′。 则边 ( S , A ) (S,A) (S,A) 的作用值 Q ( s , a ) = max u ∈ { s ′ } ∪ descendent ( s ′ ) p s ( S ( u ) ) Q(s, a)=\max _{u \in\left\{s^{\prime}\right\} \cup \text { descendent }\left(s^{\prime}\right)} p s(S(u)) Q(s,a)=maxu∈{s′}∪ descendent (s′)ps(S(u)),该作用值等于树中 S ′ S^{\prime} S′ 及其子节点的最大潜在得分。 对于每个 S S S 将 Q ( s , a ) Q(s, a) Q(s,a) 初始化为 P S ( S ( s ) ) PS(S(s)) PS(S(s))。
现在我们来说明MCTS迭代在我们的异常定位中的四个步骤。 假设在当前迭代开始时,状态树如图所示 4(a)。
(a) 选择 此步骤的目标是从当前状态树中选择一个要展开的节点。 每次执行此步骤时,树遍历总是从根状态开始。 假设在这个选择步骤中我们已经前进到当前状态 s s s。如果 A ( s ) A(s) A(s) 中的所有动作都在以前的迭代中被访问过,则通过使用上限置信阈值(Upper Confidence thresholds, UCB)算法 [7],从可用动作 A ( s ) A(s) A(s) 的集合中选择动作 a a a,如公式8所示。
a = arg max a ∈ A ( s ) { Q ( s , a ) + C ln N ( s ) N ( s , a ) } . (8) a=\underset{a \in A(s)}{\arg \max }\left\{Q(s, a)+C \sqrt{\frac{\ln N(s)}{N(s, a)}}\right\} . \tag{8} a=a∈A(s)argmax{Q(s,a)+CN(s,a)lnN(s)}.(8)
Q ( s , a ) Q(s,a) Q(s,a) 是采取移动 a a a 的值。 Q ( s , a ) Q(s,a) Q(s,a) 值越高,在该选择步骤中选择移动 a a a 的机会越大,这是 MCTS 中的利用机制。 等式的第二部分只是用于探索的标准 UCB 机制。 可以通过修改 C C C 来改变利用与研究(exploitation and exploration)之间的平衡,一个常用的 C C C 值是 2 \sqrt{2} 2 文献[8],我们在本文中选择这个值,也可以在实践中根据经验选择这个值。
如果存在根本没有被用过的动作 a ∈ A ( s ) a \in A(s) a∈A(s),因为 N ( s , a = 0 N(s, a=0 N(s,a=0 所以不能应用公式 8 。相反,我们将采取未访问操作的概率指定为 R = ( 1 − Q ( s , a m a x ) ) R=(1-Q(s,a_{max})) R=(1−Q(s,amax)),其中 a m a x = arg max a ∈ A ( s ) ∩ N ( s , a ) = 0 Q ( s , a ) a_{max} = \argmax_{a\in A(s)\cap N(s,a)=0}Q(s,a) amax=a∈A(s)∩N(s,a)=0argmaxQ(s,a)。
选择步骤从树的根部开始,并在根据公式8选择叶子状态时停止或者选择一个未访问的动作。比如,在图4(a) 中的实线包含的部分,选择叶状态 { e 1 , e 3 } \{e_1,e_3\} {e1,e3} 时停止选择。
(b) 扩展 在选择步骤中选择状态 S S S 之后,我们通过添加一个新节点 S ′ S^\prime S′ 来扩展蒙特卡罗树, 其中 S ( s ′ ) = S ( s ) ∪ { e ∗ } S\left(s^{\prime}\right)=S(s) \cup\left\{e^{*}\right\} S(s′)=S(s)∪{e∗} , e ∗ = arg max e ∈ { e 1 , e 2 , … , e n } − S ( s ) p s ( e ) e^{*}=\arg \max _{e \in\left\{e_{1}, e_{2}, \ldots, e_{n}\right\}-S(s)} p s(e) e∗=argmaxe∈{e1,e2,…,en}−S(s)ps(e)。 我们选择 e ∗ e^{*} e∗使其具有剩余元素中最大的 p s ( s ) ps(s) ps(s) 值,而不是随机选择 e ∗ e^{*} e∗。比如,在图4(b)中, S ( s ) = { e 1 , e 3 } S(s)=\{e_1,e_3\} S(s)={e1,e3} 被选中后, e ∗ = e 4 e^{*}=e_4 e∗=e4 会被添加,得到 s ′ s' s′ ,并且 S ( s ′ = { e 1 , e 3 , e 4 } S(s'=\{e_1,e_3,e_4\} S(s′={e1,e3,e4}。
( c ) 评估 为了初始化扩展后的新节点(如图4©中的 { e 1 , e 3 , e 4 } \{e_1,e_3,e_4\} {e1,e3,e4}),我们计算其 p s ps ps, Q Q Q 和 N N N。
(d) Backup 从 S ′ S^{\prime} S′ 到根的路径上的所有节点上的动作值 Q Q Q 和访问计数 N N N 都将更新,如图4(d) 中的粗体箭头所示,回想 Q Q Q 的定义,沿着这条路径,我们只有当子节点的 Q Q Q 大于父亲的 Q Q Q 时才更新父亲的 Q Q Q。
在长方体中本地化根本原因集。 我们在每个长方体中应用MTCS,对此我们迭代执行上述四个步骤,直到至少出现以下三个条件之一:
在第二个终止条件和第三个终止条件下,如果我们没有得到一个 P S PS PS 大于 P T PT PT 的集合,我们将返回 P S PS PS 最大的 B S e t BSet BSet 作为 R S e t RSet RSet。
为了进一步减少高层长方体的搜索空间,Hotspot采用了分层剪枝策略。 其基本思想是,Hotspot 逐层搜索长方体,即从第1层到第 L L L 层,在搜索到较低的一层后,在较高的一层中剪除一些不太可能是根本原因的元素。
对于层 L L L ( 1 ≤ l ≤ L 1\leq l \leq L 1≤l≤L) 中的每一个长方体 B B B,利用 MCTS 算法可以得到最优集(该长方体潜在得分最大的子集) B S e t l , B {BSet}_{l,B} BSetl,B。 我们的直觉如下。 如果 l + 1 l+1 l+1 层中的一个元素 ( p 1 , i 1 , ∗ , ∗ ) (p_1,i_1,*,*) (p1,i1,∗,∗) 具有较高的潜在得分,那么它在 l l l 层中的父元素 ( P 1 , ∗ , ∗ , ∗ ) (P_1,*,*,*) (P1,∗,∗,∗) 和 ( ∗ , i 1 , ∗ , ∗ ) (*,i_1,*,*) (∗,i1,∗,∗) 也将具有相对较高的潜在得分。 因此,如果父元素的潜在得分很低,那么每个子元素都不太可能是根本原因元素,尽管可能有很少的情况,子元素 a a a 的潜在得分确实高于其父元素,但其他一些子元素 b b b 的 PV 变化抵消了 a a a 对父元素潜在得分的影响。 因此,如果层 l l l 中的一个元素不在 B S e t l , b BSet_{l,b} BSetl,b 中,HotSpot会选择剪除它的所有子元素。 这种方法在思路上与关联规则挖掘中的Apriori原理非常相似[3]。 我们称我们的剪枝方法为层次剪枝,因为它的剪枝策略利用了层的层次信息。
我们以表7中的一个例子来说明我们在图5的分层剪枝方法。假设我们在第1层,使用 MCTS 获得的最佳集合是 B S e t 1 , B P = { ( F u j i a n , ∗ ) , ( J i a n g s u , ∗ ) } BSet_{1,B_P}=\{(Fujian,*),(Jiangsu,*)\} BSet1,BP={(Fujian,∗),(Jiangsu,∗)} 和 p s ( B S s e t 1 , B l = { ( ∗ , M o b i l e ) , ( ∗ , U n i c o m ) } ps(BSset_{1,B_l}=\{(*,Mobile),(*, Unicom)\} ps(BSset1,Bl={(∗,Mobile),(∗,Unicom)} 其中, p s ( B S s e t 1 , B l = 0.32 ps(BSset_{1,B_l}=0.32 ps(BSset1,Bl=0.32 。 在第2层搜索长方体时,由于元素 ( Z h e j i a n g , U n i c o m ) (Zhejiang, Unicom) (Zhejiang,Unicom) 和 ( Z h e j i a n g , U n i c o m ) (Zhejiang, Unicom) (Zhejiang,Unicom) 的父元素 ( Z h e j i a n g , ∗ ) (Zhejiang, *) (Zhejiang,∗) 不在第1层的 BSets 中,所以我们对元素 ( Z h e j i a n g , U n i c o m ) (Zhejiang, Unicom) (Zhejiang,Unicom) 进行剪枝。 因此,我们只需要搜索剩下的四个元素来寻找 B P , I B_{P,I} BP,I。 这样,潜在集的数量将从 63 减少到 15( 2 6 − 1 2^6-1 26−1 到 2 4 − 1 2^4-1 24−1)。 然后在第2层再次使用MCTS,得到 R S e t = B S e t 2 , B P , I = { ( F u j i a n , M o b i l e ) , ( J i a n g s u , U n i c o m ) } RSet=BSet_{2,B_{P,I}}=\{(Fujian, Mobile),(Jiangsu,Unicom)\} RSet=BSet2,BP,I={(Fujian,Mobile),(Jiangsu,Unicom)},其中 p s ( B S e t 2 , B P , I ) = 1 ps(BSet_{2,B_{P,I}})=1 ps(BSet2,BP,I)=1。
我们现在总结我们的总体热点算法,其伪代码如算法1所示。 HotSpot以元素的 PV 值、潜在阈值 P T PT PT 和最大迭代次数 $M作为输入。 它从第1层开始,对于给定层的每个长方体,Hotspot应用MCTS来找到其最佳集合。 当从一层到下一层时,使用分层剪枝。 我们重复这个过程,直到搜索到层 L L L,或者得到根本原因集 R s e t ( P s ( R s e t ) > P T ) Rset(Ps(Rset)>PT) Rset(Ps(Rset)>PT)。 最终输出的 R S e t RSet RSet 是算法生成的所有 B S e t BSet BSet 中 P S PS PS 最大的 B S e t BSet BSet。
算法步骤描述清晰,代码中还添加了注解,容易理解,这里不复介绍。
论文源码未公开,目前只能在 github 上找到一个相关的代码可以参考一下,https://github.com/junkfei/Multidimensional_root_cause_analysis/tree/4bf4865e8f633e88f3af91f684bbb12ac24d471c
代码并非论文源码,仅供参考。
论文强调的是如何找到异常原因,并且定位到异常发生根因。这个与我们之前提到的论文均不相同,但这类型的算法是非常有意义的。工业场景下异常发生后除了及时修复问题,减少异常带来的损失,还应该定位到哪个步骤出了问题,并不断总结,优化常常出问题的步骤。
所以如果在其他方向上找不到可以发论文的点,不妨考虑这个方向。
没能找到合适的代码,给各位小伙伴们道歉 ~ 不过希望读者查查资料,了解论文原理,并且想想自己是否可以参考这个思路进行创新,创造属于自己的可靠方法。
Smileyan
2022.11.30 22:57