首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我们不一样!告诉你百度是如何做智能流量异常检测的

作者简介

牧之 百度云高级研发工程师

负责百度云Noah智能异常检测算法相关工作,在自动异常检测、智能故障诊断等方向有广泛的实践经验。

干货概览

今天我们将从流量异常检测难点入手,分析常见流量检测方法存在的问题,然后重点介绍百度云智能运维产品(Noah)所使用的一类智能异常检测算法,基于鲁棒回归与泊松分布的流量异常检测算法。文章最后也附上了百度云Noah智能异常检测算法试用申请地址,欢迎大家试用。

流量异常检测的难点

流量异常检测主要有以下三个难点:

流量的大小会随着用户行为发生变化。对于大部分百度云上的业务,白天的访问流量较高,深夜的访问流量较低。这使得流量水位值存在上下文相关性,白天水位高,夜晚水位低,不断波动变化。这就需要算法能够区分流量的正常波动变化与异常波动变化,准确的检测异常流量。

对于所有百度云上用户而言,运维工程师关心系统本身的故障,需要及时检测到流量的突降异常,而安全工程师关心攻击、抓取和爬虫,更多地关心流量是否存在突升异常。这就要求算法有能力区分当前流量的异常类型,精准地给出流量的预测值。

流量也会受到业务逻辑调整的影响,流量水位会出现上涨或者下跌后不恢复的现象。需要算法能够及时适应这种变化,否则就会导致持续的误报。

流量异常检测模型

我们从上述难点出发,将流量异常检测分为预测与检测两个阶段。预测阶段需要克服异常流量的影响,对流量进行精准预测,检测阶段需要计算真实值与预测值之间的差异,当差异显著大于通常情况时,即可判定当前实际流量出现了异常。

常见预测算法的问题

比较简单的预测算法是移动平均算法

时序流量数据定义为,t代表不同的时刻。移动平均算法使用当前窗口内w个数据的均值作为窗口内最后一个点的预测值,即

。如下图所示,棕色线是移动平均算法的预测结果,蓝色线是原始的流量曲线。可以看到移动平均算法的预测趋势落后于实际的趋势,对于上涨过程中的突降可能会造成漏报。

另外,在下降过程中,移动平均算法会认为数据一直存在下跌,下降过程中又容易造成误报。

移动平均算法简单地将窗口内数据的均值作为下一个点的预测值,没有考虑到窗口内的数据趋势,导致预测的趋势总是滞后于实际趋势,预测的结果不准确。

观察流量数据能够发现局部窗口内符合线性趋势,因此,我们考虑使用线性回归的方法预测流量值。局部窗口内的线性表达式为,其中为窗口内每个点的预测值,t为不同时刻,k、b为直线的斜率和截距。对于窗口内n个数据点使用最小二乘法来最小化损失函数,可以求得k、b参数,然后即可预测窗口内最后一个点的流量值。

实验发现,线性回归方法容易受到异常点的影响。上图中蓝色曲线为某一个窗口内的数据,窗口内后半部分出现了突升异常。理想的拟合结果应该不受突增异常影响,如图中粉色直线所示。而线性回归的拟合结果受到了异常点的影响,预测水位偏高,如图中红色直线所示。当曲线中的异常值较多时,线性回归的预测结果会出现如下图棕色线所示的不符合预期的波动。由于线性回归的损失函数是二次函数,所以异常点带来的影响被放大,导致拟合的结果偏离理想结果。

鲁棒回归算法

由于线性回归的二次损失函数放大了异常点的影响,因此我们考虑了将二次函数缩小为一次函数,减弱异常点影响。将损失函数改成如下:

但不可导,没有确定的解析解,可以使用

Interatively reweighted least squares

(https://en.wikipedia.org/wiki/Iteratively_reweighted_least_squares)

优化方法得到相对的最优解。这样在预测过程中就可以弱化突增、突降等异常点的影响,得到比较理想的预测结果。

如下图所示,图中蓝色曲线为原始流量曲线,红色曲线为鲁棒回归算法的预测结果,黑色曲线为移动平均算法的预测结果。可以看到原始流量存在较多的突增异常,移动平均算法受异常点的影响预测效果较差,异常流量位置的预测值偏离理想值。从箭头所指向的局部拟合效果图中可以看到,鲁棒回归算法没有受到这些异常点的影响,在流量的突升、突降位置都能够给出理想的预测值。

常见检测算法的问题

有了精准的预测结果,接下来需要根据预测结果检测流量是否出现异常。最简单的检测算法是直接计算真实值与预测值之间的残差,得出真实值与预测值的绝对误差,以此来表征流量是否出现了异常。然而此检测方法没有考虑流量本身大小的因素,例如当残差为-100时,如果此时流量的预期值为200,意味着系统很可能出现了故障;如果流量预期为10000,那么-100的残差可能只是观测白噪声。所以使用基于残差的检测方法,需要我们针对不同的系统流量设置不同的阈值。

基于残差的方法没有考虑到不同系统流量的差异,因此也有人对流量的残差进行归一化,计算相对残差,即

,但此方法仍然存在一定的问题。例如百度大部分系统服务白天流量大,相对波动小,下跌10%可能意味着比较严重的问题,而深夜流量小,相对波动大,下跌30%才有可能意味着系统存在故障。所以基于相对残差的检测方法也不能够设置统一的阈值来检测异常。

泊松分布检测算法

由于基于残差与相对残差的检测方法都不能够设置统一的检测阈值,所以我们考虑从概率的角度来设置恒定的检测阈值。系统大部分时间都处于正常状态,正常流量出现的概率远远大于异常流量,可以通过流量出现的概率大小来检测异常流量。

要计算流量出现的概率,首先要找到合适的分布来描述流量。我们知道流量是系统一段时间内接受到的请求次数,而泊松分布是描述单位时间内随机事件发生次数的概率分布,因此可以用泊松分布对流量进行建模。泊松分布的概率函数为,其中是t时刻的真实流量值,是鲁棒回归预测出的t时刻的流量值。当检测是否为突降异常时,可以根据泊松分布计算流量值小于等于的概率,当此概率小于设定的概率阈值时,我们认为此时发生了突降异常。但这个概率的计算涉及阶乘求和等操作,会耗费较多的计算资源,需要简化计算过程。我们知道当较大时,可以用正态分布近似表示泊松分布,此时。然后可以计算统计量

,对统计量z设置恒定的检测阈值m来判断是否存在突降异常。

突降异常的检测结果如下图所示,第一幅图中蓝色曲线为原始流量数据,橘色曲线为鲁棒回归算法预测结果,红色点为检测出的突降异常,第二幅图中蓝色线是根据真实流量与预测流量计算出的z统计量值,红色直线为设置的检测阈值。从图中可以看到,在z统计量上设置恒定阈值即可检测异常流量。

目前,本文的算法已经在百度云Noah智能运维系列产品之霍莉(Horae)异常检测平台上开放试用,Horae覆盖时序数据异常检测实验运行的整个生命周期,包含数据标注、算法实验、离线评估、后验评估等过程。欢迎大家申请试用,申请地址http://aiops.baidu.com/#/product/intelligentProduct。

总结展望

本文介绍了AIOps智能运维领域中的一个典型场景——智能流量异常检测。在分析其背景和难点,并对比介绍了一些常见的流量预测、检测方法之后,我们为大家重点介绍了百度云智能运维产品(Noah)中的一种智能异常检测算法——基于鲁棒回归与泊松分布的时序流量异常检测算法。一方面,基于鲁棒回归的预测算法,可以不受异常点的影响,精准地预测流量水位值;另一方面,基于泊松分布的检测算法,可以从概率的角度对流量建模,能够使用简单的恒定阈值来精准地检测流量异常。

当然,每类智能异常检测算法都有其场景特征和局限性:

(1)该算法对相对平缓的异常趋势变化不敏感,因为我们每次是对局部窗口的数据进行鲁棒回归来预测窗口最后一个点流量值,没有使用足够的历史数据来判断当前的平缓趋势变化是否正常。

(2)如果异常持续时间超过鲁棒回归窗口长度,可能会出现误报。例如,检测突降异常时,当突增的持续时间超过拟合窗口时,鲁棒回归算法会跟随上这种突增变化,这样就容易在突增恢复正常时造成突降的误报。

当然,为了解决上述问题,我们在霍莉(Horae)异常检测平台中,还实现了智能同比检测等算法,在后续的文章中会详细介绍,敬请期待!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180803G1K9PZ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券