Topology Attack and Defense for Graph Neural Networks: An Optimization Perspective
概
为图添加/删除一些的边使得结点的预测发生误判, 基于此攻击作者又提出了一个对抗训练的方法.
符号说明
- \(\mathcal{G = (V, E)}\), 图;
- \(|\mathcal{V}| = N, |\mathcal{E}|=M\);
- \(A \in \{0, 1\}^{N \times N}\), 邻接矩阵;
- \((\bm{x}_i \in \mathbb{R}^{M_0}, y_i)\), 结点 \(i\) 对应的特征和标签;
- GCN:\[H^{(k)} = \sigma(\tilde{A}H^{(k-1)}(W^{(k-1)})^T), \]其中 \(\tilde{A}\) 是 \(A\) 添加 self-loop 后 + 标准化后的邻接矩阵.
Topology Attack
-
Topology attack 就是指在原图 \(\mathcal{G}\) 的基础上, 添加和删除一些边, 使得对于某一些点 \(i\) 的标签预测产生误判;
-
作者首先将这个问题转换为:
\[A' = A + C \circ S, \: C = \bar{A} - A, \]其中
\[S \in \{0, 1\}^{N \times N}, \\ \bar{A} = \bm{1}\bm{1}^T - I - A, \]\(\circ\) 表示 element-wise 的乘法.
注意到, 扰动后的邻接矩阵 \(A'\) 是在原来的 \(A\) 的基础上进行 \(C \circ S\) 的操作. 这里 \(S_{ij} = 1\) 表示该位置的边发生了变化, 而 \(C_{ij} = 1\) 表示添加边的操作, 而 \(C_{ij} = -1\) 表示删除边的操作. 故
- \([C\circ S]_{ij} = 1\) 表示添加了边;
- \([C \circ S]_{ij} = 0\) 表示不进行操作;
- \([C \circ S]_{ij} = -1\) 表示删除了边;
-
如此以来, 我们就可以着眼于 \(S\) 的设计了, 为了保证扰动前后 \(A', A\) 的'差别'不是很大, 作者还额外添加了
\[\|S\|_1 \le \epsilon \]的限制.
-
于是, 攻击的目标函数可以归纳为:
\[\tag{6} \begin{array}{ll} \min_{S} & \sum_{i \in \mathcal{V}} f_i(\bm{s}; W, A, \{\bm{x}_i\}, y_i) \\ \text{s.t.} & \bm{1}^T\bm{s} \le \epsilon, \: \bm{s} \in \{0, 1\}^n, \end{array} \]这里我们用 \(\bm{s} \in \{0, 1\}^n, n = N(N-1)/2\) 来替代 \(S\), 因为后者是一个对称矩阵, 用 \(\bm{s}\) 就可以避免这一限制. (6) 中的 \(f_i\) 表示预测误差的损失的反, 比如 CE-type loss:
\[f_i(\bm{s}, W; A, \{\bm{x}_i\}, y_i) = \log Z_{i, y_i}, \]这里 \(Z_{i, y_i}:= \hat{P}(y = y_i|\bm{x}_i)\);
-
为了进一步解决 (6) 中的限制条件, 我们可以放松为:
\[\tag{8} \begin{array}{ll} \min_{S} & \sum_{i \in \mathcal{V}} f_i(\bm{s}; W, A, \{\bm{x}_i\}, y_i) \\ \text{s.t.} & \bm{1}^T\bm{s} \le \epsilon, \: \bm{s} \in [0, 1]^n, \end{array} \]然后通过如下算法采样 \(\bm{u}\) 用于增删 \(A\):
-
为了更新 \(\bm{s}\), 我们采用 PGD (projected gradient descent):
\[\bm{s}' \leftarrow \text{clip}(\bm{s} - \eta \bm{g} - \mu \bm{1}, 0, 1), \]其中 \(\eta, \bm{g}\) 分别为学习率和梯度, 而 \(\mu \ge 0\) 为
\[\min_{\mu} \quad \bm{1}^T \bm{s}' \le \epsilon \]的解, 可以用二分法逼近.
对抗训练
- 我们可以通过如下损失进行对抗训练:\[\min_{W} \: \max_{\bm{s}} \: -f(\bm{s}, W), \]这里每次训练我们首先通过上述的攻击方法生成 \(\bm{s}^*\), 然后再在此基础上\[\min_{W} -f(\bm{s}^*, W). \]重复直到收敛.
代码
[official]