![52b39946ee12f91a82f1c928fce5fc53.png](https://i-blog.csdnimg.cn/blog_migrate/1fb32ac9bc015c92cbf68a2f72d052c3.jpeg)
paper project page code
1. Overview
1.1 Motivation
自编码器在异常检测中广泛的使用(对此的总结回顾可参考异常检测概述(二):Reconstruction Model),在半监督/无监督的设定下,AE是期望异常的重构损失是较大的,而正常则不然,那么就可以区分这两者,但是实际上并不能保证这一点,AE实际上会把部分的异常也较好的重构,大部分的文章都认为这是AE泛化能力过强。而本文针对此问题,对AE做了记忆增强(Memory Augmentated AE)的操作来尝试克服这个问题。
![6fe3a6f1796ee1752ca4bfd069c1c42c.png](https://i-blog.csdnimg.cn/blog_migrate/c0fd25bd25b35e946fbfada189872abc.jpeg)
1.2 Idea
传统的AE是通过Encoder产生隐特征向量Z,然后经过Decoder还原到图像空间。而MemAE实际上是做了对Z的限制(以往的做法是对Z分布做限制,或者是做一些正则),而这里是以少量有限的prototype来代替Z,训练时Z以最近邻匹配最近的prototype,那么Decoder的input就是最近邻的prototype,训练会同时优化prototype,使得正常样本重构能够得到较贴合的还原。测试时,异常样本会匹配到正常的prototype,那么其重构损失就会相当明显,由此来发现异常。
2. Model Design
![8c2e7626bad73cf6f59b1b8470b3843d.png](https://i-blog.csdnimg.cn/blog_migrate/d8b588136064c83a2934b10cdcb53476.jpeg)
2.1 Encoder & Decoder
Encoder就是通过对于输入x,模型参数为$theta_e$ ,计算得到特征向量Z,而Z经过MemAE之后得到的是z^,那么Decoder就是通过$theta_d$产生X^。传统AE就是Z^=Z。
![17198ce5b50b1671f82dcb6734d8b38c.png](https://i-blog.csdnimg.cn/blog_migrate/aed1d8c28d4f7f9060637d08f2be85ac.jpeg)
2.2 Memory Module
当然如果直接使用Z与prototype最近邻too hard,这里通过产生记忆矩阵M=$R^{NC}$,其中N意味着memory slot个数,C是特征维度长度,Z是1C,维,也就是通过N个prototype的加权求和来近似表示Z。
![df8fdefe866d8b70aceeb06a93f9078e.png](https://i-blog.csdnimg.cn/blog_migrate/c1e02aa763f274e672af7f0d8cbe5683.jpeg)
对于N这个超参,文中说并不是很重要,够大就好了。
![8b485d33cab483224525c7460d6cc629.png](https://i-blog.csdnimg.cn/blog_migrate/17c0ec48950cf48de2447df10466b061.jpeg)
距离是采用cosine距离,而这个w是通过softmax方法计算,这就美其名曰Attention..
![e3e7c1fd09e7cfd45355a615e1db4cb0.png](https://i-blog.csdnimg.cn/blog_migrate/c6fd7fb07ae0ea467e57cd52b18bb90e.jpeg)
2.2.1 Hard Shrinkage
如果没有对W进行约束,通过prototype的组合还是有可能导致异常也能被重构,那么这里对W也进行了类似Relu的Hard Shrinkage约束,其实就是超过阈值才保留,不超过阈值就是0。
![4ca21498bb6db1500e4e518228c78176.png](https://i-blog.csdnimg.cn/blog_migrate/c670028bd8a43c3132f824a990cb9368.jpeg)
为了能够让这能够算梯度,结合Relu做了一点调整。
![0f792936ff2db9159830504fd9787bdc.png](https://i-blog.csdnimg.cn/blog_migrate/af8563bcabaebb80199b28021d0185d9.jpeg)
这里的超参数$lambda$是认为设定在[1/N,3/N]为宜。
2.3 Loss
这里包含了两个loss,一个就是常见的MSE,来期望重构好图像。另外一个就是对W的稀疏限制,也就是期望的W的熵越小越好。两者通过$alpha$进行权重调节,一般设为0.0002
![8031d83855ff8fdda5896dbf1b0f7cba.png](https://i-blog.csdnimg.cn/blog_migrate/397707d9ee92529af80aa8ea9dbafb3b.png)
3. Experiments
3.1 on MINIST & Cifar10
实验在MINIST和Cifar10上,在一个类里面训练然后另外的类视作异常的方法进行测试,然后通过对比MSE得到anomaly score
![488a080d861055d41f757eedf126a43c.png](https://i-blog.csdnimg.cn/blog_migrate/62f02409f344f8f99469a2aaca86d535.jpeg)
以上看到的结果发现做了“记忆”的操作是能够使得异常检测能力提高,但是Cifar10上整体比较差,说是其类间有很多变量导致的。下图可以看出而单个slot的memory重构的结果,都是跟训练集是相关的。
![78fafe92db228b3a45424a02e831fa14.png](https://i-blog.csdnimg.cn/blog_migrate/b1df31ef58ecc8c0d880c91b3e99d745.jpeg)
由此,对于未知的训练集,那么其更偏向于重构出已知的类别,这也就是说更能保证异常重构类似正常,从而区分开两者。
![ecadc017885450eace7359de6ef80774.png](https://i-blog.csdnimg.cn/blog_migrate/48c4f9e6c899226075357791ae47d48b.jpeg)
3.2 VAD
在Ped2、ShanghaiTech、Avenue数据集上的结果:
![7707778628c3bbe241ac753f0cdca5b6.png](https://i-blog.csdnimg.cn/blog_migrate/956ad8c4439e0c7c0dea6f96c70705dc.jpeg)
其中异常分值是通过对重构帧的重构损失的帧内归一化,1-之即为正常分值:
![b0ff7b8558e8949961edc4cbe56c248a.png](https://i-blog.csdnimg.cn/blog_migrate/3a5e51374fcd843e75265fcd7908ab5e.png)
![610a558e3f848f2d21a5ef86b08545bd.png](https://i-blog.csdnimg.cn/blog_migrate/ff4290e25b6a2937e00d760d6e1974a1.jpeg)
3.3 Cybersecurity Dataset
对于未知物体来说,这样的重构误差会更为明显,如上图。那么对于贴近正常的异常,这恐怕无能为力,AE本身的异常发现能力相对有限,但是本文的目标并不是为了刷榜,这种方法在异常检测中可以推广,继续扩展,比如用在时序数据中,这里在网络安全的数据上做了测试:
![f95a6ecfbff0815466616428884af87a.png](https://i-blog.csdnimg.cn/blog_migrate/6a36f4171f5c51a08b06930ece584d84.jpeg)
其能力确实相对来说有很大提高,这或许是因为图像空间中,采用MSE做重构损失容易导致图像模糊,模糊的图像计算error的差距相对不明显?对于离散的数据来说,更能显现出这个方法的能力。
3.4 Ablation Study
在ped2上做的消融实验,对比AE和AE+l1_norm,相对于仅仅只是加了隐向量正则,有“记忆”的存在,让Z是有限prototype的加权组合来近似Z,相对于L1正则约束Z更加能够让模型保证异常发现能力。
![0fcbc1e787004d0594fc45b739327a79.png](https://i-blog.csdnimg.cn/blog_migrate/178c69c8067529135a8f6bb28efb9c39.jpeg)
4. Discussion
这篇文章相对于以往的方法,提出了可靠的机制来保证重构的异常能够有更大的重构损失,diss了聚类的方法通常对于高维度的数据通常面临次最优的表现(现在的方法都是通过将图像空间做特征抽取后,再做聚类,维度已将大为下降,这里好像diss错地方了)
记住正常的prototype,以之重组正常,一定程度上保证未知的异常,尤其是未见过的物体的重构。
本文的实验都做的很简单,如果要提高性能,可以考虑视频的时序特性,帧间变化,应该有更有趣的拓展。
一家之言,难免疏漏,望不吝斧正~
本文首发于个人专栏 CV上手之路