1 背景在蚂蚁集团智能监控领域,时序异常检测是极重要一环,异常检测落地中,业务方参考业界标准输出 Metrics 指标数据,监控不同业务、应用、接口、集群的各项指标,包含 Metrics 指标(总量、失败量、耗时等)和系统服务指标(CPU、MEM、DISK、JVM、IO 等)。早期的时序异常检测是由 SRE 结合长期运维经验通过配置专家规则来完成,随着 AI 技术的普及,异常检测逐步 AI 化,在现实场景中,AI 算法常常面临如下挑战:
图1 耗时时序曲线本文基于 CNN 神经网络方向进行了一些探索,在保证检测准确率与召回率的同时,也能保证模型有较好的泛用性。二 算法调研下图整理出部分时序数据异常检测涉及算法,这里不一一详述,有兴趣自行查询相关算法原理。
图2 异常检测相关算法从是否依赖标注训练样本的角度看,算法主要分为有监督和无监督两个方向(半监督这里就不介绍了)。无监督算法免去了标注样本耗费的大量人力,适合冷启动,但最终还需算法开发人员持续调参去寻找最优分类决策平面,在调参过程中还需兼顾不同监控业务的自身特点;有监督算法则相反,但往往模型可解释性较差,日常运维中用户会经常询问:为啥告警/为啥没告警,运维人员这时可能会风中凌乱,同时不同业务 owner 对异常评判的标准是存在差异的,如果不能在异常评判的标准上达成一致,使用有监督算法往往需为不同的评判标准维护多套样本集。CNN 的卷积层在提取异常波形特征上有明显的优势,复杂度合适的全连接层理论上也可拟合出所有的非线性关系;还有一点,网络结构的设计是一件灵活的工作,算法工程师有较大的发挥空间,而非仅仅涉及调参。三 算法原理此章从特征工程,样本增强,神经网络设计三部分介绍基于 CNN 模型方案,还是以耗时指标为例进行说明。 特征工程不同样本的均值/方差/趋势差异明显,需要将原始时序数据映射到统一量纲的空间。模型原始输入为5组输入通道:
图3 处理前后对比去均值均值体现了时序数据在统计时段内水位,在真实样本中,当日均值与往期同比时段均值是不相等的,需要对齐水位。对每组输入通道中时序数据取中位数,以中位数为0点进行平移,注意是中位数不是统计均值。
图4 处理前后对比关于为何使用中位数,而不使用统计均值,使用均值会出现下图所示问题,没达到对齐效果。
图5 中位数和统计均值差异提取趋势基线滑动平均,滚动窗口提取参考时段内的趋势基线,需要对窗口内数据集进行一定比率的去噪。
图6 提取趋势基线去趋势做个简单的映射操作,真实值-趋势基线值,提取出去趋势后的残差时序。
图7 去趋势标准化对残差时序做一个标准化操作。
图8 标准化数据截取通过上述几个步骤,将当日与往期共5个通道时序数据映射到了新的空间;在进行异常检测时,由于只需检测当前时刻是否异常,所以送入神经网络的当日时序输入只需截取最近 c 分钟即可,在作者实践中,c=7。 数据增强模型训练前,可以做适量的数据增强,不仅能提升模型泛用性,还能在训练收敛过程中更容易提取到异常波形特征,对准确/召回率有比较大的提升。数据增强在特征工程之后。
图9 交换通道输入
图10 修改当前时刻值
图11 修改当天输入向量
图12 模拟周期事件 神经网络设计相比于复杂的图像识别,异常波形的图像特征要简单的多,在满足准召率的前提下,尽可能用更少的隐层,更少的参数去解决问题,模型结构中有2个关键点:
模型结构打印,表格中各 Layer 详细定义可以参考模型 Keras 定义代码,整个网络结构较简洁,这里不再详述各层定义,训练使用 loss为binary_crossentropy,模型输出为一个标量 y,y > 0.5 为正,阈值可自行设置去控制模型对异常检测的敏感度。
图13 网络结构四 效果评估 标注样本集评估结果训练样本集规模10000+,大部分样本为数据增强生成,原始标注样本1000+,正负样本比例约1:2。当前在训练样本集上准确率可达 98.9%,因为打标数据中有一些模棱两可的标注数据,不同的业务人员判断很难达到统一,通过提高模型复杂度去强行拟合训练样本集,这样可能会影响模型的泛用性。
实测结果与分析最近一期评审数据:准确78%,召回96%,误报主要原因分析:
图14 检测的异常五 当前面临的一些问题和思考
- 每日不同时段,业务时序曲线呈现不同的局部均值/方差特性;
- 特殊日期如大型节假日、大促日,时序数据与日常差异巨大,甚至与往年同期也存在不小差异;
- 每日或间隔几日固定时间段中随机时刻发生的偏定时事件;
- 海量监控业务,很难针对单独指标一一建模;


- 当日数据:前 n 分钟到当前预测时间点时序数据;
- 同比数据(前1天):1天前当前时刻为参考点,前 n 分钟到后 m 分钟内时序数据;
- 同比数据(前2天):2天前当前时刻为参考点,前 n 分钟到后 m 分钟内时序数据;
- 同比数据(前7天):7天前当前时刻为参考点,前 n 分钟到后 m 分钟内时序数据;
- 同比数据(前14天):14天前当前时刻为参考点,前 n 分钟到后 m 分钟内时序数据;
- 消除了不同日期时序数据水位差异带来的影响;
- 消除了不同日期时序数据抖动幅度差异带来的影响;
- 消除了不同指标的值域范围差异带来的影响;






- 交换往期参考日输入通道的数据,如下例中就交换了 y7 和 y14 通道的输入;

- 修改异常样本当前时刻值,随机设置到指定阈值之下,把一个异常样本变成一个正常样本;

- 修改异常样本中当日输入通道的向量,向量整体做大尺度负向平移,把一个异常样本变成一个正常样本;

- 模拟周期事件,随机抽取几个往期通道,在输入时序中生成与今日异常波形相似的数据;

- 每个输入通道共享相同卷积层,因为每个通道需提取的波形特征是一致的,共享卷积层可以节约计算性能;
- MaxPool 层实质对每个通道做的是一个取向量最大元素操作,所以不管 Input 层输入向量长度如何变化,MaxPool 层输出数据结构都是固定的,所以在模型做预测时,输入通道是可灵活输入不同的长度时序数据;



- 部分业务人员判定持续时间较短的毛刺为误报,但训练样本集中是存在这种毛刺异常标注,可以添加一条简单的后置规则对异常持续时长进行过滤;
- 在当日原始输入为1小时左右的时长跨度中,异常波形较明显,但拉长时轴,在更长的时间跨度下看涨跌幅度正常;可以通过给原始输入更久时序数据减少此类误报,或者基于历史数据离线统计出一些合适的最小涨跌阈值进行过滤;
- 小数据/稀疏数据模型表现较差;
- 周期性差,当日走势和历史差异极大;


监控指标自带业务属性,异常标准定义很难达到统一,业务人员 A 认可的异常在业务人员 B 眼中是正常现象,这意味着使用有监督方案需要维护多份训练集,这在实际操作中是不现实的;
算法性能问题,面临海量监控业务,训练和实时检测计算资源是否吃得消,本文的方案在实时检测会产生大量时序数据查询请求,需要平台强力支持;
在实际探索中,我们发现单一的算法解决不了所有问题,不同算法都有其优势及不足,都有其契合及尴尬的场景,合适的方法才是最好的方法;
欢迎来到「蚂蚁智能运维」的世界。本公众号由蚂蚁集团技术风险中台团队出品,面向关注智能运维、技术风险等技术的同学,将不定期与大家分享云原生时代下蚂蚁集团在智能运维的架构设计与创新方面的思考与实践。
蚂蚁技术风险中台团队,负责蚂蚁集团的技术风险底座平台建设,包括智能监控、资金核对、性能容量、全链路压测以及风险数据基础设施等平台和业务能力建设,解决世界级的分布式处理难题,识别和解决潜在的技术风险,参与蚂蚁双十一等大型活动,通过平台能力保障整体蚂蚁系统在极限请求量下的高可用和资金安全。
关于「智能运维」有任何想要交流、讨论的话题,欢迎留言告诉我们。
PS:技术风险中台正在招聘技术专家,欢迎加入我们,有兴趣联系 techrisk-platform-hire@list.alibaba-inc.com
