这篇文章是李宏毅老师的在线课程https://www.youtube.com/watch?v=gDp2LXGnVLQ 的笔记内容,推荐大家去看原视频。
异常检测,简单的说,就是给定一个训练集
我们希望可以找到一个函数,是的可以检测Input x是否和训练集相似。
我们找出来的内容是与训练数据集不太一致的内容。
异常检测有很多应用,比如
一个很直觉的想法是收集一堆异常数据,收集一堆正常数据,然后来做二分类?问题没有那么简单。一般来说,收集异常的资料比较困难。比如就信用卡侦测,多数的资料都是正常的交易,而异常的数据非常难收集。针对这些问题,会有各种各样的上采样、下采样方法,数据增量的策略。不过这篇文章先不涉及这些啦,之后再慢慢解释。
异常检测会有三种,一种是每一笔数据都有label,但是当遇到新数据时,如果说新数据不属于之前的任何一类,分类器要能够把这一类标注为"unknown",一个是所有的训练数据都是正例。第三种是手上的资料都是正常的,但是有一部分是异常的混了进来。
最常用的异常检测方法,就是使用分类器来做异常检测的原理是,分类器不但需要输出类别,还会输出一个置信度c,然后异常检测的时候
像下面这张图片,这个分类器是用来判断图片是否是辛普森家庭的。根据最大的类别的分数,可以确定是否是异常。
那么这就是论文Network for Confidence Estimation的内容啦,就是用分类器产出置信度
比如说我们看看下图,虽然说猫猫和狗狗的确可以通过分类器辨别开,但是接收到一些新事物,比如说老虎,狼等具有和分类器能辨别的类别类似的对象时,可能会产生误判。
针对这点,现在的理论说通过GAN的方式来生成一些异常的数据。
假设我们的数据是没有标签的,那么异常检测又怎么做呢?
我们的做法是,假设我们的数据是从一个分布 sample出来的,我们需要找到一组 参数 ,使得在这组参数下,这个分布能够产生出这组数据的可能性最大。也就是计算这组数据的最大似然:
我们要找到一组 ,让上式中的 最大,也就是找到 , 使得
那么 又长什么样呢?我们常用的一个是高斯分布,也就是:
这个公式可以看成输入一个向量x, 输出的是该条件分布产生x的概率。这个公式是由 这两个参数来决定的,这两个参数也就是上文我们说的 。也就是说,上式中的最大似然计算公式变为:
然后我们穷举所有找到的 ,看看那一组可以使得 最大,也就是:
如果是下图,则可以看到在密集区域的 的最大似然会比在稀疏区域找到的 会有更大的最大似然
一般来说,其实 的计算是有公式的啦。这一块的内容涉及概率统计,有兴趣的同学可以再去看看。
我们找到了这组参数后,就可以来做异常检测了。 其实和有监督的异常检测是类似的。
还有一些别的方法,比如说Auto-Encider等。训练的时候,同时训练Encoder 和Decoder,就是把输入进行Encoder解码成一个向量后,再通过Decoder解回来。如果是异常的图片,还原度就会很低,如果是正常的图片,则还原度会高。
异常检测的case中,往往数据集非常不均衡。异常的资料要远少于正常的资料。如果用常用的分类指标accuracy来衡量的话,那么一个把所有的内容都判别为正例的系统(其实完全没有起作用)也能有很高的accuracy。所以一般我们会用TPRFPR的指标来看,而真正例和假正例会根据系统的不同状况乘上不同的权重。比如说如果做癌症检测,那么查全率更加重要。当然还有ROC curve这样的指标也很常用。