【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)

异常检测视频课程地址:https://www.bilibili.com/video/av46561029?p=2
课件不要太卡哇伊啦~~~~

文章目录

  • 1 什么是异常检测
  • 2 问题描述
  • 3 现实应用
  • 4 和Binary Classification的关系
  • 5 异常检测的分类
    • 5.1 with classifier
      • 信心分数如何估计
        • 信心分数估计的一些其他研究
      • 门限如何获得
      • 如何评估
      • 可能的问题
    • 5.2 without classifer
      • 问题描述
      • 生成函数 P ( x ) P(x) P(x)如何得到
      • 其他方法
  • 6 小结

1 什么是异常检测

anomaly detection,有时也称为out-of-distribution检测。比如:我们用各个品种的猫咪图片训练好了一个猫咪品种的分类器,可以区分各种品种的猫咪。但是在输入是一只狗狗的时候,能不能知道这个输入超出了自己的范围。
神经网络拥有很强的预测能力,但它们往往无法知道自己的预测何时可能出错。与此密切相关的是out-of-distribution检测任务,在这个任务中,模型必须确定输入是否超出了它的能力范围。

2 问题描述

【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第1张图片
训练集合有N个数据,我们希望找到一个检测器,对于新的输入x,能够检测出来x是不是训练数据集中的同一类数据。也就是新的输入x到底有多像训练数据。
特别强调,异常检测所谓的异常,并不一定是不好的东西~~只是要判断x是不是和训练集合里的数据是一类东西而已。

3 现实应用

比如银行里面欺诈行为的检测等等
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第2张图片

4 和Binary Classification的关系

是不是就是二元分类呢?
只要我们有正常的数据、异常的数据,然后训练一个二元分类器就可以啦??
当然不是啦。
并不是普通的二元分类问题。
1)异常的数据不能被认为是一类
比如正常的数据是宝可梦的图片,那么所有不是宝可梦的东西都是异常的例子,太多了,没有办法穷举所有不是宝可梦的东西~~异常的数据不能视为一个类别!
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第3张图片
2)很多情况下收集异常的数据很困难。比如银行欺诈行为,大多数行为都是正常交易,异常交易收集的很少。

5 异常检测的分类

分为两类
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第4张图片
一类是有标签的情况,就是训练数据集中的数据都已经被分好了类别,那么可以有很多机器学习的方法训练一个分类器,来对新的样本进行分类。可是以前那些分类器都不能输出“未知类别”(unknown)这样的类。
另一类是没有标签的,就是一堆数据,这些数据可能是干净的,也就是全都是正常的类别。但是更多情况下,这些数据是polluted,即可能混杂进去了一些异常的类别,但是异常类别的数量很少。

5.1 with classifier

有标签的情况,可以训练一个分类器
举个例子
数据集:有很多辛普森家族的图片,已经对每个人物是谁进行了标注。
训练:可以根据这些数据训练一个辛普森家族的家庭成员分类器。
如下图所示。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第5张图片
根据这个已有的分类器来做异常检测,看看一个新的图片到底是不是来自辛普森家庭。

怎么做呢?就是在分类器输出类别的时候,同时输出一个confidence score c。用这个confiidence score来判断是不是异常数据。如果信心分数很高,超过门限 λ \lambda λ,那么就是正常数据(输入x是辛普森家族的图片);如果c很小,没有超过门限,那么就是异常数据(输入x不是辛普森家族的图片)。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第6张图片
那么问题就是:

  • 信心分数c如何得到;
  • 门限如何确定。

(这个门限 λ \lambda λ要根据development set来定哦。后面会讲。)

先看第一个问题

信心分数如何估计

一般来讲,分类器输出经过softmax,得到的是图片属于某个类别的概率。对于正常样本,应该能够得到一个很明显的类别,如上面的97%的概率是霸子;对于异常图片,则可能不存在一个类别会得分很高,比如下面的异常图片,属于每个类别的概率都不是很高呢。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第7张图片
怎样去量化这个c?
最直觉的方法:the maximum score
比如上图中:上面的图片c=0.97;下面的图片c=0.26。
还可以有其他很多方法,比如用负熵来表示信息分数。如果输出的熵越大,就说明不确定性越高,信息分数越低。
文献上有用过很多不同的方法来量化c,但是老师说差异不是很大~~~
反而这种最简单的maximum score的方法,通常蛮好用哦!!

看看结果
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第8张图片
结果看出来,对于是正常样本的,确实c的分数大部分都比较高;对于异常样本,也可能会有比较高的c值,但是并不多,只有10%,大部分异常样本还是会得到较低的c值。

信心分数估计的一些其他研究

思路:在训练分类器的时候,既输出类别 又输出信心分数c。
(上面提到的方法是一般的分类器,只能够输出各个类别的概率,然后我们基于已有的分类器自己定义了一些c的估计方法)
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第9张图片

门限如何获得

要用到Development set
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第10张图片
训练时:训练集合的所有图片都是辛普森家族的图片,标注好了label,具体是哪个人物。
Dev set:需要有是辛普森家族的图片,和不是辛普森家族的图片。需要标注好,是不是辛普森家族的图片(不需要标注具体是哪个人物)
用这个Dev set里面的数据来确定门限 λ \lambda λ和其他超参数。
最后就可以进行test了。

如何评估

一个异常检测系统效能的好坏
假设Dev set里面一共有105张图片,100张是辛普森家族的图片,5张不是辛普森家族的图片。他们的confidence score如下图所示。
可以看到,对于正常的图片,也可能得分很低,比如最左边那个图片。
对于异常的5张图片,大部分得分是不高的,其中最高的一张图(最右边)是0.998。看上去这个值也挺大,但是其实对于正常的图片,得分是更大的,很多情况都是1,大部分图片也都是>0.998的。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第11张图片
在这样一个development set上面,如何来评估异常检测的性能好坏??
用准确率行不行??
----准确率评估指标并不好,因为这里正常样本和异常样本的数量太悬殊了,如果用准确率来评价,很可能系统会给一个很小的门限 λ \lambda λ,比如 λ < 0.3 \lambda<0.3 λ<0.3,这样的话所有异常数据都被判断成正确的,但是总的错误率也只有 5 105 \frac{5}{105} 1055,也就是下图所示。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第12张图片

这时候就是需要把两种错误分开考虑了~~
这部分内容在一般的二元分类问题中有很多研究,这里不再展开了,总之判断的标准有很多种,需要根据实际情况看看是把正常判断为异常比较糟糕(false alarm),还是把异常判断为正常比较糟糕啦(missing)。(比如对于癌症细胞的检测,教授认为把良性肿瘤判断为恶性,可能没有那么糟糕,去别的医院再检查一下就好啦,顶多难过一阵子;但是把恶性肿瘤判断为良性,错失治疗良机,就很糟糕了啦。。。完了听台湾腔挺多了~~~)
或者采用AUC这样的一些标准来评估。
下图就是两种门限选取的情况。第一种有1个正常的被判断为异常,有4个异常的并没有被检测到。第二种有6个正常的被判断为异常,有3个异常的没有被检测出来。对于不同的cost table,两个门限谁更好是不一样的。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第13张图片

可能的问题

【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第14张图片
比如一个训练好的区别是猫还是狗的分类器,对于某些异常数据(如草泥马。。)可能输出的信心分数就很低。但是真的存在一些异常数据,比如老虎,真的很像猫,信心分数也会很高呢~~

怎么去解决这个问题??
对于刚才的辛普森家族分类器,老师调皮的把异常输入的图片的人脸涂成黄色,结果发现信心分数真的增大了呢!!如下图所示。这是因为可能这个分类器对于黄色脸这个特征比较敏感,认为辛普森家族成员最关键的特征就是黄色脸。。。输入图片只要大面积有黄色就认为是辛普森家族成员了。。。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第15张图片
下图就是一些解决这个问题的方法。
第一个就是分类器在学习的时候,就教给它当异常数据出现时候,要给出一个较低的信心分数。但是问题就是异常数据样本通常比较少。第二个方法是用GAN来生成异常样本,从而辅助训练。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第16张图片

5.2 without classifer

只搜集了很多数据,但是没有标签。数据里面可能有少量混入的异常数据哦。
怎样学习一个函数来进行异常检测呢

问题描述

数据集合里面有N个样本。我们希望通过这些数据能够生成一个函数 P ( x ) P(x) P(x)来检测新的输入x是正常样本还是异常样本。同样的,根据一个检测门限 λ \lambda λ来判断是不是异常样本。门限是由development set来决定的。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第17张图片

生成函数 P ( x ) P(x) P(x)如何得到

这里其实是统计学中常用的最大似然的方法。
以二维数据为例 如下图所示,假设这些数据服从某个带参数的分布 f θ ( x ) f_\theta(x) fθ(x), 根据这些数据找到这个 θ \theta θ θ \theta θ就是让似然函数最大时候的取值。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第18张图片
常用的一个分布是高斯分布,含有参数 μ \mu μ, Σ \Sigma Σ。高斯分布的最大似然估计是很容易得到的: μ \mu μ就是所有data的均值; Σ \Sigma Σ就是所有data的方差。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第19张图片
这个其实就是generative model。当然也可以选择其他的分布,或者用一个网络来表示分布。

有了这个概率密度函数之后,就可以根据门限来判断是不是异常数据了。不同的门限 λ \lambda λ对应的就是这个二维图里面的等高线。给一个新的输入x,带入 f ( x ) f(x) f(x)并和 λ \lambda λ比较,就可以判断是否是异常数据。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第20张图片

其他方法

AutoEncoder的方法
用数据集训练一个AE。那么这个AE其实就学习到了正常数据集的一些内在特征。
对于一个新的输入x,如果x是正常的,那么AE可以很好的恢复出这个图像。如下图。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第21张图片
对于一个新的输入x,如果x是异常输入,那么则无法重建这个图像。从而进行异常检测。
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第22张图片

其他异常检测的方法:
【抗疫不出门】李宏毅教授机器学习课程笔记二——异常检测(Anomaly Detection)_第23张图片
这两种方法一笔带过了,感兴趣的可以深入研究。

6 小结

我觉得实用起来最困难的应该是门限如何取得吧。。。与具体任务的相关度太高了。。。

你可能感兴趣的:(机器学习)