无题
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
2self.struct_gate = nn.Linear(256, 256)
nn.init.constant_(self.struct_gate.bias, -1.0)更新后的 message 构造方式:
1
2gated_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 架构中
