SimGuard 阅读笔记:Over-Similarity Perspective
论文:Boosting Graph Robustness Against Backdoor Attacks: An Over-Similarity Perspective关键词:Graph Backdoor Defense、Over-Similarity、Trigger Detection、Contrastive Learning、DRR
1. 核心问题
现有图后门攻击中的触发器是真的具有样本特异性,还是表现出固有的相似性?
作者发现:这些生成的触发器存在过度相似性,表现为高度的特征相似性和结构相似性。这种过度相似性使其更容易与干净节点区分开来,原因很可能是触发器生成过程缺乏足够约束。
2. 核心方法
SimGuard 的目标是:精准识别触发器并有效消除其影响。
整体方法包括:
将整体异常检测与密度聚类方法结合,识别潜在触发器;
通过灵活边界区分触发器与干净节点,提高检测精度;
引入基于对比学习的触发器检测模块;
通过对比损失函数,让触发器嵌入与干净节点嵌入有效分离。
2. Preliminaries
2.1 Backdoor and Problem Definition
2.1.1 图的基本定义
作者定义带属性图为:
$$
G=(V,E,X)
$$
其中:
$$
V=\{v_1,\dots,v_N\}
$$
$$
E \subseteq V \times V
$$
$$
X=\{x_1,\dots,x_N\}
$$
这里:
$V$:节点集合;
$E$:边集合;
$X$:节点特征集合。
2.1.2 Inductive Setting
作者强调:训练图和测试图不是同一个图。
训练阶段有:
$$
G_T=(V_T,E_T,X_T)
$$
推理阶段有一个未见过的新图:
$$
G_U=(V_U,E_U,X_U)
$$
并且训练图和测试图节点不重叠:
$$
V_U \cap V_T = \emptyset
$$
这个设定很关键。因为如果只是 transductive setting,防御方法可能只需要在一个固定图上删除触发器;但 inductive setting 要求方法能够迁移到新图上。
所以 SimGuard 后面不仅要在训练阶段找 trigger,还要训练一个trigger detector,使其在推理阶段也能检测新图中的触发器。
2.1.3 干净节点与后门节点
训练图中有干净节点集合:
$$
V_C \subseteq V_T
$$
也有后门节点集合:
$$
V_B \subseteq V_T
$$
干净节点 $v_i \in V_C$ 的标签是真实标签:
$$
y_i
$$
后门节点 $v_j \in V_B$ 会被攻击者赋成目标类别:
$$
y_t
$$
也就是说,攻击者会把一部分节点污染掉:给它们加 trigger,并把它们标成攻击目标类别。
2.1.4 Trigger 与目标节点之间的边
图后门攻击一般不是像图像后门那样贴一个小图案,而是在目标节点附近注入节点或子图。
作者用:
$$
E_B \subseteq E_T
$$
表示后门节点和 trigger 之间的连接边。
也就是说:目标节点本身不一定改变,但是它的邻域里多了触发器节点或触发器子图。随后通过 GNN 的 message passing,trigger 信息会传到目标节点上。
2.1.5 推理阶段
测试图里面也分干净节点和后门节点:
$$
V_U = V_U^C \cup V_U^B
$$
测试阶段后门节点和 trigger 的连接边写成:
$$
E_U^B \subseteq E_U
$$
这说明攻击不只发生在训练图,推理阶段也可能给新节点挂 trigger。
2.1.6 攻击者目标
攻击者希望训练出一个后门模型,使其同时满足两个条件:
第一,带 trigger 的节点被预测成目标类:
$$
f(v_j)=y_t
$$
第二,不带 trigger 的干净节点保持正常分类。
因此,后门攻击的危险在于:干净准确率看起来正常,但只要触发条件出现,模型就会稳定误判。
2.1.7 防御者知识
防御者不知道:
$$
V_B
$$
也就是不知道哪些节点被攻击。
防御者也不知道:
$$
y_t
$$
也就是不知道攻击目标类是什么。
防御者只能拿到一个可能已经被污染的训练图,然后训练防御模型。推理阶段还要面对一个可能也被污染的新图。
2.1.8 图后门防御目标
作者把防御目标写成:
$$
\min_f \sum_{v_i\in V_C} l(f(v_i),y_i) + \sum_{v_j\in V_B} l(f(v_j),y_j)
$$
第一项表示干净节点要分类正确:
$$
\sum_{v_i\in V_C} l(f(v_i),y_i)
$$
第二项表示后门节点也应该恢复到正确状态:
$$
\sum_{v_j\in V_B} l(f(v_j),y_j)
$$
这和很多旧防御不同。旧防御往往只要求:
$$
g(v_t)\neq y_t
$$
也就是被攻击节点不要再预测成攻击目标类。
但 SimGuard 要求更高:
$$
g(v_t)=y_o
$$
其中 $y_o$ 表示攻击前的原始预测结果,或者原本应该属于的语义类别。
核心思想:
不预测成目标类,不代表恢复到了正确类别。
2.1.9 Proposition 2.1
Proposition 2.1 想表达:鲁棒训练方法可以让目标节点不再预测成攻击目标类,但不能保证它恢复到原始类别。
鲁棒训练目标大致为:
$$
\min_f L_f = \sum_{v_i\in V_D} \log f(v_i)_{y_t} + \sum_{v_j\in V_T\setminus V_D} L(f(v_j),y_j)
$$
其中:
$V_D$:检测出的疑似 trigger 或后门相关节点;
$y_t$:攻击目标类别;
$g(v_i)$:节点 $v_i$ 的预测类别。
鲁棒训练最多能做到:
$$
g(v_t)\neq y_t
$$
但不能保证:
$$
g(v_t)=y_o
$$
原因是:防御者不知道这个节点攻击前到底应该是什么类别。所以它可以把节点从目标类拉走,但不知道该把它拉回哪里。
2.2 Contrastive Learning Preliminaries
对比学习的核心思想是:
相似样本拉近,不相似样本推远。
正样本对:
$$
(z_i,z_j)
$$
负样本对:
$$
(z_i,z_k)
$$
InfoNCE 损失为:
$$
L_{\text{contrastive}} = -\frac{1}{N} \sum_{i=1}^{N} \log \frac{ e^{\operatorname{sim}(z_i,z_j)/\tau} }{ \sum_{k=1}^{N} e^{\operatorname{sim}(z_i,z_k)/\tau} }
$$
其中:
$$
e^{\operatorname{sim}(z_i,z_j)/\tau}
$$
表示正样本对的相似度项。
如果正样本越相似:
$$
\operatorname{sim}(z_i,z_j) \uparrow
$$
则分子越大,loss 越小。
分母为:
$$
\sum_{k=1}^{N} e^{\operatorname{sim}(z_i,z_k)/\tau}
$$
它包含很多样本,包括负样本。如果 $z_i$ 和负样本也很像,分母就会变大,loss 也会变大。
所以模型为了让 loss 变小,会学到:
$$
\operatorname{sim}(z_i,z_j) \uparrow
$$
同时:
$$
\operatorname{sim}(z_i,z_k) \downarrow
$$
3. Over-Similarity Phenomenon
第三章的核心问题是:
现有图后门攻击生成的 trigger 到底是不是真的 sample-specific?还是说它们其实有共同模式,可以被检测出来?
作者的结论是:它们并不够 sample-specific,反而具有明显的 over-similarity。
3.1 Over-Similarity in Features
3.1.1 Trigger-Bridge Node
作者没有直接分析整个 trigger 子图,而是先定义了一个更关键的节点:
Trigger-Bridge Nodes,简称 TBN。
它指的是:
直接连接到目标节点的 trigger node。
原因是:在 GNN 里,信息通过 message passing 传播。真正把 trigger 影响传给目标节点的,就是这些和目标节点直接相连的 trigger node。
攻击链路可以理解为:
trigger node → target node → GNN message passing → target prediction 被劫持
3.1.2 特征相似度计算
作者计算 TBN 之间的 pairwise cosine similarity:
$$
C_k = \frac{1}{n-1} \sum_{j=1, j\neq i}^{n} \frac{v_i \cdot v_j}{\|v_i\|\|v_j\|}
$$
其中:
$v_i, v_j$:两个 trigger node 的特征向量;
$n$:trigger-bridge nodes 的总数;
$C_k$:某个 trigger node 和其他 trigger nodes 的平均相似度。
如果 $C_k$ 很高,说明 trigger nodes 彼此非常相似。
3.1.3 主要观察
作者在 GTA、UGBA、DPGBA 上进行分析,发现:
trigger 之间的相似度明显高于 clean nodes 之间的相似度;
GTA 和 DPGBA 中,trigger 几乎 collapse 到同一种特征上;
UGBA 没有完全 feature collapse,但仍存在全局异常相似。
可以概括为:
GTA / DPGBA:trigger 特征几乎坍缩 UGBA:没有完全坍缩,但仍存在全局异常相似
SimGuard 的逻辑链为:
trigger features over-similar → trigger 在特征空间形成异常高密度区域 → 可以用相似性 / 密度聚类 / 异常分数检测 trigger
3.2 Over-Similarity in Structure
3.2 关注 trigger 的结构相似性,尤其是 trigger 的 degree 分布。
作者计算每个 trigger 的度数,然后统计均值和方差:
$$
\text{Mean}
$$
$$
\text{Var}
$$
如果所有 trigger node 的 degree 都一样,那么:
$$
\text{Var}=0
$$
这说明 trigger 在结构上高度一致。
Table 1 的主要结果:
GTA: Cora: Mean = 1.0, Var = 0.0 CiteSeer: Mean = 1.0, Var = 0.0 PubMed: Mean = 1.0, Var = 0.0 DPGBA: Cora: Mean = 3.0, Var = 0.0 CiteSeer: Mean = 3.0, Var = 0.0 PubMed: Mean = 3.0, Var = 0.0 UGBA: Cora: Mean = 2.7, Var = 0.45 CiteSeer: Mean = 3.0, Var = 0.0 PubMed: Mean = 1.0, Var = 0.0
结论:现有 graph backdoor attacks 不仅在特征上过相似,在结构上也过相似。
4. Defense Method
SimGuard 的基本策略是:
在消息传播前识别 trigger ↓ 删除 trigger ↓ 训练 trigger detector ↓ 推理阶段遇到新图,也能检测并删除 trigger
4.1 Identify Triggers
检测要在 message passing 之前做。原因是:一旦开始 GNN 聚合,trigger 特征会和目标节点、邻居节点特征混在一起。
4.1.1 DBSCAN 聚类
$$
C = \operatorname{DBSCAN}(F,\epsilon,\operatorname{minPts})
$$
其中:
$F$:节点原始特征;
$\epsilon$:DBSCAN 的邻域半径;
$\operatorname{minPts}$:形成一个簇所需要的最小点数。
DBSCAN 得到多个簇:
$$
C=\{C_1,C_2,\dots,C_K\}
$$
4.1.2 结构方差辅助判断
对每个 cluster 计算节点度数均值和方差:
$$
\mu(C_i)=\frac{1}{|C_i|}\sum_{u\in C_i}d(u)
$$
$$
\sigma^2(C_i)=\frac{1}{|C_i|}\sum_{u\in C_i}(d(u)-\mu(C_i))^2
$$
如果一个簇里所有节点度数几乎一样:
$$
\sigma^2(C_i) \approx 0
$$
则这个簇可能是 trigger cluster:
$$
\{C_i \mid \sigma^2(C_i)<\delta\}
$$
其中 $\delta$ 是一个很小的阈值,例如:
$$
\delta=0.001
$$
4.1.3 Global Anomaly Score
UGBA 没有完全 feature collapse,因此作者设计了 global anomaly score:
$$
G(x)= \frac{1}{m} \sum_{i=1}^{m} \frac{\|x-y_i\|_1}{\|x\|_1+\|y_i\|_1}
$$
其中:
$x$:待检测节点;
$y_i$:选出来的 clean nodes;
$m$:clean nodes 的数量;
$G(x)$:节点 $x$ 的 global anomaly score。
然后将所有节点的 $G(x)$ 从大到小排序,得到:
$$
G_{\operatorname{sorted}}
$$
找排序后相邻分数差距最大的地方:
$$
k=\arg\max_j \left( G_{\operatorname{sorted}}(j) - G_{\operatorname{sorted}}(j+1) \right)
$$
最后取前面异常分数最高的一批节点作为 trigger:
$$
S=\{\pi(i)\mid 0\leq i\leq k\}
$$
其中 $\pi(i)$ 表示排序后索引映射回原始节点索引。
这个过程可以理解为:
异常分数排序 ↓ 找最大断崖 ↓ 断崖之前的节点认为是 trigger
4.2 Training a Trigger Detector Based on Contrastive Learning
4.1 是训练阶段检测 trigger,但推理阶段会遇到新的 unseen graph:
$$
G_U
$$
所以 SimGuard 需要训练一个 trigger detector,使其能泛化到新图。
4.2.1 Proposition 4.1
如果 trigger generation 足够强,攻击者总能通过加边或加 trigger,让目标节点预测成攻击目标类:
$$
f_u(G')=y_t
$$
这说明推理阶段也必须防御,不能只清理训练图。
4.2.1 Subset of Normal Nodes
训练 trigger detector 需要两类样本:
trigger nodes clean nodes
trigger nodes 可以通过 4.1 的检测方法找出来。clean nodes 则通过 autoencoder 的重构误差选出。
Autoencoder 重构损失为:
$$
L_{\operatorname{recon}}(v_i) = \left\| X_i - f_{\operatorname{decoder}} \left( f_{\operatorname{encoder}}(X_i) \right) \right\|_1
$$
选择高置信 clean nodes:
$$
O=\{v_i\mid L_{\operatorname{recon}}(v_i)<\delta\}
$$
4.2.2 Train a Trigger Detection
作者使用对比学习训练 trigger detector。
目标是:
clean nodes 彼此靠近 trigger nodes 彼此靠近 clean nodes 和 trigger nodes 彼此远离
每轮训练采样 $m$ 个 clean nodes,其中 $m$ 等于检测出来的 trigger 数量。
clean-clean 相似项
$$
u_i= \frac{1}{m-1} \sum_{j=1,j\neq i}^{m} e^{z_i^+\cdot z_j^+/\tau}
$$
trigger-trigger 相似项
$$
v_i= \frac{1}{m-1} \sum_{j=1,j\neq i}^{m} e^{z_i^-\cdot z_j^-/\tau}
$$
clean-trigger 相似项
$$
q_i= \frac{1}{m} \sum_{j=1}^{m} e^{z_i^+\cdot z_j^-/\tau}
$$
其中:
$z_i^+$:clean node 的归一化表示;
$z_i^-$:trigger node 的归一化表示;
$\tau$:temperature parameter。
整体 contrastive loss 为:
$$
L= -\frac{1}{m} \left( \sum_{i=1}^{m} \log\frac{u_i}{q_i} + \sum_{i=1}^{m} \log\frac{v_i}{q_i} \right)
$$
最终效果:
clean nodes 聚成一类 trigger nodes 聚成一类 两类之间拉开距离
