SLADE
文献地址:SLADE: Detecting Dynamic Anomalies in Edge Streams without Labels via Self-Supervised Learning
代码地址:SLADE
1 引言(Introduction)
在现实场景中进行图异常检测面临以下挑战:
挑战 C1:检测延迟(Time Delay in Detection)
尽管大多数异常检测方法假设输入图是静态的,但现实中的图是随着交互事件不断演化的。因此,及时识别异常事件变得尤为重要。如果检测存在延迟,就有可能在此期间让恶意节点对正常节点造成损害。
然而,如果每次交互事件发生时都重新运行一次静态图异常检测算法,那么巨大的计算成本会造成严重的延迟。为此,我们应当将交互事件建模为边流(edge stream),并使用增量计算(incremental computation)方式,在常数时间内评估每条新边是否异常。
过去一些研究(如文献[4,12])已经提出了用于边流异常检测的增量算法。然而,这些方法大多只针对某一类异常(例如突发行为),缺乏可学习的模块,难以识别复杂的行为偏移模式。
挑战 C2:状态的动态变化(Dynamically Changing States)
在现实网络中,用户的状态是随时间变化的。一个用户在某一时间段可能表现正常,但在另一个时间段却可能变成异常用户。
例如:一个正常用户的账号可能被黑客入侵并被用来发送垃圾广告。在这种情况下,该用户的状态会从“正常”转变为“异常”。这种类型的用户即为动态异常(dynamic anomalies),比传统的静态异常检测难度更高。
解决这个挑战的一种方式是:追踪节点行为随时间的变化。这需要借助动态图表示学习(dynamic node representation learning)技术。然而,目前的动态图表示学习方法大多依赖于异常标签进行训练,而这些标签在现实中是稀缺的。
挑战 C3:异常标签缺乏(Lack of Anomaly Labels)
图神经网络(GNN)等深度学习方法在图异常检测方面表现出色,但它们大多依赖于异常标签进行监督学习。然而,现实中的异常标签通常难以获取,尤其是动态异常。
为此,一些研究开始尝试使用无监督方法进行异常检测,例如在静态图中采用重构误差或对比学习等方式。但这些方法很难同时满足上述三大挑战:动态建模、增量处理、无监督学习。
本文贡献
为了解决上述问题,本文提出了 SLADE(Self-supervised Learning for Anomaly Detection in Edge Streams)框架,实现了以下目标:
- 无需任何异常标签,进行无监督学习;
- 利用两个自监督任务训练动态图模型;
- 在每条新边到来时,以常数时间更新节点状态,支持实时检测。
这两个自监督任务包括:
- 最小化表示漂移(即让节点表示在短时间内保持稳定);
- 从短期交互中生成长期行为模式(如果生成失败,表示该节点偏离正常模式)。
第 3 章:问题定义(Problem Statement)
连续时间动态图定义
我们研究的对象是边流图(edge stream graph),即一个随着时间不断增长的图。我们将其形式化地表示为:
$\mathcal{G} = { (u_s, u_d, t, e) }$
其中,每一个四元组表示一条带时间戳的边,具体含义如下:
- $u_s$:边的源节点(source node);
- $u_d$:边的目标节点(destination node);
- $t$:该边发生的时间戳(timestamp);
- $e$:该边的属性信息,例如交互类型、金额等(edge feature)。
这组边随着时间不断到来,形成一个异构边序列,即边的类型和节点可能随时间发生变化。这样的结构属于连续时间动态图(CTDG),广泛存在于诸如社交网络、金融系统、通信日志等现实场景中。
动态异常定义
我们关注的并不是传统静态图中的孤立异常,而是节点行为随时间发生异常偏移的情况,即所谓的动态异常(dynamic anomalies)。
什么是动态异常?
- 它不是由一条孤立边导致的;
- 而是一个节点在近期的行为模式,与其长期历史行为明显不一致。
这种异常更加复杂且隐蔽,举例来说:
- 某位用户长期习惯在白天浏览正常网页,但某天凌晨频繁访问可疑链接;
- 某个银行账户突然连续向多个从未交互的账户转账;
- 一个社交账号短时间内发送了大量以前从不发布的内容。
这些“行为漂移”不容易通过传统图结构或静态异常检测方法捕捉到,因此构成了我们要解决的核心问题。
问题目标
我们的目标是设计一种模型,能够:
在每条新边到达时,实时地判断该边所涉及的节点是否处于异常状态。
具体而言,假设当前新到达的边为 $(u_s, u_d, t, e)$,我们希望有一个异常评分函数:
$A: (u_s, u_d, t, e) \mapsto \mathbb{R}$
该函数输出一个实数值,表示该节点是否处于异常状态。
- 分值越高,表示节点行为越异常;
- 该判断必须迅速且高效(最好是常数时间复杂度)完成,以满足实时检测的需求。
模型要求
为了实现上述目标,我们提出的模型需要满足以下三点:
- 无监督性(No Labels Required)
模型不能依赖任何预先标注的异常节点或异常边,因为现实中这些标签往往缺失或者难以获取。 - 动态性(Temporal Adaptation)
节点的表示应随着新的边到达而不断更新,反映出其时间演化过程中的状态变化。 - 增量计算(Incremental Inference)
每当有一条新边到来,模型应只处理该边及其相关节点的数据,而不重新处理整个图结构。
为此,下一章我们将引入一个自监督学习框架 —— SLADE,它可以在边流图中自动学习节点的行为模式,并实现异常检测。
第 4 章:所提方法:SLADE
本章我们介绍 SLADE(Self-supervised Learning for Anomaly Detection in Edge Streams)方法,它是一种针对 连续时间动态图(CTDG) 中无监督的动态异常检测方法。
SLADE 背后的核心直觉是:
正常节点的交互模式往往在结构上和时间上具有一致性,而异常节点则由于重复异常行为可能暴露自身,因而行为更加多变。
基于这一点,作者提出了两个关键假设:
- A1. 稳定的长期交互模式(Stable Long-Term Interaction Patterns):
正常节点倾向于在长期内重复类似的交互行为,这种模式在短时间窗口内的变化非常小。 - A2. 模式可恢复性(Potential for Restoration of Patterns):
可以仅通过节点近期的交互,准确还原其长期行为模式。
为了捕捉满足 A1 和 A2 的正常行为模式,SLADE 利用两个自监督任务对模型进行训练:
- S1. 时间对比任务(Temporal Contrast):最小化短期内节点表示的漂移,服务于 A1。
- S2. 记忆生成任务(Memory Generation):基于近期邻居信息生成节点长期行为表示,服务于 A2。
若某个节点在 S1 或 S2 上表现较差(如生成失败或变化突兀),则被视为可能异常。
4.1 SLADE 的核心模块
为了增量式学习每个节点的动态表示,SLADE 包含以下三个模块:
- 记忆模块(Memory Module)
- 存储每个节点的长期交互模式;
- 用一个可更新的记忆向量 $\mathbf{s}_i$ 表示节点 $v_i$;
- 初始为零向量,随后由 GRU 逐步更新。
- 记忆更新器(Memory Updater)
- 每条边到达时,根据对端节点的记忆与时间差,生成消息向量;
- 用 GRU 结构将消息编码进当前节点记忆,实现历史行为演化。
- 记忆生成器(Memory Generator)
- 给定节点近期邻居,使用 TGAT 模型生成记忆向量;
- 该向量应逼近真实长期记忆向量,用以评估生成效果。
记忆更新细节
当一条边 $(vi, v_j, t{ij})$ 到达时,SLADE 会根据如下方式生成两端节点的消息:
- $\mathbf{m}i = \mathrm{MLP}([\mathbf{s}_j | \phi(t{ij} - t_{j}^{\mathrm{prev}})])$
- $\mathbf{m}j = \mathrm{MLP}([\mathbf{s}_i | \phi(t{ij} - t_{i}^{\mathrm{prev}})])$
其中:
- $\phi(\cdot)$ 是时间编码函数;
- $[\cdot | \cdot]$ 表示向量拼接。
然后使用 GRU 更新节点记忆:
$\mathbf{s}_i = \mathrm{GRU}(\mathbf{m}_i, \mathbf{s}_i^{\prime})$
记忆生成细节
给定节点 $vi$,我们使用 TGAT 聚合其最近邻居的状态 ${(\mathbf{s}{n1}, t{n1}), …, (\mathbf{s}{nk}, t{n_k})}$,计算生成记忆:
$\hat{\mathbf{s}}i = \mathrm{TGAT}({\mathbf{s}{nj}, t - t{nj}}{j=1}^k)$
4.2 训练目标与流程
SLADE 的训练目标是最小化两个自监督损失:
1)时间对比损失(Temporal Contrast Loss)
该损失鼓励节点表示在短时间内尽可能平稳。
给定节点 $v_i$ 在时间 $t$ 前后的记忆向量分别为 $\mathbf{s}_i^{\prime}$ 与 $\mathbf{s}_i$,其时间对比损失为:
$\ell_c(v_i, t) = 1 - \cos(\mathbf{s}_i^{\prime}, \mathbf{s}_i)$
批次级别的总对比损失为:
$Lc = \frac{1}{|E_B|} \sum{(vi, v_j, t) \in E_B} \omega{cs} \cdot \ellc(v_i, t) + \omega{cd} \cdot \ell_c(v_j, t)$
其中 $\omega{cs}, \omega{cd}$ 是源节点与目标节点的权重。
2)记忆生成损失(Memory Generation Loss)
该损失衡量基于短期邻居生成的记忆向量与真实记忆之间的误差:
$\ell_g(v_i, t) = 1 - \cos(\hat{\mathbf{s}}_i, \mathbf{s}_i)$
总体生成损失为:
$Lg = \frac{1}{|E_B|} \sum{(vi, v_j, t) \in E_B} \omega{gs} \cdot \ellg(v_i, t) + \omega{gd} \cdot \ell_g(v_j, t)$
最终损失函数
最终总损失为上述两者之和:
$L = L_c + L_g$
注意:虽然训练中并不使用异常标签,但作者假设训练集中的大部分节点是正常的,因此模型能有效学习正常行为。
4.3 异常评分(Anomaly Scoring)
SLADE 在推理阶段根据两个评分函数对每个节点进行异常检测:
1)时间对比评分(Temporal Contrast Score)
衡量当前和之前的记忆向量之间的差异:
$s_{cc}(v_i, t) = 1 - \cos(\mathbf{s}_i^{\prime}, \mathbf{s}_i)$
该评分越高,表示当前行为偏离长期行为越严重,可能异常。
2)记忆生成评分(Memory Generation Score)
衡量当前记忆与由邻居生成记忆的相似度:
$s_{cg}(v_i, t) = 1 - \cos(\hat{\mathbf{s}}_i, \mathbf{s}_i)$
该评分越高,表示短期行为无法重建正常行为,可能异常。
最终异常评分为两个得分的加权平均或合并,后续章节中作者会做消融实验验证各项得分的有效性。
下一章是 第 5 章:讨论与分析(Discussion and Analysis),如你希望我继续翻译,请告诉我!我也可以帮你画图梳理结构关系图。