[异常检测]Deep One-Class Classfication(Deep-SVDD) 论文阅读源码分析

本文主要是介绍[异常检测]Deep One-Class Classfication(Deep-SVDD) 论文阅读源码分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

论文链接:http://proceedings.mlr.press/v80/ruff18a

文章目录

    • 论文阅读
      • 摘要
      • 相关工作
      • 模型结构
      • 实验
    • 源码分析
      • 数据集制作
      • 训练

论文阅读

摘要

“尽管deep learning在很多machine learning任务中取得成功,相对较少的deep learning方法被用在异常检测任务中。一些原本被用来做其他任务的深度模型例如生成模型或压缩模型尝试被用在异常检测任务中,但是没有基于异常检测目标训练的网络”

在18年的时候,anomaly detection这个任务还没有什么深度学习的方法,摘要中提到基于异常检测的目标进行训练是整篇论文的核心,也为后面的DL-based AD任务提供了一些思路。

相关工作

相关工作部分论文提到了基于传统方法和深度方法两个方向

  • One-class SVM & support vector data description(SVDD)

    One-class SVM
    m i n 1 2 ∣ ∣ w ∣ ∣ F k 2 − ρ + 1 v n ∑ i = 1 n ξ i s . t . ⟨ w , ϕ ( x i ) ⟩ ≥ ρ − ξ i , ξ i ≥ 0 min \frac{1}{2}||w||^2_{F_k}- \rho + \frac{1}{vn}\sum_{i=1}^n\xi_i \\ s.t. \left \langle w,\phi(x_i) \right \rangle \geq \rho - \xi_i, \xi_i \geq 0 min21wFk2ρ+vn1i=1nξis.t.w,ϕ(xi)ρξi,ξi0
    SVDD
    m i n R 2 + 1 v n ∑ i ξ i s . t . ∣ ∣ ϕ ( x i ) − c ∣ ∣ 2 ≤ R 2 + ξ i min \ R^2 + \frac{1}{vn}\sum_i\xi_i \\ s.t. ||\phi(x_i) - c||^2 \leq R^2 + \xi_i min R2+vn1iξis.t.ϕ(xi)c2R2+ξi
    其中 ϕ ( x i ) \phi(x_i) ϕ(xi)都是特征映射,OC-SVM是找一个间隔超平面使得数据与原点距离最大;SVDD是找到一个超球面,使得正常数据全部落在该超球面内,具体可参考网上的分析。

  • Deep learning method(Autoencoder GAN)

    基于深度学习的方法包括利用深度网络进行特征提取再与传统异常检测算法结合的,也有纯深度学习方法的,包括利用自编码器进行特征压缩和样本重构,将重构误差作为异常分数。
    s c o r e = ∣ ∣ x − x ^ ∣ ∣ 2 score = ||x - \hat{x}||^2 score=xx^2
    也有利用GAN网络在latent space对测试样本进行分析,这里不再赘述。

    这些方法的弊端统一有两点:1. 不是以anomaly detection为目标的(都是一些其他任务的副产物) 2. 压缩的dimension不好确定,是否能找到一个很好的低维latent space是决定性因素。

模型结构

在这里插入图片描述

  • 对于图像级数据,利用CNN进行特征提取,进行 X − F \mathcal{X} - \mathcal{F} XF的映射,在 F \mathcal{F} F空间中,尽可能希望大量normal样本被聚集在一个hypersphere中,而anomaly 样本在该hypersphere外。(思想与SVDD一致),这里的hypersphere中由两个参数确定(c, R),具体调整在后面会详解。
  • 论文提出了两个objective: soft-boundary & one-class

1 soft-boundary Deep SVDD

objective function:
m i n R 2 + 1 ν n ∑ i = 1 n m a x { 0 , ∣ ∣ ϕ ( x i ; W ) − c ∣ ∣ 2 − R 2 } + λ 2 ∑ l = 1 L ∣ ∣ W l ∣ ∣ F 2 min \ R^2 + \frac{1}{{\nu} n}\sum_{i=1}^nmax \left \{ 0,||\phi(x_i;W)-c||^2 -R^2 \right \} + \frac{\lambda}{2}\sum_{l=1}^L||W^l||_F^2 min R2+νn1i=1nmax{0,ϕ(xi;W)c2R2}+2λl=1LWlF2
软边界Deep-SVDD的核心思想是通过假设训练数据中不全是normal数据(因此强迫所有样本聚于超球面内是不合适的,但是从源码来看,训练的时候还是用的one-class数据,不过这样的假设更软,更适合实际场景), 因此利用 ν ∈ ( 0 , 1 ] \nu \in (0,1] ν(0,1]在超球体体积和超出边界的程度进行一个trade-off control. (这个参数控制着允许超出球面的样本比例)。

2 one-class Deep SVDD

objective function:
m i n 1 n ∑ i = 1 n ∣ ∣ ϕ ( x i ; W ) − c ∣ ∣ 2 + λ 2 ∑ l = 1 L ∣ ∣ W l ∣ ∣ F 2 min \frac{1}{n}\sum_{i=1}^{n}||\phi(x_i;W) - c||^2 + \frac{\lambda}{2}\sum_{l=1}^L||W^l||_F^2 minn1i=1nϕ(xi;W)c2+2λl=1LWlF2

一类Deep SVDD是在一个较强的假设,训练数据大部分都为normal数据,也就是处在一个one-classification的情境下,不用优化参数R,超球体的体积通过函数第一项进行隐式的压缩。该损失相较于soft-boundry是一种更硬的目标,要求所有样本离超球体中心更近,因此这种方法一定要在训练集大部分为normal下进行,否则测试阶段的异常样本也会被认为正常(因为把所有数据一起压缩了)。

3 测试

定义异常分数
s ( x ) = ∣ ∣ ϕ ( x ; W ∗ ) − c ∣ ∣ 2 s(x) = ||\phi(x;W^*) - c||^2 s(x)=ϕ(x;W)c2
对于soft-boundary来说可以利用
∣ ∣ ϕ ( x ; W ∗ ) − c ∣ ∣ 2 − R > 0 ||\phi(x;W^*) - c||^2 - R > 0 ϕ(x;W)c2R>0
进行判断。

4 优化

Adam作为优化器优化网络权重。当用soft-boundary损失时,因为要优化 W W W R R R, 两个参数优化是不同的尺度,因此利用alternating minimization/block coordinate descent approach,先将R固定住,训练k epoch 的W参数,之后的每个epoch先更新W,再利用最新的W,训练R。

5 性质

论文提到了该模型的四个性质,前三个性质为可能产生平凡解的情况,最后一个为参数 ν \nu ν的性质。

球心c的选择

当所有权重为零,得到的网络输出 ϕ ( x n ; W ) = ϕ ( x m ; W ) = c 0 \phi(x_n;W) = \phi(x_m;W) = c_0 ϕ(xn;W)=ϕ(xm;W)=c0时,即当权重为零时,所有样本映射至一个常数,则此时的loss为零,即达到一个最优解,但该解是无意义的,因此必须避免这种情况。

偏置项

传统的深度网络中往往有偏置项,但是该模型中不能有偏置项。

如果某个hidden layer有bias,则该层输出为 z l ( x ) = σ l ( W l z l − 1 ( x ) + b l ) z^l(x) = \sigma^l(W^lz^{l-1}(x) + b^l) zl(x)=σl(Wlzl1(x)+bl),则当权重全为零时,所有样本的输出同样相同即 z l ( x i ) = z l ( x j ) = σ l ( b l ) z^l(x_i) = z^l(x_j) = \sigma^l(b^l) zl(xi)=zl(xj)=σl(bl),最后的结果跟1一样,同样会输出到同一个点,使得R = 0。因此避免该情况就需要所有层不包含bias项,包括batch normal层($ x = \frac{x-mean}{\sqrt{var}}*\gamma + \varepsilon $)。

激活函数的选择

论文提到如果选择的激活函数包含上下界,则也会陷入hypersphere collapse。例如sigmoid函数,如果一个神经元对应所有样本输入都为正,则模型会朝着将其他神经元输出置零,该神经元输出继续增大,直到接近上界。那么也就和前述一样,所有样本输出为常数。

针对上述三点,论文的解决方案为:采用将网络进行初始化后的所有样本输出均值作为球心;所有层不添加bias;激活函数选择单侧无界函数(论文里使用的是leaky relu)

v-property

该性质与soft-boundary中的 ν \nu ν相关,较为复杂,暂没看懂,后续会专门结合OC-SVM中的性质一起总结。

实验

论文在MNIST 和 CIFAR10上进行实验,每个实验分别选择一类为normal类,其他为anomaly类。比较的方法包括传统方法OS-SVM/ 核密度估计 KDE/ isolation forest,深度方法 DCAE/ AnoGAN。

在提出的方法的实验中,具体实现是先用DCAE进行预训练,将encode部分作为网络权重,learning_rate为两阶段分别是1e-4, 1e-5; R的学习每5个epoch利用line search进行。

实验结果:
在这里插入图片描述

源码分析

源码地址:https://github.com/lukasruff/Deep-SVDD-PyTorch

数据集制作

利用L1-norm进行 全局对比度标准化global contrast normalization, 计算图像中所有像素的均值和标准差,然后每个像素分别减去权值并除以标准差。

def global_contrast_normalization(x, scale = 'l1'):assert scale in ('l1', 'l2')n_features = int(np.prod(x.shape)) # 所有维度特征数量和 n * w * hmean = torch.mean(x)x -= meanif scale == 'l1':x_scale = torch.mean(torch.abs(x)) if scale == 'l2':x_scale = torch.sqrt(torch.sum( x**2 )) / n_features # 这个是对比度x /= x_scalereturn x

训练集选择只选择某一类

def get_target_label_index(labels, targets):return np.argwhere(np.isin(labels, targets)).flatten().tolist() # 返回某一类的索引

训练

论文特意定义了一个trainer类。正式训练之前,将初始化网络的输出均值作为目标函数中的c

def init_center_c(self, train_loader, net, eps = 0.1):n_samples = 0c = torch.zeros(net.rep_dim, device = self.device)net.eval()with torch.no_grad():for data in train_loader:inputs, _ = datainputs = inputs.to(self.device)outputs = net(inputs)n_samples += outputs.shape[0]c += torch.sum(outputs, dim = 0)c /= n_samplesc[(abs(c) < eps) & (c < 0)] = -eps # 为了避免初始化后输出过小(前面提到输出的常数值,用relu的话不能输出零)c[(abs(c) > eps) & (c > 0)] = epsreturn c

loss部分参考源码自己写了一个函数

def Compute_loss(objective, outputs, r, c, v):assert objective in ('soft-boundry', 'one-class')dist = torch.sum((outputs-c)**2, dim = 1) # 行求和 N * 1if objective == 'soft-boundry':scores = dist - r**2 # 也是测试用的异常分数loss = r ** 2 + (1/v) * torch.mean(torch.max(scores, torch.zeros_like(scores)))else:loss = torch.mean(dist)return dist, loss

R的更新。论文中写的是line search,代码中给出的方法是:

def Get_radius(dist, v): # 参数\nureturn np.quantile(np.sqrt(dist.clone().data.cpu().numpy()), 1-v)
if (self.objective == 'soft-boundary') and (epoch >= self.warm_up_n_epochs):self.R.data = torch.tensor(get_radius(dist, self.nu), device=self.device) # 一个batch中的距离计算出来的

这篇关于[异常检测]Deep One-Class Classfication(Deep-SVDD) 论文阅读源码分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742995

相关文章

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-