Topology Attack and Defense for Graph Neural Networks: An Optimization Perspective

Xu K., Chen H., Liu S., Chen P., Weng T., Hong M. and Lin X. Topology attack and defense for graph neural networks: an optimization perspective. In International Joint Conferences on Artificial Intelligence (IJCAI), 2019.

为图添加/删除一些的边使得结点的预测发生误判, 基于此攻击作者又提出了一个对抗训练的方法.

符号说明

  • \(\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\) 表示删除边的操作. 故

    1. \([C\circ S]_{ij} = 1\) 表示添加了边;
    2. \([C \circ S]_{ij} = 0\) 表示不进行操作;
    3. \([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]

posted @ 2022-10-06 14:37  馒头and花卷  阅读(113)  评论(0编辑  收藏  举报