{"notes":[{"id":"graph-learning/sgc","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"SGC","subtitle":"线性就够了？","author":"Z. Yuan","paperDate":"2019-02-19","publishedOn":"2024-02-09","world":"external/sgc","paperTitle":"Simplifying Graph Convolutional Networks","paperUrl":"https://arxiv.org/abs/1902.07153","bibliography":{"title":"Simplifying Graph Convolutional Networks","authors":["Felix Wu","Tianyi Zhang","Amauri Holanda de Souza","Christopher Fifty","Tao Yu","Kilian Q. Weinberger"],"url":"https://arxiv.org/abs/1902.07153","pdfUrl":"https://arxiv.org/pdf/1902.07153v2","codeUrl":"https://github.com/Tiiiger/SGC","preprint":{"id":"1902.07153","submittedOn":"2019-02-19","url":"https://arxiv.org/abs/1902.07153"},"publication":{"venue":"ICML","year":2019,"kind":"conference","url":"https://proceedings.mlr.press/v97/wu19e.html"},"citation":"@misc{graphlearningsgc2019,\n  title = {{Simplifying Graph Convolutional Networks}},\n  author = {Felix Wu and Tianyi Zhang and Amauri Holanda de Souza and Christopher Fifty and Tao Yu and Kilian Q. Weinberger},\n  year = {2019},\n  eprint = {1902.07153},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1902.07153}\n}\n","citationPath":"/content/papers/citations/graph-learning/sgc.5b3815dbf17c.bib"},"thumbnail":{"src":"/content/papers/assets/42da0472259826c266fe1b1b617041ef7cb3aa49eda3558ac91dcd15aa5272e0.png","width":1366,"height":612},"locale":"zh-hans","path":"/content/papers/zh-hans/graph-learning/sgc.fffc749dcc50.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"解决问题","text":"解决问题","depth":2},{"id":"拿掉非线性","text":"拿掉非线性","depth":3},{"id":"从频域看它是一个低通滤波器","text":"从频域看：它是一个低通滤波器","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"引用网络与-reddit","text":"引用网络与 Reddit","depth":3},{"id":"快多少","text":"快多少","depth":3},{"id":"下游任务","text":"下游任务","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"graph-learning/gin","relation":"referenced","topic":""}]},{"id":"graph-learning/gin","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"GIN","subtitle":"加总才算数","author":"Z. Yuan","paperDate":"2018-10-01","publishedOn":"2023-12-28","world":"external/gin","paperTitle":"How Powerful are Graph Neural Networks?","paperUrl":"https://arxiv.org/abs/1810.00826","bibliography":{"title":"How Powerful are Graph Neural Networks?","authors":["Keyulu Xu","Weihua Hu","Jure Leskovec","Stefanie Jegelka"],"url":"https://arxiv.org/abs/1810.00826","pdfUrl":"https://arxiv.org/pdf/1810.00826v3","codeUrl":"https://github.com/weihua916/powerful-gnns","preprint":{"id":"1810.00826","submittedOn":"2018-10-01","url":"https://arxiv.org/abs/1810.00826"},"publication":{"venue":"ICLR","year":2019,"kind":"conference","url":"https://arxiv.org/abs/1810.00826"},"citation":"@misc{graphlearninggin2018,\n  title = {{How Powerful are Graph Neural Networks?}},\n  author = {Keyulu Xu and Weihua Hu and Jure Leskovec and Stefanie Jegelka},\n  year = {2018},\n  eprint = {1810.00826},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1810.00826}\n}\n","citationPath":"/content/papers/citations/graph-learning/gin.f2b31912b576.bib"},"thumbnail":{"src":"/content/papers/assets/1062d104bcaae50e5f8c9abf6c72f574a014c68e6a7bb4c6705f663336773b4f.png","width":960,"height":214},"locale":"zh-hans","path":"/content/papers/zh-hans/graph-learning/gin.eebc14bb4c0d.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"邻居聚合的共同形式","text":"邻居聚合的共同形式","depth":3},{"id":"邻居是一个多重集合","text":"邻居是一个多重集合","depth":3},{"id":"wl-测试","text":"WL 测试","depth":3},{"id":"解决问题","text":"解决问题","depth":2},{"id":"gnn-的上限","text":"GNN 的上限","depth":3},{"id":"加总平均最大值","text":"加总、平均、最大值","depth":3},{"id":"gin","text":"GIN","depth":3},{"id":"不够强但不一定没用","text":"不够强，但不一定没用","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"实验设置","text":"实验设置","depth":3},{"id":"训练集拟合得了吗","text":"训练集拟合得了吗","depth":3},{"id":"测试准确率","text":"测试准确率","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"graph-learning/sgc","relation":"citing","topic":""},{"id":"graph-learning/gnn-plus","relation":"citing","topic":""}]}],"text":"GCN 从深度学习借来了一整套做法。一层接一层，每层一个权重矩阵，中间夹着 ReLU，最后接 softmax。\n\nCornell 的 Felix Wu、Tianyi Zhang 与 Kilian Weinberger 等人怀疑，这套做法里有些部分可能是多余的。他们在引言里回顾，机器学习的方法大多从简单出发，不够用时才加复杂度；线性感知器的极限催生了多层感知器，Sobel 这类固定的滤波器后来才演变成可学习的 CNN。GCN 是少见的例外，它在神经网络复兴之后才提出，一开始就建立在多层网络上，从来没有一个更简单的线性版本。\n\n作者还补了一句很实际的话。现实世界的应用，大多数分类器其实还是线性的，通常是逻辑回归，容易优化，也容易解释。\n\n于是他们把 GCN 一路拆到最简单，看看还剩下什么。\n\n## 定义问题\n\n先回顾 GCN 的一层。令 $S=\\tilde D^{-1/2}\\tilde A\\tilde D^{-1/2}$ 是加了自环的归一化邻接矩阵，第 $k$ 层做三件事：\n\n1. **特征传播**：$\\bar H^{(k)}\\leftarrow SH^{(k-1)}$，每个节点和邻居做加权平均。\n2. **线性变换**：$\\bar H^{(k)}\\leftarrow\\bar H^{(k)}\\Theta^{(k)}$。\n3. **非线性**：$H^{(k)}\\leftarrow\\mathrm{ReLU}(\\bar H^{(k)})$。\n\n$K$ 层之后接 softmax 分类：\n\n$$\n\\hat Y_{\\text{GCN}}=\\mathrm{softmax}\\left(SH^{(K-1)}\\Theta^{(K)}\\right)\n$$\n\n这三件事里，哪一件真正让 GCN 在引用网络上表现好？作者的假设是第一件。在这类图上，相邻节点通常属于同一类，把邻居的特征平均进来，同类的节点就会变得更像，后面的分类器也就好做了。\n\n## 解决问题\n\n### 拿掉非线性\n\n如果非线性不是关键，就把它全部拿掉，只在最后保留 softmax：\n\n$$\n\\hat Y=\\mathrm{softmax}\\left(S\\cdots SSX\\Theta^{(1)}\\Theta^{(2)}\\cdots\\Theta^{(K)}\\right)\n$$\n\n连乘的 $S$ 可以写成 $S^K$，连乘的权重矩阵也可以合并成一个 $\\Theta$：\n\n$$\n\\hat Y_{\\text{SGC}}=\\mathrm{softmax}\\left(S^KX\\Theta\\right)\n$$\n\n这就是 SGC（Simple Graph Convolution）。$\\bar X=S^KX$ 完全没有参数，可以在训练前算好一次；之后整个训练，就是一个以 $\\bar X$ 为输入的多类别逻辑回归，损失函数是凸的，用什么二阶方法或随机梯度下降都行。\n\n[![原论文 Figure 1：上排是 GCN，输入图经过 K 次「特征传播、线性变换、非线性」的循环，最后接 softmax；下排是 SGC，输入图只做一次 K 步的特征传播，接着就是逻辑回归。两排的输入与预测结果相同。](/content/papers/assets/42da0472259826c266fe1b1b617041ef7cb3aa49eda3558ac91dcd15aa5272e0.png)](/content/papers/assets/42da0472259826c266fe1b1b617041ef7cb3aa49eda3558ac91dcd15aa5272e0.png)\n\n*原论文 Figure 1（Wu 等人），取自 [**PDF 第 2 页**](https://arxiv.org/pdf/1902.07153v2#page=2)。图注未收录。*\n\n上排的 GCN 每一层都要回到图上传播一次；下排的 SGC 把传播集中在最前面做完，后面的分类器完全不需要知道图长什么样子。\n\n用一条六个节点的路径 0-1-2-3-4-5 跑一次，前三个是一类、后三个是另一类：\n\n```python\nimport numpy as np\nnp.set_printoptions(precision=2, suppress=True)\n\nn = 6\nA = np.zeros((n, n))\nfor i in range(n - 1):                      # 一条 6 个节点的路径\n    A[i, i + 1] = A[i + 1, i] = 1\n\ndef sym_norm(M):\n    d = M.sum(1)\n    return M / np.sqrt(np.outer(d, d))\n\nrng = np.random.default_rng(0)\nX = rng.random((n, 4))                      # 6 个节点、每个 4 维特征\nS = sym_norm(A + np.eye(n))\nX_bar = np.linalg.matrix_power(S, 2) @ X    # K = 2：事先算好，之后不用再碰图\nprint(\"X̄:\", X_bar.shape)\n\n# 剩下的就是普通的多类别逻辑回归：softmax(X̄ Θ)\nTheta = np.zeros((4, 2))\ny = np.array([0, 0, 0, 1, 1, 1])\nfor _ in range(500):\n    logits = X_bar @ Theta\n    P = np.exp(logits - logits.max(1, keepdims=True))\n    P /= P.sum(1, keepdims=True)\n    Theta -= 0.5 * X_bar.T @ (P - np.eye(2)[y]) / n      # 交叉熵的梯度\nprint(\"预测:\", P.argmax(1), \" 标签:\", y)\n```\n\n```text\nX̄: (6, 4)\n预测: [0 0 0 1 1 1]  标签: [0 0 0 1 1 1]\n```\n\n这里只是把流程跑通，六个训练点谈不上准确率。要看的是循环里已经完全没有 $S$，图只在最前面用了一次。\n\n### 从频域看：它是一个低通滤波器\n\n为什么只做平滑就够？作者从频域给了解释。\n\nGCN 的推导从图拉普拉斯 $\\Delta_{\\text{sym}}=I-D^{-1/2}AD^{-1/2}$ 开始，它的特征值 $\\lambda$ 就是图上的频率，范围在 $[0, 2]$。不加自环的传播矩阵 $S_{\\text{adj}}=D^{-1/2}AD^{-1/2}=I-\\Delta_{\\text{sym}}$，所以乘上 $K$ 次，等于在频域上套一个滤波器：\n\n$$\ng(\\lambda)=(1-\\lambda)^K\n$$\n\n麻烦在 $\\lambda$ 接近 2 的高频成分。$1-\\lambda$ 接近 $-1$，$K$ 是奇数时系数是负的，$K$ 是偶数时又变回正的，高频成分并没有被压掉。\n\n作者证明，加上自环以后（论文的 Theorem 1），拉普拉斯的最大特征值一定变小，最小的特征值仍然是 0。在 Cora 上，最大特征值大约从 2 缩到 1.5，$(1-\\lambda)^K$ 在整个频谱上都落在比较小的范围，$S^K$ 就成为一个低通型的滤波器。这也解释了 GCN 论文里那个 renormalization trick 为什么有用。\n\n回到刚才那条路径。路径是二部图，不加自环时最大频率刚好是 2：\n\n```python\nlam = np.linalg.eigvalsh(np.eye(n) - sym_norm(A)).clip(0)     # S_adj 对应的频率\nlam_t = np.linalg.eigvalsh(np.eye(n) - sym_norm(A + np.eye(n))).clip(0)  # 加自环后\nprint(\"没有自环:\", lam)\nprint(\"加了自环:\", lam_t)\nfor K in (1, 2, 3):\n    print(f\"K={K}  最高频的系数  没有自环: {(1 - lam.max()) ** K:5.2f}\"\n          f\"   加了自环: {(1 - lam_t.max()) ** K:5.2f}\")\n```\n\n```text\n没有自环: [0.   0.19 0.69 1.31 1.81 2.  ]\n加了自环: [0.   0.11 0.41 0.78 1.09 1.28]\nK=1  最高频的系数  没有自环: -1.00   加了自环: -0.28\nK=2  最高频的系数  没有自环:  1.00   加了自环:  0.08\nK=3  最高频的系数  没有自环: -1.00   加了自环: -0.02\n```\n\n不加自环时，最高频的成分不管乘几次，大小都还是 1，只是正负号来回翻；加了自环之后，最大频率缩到 1.28，乘两次就只剩 0.08。\n\n[![原论文 Figure 2：三张子图分别是一阶 Chebyshev 滤波器、不加自环的归一化邻接矩阵、加自环的归一化邻接矩阵，横轴是特征值 0 到 2，蓝色曲线是 K=1 到 6 的滤波器系数，红色是 Cora 第 3 个特征的频谱。一阶 Chebyshev 的系数在低频处爆增到 8 以上；不加自环的版本在接近 2 的高频处系数为 ±1；加自环的版本频谱只到 1.5 左右，系数随频率递减。](/content/papers/assets/8025ac636ebdc23923398f9d8902317850a9937978d6dc393b96103e730fce8d.png)](/content/papers/assets/8025ac636ebdc23923398f9d8902317850a9937978d6dc393b96103e730fce8d.png)\n\n*原论文 Figure 2（Wu 等人），取自 [**PDF 第 5 页**](https://arxiv.org/pdf/1902.07153v2#page=5)。图注未收录。*\n\n三张图各是一种传播矩阵。左边是 GCN 推导途中的一阶 Chebyshev 滤波器 $I+D^{-1/2}AD^{-1/2}$，对应的系数是 $(2-\\lambda)^K$，低频处随 $K$ 爆增，这正是 GCN 论文说会数值不稳的地方。中间不加自环，右端的高频系数在 $+1$ 和 $-1$ 之间跳。右边加了自环，频谱缩到 1.5 左右，曲线一路往下，是干净的低通滤波。\n\n附录的实验也呼应了这张图。在验证集上，有自环的传播矩阵在各种 $K$ 都比较准、也比较稳；没有自环的版本，$K$ 取奇数时准确率会明显下降。\n\n## 讨论\n\n### 引用网络与 Reddit\n\n| 方法 | Cora | Citeseer | Pubmed |\n| --- | ---: | ---: | ---: |\n| GCN | 81.4 ± 0.4 | 70.9 ± 0.5 | 79.0 ± 0.4 |\n| GAT | 83.3 ± 0.7 | 72.6 ± 0.6 | 78.5 ± 0.3 |\n| FastGCN | 79.8 ± 0.3 | 68.8 ± 0.6 | 77.4 ± 0.3 |\n| GIN | 77.6 ± 1.1 | 66.1 ± 0.9 | 77.0 ± 1.2 |\n| **SGC** | 81.0 ± 0.0 | **71.9 ± 0.1** | 78.9 ± 0.0 |\n\n这些是作者自己重跑的结果，10 次平均的准确率（%），SGC 用 $K=2$。SGC 和 GCN 几乎打平，Citeseer 上还高了 1 个百分点左右；作者认为是参数少，比较不会过拟合。GAT 在 Cora、Citeseer 上仍然最好。GIN 是作者照原论文实现、另外调过的，在这里反而因为过拟合表现较差。\n\nSGC 的标准差几乎是 0。它的目标函数是凸的，不同的初始化会收敛到几乎相同的解。\n\nReddit 有 23 万个节点，完整的 GCN 直接内存不足。SGC 的 micro-F1 是 94.9，胜过同样以采样解决规模问题的 SAGE-GCN（93.0）和 FastGCN（93.7），但低于 SAGE-mean（95.0）、SAGE-LSTM（95.4）和 GaAN（96.4）。训练时，作者用 L-BFGS、不加正则化，两步就收敛了。\n\n### 快多少\n\n作者在 GTX 1080 Ti 上量了相对于 SGC 的训练时间，SGC 的时间已经包含预先计算 $S^KX$ 的部分。Pubmed 上，GCN 要 SGC 的 28 倍，FastGCN 是 6 倍。Reddit 上，SAGE-GCN 是 32 倍，SAGE-LSTM 是 180 倍，FastGCN 是 100 倍。\n\n### 下游任务\n\n作者把 SGC 换进五种下游任务，取代原本模型里的 GCN：\n\n1. **文本分类**：把文档和词都当成节点的 TextGCN，换成 $K=2$ 的 SGC，在 5 个数据集上表现相当，最多快 83.6 倍。\n2. **用户地理定位**：在 GEOTEXT、TWITTER-US、TWITTER-WORLD 上胜过带 highway 连接的 GCN，TWITTER-WORLD 上省下 30 多个小时。\n3. **关系抽取**：把 C-GCN 里的 GCN 换掉，TACRED 准确率 67.0%，C-GCN 是 66.4%。\n4. **零样本图像分类**：用 MLP 接 SGC 取代 GCNZ，参数少了 55%，准确率还略高。\n5. **图分类**：这里就不行了。换进 DCGCN 之后，NCI1 是 71.0%、COLLAB 是 76.2%，和 GCN 版本差不多，但远远落后 GIN。QM8 量子化学数据集上，SGC 的 MAE 是 0.03，更先进的方法是 0.01。\n\n前四个任务的共同点，是图上相邻的东西本来就倾向相似，平滑很管用。图分类要分辨的是结构本身，光做平滑就不够了。\n\n\n> [!TIP]\n> \n> GIN 为什么在图分类上比平均式的模型强，可以参考我们的笔记：\n> \n> - **[[18.10] GIN：加总才算数](/blog/papers/graph-learning/gin)**\n\n\n## 结论\n\nSGC 把 GCN 拆到只剩两步，在图上平滑 $K$ 次，再做一次逻辑回归。在引用网络和不少下游任务上，它和 GCN 一样准，训练却快上一两个数量级。从频域看，加自环把频谱缩小，让 $S^K$ 成为低通滤波器，这也替 GCN 的 renormalization trick 补上了一个解释。\n\n这篇的结果也划出了 GCN 的边界。它在引用网络上有用的部分，主要就是平滑；任务需要的是结构本身，例如图分类，SGC 和 GCN 一起落后。\n\n有人拿 GCN 的新变体来比的时候，记得把 SGC 也放进基准。训练几秒钟的事，打不过它，就先别谈那些非线性了。\n","imageSizes":{"/content/papers/assets/42da0472259826c266fe1b1b617041ef7cb3aa49eda3558ac91dcd15aa5272e0.png":{"width":1366,"height":612},"/content/papers/assets/8025ac636ebdc23923398f9d8902317850a9937978d6dc393b96103e730fce8d.png":{"width":1080,"height":396}}}
