杜伦大学提出GANomaly:无需负例样本实现异常检测

本期推荐的论文笔记来自 PaperWeekly 社区用户 @TwistedW。在异常检测模块下,如果没有异常(负例样本)来训练模型,应该如何实现异常检测?本文提出的模型——GANomaly,便是可以实现在毫无异常样本训练下对异常样本做检测。

关于作者:武广,合肥工业大学硕士生,研究方向为图像生成。

■ 论文 | GANomaly: Semi-Supervised Anomaly Detection via Adversarial Training

■ 链接 | https://www.paperweekly.site/papers/2293

■ 源码 | https://github.com/samet-akcay/ganomaly

异常检测(Anomaly Detection)是计算机视觉中的一个经典问题,生活中大部分的数据是正常数据,有很少一部分属于异常数据,在很少的异常下如何检测出异常是一个困难的课题,甚至不知道什么是异常,只知道不属于正常的就算异常的话又如何检测异常呢?GANomaly 便是可以实现在毫无异常样本训练下对异常样本做检测,我们一起来读一下。

论文引入

在计算机视觉上大部分的检测任务的前提是需要大量的标记数据做训练,这虽然在成本上耗费巨大,但是在实验效果上确实有很大的突破,目前的目标检测技术已经上升到近乎实时检测的效果了,背后的人力和成本也是可想而知的。

在庞大的目标检测背景下,异常检测算是一个特立独行的分支,虽然只是判断正常和异常两种情况(二分类问题),但是往往异常样本特别的少,如果从特征提取上区分正常和异常的话,由于训练样本过少或者说是训练样本比例太不平衡(正常样本特别多)往往会导致实验结果上不尽如人意。

异常检测的发展在深度学习的浪潮下得到了很快的发展,基于 CNN,RNN、LSTM 技术上已经取得了一定的成效。随着 GAN 的提出,对抗的思想越来越引人注意,利用 GAN 做异常检测的文章在实验上有了一定的突破,从 AnoGAN [1] 学习到正常样本的分布,一旦送入异常样本数据发生改变从而检测出异常,这种方法的局限性很强,往往也会带来计算成本的昂贵(需要严格的控制先验分布 z)。在此基础上,为了找到更好用作生成的先验分布 z,在 AnoGAN 的基础上提出了 Efficient-GAN-Anomaly [2] 同样由于做个一次重新映射导致计算成本上也是庞大的。

GANomaly 算是在前两篇文章的基础上做了一次突破,不再比较图像分布了,而是转眼到图像编码的潜在空间下进行对比。对于正常的数据,编码解码再编码得到的潜在空间和第一次编码得到的潜在空间差距不会特别大。但是,在正常样本训练下的 AE 用作从未见过的异常样本编码解码时,再经历两次编码过程下往往潜在空间差距是大的。

当两次编码得到的潜在空间差距大于一定阈值的时候,我们就判定样本是异常样本,这就是 GANomaly 的思路。我们以此对比一下以 GAN 为发展下的异常检测模型,模型结果如下,上述已对其做了一定的分析。

GANomaly 的优势总结一下:

  • 半监督异常检测:编码器-解码器-编码器流水线内的新型对抗自动编码器,捕获图像和潜在向量空间内的训练数据分布;

  • 功效:一种有效且新颖的异常检测方法,可在统计和计算上提供更好的性能。

GANomaly模型

我们还是先看一下模型框架:

GANomaly 模型框架是蛮清晰的,整个框架由三部分组成:

GE(x),GD(z) 统称为生成网络,可以看成是第一部分。这一部分由编码器 GE(x) 和解码器 GD(z) 构成,对于送入数据 x 经过编码器 GE(x) 得到潜在向量 z,z 经过解码器 GD(z) 得到 x 的重构数据 x̂ 。

模型的第二部分就是判别器 D,对于原始图像 x 判为真,重构图像 x̂ 判为假,从而不断优化重构图像与原始图像的差距,理想情况下重构图像与原始图像无异。

模型的第三部分是对重构图像 x̂ 再做编码的编码器 E(x̂) 得到重构图像编码的潜在变量 ẑ。

在训练阶段,整个模型均是通过正常样本做训练。也就是编码器 GE(x),解码器 GD(z) 和重构编码器 E(x̂),都是适用于正常样本的。

当模型在测试阶段接受到一个异常样本,此时模型的编码器,解码器将不适用于异常样本,此时得到的编码后潜在变量 z 和重构编码器得到的潜在变量 ẑ 的差距是大的。我们规定这个差距是一个分值,通过设定阈值 ϕ,一旦 A(x)>ϕ 模型就认定送入的样本 x 是异常数据。

网络损失

对于模型的优化,全是通过正常样本实现的,网络损失也可分为三部分。标准 GAN 的损失大家相比都很清楚了,这里不重复写。对于第一部分的生成网络下,文章给定了一个重构误差损失,用于在像素层面上减小原始图像和重构图像的差距。

对于第二部分判别器下,设置了一个特征匹配误差,用于在图像特征层方面做优化,这部分损失其实已经在很多文章中都用到过。

对于第三部分重构图像编码得到的潜在变量 ẑ ,这部分对于正常数据而言,希望得到的 ẑ 与原始数据直接编码得到的 z 无差别最好,也就是对于最好的得分判断,对于正常数据而言理想状态下希望。当然这是最理想的状态,但是对于正常数据还是希望 A(x) 越小越好,所以引入了一个潜在变量间的误差优化。

训练过程中只有正例样本参与,模型只对正例样本可以做到较好的编码解码,所以送入负例样本在编解码下会出现编码得到的潜在变量差异大从而使得差距分值 A(x) 大,判断为异常。对于模型,整个损失函数可以表示为:

这里的 ωadv,ωcon,ωenc 是调节各损失的参数,可以根据具体实验设置。

模型测试

模型测试过程中以正负样例 D̂ 混合输入,对于测试样本下的得分 S 可记为具体的判断异常分数进行一个归一化处理将其整合到 [0,1] 之间。

这里的就是最终的异常得分,对于正常样本理论上希望,对于异常样本理论上希望。需要一个阈值 ϕ 来衡量这个标准,经过源码分析,一般的 ϕ=0.2 可以根据实际项目需要对 ϕ 做调整。

GANomaly实验

实验在 MNIST,CIFAR10 上选取部分类别做正样本,选取一些类别作异常样本,测试模型是否能够检测出异常样本并给出准确率。文章的衡量标准是以 AUC 为判断。实验对比了三种以 GAN 做异常检测的模型以及 VAE 的结果,通过 AUC 分析可以看出 GANomaly 取得了不错的优势。

实验还对大件行李异常数据集(University Baggage Anomaly Dataset - (UBA))做了实验,数据集包括 230275 个图像块,图像从完整的 X 射线图像中提取,异常类别(122803)有 3 个子类 - 刀(63,496),枪(45,855)和枪组件(13,452),对于另一个数据集选择了枪械检测(FFOB)。

对于潜在变量的选取,以及超参的确定也通过实验选取:

最后来看一下正常样本和异常样本重构的对比,可以看出异常样本在重构上已经和原始有了较大的差别了,所以编码得到的潜在变量自然会产生差异,从而判断出异常。

总结

GANomaly 以编码器-解码器-编码器设计模型,通过对比编码得到的潜在变量和重构编码得到的潜在变量差异,从而判断是否为异常样本。文章在无异常样本训练模型的情况下实现了异常检测,对于很多场景都有很强的实际应用意义。个人感觉文章对于异常分数的计算和判断可再进一步优化,从而实现更好的异常检测效果。

杜伦大学提出GANomaly:无需负例样本实现异常检测的更多相关文章

  1. 斯坦福大学Andrew Ng - 机器学习笔记(7) -- 异常检测

    大概用了一个月,Andrew Ng老师的机器学习视频断断续续看完了,以下是个人学习笔记,入门级别,权当总结.笔记难免有遗漏和误解,欢迎讨论. 鸣谢:中国海洋大学黄海广博士提供课程视频和个人笔记,在此深 ...

  2. ROC 曲线/准确率、覆盖率(召回)、命中率、Specificity(负例的覆盖率)

      欢迎关注博主主页,学习python视频资源 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.ht ...

  3. 4 关于word2vec的skip-gram模型使用负例采样nce_loss损失函数的源码剖析

    tf.nn.nce_loss是word2vec的skip-gram模型的负例采样方式的函数,下面分析其源代码. 1 上下文代码 loss = tf.reduce_mean( tf.nn.nce_los ...

  4. hadoop学习;block数据块;mapreduce实现样例;UnsupportedClassVersionError异常;关联项目源代码

    对于开源的东东,尤其是刚出来不久,我认为最好的学习方式就是能够看源代码和doc,測试它的样例 为了方便查看源代码,关联导入源代码的项目 先前的项目导入源代码是关联了源代码文件 block数据块,在配置 ...

  5. Pytest的装饰器——parametrize中ids里包含中文,用例标题显示异常如何解决?

    在使用pytest做测试的过程中,经常会用到pytest.mark.parametrize来对批量生成测试用例,比如 @pytest.mark.parametrize( ['a', 'b', 'exp ...

  6. Gradient Boost Decision Tree(&Treelink)

    http://www.cnblogs.com/joneswood/archive/2012/03/04/2379615.html 1.      什么是Treelink Treelink是阿里集团内部 ...

  7. 基于机器学习的web异常检测

    基于机器学习的web异常检测 Web防火墙是信息安全的第一道防线.随着网络技术的快速更新,新的黑客技术也层出不穷,为传统规则防火墙带来了挑战.传统web入侵检测技术通过维护规则集对入侵访问进行拦截.一 ...

  8. NLP相关问题中文本数据特征表达初探

    1. NLP问题简介 0x1:NLP问题都包括哪些内涵 人们对真实世界的感知被成为感知世界,而人们用语言表达出自己的感知视为文本数据.那么反过来,NLP,或者更精确地表达为文本挖掘,则是从文本数据出发 ...

  9. 基于PU-Learning的恶意URL检测

    https://xz.aliyun.com/t/2190 Ya-Lin Zhang, Longfei Li, Jun Zhou, Xiaolong Li, Yujiang Liu, Yuanchao ...

随机推荐

  1. P4180 【模板】严格次小生成树[BJWC2010]

    P4180 [模板]严格次小生成树[BJWC2010] 倍增(LCA)+最小生成树 施工队挖断学校光缆导致断网1天(大雾) 考虑直接枚举不在最小生成树上的边.但是边权可能与最小生成树上的边相等,这样删 ...

  2. spring mybatis 3.2调用mysql存储过程返回多结果集(完整、亲测、可用)

    最近,有个开发提了个需求,希望中间件支持调用mysql存储过程时支持多结果集返回,因为某些原因我们使用了不少的存储过程,很多复杂的逻辑目前来看交互非常的多,所以从当前的现状来说,这个需求还是蛮合理的. ...

  3. 2018-2019-1 20189218《Linux内核原理与分析》第八周作业

    编译链接的过程 编译就是把文本形式源代码翻译为机器语言形式的目标文件过程. 链接是把目标文件.操作系统的启动代码和用到的库文件进行组织最终形成可执行代码的过程. 对于GCC来说,编译源代码并最终形成可 ...

  4. noip2007部分题

    1.统计数字 题目描述 Description 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000 个,现在需要统计这些自然数各自出现 ...

  5. 关于Session的概念和测试点

    Session概要 Session 是用于保持状态的基于 Web 服务器的方法,在 Web 服务器上保持用户的状态信息供在任何时间从任何页访问. Session 允许通过将对象存储在 Web 服务器的 ...

  6. 第一个html文件

    1.新建记事本文件,后缀改为.html 2.添加: <html>  <head>  <title>jude`s first web</title>  & ...

  7. Python3基础 __repr__ 实例对象的名字,可以显示信息

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. 以太坊(Ethereum) - 节点时间未同步和区块同步失败案例分析

    背景 以太坊技术搭建的区块链网络,节点间需要保证时间一致,才能正常有序的发送交易和生成区块,使得众多节点共同维护分布式账本(区块数据+状态数据).但是,网络中节点的系统时间不一致回出现什么现象呢,我们 ...

  9. spring集成mybatis后,打印SQL语句

    网上说mybatis的早前版本配置打印sql还比较简单,在3.0.6之后配置方式修改了. 现在的spring-mybatis.xml配置如下: <bean id="sqlSession ...

  10. 【附2】hystrix详述(2)- 配置

    一.hystrix在生产中的建议 1.保持timeout的默认值(1000ms),除非需要修改(其实通常会修改) 2.保持threadpool的的线程数为10个,除非需要更多 3.依赖标准的报警和监控 ...