基于深度学习的图异常检测如何改进

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于深度学习的图异常检测如何改进相关的知识,希望对你有一定的参考价值。

您好,基于深度学习的图异常检测是一种有效的方法,但是仍然存在一些问题需要改进。以下是几种可能的改进方法:

1. 数据增强:在训练模型之前,可以使用数据增强技术来扩充训练数据集。这可以帮助模型更好地学习数据的特征,并提高模型的准确性。

2. 增加正常数据:在训练模型时,可以增加正常数据的数量,这可以帮助模型更好地学习正常数据的特征,并减少误报率。

3. 引入新的特征:除了使用传统的图像特征,还可以考虑引入新的特征,例如图像的上下文信息、颜色信息等等,以提高模型的准确性。

4. 使用集成学习:集成学习可以将多个模型组合在一起,以提高整体的准确性和稳定性。可以使用不同的深度学习算法或不同的参数来训练多个模型,然后将它们组合在一起,以获得更好的结果。

5. 对抗训练:对抗训练是一种训练模型的方法,其中模型被训练来对抗一些特定的攻击。这可以帮助模型更好地识别异常数据,并提高模型的鲁棒性。

综上所述,基于深度学习的图异常检测可以通过数据增强、增加正常数据、引入新的特征、使用集成学习和对抗训练等方法来改进。这些方法可以帮助模型更好地识别异常数据,并提高模型的准确性和鲁棒性。
参考技术A 基于深度学习的图异常检测方法已经在许多领域得到了广泛应用,但是这种方法仍然有许多可以改进的地方,以下是一些改进策略:

1. 数据预处理:一些数据的预处理方法,如降维、规范化、数据采样等,可以使异常检测更加准确。例如,对于图像数据,可以使用特征提取技术将原始像素数据转换为更抽象和有意义的特征向量。

2. 网络结构的改进:改进深度神经网络的结构来提高异常检测的精度和效率。例如,可以使用不同的激活函数、增加网络深度、调整各层之间的连接等。

3. 数据增强:通过随机扰动、旋转、裁剪等方式增加训练数据的多样性,可以增加模型的鲁棒性和泛化能力,从而提高异常检测的效果。

4. 异常检测算法的调整:根据具体的场景和数据特点,选择适合的异常检测算法,如有监督学习、无监督学习、半监督学习等,以获得更好的异常检测结果。

5. 多模态数据的融合:对于多模态数据,可以将不同的数据模态融合在一起进行异常检测,以提高异常检测的准确性和鲁棒性。

综上所述,改进基于深度学习的图异常检测方法,可以从数据预处理、网络结构、数据增强、异常检测算法和多模态数据融合等方面入手,以提高异常检测的准确性和泛化能力。
参考技术B 改进基于深度学习的图异常检测方法:

1. 使用复杂的模型:使用更复杂的深度学习模型,如卷积神经网络(CNN)、循环神经网络(RNN)或变分自编码器(VAE)等,可以提高图异常检测的准确性。
2. 结合图像和图数据:结合图像和图数据可以提高异常检测的准确性,例如可以使用卷积神经网络(CNN)提取图像特征,然后将这些特征与图数据结合使用来进行异常检测。
3. 弱化异常数据的影响:通过对异常数据进行去噪、降维等处理,可以减少异常数据对整个图的影响,从而提高异常检测的准确性。
4. 结合其他数据源:将图数据与其他数据源结合使用,例如社交网络数据、地理信息数据、生物数据等,可以提高异常检测的准确性。
5. 优化损失函数:通过设计更合理的损失函数,可以提高异常检测模型的准确性。例如,可以设计基于图结构的损失函数、基于异常度量的损失函数等。
6. 数据增强:通过对图数据进行增强,例如添加噪声、旋转、缩放等,可以增加训练数据的多样性,提高异常检测模型的准确性。
参考技术C 您好,基于深度学习的图异常检测是一种有效的方法,但是它仍然存在一些问题和局限性,需要进一步改进。

首先,深度学习模型通常需要大量的数据来训练,但是在某些应用场景下,数据可能非常有限,这就会影响模型的性能。因此,需要研究如何在数据有限的情况下进行图异常检测。

其次,深度学习模型通常需要较长的训练时间,这会导致在实际应用中出现延迟问题。因此,需要研究如何加速深度学习模型的训练过程,以提高图异常检测的实时性。

另外,深度学习模型通常是黑盒模型,难以解释其决策过程。这会导致在实际应用中出现可解释性问题,因此需要研究如何提高深度学习模型的可解释性,以便更好地理解其决策过程。

最后,深度学习模型对于噪声和异常数据比较敏感,容易出现误检测和漏检测的情况。因此,需要研究如何提高深度学习模型的鲁棒性,以减少误检测和漏检测的情况。

总之,基于深度学习的图异常检测仍然存在一些问题和局限性,需要进一步改进,以提高其性能和实用性。
参考技术D 1、加强数据预处理:对数据进行归一化处理,去除噪声,增强图像质量,以提高模型的准确率;

2、进行模型的调参,采用网络结构设计,调优学习率、优化函数,隐藏层数量等参数;

3、加强特征提取:增加模型层数,提高模型的深度,增加卷积层的大小,可以提取更多的特征,提高模型的准确率;

4、对模型结构进行调整:采用卷积神经网络,更具空间关系进行网络搭建,充分提取空间特征;

5、添加新的特征提取算法,如图像金字塔、小波变换等算法,可以挖掘更多的纹理特征,增加检测准确率;

6、采用强化学习技术,模拟人类学习的方式,让模型更好地理解环境,从而提高模型的准确率。

《异常检测——从经典算法到深度学习》13 MAD: 基于GANs的时间序列数据多元异常检测

《异常检测——从经典算法到深度学习》

相关:

重要说明

感谢小伙伴的提醒,从这一篇开始为了突出重点,将翻译部分全部移到自己的 个人博客 中( 5 M 带宽并且配置了 CDN 的服务器应该不会太慢,就是有点伤钱)。

所以接下来的内容将是简单明了的部分,一般而言会提到几个大家都关心的问题:

  • 这是什么论文?值得看吗?一般而言节选的论文不一定是很厉害的会议或者期刊上的,而是一些相对基础一些的,容易理解的,甚至比较简单的。因为个人认为读那种非常复杂高深的论文参考意义不一定很大。
  • 论文算法开源吗?很抱歉大多数论文不开源,但是我会尽量找一些开源的论文。
  • 论文用到的是什么数据集?数据集这个问题非常难以解决,但是论文提到的也会在下面记下。
  • 论文最最最主要在讲什么?一般论文有个总体思路,算法有个最主要的模型等等。这里希望自己能够概括一下这部分内容。有必要的话,我也会制作成 PPT 的形式和大家交流。
  • 论文的优缺点。

13. MAD: 基于GANs的时间序列数据多元异常检测

2018 Anomaly Detection with Generative AdversarialNetworks for Multivariate Time Series
论文下载以及源码地址:MAD-GANs 翻译
期刊:Lecture Notes in Computer Science(普刊)
引用索引 bib

13.1 简要概述论文内容

13.1.1 核心思想与方法

论文提出了一种新的基于无监督GAN的异常检测 (GAN- AD) 方法,该方法通过建模多个时间序列之间的非线性关联,并基于训练好的 GAN 模型检测异常。

上图分为训练和检测两部分,这两部分之间的联系就是隐变量。这个与 VAE 异常检测类似,把数据特征存储在隐变量中,检测的时候隐变量则会派上用场。因为生成模型本身是不能直接输出与异常有线性关系的结果的。

继续看上图左边部分,这个是典型的 GAN 模型,GAN 模型的判别器与生成器 “相爱相杀”,生成器想方设法欺骗判别器而判别器又不断提高自己的识别能力。论文在 GAN 标准模型上添加了 LSTM 与 RNN。

继续看上图右边部分,异常检测部分首先从测试数据开始,将样本数据与隐变量空间建立映射关系,然后再把映射结果作为输入交给 GAN 的生成器,注意看上面的虚线,是指这个生成器是训练得到的。使用生成器对隐变量输入进行重构,然后与测试数据进行计算得到 Residual Loss ,同样将测试数据直接交给判别器进行计算得到 Discrimination Loss ,最后将这两个损失结合,得到最终的检测结果。

13.1.2 主要贡献

  • 提出了一种基于 GAN 的无监督异常检测方法,用于检测具有网络传感器和执行器的复杂多进程网络物理系统的异常(网络攻击)。
  • 使用多个时间序列对GAN模型进行训练,采用LSTM-RNN (Long - Short - Term-Recurrent Neural Networks, LSTM-RNN) 捕获时间相关性,从图像生成域自适应生成GAN进行时间序列生成。
  • 均匀使用高维的正规序列训练GAN模型区分真伪,同时从特定的潜在空间重构测试序列;
  • 将训练好的鉴别器计算的鉴别损失与重构序列与真实测试序列之间的残差损失(训练好的鉴别器与生成器同时使用)结合起来检测高维时间序列中的异常点,在具有六级的复杂安全水处理(SWaT)系统中,该方法在检测网络攻击导致的异常方面优于现有方法。

13.1.3 论文算法

论文算法:LSTM-RNN-GAN-based Anomaly Dection Strategy。

训练时

  • 对于第 k 个批次训练数据:
    • 从隐变量空间中生成样本 Z = { z i , i = 1 , 2 , . . . , m } ⇒ G R N N ( Z ) Z=\\{z_i, i=1,2,...,m\\} \\Rightarrow G_{RNN}(Z) Z={zi,i=1,2,...,m}GRNN(Z)
    • 进行判别操作 X = { x i , i = 1 , 2 , . . . , m } ⇒ D R N N ( X ) X=\\{x_i,i=1,2,...,m\\} \\Rightarrow D_{RNN}(X) X={xi,i=1,2,...,m}DRNN(X)
    • G R N N ( Z ) ⇒ D R N N ( G R N N ( Z ) ) G_{RNN}(Z)\\Rightarrow D_{RNN}(G_{RNN}(Z)) GRNN(Z)DRNN(GRNN(Z)) 即进行对抗训练
    • 通过梯度下降来最小化 D l o s s D_{loss} Dloss 更新判别器的参数: min ⁡ 1 m ∑ i = 1 m ( − log ⁡ D R N N ( x i ) − log ⁡ ( 1 − D R N N ( z i ) ) ) \\min \\frac{1}{m}\\sum_{i=1}^m(-\\log D_{RNN}(x_i)-\\log(1-D_{RNN}{(z_i)})) minm1i=1m(logDRNN(xi)log(1DRNN(zi)))
    • 通过梯度下降来最小化 G l o s s G_{loss} Gloss 更新判别器的参数: min ⁡ ∑ i = 1 m log ⁡ ( − D R N N ( G R N N ( z i ) ) ) \\min \\sum_{i=1}^m \\log (-D_{RNN}(G_{RNN}(z_i))) mini=1mlog(DRNN(GRNN(zi)))。(注: 这个地方应该是指更新生成器的参数。应该是论文书写错误。
    • 记录当前迭代中生成器与判别器的参数。
  • 本次循环建立测试数据与隐变量之间的映射关系
  • 计算残差(residuals): R e s = ∣ X t e s − G R N N ( Z k ) ∣ Res = |X^{tes}-G_{RNN}(Z^k)| Res=XtesGRNN(Zk)
  • 计算判别结果: P r o = D R N N ( X t e s ) Pro=D_{RNN}(X^{tes}) Pro=DRNN(Xtes)
  • 计算异常分数: S = R e s + P r o S=Res+Pro S=Res+Pro

13.1.4 其他部分

算法这一块儿的内容大致如上,其他部分内容比如 Anomaly Detection Framework 中提到的使用 PCA 建立映射关系比较简单,而其他部分比如根据阈值进行异常打标实在是有凑公式凑字数的嫌疑。

13.2 实验数据与结果

实验使用的是 SWaT 数据集,可以前去 https://itrust.sutd.edu.sg/ 进行申请,一般填写学生邮箱就能申请成功,但是给的是谷歌云盘的资源地址,并且数据集非常大,一般是几个 G 起。

SWaT 数据是一个高维数据(共有51个维度),光从谷歌云下载下来就需要花费大量的时间。因此,不建议使用这个数据集。但是如果环境允许可以申请一下,了解一下。

论文源码https://github.com/LiDan456/MAD-GANs 提到可以考虑跑一下 KDD CUP 数据,数据集附加在源码文件夹中,解压即可用。并且已经是进行一些处理后的,比如不考虑异常的类型,只要是异常就把标签设置为 1 等。

具体步骤:

环境说明

  • tensorflow 1.x
  • keras:1.x

克隆项目

git clone https://github.com/LiDan456/MAD-GANs.git

解压文件夹

需要注意解压后的是这样的,不要添加额外的路径:

直接运行

python RGAN.py --settings_file kdd99 

如果是使用 notebook 的话前面添加感叹号即可,具体效果如下:

对测试数据进行异常检测

 python AD.py --settings_file kdd99_test


同样需要一些时间,输出的结果大致包括:


常见问题

一般情况下肯定都会出问题,莫方莫烦,逐个解决即可。

首先确保tensorflow版本

一般情况下 1.x 即可。我自己的环境是 1.15.4


其次是 keras 的版本

一般也是 1.x 即可,我的环境是 1.1.2

scipy报错

运行训练的时候报错。具体的报错内容是 ModuleNotFoundError: No module named 'scipy.misc.pilutil'

查了一下官网,这个库是旧版本的,所以方法就是降低版本或者不使用这个库,我们选择不使用这个库,所以前去源码指定位置进行一波注释即可。

具体的文件地址是 data_utils.py ,其中的第14行,from scipy.misc.pilutil import imresize 根本后面就没用到,所以直接注释掉就好了。

numpy报错

在进行测试的时候,看到的报错。具体报错内容是 ValueError: Object arrays cannot be loaded when allow_pickle=False

方法也非常简答,把 model.py 中所有 np.load 都添加一个参数以及值为 True。如图所示:


linux解压7z文件

如果和我一样使用的是云服务器跑代码的话,或者本身自己用的就是linux系统的话,希望通过命令行解压也非常简单。安装方法与解压请 参考

p7zip x data.7z

需要多长时间执行完

跟自己的机器性能有关,一般情况下……很久。叫上你的小伙先去吃顿饭吧。


运行时间太长

模型的训练需要很长时间(约半个小时),而模型的测试却需要更长的时间,简直可怕,我居然非常有耐心让它跑完了(睡觉第二天出结果)。


约 4.5 小时。所以如果希望早点结束运行的话,需要修改源码文件夹中的配置文件。experiments/settings/kdd99_test.txt 找到这个文件中的 num_epochs ,默认是 100 修改为 10 或者更小即可。

其他错误

我没有遇到其他问题,如果有遇到其他问题请在后面留言。

13.3 论文的优缺点

个人认为最大的优点就是开源,让大家可以跑一下玩一下了解一下,说不定也写到自己的论文的 REFERENCE 中。

其次论文相对而言比较简单,没有高深的数学理论和复杂的推导公式。

还有很不错的地方在于提供数据集让大家解压即可使用,这一点必须给作者以及作者团队点赞。

缺点就是凑字数的嫌疑太大了,比如 f1-score 的计算公式也写到论文中而且还算是5个公式是不是有点不太好,而且在算法中更新判别器和生成器的时候那个地方应该是存在错误的,两个地方都是更新判别器参数是非常不科学的。

但总体而言虽然这只是一个普刊上的论文,但是还是值得读一下,跑一下代码,了解一下的。如果觉得作者写得可以的话也请前去 github 点星星吧。自己的论文也可以考虑引用一下。作为对比实验之类的。

13.4 致谢

不知不觉这方面的博客写了这么长时间了,存在很多很多问题,也有不少小伙伴留言与私信交流这方面的内容,对我也有一些帮助,感谢!

如果有这方面的疑问欢迎留言讨论!


感谢 您的 阅读、点赞、收藏评论 ,别忘了 还可以 关注 一下哈,感谢 您的支持!

Smileyan
2021.8.5 17:02

以上是关于基于深度学习的图异常检测如何改进的主要内容,如果未能解决你的问题,请参考以下文章

《异常检测——从经典算法到深度学习》16 基于VAE和LOF的无监督KPI异常检测算法

异常检测——从经典算法到深度学习》14 对于流数据基于 RRCF 的异常检测

异常检测——从经典算法到深度学习》14 对于流数据基于 RRCF 的异常检测

《异常检测——从经典算法到深度学习》15 通过无监督和主动学习进行实用的白盒异常检测

《异常检测——从经典算法到深度学习》15 通过无监督和主动学习进行实用的白盒异常检测

《异常检测——从经典算法到深度学习》17 基于 VAE-LSTM 混合模型的时间异常检测