异常点检测算法(三)Replicator Neural Networks

异常值检测算法在数据挖掘的诸多领域有着应用场景,例如金融领域,信息传输领域,图像领域等。在研究过程中,有学者给出了异常点的一个定义:

An outlier is an observation that deviates so much from other observations as as to arouse suspicion that it was generated by a different mechanism.

RNN 算法的主要思想

在这篇文章中,我们将会介绍一个多层的前馈神经网络,该神经网络可以用来进行异常值的检测。这个神经网络模拟的是一个恒等映射,输入层的神经元个数和输出层的神经元个数是一样的。这类的神经网络被称为 Replicator Neural Networks (RNNs),请注意这里的 RNN 算法指的并不是 Recurrent Neural Networks(RNNs),而是 Replicator Neural Networks,尽管它们拥有着同样的缩写名字 RNNs。具体来说, Replicator Neural Networks (RNNs),或者说自编码器,是一个多层前馈的神经网络 (multi-layer feed-forward neural networks)。在 Replicator Neural Networks 中,输入的变量也是输出的变量,模型中间层节点的个数少于输入层和输出层节点的个数。这样的话,模型就起到了压缩数据和恢复数据的作用。

如图所示,这里的 RNNs 有三个隐藏层,输入层和输出层的节点个数都是6,第一个隐藏层和第三个隐藏层的节点个数(图中是4个节点)少于输入层,第二个隐藏层的节点个数是最少的(图中是2个节点)。在神经网络传输的时候,中间使用了 tanh 函数和 sigmoid 函数。这个神经网络是训练一个从输入层到输出层的恒等函数(identity mapping),传输的时候从输入层开始压缩数据,然后到了第二个隐藏层的时候开始解压数据。训练的目标就是使得整体的输出误差足够小,整体的误差是由所有的样本误差之和除以样本的个数得到的。由于图中只画出了6个特征,因此第 i 个样本的误差是

如果使用已经训练好的 RNN 模型,异常值的分数就可以定义为重构误差(reconstruction error)。

下面简要介绍一下 RNN 模型是如何构建的:

根据上图所示,左边的是输入层,右边的输出层。假设第 k 层中第 i 个神经元的输出是 ,其中 表示第 k 层中第 i 个神经元的输入, 表示第 k 层使用的激活函数。那么

其中 是第 k 层中第 j 个神经元的输出, 是第 k 层神经元的个数。对于第二层和第四层而言 (k=2,4),激活函数选择为

这里的 是一个参数,通常假设为1。对于中间层 (k=3) 而言,激活函数是一个类阶梯 (step-like) 函数。有两个参数 N 和,N 表示阶梯的个数, 表示从这一层到下一层的提升率 (transition rate):

+.

在这里可以假设 . 那么 就如下图所示。

第三层的激活函数的输出就变成了 N 个离散的变量:0, 1/(N-1), 2/(N-1),…,1。这个阶梯型的激活函数是把第三层的连续输入值变成了一批离散的值。也就意味着把样本映射到了 N 个簇,那么 RNN 就可以计算出单个的异常点和一小簇的异常点。

备注:

根据上面的分析,可以看出如果按照以上算法,则不能使用反向传播算法来训练模型,原因是 的导数不能够通过它的取值来表示。这一点与 tanh 函数, 函数是不一致的,因为 。因此有学者指出 [1],使用三个隐藏层是没有必要的,使用1个或者2个隐藏层的神经网络也能够得到类似的结果;同样,没有必要使用 这样类型的阶梯函数,使用传统的 激活函数也能够得到类似的结果。并且 是一个 step-like 函数,很多地方的导数取值都是接近于零的。

后向传播算法:

一般来说,为了训练神经网络模型,需要使用后向传播算法(back propagation),也简称为 BP 算法,或者误差逆传播算法(error back propagation)。在本文中,仅针对最简单的 RNN 模型介绍如何使用 BP 算法进行模型训练,至于多层的神经网络模型或者其他的神经网络模型,方法则是完全类似的。

给定训练集合 ,其中有 m 个样本,并且输入和输出是一样的值。换句话说,也就是 n 维向量

.

换句话说,输入样例是由 n 个属性描述,输出的结果也是 n 个属性。隐藏层只有一个,隐藏层的神经元个数是 ,这里的 [] 表示 Gauss 取整函数。输出层第 j 个神经元的阈值使用 表示,隐藏层第 h 个神经元的阈值使用 表示。输入层第 i 个神经元与隐藏层第 h 个神经元之间的连接权重是, 隐藏层第 h 个神经元与输出层第 j 个神经元之间的连接权重是 其中

记隐藏层第 h 个神经元接收到的输入为

写成矩阵形式就是:

记输出层第 j 个神经元接收到的输入为

其中 是隐藏层第 h 个神经元的输出, 是激活函数。写成矩阵形式就是:

输出层第 j 个神经元的输出是 其中

下面可以假定激活函数都使用 那么直接通过导数计算可以得到

对于训练集 通过神经网络得到的输出是 并且 对于 都成立。那么神经网络在训练集 的均方误差是

其中 整体的误差是

标准 BP 算法:

网络中有 个参数需要确定:输入层到隐藏层的 n*q 个权重值,隐藏层到输出层的 n*q 个权重值,q个隐层神经元的阈值,n 个输出层神经元的阈值。BP 算法是一个迭代学习算法,在迭代的每一轮采用了梯度下降法来进行参数的更新。任意参数的更新规则是

+

标准 BP 算法是根据每一个 来获得更新规则,下面来推导每一个参数的更新规则。对于 计算梯度

注意到 先影响到第 j 个输出层神经元的输入值 再影响到第 j 个输出层神经元的输出值,最后影响到,根据高等数学的链式法则可以得到

根据定义 可以得到 对于 都成立。

根据定义 可以得到 .

根据定义 可以得到

所以可以计算出对于

如果假设

那么可以得到

因此对于 可以得到

根据类似的想法,有

.

逐个计算:

由于

所以,

其中

整理之后,任意参数 v 的更新式子是 + 并且更新的规则如下:

其中学习率 控制着算法每一轮迭代中的更新步长,若步长太大则容易振荡,太小则收敛速度过慢,需要人工调整学习率。 对每个训练样例,BP 算法执行下面的步骤:先把输入样例提供给输入层神经元,然后逐层将信号往前传,直到计算出输出层的结果;然后根据输出层的误差,再将误差逆向传播至隐藏层的神经元,根据隐藏层的神经元误差来对连接权和阈值进行迭代(梯度下降法)。该迭代过程循环进行,直到达到某个停止条件为止。

标准 BP 算法的训练流程:
输入:训练集合 和学习率
过程:
1. 在 (0,1) 范围内随机神经网络中的所有连接权重和阈值
2. repeat
for all do
根据当前参数,计算出当前的样本输出
计算输出层神经元的梯度项
计算隐藏层神经元的梯度项
更新连接权重 与阈值
end for
3. 达到停止条件
输出:链接权与阈值都确定的神经网络模型

累积 BP 算法:

BP 算法的目的是最小化训练集上的累计误差 其中 m 是训练集合中样本的个数。不过,标准的 BP 算法每次仅针对一个训练样例更新连接权重和阈值,也就是说,标准 BP 算法的更新规则是基于单个的 推导而得到的。通过类似的计算方法可以推导出累计误差的最小化更新规则,那就得到了累计误差逆传播(accumulate error backpropagation)算法。标准 BP 算法需要进行更多次的迭代,并且参数的更新速度快,累积 BP 算法必须扫描一次训练集合才会进行一次参数的更新,而且累计误差下降到一定的程度以后 ,进一步下降就会明显变慢,此时标准 BP 算法往往会更快的得到较好的解,尤其是训练集合大的时候。

训练方法:

(1)把数据集合的每一列都进行归一化;

(2)选择 70% 的数据集合作为训练集合,30% 的数据集合作为验证集合。或者 训练集合 : 验证集合 = 8 : 2,这个需要根据情况而定。

(3)随机生成一个三层的神经网络结构,里面的权重都是随机生成,范围在 [0,1] 内。输入层的数据和输出层的数据保持一致,并且神经网络中间层的节点个数是输入层的一半。

(4)使用后向传播算法(back-propagation)来训练模型。为了防止神经网络的过拟合,通常有两种策略来防止这个问题。(i)第一种策略是“早停”(early stopping):当训练集合的误差降低,但是验证集合的误差增加时,则停止训练,同时返回具有最小验证集合误差的神经网络;(ii)第二种策略是“正则化”(regularization):基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如链接权和阀值的平方和。

测试效果:

其中蓝色的点表示正常点,红色的点表示被 RNN 算法标记的异常点。

参考文献:

[1] Anomaly Detection Using Replicator Neural Networks Trained on Examples of One Class, Hoang Anh Dau, Vic Ciesielski, Andy Song

[2] Replicator Neural Networks for Outlier Modeling in Segmental Speech Recognition, Laszlo Toth and Gabor Gosztolya

[3] Outlier Detection Using Replicator Neural Networks, Simon Hawkins, Honxing He, Graham Williams and Rohan Baxter

异常点检测算法(三)Replicator Neural Networks相关推荐

  1. 非监督异常点检测算法总结——没有想到矩阵分解和编码解码器也是一种思路...

    非监督异常点检测算法总结 一.基于密度 1) d(p,o):两点p和o之间的距离: 2) k-distance:第k距离 对于点p的第k距离dk(p)定义如下: p的第k距离,也就是距离p第k远的点的 ...

  2. 使用PyTorch从零开始实现YOLO-V3目标检测算法 (三)

    原文:https://blog.csdn.net/u011520516/article/details/80216009 点击查看博客原文 这是从零开始实现YOLO v3检测器的教程的第3部分.第二部 ...

  3. Python机器学习笔记:异常点检测算法——Isolation Forest

    Python机器学习笔记:异常点检测算法--Isolation Forest 参考文章: (1)Python机器学习笔记:异常点检测算法--Isolation Forest (2)https://ww ...

  4. 皮肤检测算法三种,示例与代码

    今天是地球日,就选了张相关主题的图像做测试 第一种:RGB color space 第二种:RG color space 第三种:Ycrcb之cr分量+otsu阈值化 还有别的一些模型,效果不太好就不 ...

  5. RX异常点检测算法(马氏距离)

    异常检测算法目的在于从影像中将目标信息(异常信息)从影响背景和噪声中分离出来.RX异常检测算法为一种局部目标检测算法,算法的监测窗口包括目标窗口和背景窗口,且后者远大于前者.RX算法假设数据空间白化且 ...

  6. 时间序列异常点检测算法(Smoothed z-score algorithm)

    目录 前言 一.原理 二.代码实现 总结 前言 时间序列异常点处理! 一.原理 算法原理:利用滑动窗口对之后的节点值做一个范围预测(利用平均值和方差),如果真实节点不在这个范围,则表明该节点是异常值. ...

  7. python时间序列异常值查找_(No.38)时间序列异常点检测算法

    写在前面: 针对一个数值序列,识别出其中的异常波动点.例如: p = [1 1 1.1 1 0.9 1 1 1.1 1 0.9 1 1.1 1 1 0.9 1 1 1.1 1 1 1 1 1.1 0. ...

  8. 基于时间序列的异常检测算法小结

    简介 搜罗了网上几乎所有的基于时间序列的异常检测方法,没有包括文献,整理记录一下. 综合引用以下文章: 数据挖掘导论 时间序列异常检测机制的研究 KPI异常检测竞赛笔记 异常检测之时间序列的异常检测 ...

  9. [论文阅读] (02) SP2019-Neural Cleanse: Identifying and Mitigating Backdoor Attacks in Neural Networks

    神经清洁:神经网络中的后门攻击识别与缓解 Neural Cleanse: Identifying and Mitigating Backdoor Attacks in Neural Networks ...

最新文章

  1. (译)第一次Android开发单飞
  2. nslookup命令详解【转】
  3. 天空测试显卡软件,BootCamp版本检测工具v1.5.2
  4. strrchr php,php strstr() strrchr() strpos() strrpos()函数_PHP教程
  5. 实例14:python
  6. 初中位似图形作图_教师资格证面试中,哪些篇目最容易抽到?(初中数学篇)...
  7. mysql cst_一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历...
  8. mysql内连接和外连接的区别_数据库左连接、右连接、内连接、全连接区别
  9. 如此多的深度学习框架,为什么我选择PyTorch?
  10. 切比雪夫多项式(Chebyshev Polynomials)
  11. 2021赣网杯web和misc部分wp
  12. 一脸懵逼加从入门到绝望学习hadoop之Caused by: java.net.UnknownHostException: master报错
  13. 《图解HTTP》全文笔记梳理
  14. 微信获取授权用户手机号
  15. C#基础面试题(附答案)
  16. js日期计算,根据当前日期计算n个月后的日期
  17. I have the Dream
  18. python树状图可视化_如何可视化(树状图)一个层次项目字典?
  19. 【单片机项目与仿真】控制步进电机转速的Proteus仿真及C语言程序设计
  20. idea pom依赖失败_maven多模块和依赖冲突问题汇总记录

热门文章

  1. 05-Node.js—http模块
  2. win10计算机组共享的打印机,Win10系统局域网共享打印机设置 共享大地Win10打印机的方法...
  3. krpano plugin interface
  4. 【Vue3+Vite+TS项目集成ESlint +Prettier实现代码规范检查和代码格式化】
  5. Blender插件开发:用fake-bpy-module提供代码补全
  6. Java中的switch
  7. 从动态性、并发性、独立性和异步性上比较进程和程序。
  8. 一例Vmware虚拟化Vcenter连接不上解决过程。
  9. 毫米和像素怎么换算_图片的像素和毫米之间的换算关系
  10. 在线生成ascii字符画网站字符图案在线生成工具