文章目录
Anomaly Detection
Anomaly Detection,翻译为中文意思是异常侦测,异常侦测要做的就是:让机器可以知道我不知道这件事。上面引用了《论语,论证》篇,“知之为知之,不知为不知,是知也(知道就是知道,不知道就是不知道,这样才是真正的知道)”,就是让机器知道它不知道这件事。
Problem Formulation
异常侦测的问题通常formulation成这样,假设我们现在有一堆训练数据 ( x 1 , x 2 , . . . x N ) (x^1, x^2, ... x^N) (x1,x2,...xN),(在这门课里面,我们通常用上标来表示一个完整的数据,用下标来表示一个完整数据的其中一部分)。我们现在要找到一个function,这个function要做的事情是:检测输入x的时,决定现在输入的x到底跟我们的训练数据是相似还是不相似的
我们之前说过:机器学习其实就是让机器找到一个function,在异常侦测里面我们要找的function是这样的。输入与我们训练数据相似的x,则异常侦测的function(Anomaly Detector)就会告诉我们这是正常的数据;若输入与我们训练数据不相似的x,则异常侦测的function(Anomaly Detector)就会告诉我们这是异常的数据。
我们一直再用Anoamly这个词汇,可能会让某些同学觉得机器在做Anoamly Detector都是要Detector不好的结果。因为异常这个词汇显然通常代表的是负面意思。其实Anoramly Detector这件事并不一定是找不好的结果,只是找跟训练数据不一样的数据。所以我们找出结果不见得是异常的数据,你会发现Anoamly Detector在不同的领域里面有不同名字。有时候我们会叫它为“outlier, novelty, exceprions”。
总之我们要找的是跟训练数据不一样的数据,有可能是特别好的,有可能是特别坏的。但至于什么叫做“像(similar)”,这就是Anoamly Detector需要探讨的问题。不同的方法就有不同的方式来定义什么叫做“像”、什么叫做“不像”。
What is Anomaly?(什么是Anomaly)
这里我要强调一下什么叫做异常,机器到底要看到什么就是Anormaly。其实是取决你提供给机器什么样的训练数据。
假设你提供了很多的雷丘作为训练数据,皮卡丘就是异常的。若你提供了很多的皮卡丘作为训练数据,雷丘就是异常的。若你提供很多的宝可梦作为训练数据,这时数码宝贝就是异常的。
Applications
- 异常侦测有很多的应用,你可以应用到诈欺侦测(Fraud Detection)。训练数据是正常的刷卡行为,收集很多的交易记录,这些交易记录视为正常的交易行为,若今天有一笔新的交易记录,就可以用异常检测的技术来侦测这笔交易记录是否有盗刷的行为。(正常的交易金额比较小,频率比较低,若短时间内有非常多的高额消费,这可能是异常行为)
- 异常侦测还可以应用到网络系统的入侵侦测,训练数据是正常连线。若有一个新的连线,你希望用Anoramly Detection让机器自动决定这个新的连线是否为攻击行为。
- 异常侦测还可以应用到医疗(癌细胞的侦测),训练数据是正常细胞。若给一个新的细胞,让机器自动决定这个细胞是否为癌细胞。
如何做Anomaly Detection
Binary Classification?(No!)
我们咋样去做异常侦测这件事呢?很直觉的想法就是:若我们现在可以收集到很多正常的资料 ( x 1 , x 2 , . . . , x N ) (x^1, x^2, ...,x^N) (x1,x2,...,xN),我们可以收集到很多异常的资料 ( x ~ 1 , x ~ 2 , . . . , x ~ N ) ( \tilde{x}^1, \tilde{x}^2,..., \tilde{x}^N) (x~1,x~2,...,x~N)。我们可以将normal data当做一个Class(Class1),anomaly data当做另外一个Class(Class2)。我们已经学过了binary classification,这时只需要训练一个binary classifier,然后就结束了。
这个问题其实并没有那么简单,因为不太容易把异常侦测视为一个binary classification的问题。为什么这样说呢?
假设现在有一笔正常的训练数据是宝可梦,只要不是宝可梦就视为是异常的数据,这样不只是数码宝贝是异常数据,凉宫春日也是异常数据,茶壶也是异常的数据。不属于宝可梦的数据,不可能穷举所有不是宝可梦的数据。根本没有办法知道整个异常的数据(Class2)是咋样的,所以不应该将异常的数据视为一个类别,应为它的变化太大了。这是第一个不能将异常侦测视为二元分类的原因。
第二个原因是:很多情况下不太容易收集到异常的资料,收集正常的资料往往比较容易,收集异常的资料往往比较困难。对于刚才的诈欺侦测例子而言,你可以想象多数的交易通常都是正常的,很难找到异常的交易。这样就造成异常侦测不是一个单纯的二元分类问题,需要想其它的方法。它是一个独立的研究主题,仍然是一个尚待研究的问题。
Categories (两种情况)
第一种:称为:Open-set Recognition,每一个训练数据都有对应的标签,那么我们可以训练一个Classifier(可以用NN,也可以用线性分类器),这个Classifier训练好后,如果看到训练数据中不存在的数据,那么可以为其打上【unknown】的标签。
第二种:只有训练数据,没有标签。这里又分两种情况:
- All the training data is normal.所有数据都是正常数据。
- A little bit of training data is anomaly. 有一些数据是异常数据。
对于刚才的诈欺侦测例子而言,银行收集了大量的交易记录,它把所有的交易记录都当做是正常的,然后告诉机器这是正常交易记录,然后希望机器可以借此侦测出异常的交易。但所谓的正常的交易记录可能混杂了异常的交易,只是银行在收集资料的时候不知道这件事。所以我们更多遇到的是:手上有训练资料,但我没有办法保证所有的训练资料都是正常的,可能有非常少量的训练资料是异常的。
下面分别对各个类别进行讲解。
with label
Example Application
现在给定的例子是要侦测一个人物是不是来自辛普森家庭,可以看出 x 1 , x 2 , x 3 , x 4 x^1, x^2, x^3,x^4 x1,x2,x3,x4是来自辛普森家庭(辛普森家庭的人有很明显的特征:脸是黄色的,嘴巴像似鸭子),同时也可以看出凉宫春日显然不是来自辛普森家庭。
假设我们收集的辛普森家庭的人物都具有标注(霸子,丽莎,荷马,美枝),有了这些训练资料以后就可以训练出一个辛普森家庭成员的分类器。我们就可以给分类器看一张照片,它就可以判断这个照片中的人物是辛普森家庭里面的哪个人物。
将这张图片输入辛普森家庭人物的分类器,它就会告诉你这是荷马。
在kaggle上有一个非常喜欢辛普森家庭的人,收集了数千张辛普森家庭人物,然后训练出一个分类器,然后用这个分类器做了测试,结果有百分之九十六的正确率。
How to use the Classifier
现在我们想做的事情是根据这个分类器来进行异常侦测,判断这个人物是否来自辛普森家庭。
我们原本是使用分类器来进行分类,现在希望分类器不仅可以来自分类,还会输出一个数值,这个数值代表信心分数(Confidence score ),然后根据信心分数做异常侦测这件事情。
定义一个阈值称之为 λ \lambda λ,若信心分数大于\lambdaλ就说明是来自于辛普森家庭。若信心分数小于 λ \lambda λ就说明不是来自于辛普森家庭
How to estimate Confidence(如何得到信息分数?)
咋样可以得到信心分数呢?若我们将图片输入辛普森家庭的分类器中,若分类器非常的肯定这个图片到底是谁,输出的信心分数就会非常的高。当我们将图片输入分类器时,分类器的输出是一个几率分布(distribution),所以将一张图片输入分类器时,分类器会给事先设定的标签一个分数。
如图所示,将“霸子”图片输入分类器,分类器就会给“霸子”一个很高的分数。
但你若给它一张很奇怪的图片(凉宫春日),这时输出的分数会特别的平均。若输出特别平均,那这张图片就是异常的图片
刚才讲的都是定性的分析,现在需要将定性分析的结果化为信心分数。一个非常直觉的方法就是将分类器的分布中最高数值作为信心分数,所以上面那张图输出的信心分数为0.97(霸子),下面那张图输出的信心分数为0.26(凉宫春日)
根据信心分数来进行异常检测不是唯一的方法,因为输出的是distribution,那么就可以计算交叉熵(entropy)。交叉熵(entropy)越大就代表输出越平均,代表机器没有办法去肯定输出的图片是哪个类别,表示输出的信心分数是比较低。总之我们有不同的方法根据分类器决定它的信心分数
现在我输入一张训练资料没有的图片(荷马),分类器输出荷马的信心分数是1.00;输入霸子的图片,分类器输出霸子的信心分数为0.81,输出郭董的信心分数为0.12;输入三玖的图片,分类器输出柯阿三的信心分数为0.34,输出陈趾鹹的信心分数为0.31,输出鲁肉王的信心分数为0.10。
以上都是动漫人物,现在输入一张真人的图片,分类器输出柯阿三的信心分数为0.63,输出宅神的信心分数为0.08,输出小丑阿基的信心分数为0.04,输出孔龙金的信心分数为0.03。
我们可以发现,如果输入的是辛普森家庭的人物,分类器输出比较高信心分数。如果输入不是辛普森家庭的任务,分类器输出的信心分数是比较低。但是输入凉宫春日的图片,分类器输出柯阿三的信心分数为0.99。
若输入大量的训练资料(将之前的介绍辛普森家庭的那张投影片中的kaggle链接中的数据作为训练资料(有数千张辛普森家庭人物))输入至分类器中,输出的信息分数分布如图所示。几乎所有的辛普家庭的人物输入分类器中,无论是否辨识有错都会给出一个较高的信心分数。但还是发现若辨识若有错误会得到较低的信心分数,如图所示的红色点就是辨识错误图片的信心分数的分布。蓝色区域分布相较于红色区域集中在1.0,有很高的信心分数认为是辛普森家庭的人物。
若输入其它动画的人物图片(15000张图片),其分类器输出的信心分数如题所示,我们会发现有10分之一图片的信心分数比较高(不是辛普森家庭的人物,但给了比较高的分数),多数的图片得到的信心分数比较低(辛普森家庭的人物和不是辛普森家庭的人物在分类器输出的信息分数是有所差别的)。
刚才是比较直观的给出了一个信心分数,你可能会觉得这种方法会让你觉得非常弱,不过刚才那种非常简单的方法其实在实做上往往还可以有不错的结果。
若你要做异常侦测的问题,现在有一个分类器,这应该是你第一个要尝试的baseline。虽然很简单,但不见得结果表现会很差。当然还有更复杂的方法:
Outlook: Network for Confidence Estimation
你训练一个neuron network时,可以直接让neuron network输出信心分数,这个问题我先不细节,在这里我先引用一个文献(2018年的paper)是有这样的技术的。