0%

zhj Memorizing Normality to Detect Anomaly

image-20201201183707250

ICCV, 2020

概要

autoencoder被广泛应用到异常检测.

前提假设:在正常的数据上训练, 在异常样本上会有较大的重构误差, 使用重构误差作为检测异常的标准.

然而, 这一假设在实际应用中不一定成立. 有时autoencoder的泛化性太好, 而导致在面对异常样本时也能很好地重构, 即重构误差小, 这会导致漏报异常. 为了缓解这个问题, 本文提出了memory-augmented autoencoder(MemAE). 给定一个输入样本, MemAE首先使用编码器获得隐变量z, 然后使用z作为一个查询, 在memory中检索出与z最相近的条目, 然后将这些条目组合输入到解码器用于重构. 在训练阶段, memory中的内容不断更新. 在测试的使用, memory被固定, 不再更新. 这样做会使用重构的样本非常像正常的样本(训练的时候只有正常样本, 所以memory是用正常样本编码获得的.) 这样做可以使得异常样本的重构误差更大. 此外, MemAE不限定数据类型, 所以它适用于各种数据类型的异常检测.

下图为检索数量为1的情况下的示意图:

image-20201201220151716

Memory-augmented Autoencoder

1. Overview

image-20201201232017450

模型有3个组成成分: encoder, decoder 和 memory. 给定一个输入, 首先编码获得隐变量z, 在训练的时候, 使用z去Memory中检索与z最像的一些记录, 然后将这些记录组合成新的隐变量$\hat{z}$, 然后传给解码器用于重构.

在训练的时候, 编码器, 解码器优化的方向是最小化重构误差. Memory同时不断更新.

在测试时, 输入一个测试样本, 只会使用Memory中的一些记录来重构. 这样的话, 重构样本会趋近与更像正常样本. 正常样本重构出来的重构误差更小, 异常样本的重构误差更大.

2.Enocder and Decoder

定义编码器为$f{e}(\cdot): \mathbb{X} \rightarrow \mathbb{Z}$, 解码器为$f{d}(\cdot): \mathbb{Z} \rightarrow \mathbb{X}$, 给定一个输入$x$, 首先通过编码器获得$z$, 然后从Memory中检索出$\hat{z}$, 然后经过解码器获得$\hat{x}$

使用的损失函数为MSE: $e=|\mathbf{x}-\widehat{\mathbf{x}}|_{2}^{2}$

3.Memory Module with Attention-based Sparse Addressing

本文所提出的memory模块包括两个部分: 存储模块和检索模块.

3.1 Memory设计

memory是一个矩阵$\mathbf{M} \in \mathbb{R}^{N \times C}$, 包含$N$个向量, 每个向量的维度是$C$ , $z$的维度是$C$. 设$m_i$是M的第i行. 给定一个query(查询)$\mathbf{z} \in \mathbb{R}^{C}$,首先获得一个寻址向量$\mathbf{w} \in \mathbb{R}^{1 \times N}$, 获得$\hat{z}$的方式为:

$w$是和为1的非负向量, 相当于$\hat{z}$是$m_i$的加权求和. 经过实验, 认为模型对$N$的取值不是很敏感, 一个足够大的$N$就能够在所有数据集上都取得较好的效果.

3.2 w的计算方式

计算$w_i$:

$d(\cdot, \cdot)$是距离度量, 本文使用的是余弦距离:

在训练的时候, 由于Memory的空间有限, MemAE通过使用有限的m组合来重构样本, 这样会迫使模型充分利用Memory, 使得Memory存储的是最具代表性的原型模式. 下图是使用9作为正常样本来训练MemAE, 并从Memory中随机选几个m, 经过解码之后重构出来的样本. 这张图是为了说明Memory中存储的是有代表性的原型模式.

image-20201202103206688

在测试阶段, 给定训练好的Memory, 异常样本的重构也只能利用正常的m组合形成$\hat{z}$, 然后重构. 下图中, 左图是使用5来训练, 测试时输入9. 右图是使用2来训练, 测试时输入4. 重构出来的样本都很像是训练样本.

image-20201202103625165

3.3 稀疏寻址(硬收缩)

作者指出, 如果w很稠密, 即w的每个分量都很小, 会导致多个m组合之后, 使用模型仍然具有较好的泛化性, 也有可能重构出异常样本. 为了缓解这个问题, 迫使w变得稀疏:

简单来说是设定一个阈值$\lambda$, 小于$\lambda$就设为0.

上式不容易反向传播, 修改为(continuous ReLU activation function):

根据经验, $\lambda$在区间$[1 / N, 3 / N]$内取值会取得比较理想的效果.

经过以上压缩之后,重新标准化:$\widehat{w}{i}=\widehat{w}{i} /|\widehat{\mathbf{w}}|_{1}$. 这样一来, $\widehat{\mathbf{z}}=\widehat{\mathbf{w}} \mathbf{M}$

以上的稀疏寻址操作有两个好处: 一是迫使Memory中的m是更具有代表性的原型; 二是降低模型泛化性导致异常样本也能重构的可能性.

3.4 训练

损失函数包括两部分:

一. 样本重构误差

二. 除上述的硬收缩之外, 通过损失函数使得w更加稀疏.

​ 考虑到$\hat{\mathbf{w}}$中的元素非负且$|\widehat{\mathbf{w}}|_{1}=1$, 最小化它的交叉熵就可以达到稀疏化的效果.

总体的损失函数如下:

$\alpha$是调节权重的超参, 本文设定为0.0002

4 实验

4.1 图像数据

平均AUC.

image-20201202112919657

4.2 视频数据

AUC:

image-20201202114254063

image-20201202114413583

4.3 网络安全数据

KDDCUP99

Each sample can be organized as a vector with 120 dimensions

image-20201202114638957

消融实验

image-20201202114807190

AE-ℓ1:最小化z的ℓ1范数.

MemAE-nonSpar: 不做稀疏化处理

MemAE w/o Shrinkage:没有硬收缩

MemAE w/o Entropy loss:损失函数中没有交叉熵