notebook notebook
首页
  • 计算机网络
  • 计算机系统
  • 数据结构与算法
  • 计算机专业课
  • 设计模式
  • 前端 (opens new window)
  • Java 开发
  • Python 开发
  • Golang 开发
  • Git
  • 软件设计与架构
  • 大数据与分布式系统
  • 常见开发工具

    • Nginx
  • 爬虫
  • Python 数据分析
  • 数据仓库
  • 中间件

    • MySQL
    • Redis
    • Elasticsearch
    • Kafka
  • 深度学习
  • 机器学习
  • 知识图谱
  • 图神经网络
  • 应用安全
  • 渗透测试
  • Linux
  • 云原生
面试
  • 收藏
  • paper 好句
GitHub (opens new window)

学习笔记

啦啦啦,向太阳~
首页
  • 计算机网络
  • 计算机系统
  • 数据结构与算法
  • 计算机专业课
  • 设计模式
  • 前端 (opens new window)
  • Java 开发
  • Python 开发
  • Golang 开发
  • Git
  • 软件设计与架构
  • 大数据与分布式系统
  • 常见开发工具

    • Nginx
  • 爬虫
  • Python 数据分析
  • 数据仓库
  • 中间件

    • MySQL
    • Redis
    • Elasticsearch
    • Kafka
  • 深度学习
  • 机器学习
  • 知识图谱
  • 图神经网络
  • 应用安全
  • 渗透测试
  • Linux
  • 云原生
面试
  • 收藏
  • paper 好句
GitHub (opens new window)
  • 深度学习

    • Posts

    • PyTorch 入门

    • 鱼书进阶-自然语言处理

    • 深度学习-李宏毅

    • 李宏毅-2017版

    • 李宏毅-2019版

      • ELMo
      • Anomaly Detection
        • 1. Background
          • 1.1 Problem Formulation
          • 1.2 What is Anomaly?
          • 1.3 Applications
          • 1.4 Binary Classification?
          • 1.5 Categories
        • 2. Case 1:With Classifier
          • 2.1 Example Application
          • 2.2 How to use the Classifier?
          • 2.3 How to estimate Confidence?
          • 2.4 Summary
          • 2.5 Outlook:Network for Confidence Estimation
          • 2.5 如何计算一个异常检测系统的效能好坏?
          • 2.6 Possible Issue
        • 3. Case 2:Without Labels
          • 3.1 问题背景
          • 3.2 Problem Formulation
          • 3.3 Maximum Likelihood
          • 3.4 Outlook
    • 预训练语言模型-邵浩2021版

    • 王树森

  • 机器学习

  • 知识图谱

  • AI
  • 深度学习
  • 李宏毅-2019版
yubin
2022-12-20
目录

Anomaly Detection

# 1. Background

# 1.1 Problem Formulation

  • Given a set of training data
    • 用上标来表示一个完整的 data point,用下标来表示一个完整东西的其中一部分
  • We want to find a function detecting input is similar to training data or not.
image-20221220193207976

Different approaches use different ways to determine the similarity. 我们这里的 anomaly 不一定就说是坏的,它可能是 outlier、novelty 等。

# 1.2 What is Anomaly?

image-20221220193549294

# 1.3 Applications

image-20221220193929848

# 1.4 Binary Classification?

一个很直觉的方法就是用 Binary Classification 来做:

  • Given normal data => Class 1
  • Given anomaly => Class 2
  • Then training a binary classifier ….

但这样做的问题是,如下图,Pokemon 的资料是差不多的,但是 NOT Pokemon 的东西太多了,你根部无法得知 Class 2 的 distribution 长什么样子。

image-20221220194444198

还有一个原因是,其实你不太容易收集到 anomal examples,比如欺诈检测,银行收集到的大部分资料都是正常的交易。

# 1.5 Categories

根据所拥有的资料的样子,可以做如下分类:

image-20221220195238030
  • 如果你希望你的模型在看到不知道的数据类别时,能够 output 一个 “unknown”,那么这种问题也称为 Open-set Recognition。

# 2. Case 1:With Classifier

# 2.1 Example Application

任务:From The Simpsons or not

image-20221220195834309

我们收集的资料每个 Simpsons 家族人物的 image 都还有一个 label:

image-20221220195938014

有一个人就是这么干的,收集了一大堆 Simpsons 家族人物的训练资料来训练一个 classifier,结果如下(还不错):

image-20221220200126868

# 2.2 How to use the Classifier?

我们想要做的事情就是根据这个 classifier 来帮我们判断一个 image 是否来自于 Simpsons 家族人物:

image-20221220200348245
  • 我们不仅让这个 classifier 告诉我们它属于 Simpsons 家族的哪个人物,还要它告诉我们这次判断的 confidence score ,然后比对 confidence score 和 threshold 来确定是否 normal。
  • 这里的 threshold 需要通过验证集来选择。

# 2.3 How to estimate Confidence?

我们知道 classifier 输出的其实是一个 distribution,然后机器的 confidence 就是 the maximum scores:

image-20221220200915787

当然还有其他的计算 confidence 的方法,比如计算 negative entropy。

做了一些实验,实验结果如下,效果还行:

image-20221220201413172

当然也有是一些识别错误的。

尽管这看着很简单,但其实往往 performance 还不错,这也不是一个很弱的方法,很多情况下值得一试。

# 2.4 Summary

刚刚这个过程可以总结如下:

image-20221221161302447

# 2.5 Outlook:Network for Confidence Estimation

除了上面的方法之外,还有一种更好的方法是:直接让 Neural Network 生成一个 confidence score:

image-20221221160807861

具体可以参考相关资料。

# 2.5 如何计算一个异常检测系统的效能好坏?

一个 development set 的计算结果如下图,蓝色是 Simpsons 家族的 image 输入进去后得到的 confidence score,红色的是其他的 image 输入进去以后得到的 confidence score:

image-20221221161842790

可以看到,也有一些红色的点是具有挺高的 confidence score 的,也有一个蓝色的点具有挺低的 confidence score,但是大多数 Simpsons 家族的 image 能够大于 0.998,因此效果其实还不错。

那怎么计算这个异常检测系统的 performance 的好坏呢?

在 anomaly dection 中,accuracy is not a good measurement! 因为异常资料和正常资料的分布是很悬殊的,所以 A system can have high accuracy, but do nothing.

我们看看把 threshold 选在不同的位置的情况下,统计数据是什么样的:

image-20221221164346325
  • 正常但是被认为异常的叫做 False alarm
  • 异常但是没有检测出来的叫做 missing

再改一下 threshold 的位置,这样得到的统计结果在上面的右表中:

image-20221221170230110

其实一个系统的好坏,取决于你认为 False alarm 比较严重还是 missing 比较严重。因此根据你的实际情况可以设计一个 cost table,从不同的 cost table 可以计算得到不同的 cost:

image-20221221170723748

所以 cost table 怎么设计,取决于你要用它做什么事情。

在文献中,还有很多其他的 metrics,比如:

  • Some evaluation metrics consider the ranking. For example, Area under ROC curve.

这一节其实想说,一个异常检测系统没有办法用一个传统的方法来判断一个系统的好坏。

# 2.6 Possible Issue

用一个 Classifier 来做 anomaly detection 的话,比如 classify 猫和狗,这时就能得到下面的分类结果:

image-20221221171404481

如果这时 classifier 看到“羊驼”等这种异常动物时,可能就倾向于将他们放到 boundary 上,得到一个比较低的 confidence score,从而判断出这是一个“异常”。但是问题是,有些动物可能比猫更像猫,比狗更像狗… 如下图:

image-20221221172051597

也就是说,对于机器来说,有一些东西虽然在训练期间没有看过这些标为异常的资料,但是这些东西可能有非常强的 feature 给你的 classifier 很大的信心说它看到了某一种 class。

拿刚才那个例子,由于 Simpsons 家族的人物往往都是黄脸,那 classifier 很可能就是利用了这个 feature,那我们做一下实验,果然 ….:

image-20221221172807284

怎么解决这个问题呢?这里列举了一些相关资料:

image-20221221173042676

如下图,你可以在训练 classifier 的时候,不仅让他学会 classify,还要教他当看到异常图片时,要学会给出一个很低的 confidence score。

# 3. Case 2:Without Labels

这种情况下收集到的资料是没有 label 的。

# 3.1 问题背景

有一个游戏:Twitch Plays Pokemon,它是由全世界所有人一起参与这个游戏,共同操作才完成这个游戏,同一时刻玩家所有玩家输入指令,系统会随机 pick 出一个来执行。但为什么这个游戏很难的?也许是有很多人是“Troll(网络小白)”,什么是 Troll 呢:

  • Players that are not familar with the game.
  • Just for fun…
  • Malicious players…

总之,有很多 Troll(网络小白)不想完成这场游戏。现在我们假设大多数玩家是想要完成这场游戏的,他们就是 normal data for training,那我们使用 anomaly detection 技术能否识别出 Troll(anomaly)呢?

# 3.2 Problem Formulation

  • Given a set of training data
  • We want to find a function detecting input is similar to training data or not.
image-20221221191456891

一个 x 的 feature 就像上面那个样子。

现在的问题是,x 是没有 label 的,那 model 要怎样识别呢?Generated from !如下图所示:

image-20221221192308322

这里的 threshold 是通过验证集来选择的。

假设这里的 x 的 feature 只有两个,也就是 x 是二维的,那解决问题的思路差不多是这样:

image-20221221192842680

# 3.3 Maximum Likelihood

这件事怎么做呢?我们可以认为所有看到的 data points 都是由一个 probability density function 生成出来的, 决定了 的具体样子,并且 是未知的,它需要从所有的 observed data 中寻找出来。那我们现在要做的事情就是找出背后这个 probability density function 究竟长什么样子。

我们要计算一个 likelihood ,所谓 likelihood 的意思就是说,根据我手上的 probability density function,这些 observed data 被产生出来的几率有多大。但要严格来说的话,这里的 是 probability density 的 function,它的 output 不是直接的 probability,而是 probability density。

现在我们要做的就是找出能够最大化 的 :

image-20221221201639458

一个常用的 probability density function 是多维的 Gaussian Distribution,具体的做法如下图:

image-20221221202448978

为什么一定要用 Gaussian 呢?一个简单的回答就是,如果用其他的 distribution 也会问同样的问题。而且 Gaussian 真的很常用,尽管有时候你的 data distribution 没有那么像 Gaussian,它也是效果不错的。或者也可以给数据加 log、加根号来让他变得像 Gaussian。

但其实预先假设了 Gaussian 还是一个非常强的假设,因为 data 的分布根本就不是 Gaussian。所以,How about is from a network, and is network parameters? 所以这里也可以用一些 deep generative model。但在这里,我们就只拿 Gaussian 来举例了。

那这里的参数 和 怎么来计算呢:

image-20221221203655405

所以给了我们资料以后,我们就可以按照上面公式来计算出极大化似然函数的参数 。

inference 阶段还怎么做呢?把 data point 代入到 中,得到 probability,然后设置一个 threshold 来判断是否为异常,如下图所示:

image-20221221204125463

# 3.4 Outlook

还有其他的方法,比如 deep learning based 的方法:Auto-Encoder

image-20221221211144320

更多的方法:

image-20221221211245779
编辑 (opens new window)
上次更新: 2022/12/22, 14:50:16
ELMo
预训练语言模型简介

← ELMo 预训练语言模型简介→

最近更新
01
Deep Reinforcement Learning
10-03
02
误删数据后怎么办
04-06
03
MySQL 一主多从
03-22
更多文章>
Theme by Vdoing | Copyright © 2021-2024 yubincloud | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×