SLADE 结构增强机制改进过程记录

背景与目标

为提升动态图异常检测模型 SLADE 在多种数据集上的泛化能力与结构感知能力,我们围绕结构增强展开一系列实验,目标是设计一套通用、稳定、轻量的结构增强机制,能适用于如 Wikipedia、Reddit 等结构差异大的动态图数据集。


初始结构增强尝试:NIF (Node Interaction Frequency)

方法:

  • 对每个交互边 (u, v),记录其交互频次 freq_uv;

  • 将 freq_uv 离散为等级 (0~3),映射为可学习 embedding;

  • 拼接到 source_message 中:

    1
    source_message = [destination_memory, time_encoding, NIF_embedding]

问题:

  • 在 Reddit 上引发严重崩溃(AUC 降至 < 0.5);
  • 结构信号过强、未被控制,扰乱 memory 更新;

第一轮修复:加入 gate 控制结构信息注入

方法:

  • 使用结构 gate:sigmoid(Linear(NIF)) 控制结构特征注入强度;

  • 初始化 gate 的 bias 为 -1.0(结构默认弱激活):

    1
    2
    self.struct_gate = nn.Linear(256, 256)
    nn.init.constant_(self.struct_gate.bias, -1.0)
  • 更新后的 message 构造方式:

    1
    2
    gated_nif = gate * NIF
    source_message = [destination_memory, time_encoding, gated_nif]

效果:

  • Reddit 崩溃问题解决,AUC 提升至 0.7280(baseline 为 0.7198);
  • Wikipedia 稳定提升 +0.01 ~ +0.02;

第二轮改进:NIFEncoder 连续化 + 正则化

结构:

  • log1p(freq) 替代离散等级,提升频率表达的连续性;

  • 使用 MLP + Tanh + LayerNorm 编码结构特征,输出更稳定:

    1
    NIF = LayerNorm(Tanh(MLP([log1p(freq_uv), log1p(freq_vu)])))

Gate 控制结构保持原设计(bias = 0.0)

效果:

  • 在两个数据集上均取得稳定提升,无需调参,机制通用

第三轮尝试:引入结构频率变化量(delta_freq)

方法:

  • 构造 delta = log1p(freq_now) - log1p(freq_prev),加入结构特征中;
  • 目标:捕捉结构变化趋势、建模结构漂移;

问题:

  • AUC 明显下降(Reddit 从 0.7280 → 0.6831),Wikipedia 同样受损;
  • 原因:
    • delta_freq 数值不稳定或冗余;
    • 与 freq_now 强相关,引入噪声干扰;
    • gate 无法准确调节 delta 影响;

结论:

  • 结构变化量在当前框架中不具鲁棒性,不建议继续保留

最终结构增强模块(通用稳定版)

NIFEncoder:

1
MLP(log1p(freq_uv), log1p(freq_vu)) → Tanh → LayerNorm → NIF_feature

Gate 控制器:

1
sigmoid(Linear(NIF_feature)) → Dropout(0.1) → gate

Message 构造:

1
source_message = [destination_memory, Δt_encoding, gate * NIF_feature]

效果总结:

  • ✅ Wikipedia:AUC 提升约 +1%
  • ✅ Reddit:崩溃问题解决,提升 +0.8 ~ +1%
  • ✅ 通用机制:无需针对每个数据集调参,默认配置下稳定提升

后续优化方向

  • 拓展结构特征维度:如共邻居数、Jaccard、社区标签
  • 引入结构感知 loss 或结构对比任务
  • 结构趋势作为边 attention 的权重辅助,而非直接注入
  • 结构增强可迁移至 Transformer/GCN 架构中