异常检测的类别和方法

Posted by Welt Xing on June 23, 2022

参考:https://www.cs.sjtu.edu.cn/~linghe.kong/AI007/Download/%E7%AC%AC9%E8%AF%BE.pdf.

应该是上交AI的专业课。这里对异常检测做了分门别类和论文列举,有趣的是还看到了院长当年的论文被提及。

定义与分类

不同于常规模式下的问题和任务,异常检测 (Anomaly Detection ) 针对的是少数、不可预测或不确定、不符合预期模式的事件的识别,它具有独特的复杂性,使得一般的机器学 习和深度学习技术难以直接应用。

值得注意的是,异常检测除了”Anomaly Detection”以外,Novelty/Outlier/Forgery Detection等都是同义词,在搜索论文前需要知晓这一点。

异常检测的应用领域很多,这里不多赘述。异常主要是三类

  • 点异常:少数个体实例是异常的,大多数个体实例是正常的;
  • 条件异常(上下文异常):在特定情境下个体实例是异常的,在其他情境下都是正常的;
  • 群体异常:在群体集合中的个体实例出现异常的情况,而该个体实例自身可能不是异常,在入侵或欺诈检测等应用中, 离群点对应于多个数据点的序列,而不是单个数据点.

异常检测针对的数据也可以分为三类:

  • 统计数据,比如Tabular data,Flow data;
  • 序列数据,比如时间序列,蛋白质序列;
  • 空间数据,比如图形和视频。

下面将针对不同类型的数据进行解读。

表格数据的异常检测

表格数据,也就是Tabular data、结构化数据。

从笔者和身边同学的学习和实践经历中发现,深度学习在表格数据上表现的不是那么优异,而随机森林这种Tree-based model表现不错。这可能是因为表格数据的特征不算多,这对Tree-based方法来说很好,但对神经网络来说优势不明显:神经网络适合特征多的数据,从而能够进行隐式的特征工程。

表格数据的异常检测有:

  • 基于距离的方法;
  • 基于密度的方法;
  • One class SVM和SVDD;
  • iForest;
  • DevNet;
  • AutoEncoder;
  • DAGMM;
  • RDP;

我们选几个来说。

基于距离的方法

基于距离的度量进行异常检测,比如kNN算法。

image-20220623110435429

PPT中认为关键问题是如何度量Distance,特别是针对同时包含连续型和离散型变量的表格型数据,这一点在周志华老师的《机器学习》中聚类那一章已经讨论过了,这里不再赘述。

异常,更好理解的叫法是“离群点”,也就是离正常数据簇距离远的就是异常点,因此,先使用没有异常点的训练集得到一个聚类,在测试集中如果某一个点距离它最近的中心超过之前训练集里的最大距离的话,就判断它为异常点。

基于密度的方法

image-20220623111512763

单类SVM和SVDD

这个也是异常检测的经典模型了,作为SVM-based的模型,它们在LIBSVM和LIBLINEAR都有实现,笔者在几年年初也对相关的实现论文做了解读:https://welts.xyz/2022/01/31/one_class/. 其中对问题形式化的解读和描述应该是比较详细的,所以这里就不再重复了。

AutoEncoder

自编码器通过重构误差阈值来判定数据是否异常:

image-20220623111907749

也就是,设编码器为$f$,解码器为$g$,给定数据$\pmb x$和阈值$\varepsilon$,观察$\Vert{\pmb x-f(g(\pmb x))}\Vert_v$,其中$v$是某种距离度量,如果

\[\Vert{\pmb x-f(g(\pmb x))}\Vert_v\geq\varepsilon\]

则判定$\pmb x$异常。

时间序列数据的异常检测

应用场景包括:量化交易,网络安全检测、自动驾驶汽车和大型工业设备的日常监控和维护。

可以分为:

  • 传统机器学习方法;
  • 深度学习方法。

我们这里只介绍深度学习方法。基于深度学习的时间序列异常检测算法主要分为下面几种:

  • 基于高重构误差来识别异常点,或者说是生成式算法,通常是无监督的,包括自编码器和生成对抗网络;
  • 通过预测误差来识别异常点,又可以分为:
    • 时间跨度检测:模型学习一段历史数据, 然后预测未来数据;
    • 序列跨度检测:许多传感器产生的时间序列通常彼此紧密相关。经常可以使用一个序列来预测另一个序列,如隐式马尔科夫链HMM等。
  • 通过将序列映射到高维空间中距离远近 来判断异常;
  • 通过标注数据,然后通过有监督算法训练分类模型,也就是判别式算法。但实际应用中往往存在存在异常数据少,缺少标签等问题。

image-20220623153502339

下图是三种异常评判标准的示意图,从左到右分别表示重构误差、预测误差、特征空间距离。

(V)AE

一般自编码器不再赘述,至于VAE,可以理解为一种更高级的AutoEncoder。笔者最近想写一篇对VAE论文的解读,奈何硬骨头太难啃…

GAN

基于GAN模型异常检测思路是,由真实数据和生成器生成的模拟数据喂给判别器训练,同时训练生成器和判别器。收敛后,辨别器认为数据属于真实的概率越低则代表数据异常程度越高。

RNN

基于RNN,通常用于异常检测有两种方法。

  • 预测未来的值,并将它们与预定义的阈值或观测值进行比较;
  • 构造一个AE或VAE来恢复观测值,并对重建值与观测值的差异进行评估。

CNN

虽然RNN是对时间序列数据建模的主要选择,但CNN有时在某些不具有太长时间依赖的特定任务中表现更好。这种方式需要将多维数据看成图像来处理。为了捕捉长距离的依赖关系,时空卷积网络TCN也被用于时间序列的异常检测领域,TCN的卷积层结合了扩张卷积与因果卷积两种结构。因果卷积使得时间步$t$的输出只会根据$t-1$及之前时间步上的卷积运算得出,扩张卷积使得卷积核的感受野能扩展到整个序列,同时将每个单元间还引入了残差连接。

图像/视频异常检测

应用场景,比如检测交叉路口的监控视频中是否存在违规现象。该类异常检测分类两个级别:

  • 图片级:在多个图片中找出异常的图片;
  • 像素级:在图片中找出异常的部分。

图片级别异常检测有下面一些方法:

  • 密度估计;
  • 单分类;
  • 图片重构;
  • 自监督分类。

可以发现和前面的异常检测方法类似,没有什么新意。这里介绍一个我认为有新意的模型:DeepSVDD,是2018年ICML的作品。顾名思义,就是将深度神经网与SVDD模型结合:通过神经网络映射数据表征到超球面,异常数据落在球面外:

image-20220623155031977

至于像素级别异常检测,有图片重构方法和特征建模方法。注意到图片级别的方法也能用到像素级别中,因为一张图片能分割为多个部分。这里不多做介绍。

总结

本文的重点是异常检测的框架,而对模型的介绍显得不是那么重要。如果读者对具体的模型感兴趣,可以去看原来的课件。