{"notes":[{"id":"graph-learning/gcn","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"GCN","subtitle":"一个参数够吗？","author":"Z. Yuan","paperDate":"2016-09-09","publishedOn":"2023-10-01","world":"external/gcn","paperTitle":"Semi-Supervised Classification with Graph Convolutional Networks","paperUrl":"https://arxiv.org/abs/1609.02907","bibliography":{"title":"Semi-Supervised Classification with Graph Convolutional Networks","authors":["Thomas N. Kipf","Max Welling"],"url":"https://arxiv.org/abs/1609.02907","pdfUrl":"https://arxiv.org/pdf/1609.02907v4","codeUrl":"https://github.com/tkipf/gcn","preprint":{"id":"1609.02907","submittedOn":"2016-09-09","url":"https://arxiv.org/abs/1609.02907"},"publication":{"venue":"ICLR","year":2017,"kind":"conference","url":"https://arxiv.org/abs/1609.02907"},"citation":"@misc{graphlearninggcn2016,\n  title = {{Semi-Supervised Classification with Graph Convolutional Networks}},\n  author = {Thomas N. Kipf and Max Welling},\n  year = {2016},\n  eprint = {1609.02907},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1609.02907}\n}\n","citationPath":"/content/papers/citations/graph-learning/gcn.43058ec3e77e.bib"},"thumbnail":{"src":"/content/papers/assets/ded600c9ca8f4eda09d39ffb16b3c9b0ec730780063e55948b29924d00f14794.png","width":1122,"height":400},"locale":"zh-hans","path":"/content/papers/zh-hans/graph-learning/gcn.0866efaf54eb.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"把图当成正则项","text":"把图当成正则项","depth":3},{"id":"解决问题","text":"解决问题","depth":2},{"id":"从频域一路简化","text":"从频域一路简化","depth":3},{"id":"一层-gcn","text":"一层 GCN","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":3},{"id":"和-wl-算法的关系","text":"和 WL 算法的关系","depth":3},{"id":"四天后的一篇评论","text":"四天后的一篇评论","depth":3},{"id":"论文自己列的限制","text":"论文自己列的限制","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"graph-learning/spectral-networks","relation":"referenced","topic":""},{"id":"graph-learning/chebnet","relation":"referenced","topic":""}]},{"id":"graph-learning/spectral-networks","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Spectral Networks","subtitle":"绕道频域","author":"Z. Yuan","paperDate":"2013-12-21","publishedOn":"2023-09-06","paperTitle":"Spectral Networks and Locally Connected Networks on Graphs","paperUrl":"https://arxiv.org/abs/1312.6203","bibliography":{"title":"Spectral Networks and Locally Connected Networks on Graphs","authors":["Joan Bruna","Wojciech Zaremba","Arthur Szlam","Yann LeCun"],"url":"https://arxiv.org/abs/1312.6203","pdfUrl":"https://arxiv.org/pdf/1312.6203v3","codeUrl":null,"preprint":{"id":"1312.6203","submittedOn":"2013-12-21","url":"https://arxiv.org/abs/1312.6203"},"publication":{"venue":"ICLR","year":2014,"kind":"conference","url":"https://iclr.cc/archive/2014/conference-proceedings/"},"citation":"@misc{graphlearningspectralnetworks2013,\n  title = {{Spectral Networks and Locally Connected Networks on Graphs}},\n  author = {Joan Bruna and Wojciech Zaremba and Arthur Szlam and Yann LeCun},\n  year = {2013},\n  eprint = {1312.6203},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1312.6203}\n}\n","citationPath":"/content/papers/citations/graph-learning/spectral-networks.ea286632c50d.bib"},"thumbnail":{"src":"/content/papers/assets/81c18ce1b25b0675fa18b9922bab2a4316a1582ec2824475056e04b90cda9baa.png","width":1210,"height":448},"locale":"zh-hans","path":"/content/papers/zh-hans/graph-learning/spectral-networks.a3ae60467074.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"解决问题","text":"解决问题","depth":2},{"id":"空间建构局部连接加聚类","text":"空间建构：局部连接加聚类","depth":3},{"id":"频域建构拉普拉斯的特征向量","text":"频域建构：拉普拉斯的特征向量","depth":3},{"id":"重新发现-cnn","text":"重新发现 CNN","depth":3},{"id":"平滑的系数局部的滤波器","text":"平滑的系数，局部的滤波器","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"次采样的-mnist","text":"次采样的 MNIST","depth":3},{"id":"球面上的-mnist","text":"球面上的 MNIST","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"graph-learning/chebnet","relation":"referenced","topic":""},{"id":"graph-learning/gcn","relation":"referenced","topic":""}]},{"id":"graph-learning/chebnet","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"ChebNet","subtitle":"多项式就好","author":"Z. Yuan","paperDate":"2016-06-30","publishedOn":"2023-09-16","world":"external/chebnet","paperTitle":"Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering","paperUrl":"https://arxiv.org/abs/1606.09375","bibliography":{"title":"Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering","authors":["Michaël Defferrard","Xavier Bresson","Pierre Vandergheynst"],"url":"https://arxiv.org/abs/1606.09375","pdfUrl":"https://arxiv.org/pdf/1606.09375v3","codeUrl":"https://github.com/mdeff/cnn_graph","preprint":{"id":"1606.09375","submittedOn":"2016-06-30","url":"https://arxiv.org/abs/1606.09375"},"publication":{"venue":"NeurIPS","year":2016,"kind":"conference","url":"https://papers.nips.cc/paper_files/paper/2016/hash/04df4d434d481c5bb723be1b6df1ee65-Abstract.html"},"citation":"@misc{graphlearningchebnet2016,\n  title = {{Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering}},\n  author = {Michaël Defferrard and Xavier Bresson and Pierre Vandergheynst},\n  year = {2016},\n  eprint = {1606.09375},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1606.09375}\n}\n","citationPath":"/content/papers/citations/graph-learning/chebnet.52e0fac25946.bib"},"thumbnail":{"src":"/content/papers/assets/f924fc7fdf6829dd352c02c0062d56fef579382aee9d8de9a76c29aa312325ef.png","width":1144,"height":484},"locale":"zh-hans","path":"/content/papers/zh-hans/graph-learning/chebnet.04caa9e465c7.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"空间上定义不出平移","text":"空间上定义不出平移","depth":3},{"id":"频域上算不起","text":"频域上算不起","depth":3},{"id":"解决问题","text":"解决问题","depth":2},{"id":"用多项式换局部性","text":"用多项式换局部性","depth":3},{"id":"用-chebyshev-递推换速度","text":"用 Chebyshev 递推换速度","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":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"graph-learning/spectral-networks","relation":"referenced","topic":""},{"id":"graph-learning/gcn","relation":"referenced","topic":""}]}],"text":"手上有 2,708 篇论文，每篇有一份词袋特征，彼此之间有 5,429 条引用关系。其中只有 140 篇标了主题，七个主题各 20 篇，剩下的要靠模型猜。\n\n这是 Cora 数据集上的半监督节点分类。直觉上，引用彼此的论文应该是同一个主题，问题是这份直觉要怎么放进模型里。\n\n阿姆斯特丹大学的 Thomas Kipf 与 Max Welling 给了一个很短的答案。每一层，每个节点把自己和邻居的特征照固定比例加权平均，再乘一个权重矩阵，叠两层就结束。在 Cora 上，这个模型拿到 81.5%，前一代最好的方法是 75.7%。\n\n这个模型叫 GCN，后来几乎成了图神经网络的代名词。\n\n## 定义问题\n\n### 把图当成正则项\n\n在 GCN 之前，常见的做法是把图放进损失函数里：\n\n$$\n\\mathcal{L}=\\mathcal{L}_0+\\lambda\\,\\mathcal{L}_{\\text{reg}},\\qquad\n\\mathcal{L}_{\\text{reg}}=\\sum_{i,j}A_{ij}\\left\\|f(X_i)-f(X_j)\\right\\|^2\n$$\n\n$\\mathcal{L}_0$ 是有标签节点的监督损失，$\\mathcal{L}_{\\text{reg}}$ 惩罚相连节点的输出差太多。label propagation、manifold regularization 都属于这一类。\n\n作者指出，这类方法假设「有边就代表相似」。引用关系里确实有很多这种情形，但边也可能带着别的信息，硬把它写成相似度，模型能学的东西就被限制住了。\n\n另一类做法是 DeepWalk 这类图嵌入，先在图上做随机游走，学出每个节点的向量，再拿去训练分类器。步骤分开优化，中间任何一步没调好，最后的分类器也救不回来。\n\n作者想要的是一个直接吃进图的模型 $f(X, A)$。$X$ 是节点特征，$A$ 是邻接矩阵，损失只算有标签的节点；梯度通过 $A$ 流到没有标签的节点，让它们的表示也一起被学出来。\n\n## 解决问题\n\n### 从频域一路简化\n\n论文的推导从频域的图卷积开始。归一化拉普拉斯矩阵 $L=I_N-D^{-1/2}AD^{-1/2}$ 可以拆成 $U\\Lambda U^\\top$，$U$ 的每一列是图上的一个「频率」。对节点信号 $x$ 做卷积，就是先转到频域，乘上滤波器，再转回来：\n\n$$\ng_\\theta\\star x=U g_\\theta U^\\top x\n$$\n\n这条路很贵。乘一次 $U$ 是 $O(N^2)$，大图光是做特征分解就吃不消。前一篇 ChebNet 把滤波器换成 Chebyshev 多项式，用 $K$ 阶多项式近似，不必特征分解，也只看 $K$ 步以内的邻居。\n\n\n> [!TIP]\n> \n> 频域图卷积的起点与 ChebNet 的多项式滤波器，可以参考我们的笔记：\n> \n> - **[[13.12] Spectral Networks：绕道频域](/blog/papers/graph-learning/spectral-networks)**\n> - **[[16.06] ChebNet：多项式就好](/blog/papers/graph-learning/chebnet)**\n\n\nKipf 和 Welling 在这个基础上再砍三刀。\n\n第一刀，多项式只留到一阶，$K=1$。一层只看一步，要看远一点就叠层数。作者的理由是，社交网络、引用网络这类图的度数分布很宽，滤波器越灵活，越容易对局部结构过拟合。\n\n第二刀，最大特征值 $\\lambda_{\\max}$ 直接估成 2，交给网络参数去适应尺度上的差异。滤波器变成：\n\n$$\ng_{\\theta'}\\star x\\approx\\theta'_0x-\\theta'_1D^{-\\frac12}AD^{-\\frac12}x\n$$\n\n第三刀，两个参数绑成一个，$\\theta=\\theta'_0=-\\theta'_1$：\n\n$$\ng_\\theta\\star x\\approx\\theta\\left(I_N+D^{-\\frac12}AD^{-\\frac12}\\right)x\n$$\n\n括号里这个矩阵的特征值落在 $[0,2]$。叠很多层时，最大的那个 2 会一路放大，数值不稳、梯度爆炸或消失都可能出现。作者于是用了一个 **renormalization trick**，先加自环 $\\tilde A=A+I_N$，再用新的度数 $\\tilde D_{ii}=\\sum_j\\tilde A_{ij}$ 归一化：\n\n$$\nI_N+D^{-\\frac12}AD^{-\\frac12}\\;\\rightarrow\\;\\tilde D^{-\\frac12}\\tilde A\\tilde D^{-\\frac12}\n$$\n\n拿一张五个节点的小图比一比两者的特征值：\n\n```python\nimport numpy as np\nnp.set_printoptions(precision=2, suppress=True)\n\n# 五篇论文的引用关系，当成无向图：0-1、0-2、1-2、2-3、3-4\nA = np.zeros((5, 5))\nfor i, j in [(0, 1), (0, 2), (1, 2), (2, 3), (3, 4)]:\n    A[i, j] = A[j, i] = 1\n\nd = A.sum(1)\nS = np.eye(5) + A / np.sqrt(np.outer(d, d))     # 式 7：I + D^-1/2 A D^-1/2\nA_t = A + np.eye(5)                             # 加自环\nd_t = A_t.sum(1)\nA_hat = A_t / np.sqrt(np.outer(d_t, d_t))       # 重新归一化：D̃^-1/2 Ã D̃^-1/2\n\nprint(\"式 7 的特征值:\", np.linalg.eigvalsh(S))\nprint(\"Â 的特征值:   \", np.linalg.eigvalsh(A_hat))\n```\n\n```text\n式 7 的特征值: [0.14 0.5  0.7  1.65 2.  ]\nÂ 的特征值:    [-0.21  0.    0.17  0.79  1.  ]\n```\n\n式 7 的最大特征值是 2，应用十次就会把对应的成分放大一千多倍。$\\hat A$ 的特征值都不超过 1，可以放心叠。\n\n### 一层 GCN\n\n把单一信号推广到每个节点 $C$ 维的特征 $X\\in\\mathbb{R}^{N\\times C}$，再用 $F$ 个滤波器，就是：\n\n$$\nZ=\\hat AX\\Theta,\\qquad \\hat A=\\tilde D^{-\\frac12}\\tilde A\\tilde D^{-\\frac12}\n$$\n\n$\\Theta\\in\\mathbb{R}^{C\\times F}$ 是可学的权重。加上非线性、一层一层叠上去，就是论文的式 2：\n\n$$\nH^{(l+1)}=\\sigma\\left(\\hat AH^{(l)}W^{(l)}\\right)\n$$\n\n拆回单一节点来看，$\\hat A_{ij}=1/\\sqrt{\\tilde d_i\\tilde d_j}$，节点 $i$ 收到邻居 $j$ 的份量只由两人的度数决定，所有邻居共用同一个 $W$。$\\hat AX$ 可以用稀疏矩阵乘稠密矩阵来算，一层的成本是 $O(|E|FC)$，随边数线性成长。\n\n### 两层就够\n\n用在半监督分类时，论文只叠两层：\n\n$$\nZ=f(X,A)=\\mathrm{softmax}\\left(\\hat A\\,\\mathrm{ReLU}\\left(\\hat AXW^{(0)}\\right)W^{(1)}\\right)\n$$\n\n$\\hat A$ 事先算好一次。损失是交叉熵，只算有标签的节点。\n\n[![原论文 Figure 1：左图是多层 GCN 的示意，输入层有 C 个通道，节点 X1 到 X4 依图的边相连，经过隐藏层后输出 F 个特征图，部分节点带有标签 Y；右图是两层 GCN 在 Cora 上隐藏层输出的 t-SNE，不同颜色是不同主题，各自聚成一团。](/content/papers/assets/ded600c9ca8f4eda09d39ffb16b3c9b0ec730780063e55948b29924d00f14794.png)](/content/papers/assets/ded600c9ca8f4eda09d39ffb16b3c9b0ec730780063e55948b29924d00f14794.png)\n\n*原论文 Figure 1（Kipf 与 Welling），取自 [**PDF 第 4 页**](https://arxiv.org/pdf/1609.02907v4#page=4)。图注未收录。*\n\n左图的重点是同一张图在每一层共用，只有特征在变；右图是 Cora 上只用 5% 标签训练后，隐藏层输出的 t-SNE，七种颜色已经各自聚在一起。\n\n接着上面的小图，把两层 GCN 的前向传递走一次。每个节点 4 维特征，隐藏层 3 维，分成 2 类，只有 0 号和 4 号有标签：\n\n```python\nrng = np.random.default_rng(0)\nX = rng.random((5, 4))            # 5 个节点，每个 4 维特征（C = 4）\nW0 = rng.normal(size=(4, 3))      # 输入 → 隐藏层（H = 3）\nW1 = rng.normal(size=(3, 2))      # 隐藏层 → 2 个类别（F = 2）\n\nH1 = np.maximum(A_hat @ X @ W0, 0)                     # ReLU(ÂXW0)\nlogits = A_hat @ H1 @ W1                               # Â H W1\nZ = np.exp(logits) / np.exp(logits).sum(1, keepdims=True)\nprint(\"H1:\", H1.shape, \" Z:\", Z.shape)\nprint(Z)\n\nlabeled, y = [0, 4], np.array([0, 1])                  # 只有 0 号和 4 号有标签\nprint(\"loss:\", -np.log(Z[labeled, y]).mean().round(3))\n```\n\n```text\nH1: (5, 3)  Z: (5, 2)\n[[0.47 0.53]\n [0.47 0.53]\n [0.47 0.53]\n [0.47 0.53]\n [0.48 0.52]]\nloss: 0.7\n```\n\n权重还没训练，每个节点对两类的概率都在 0.5 附近，损失约等于 $\\ln 2$。训练时只有 0 号和 4 号的损失会返回，但 $\\hat A$ 把它们和邻居绑在一起，1、2、3 号的表示也会跟着更新。\n\n论文用整张图做全批量梯度下降，每一步都把整个 $\\hat A$ 和 $X$ 放进内存；随机性只来自 dropout。\n\n## 讨论\n\n### 实验设置\n\n实验沿用 Planetoid 论文的设置。三个引用网络 Citeseer、Cora、Pubmed 各有 3,327、2,708、19,717 个节点，每类只给 20 个标签；另外一个 NELL 知识图谱有 65,755 个节点，每类只有 1 个标签。验证集 500 个节点只用来调超参数，测试集 1,000 个节点。\n\n模型是两层 GCN，隐藏层 16 维，dropout 0.5，第一层 L2 正则 $5\\times10^{-4}$，Adam 学习率 0.01，最多 200 个 epoch，验证损失连续 10 个 epoch 没下降就停。超参数只在 Cora 上调，再原封不动搬到 Citeseer 和 Pubmed。\n\n### 主要结果\n\n| 方法 | Citeseer | Cora | Pubmed | NELL |\n| --- | ---: | ---: | ---: | ---: |\n| ManiReg | 60.1 | 59.5 | 70.7 | 21.8 |\n| LP | 45.3 | 68.0 | 63.0 | 26.5 |\n| DeepWalk | 43.2 | 67.2 | 65.3 | 58.1 |\n| ICA | 69.1 | 75.1 | 73.9 | 23.1 |\n| Planetoid* | 64.7 | 75.7 | 77.2 | 61.9 |\n| **GCN** | **70.3** | **81.5** | **79.0** | **66.0** |\n| GCN（随机切分） | 67.9 ± 0.5 | 80.1 ± 0.5 | 78.9 ± 0.7 | 58.4 ± 1.7 |\n\n数字是分类准确率（%），GCN 那一行是 100 次随机初始化的平均。在同一台机器上，GCN 收敛所需的时间在 Citeseer、Cora、NELL 都比 Planetoid 短（7、4、48 秒对 26、13、185 秒），Pubmed 则是 38 秒对 25 秒。\n\n最后一行换成 10 组大小相同的随机切分，GCN 的准确率掉了一些，NELL 从 66.0% 掉到 58.4%，掉得最多。\n\n### 哪一种传播最好\n\n作者把两层的传播方式换成推导过程中的各种版本，其他设置不动：\n\n| 传播方式 | Citeseer | Cora | Pubmed |\n| --- | ---: | ---: | ---: |\n| Chebyshev，$K=3$ | 69.8 | 79.5 | 74.4 |\n| Chebyshev，$K=2$ | 69.6 | 81.2 | 73.8 |\n| 一阶，两个参数（式 6） | 68.3 | 80.0 | 77.5 |\n| 一阶，一个参数（式 7） | 69.3 | 79.2 | 77.4 |\n| **重新归一化（式 8）** | **70.3** | **81.5** | **79.0** |\n| 只用一阶项 | 68.7 | 80.5 | 77.8 |\n| MLP（不用图） | 46.5 | 55.1 | 71.4 |\n\n越往下简化，结果没有变差。重新归一化的版本参数最少、运算也最少，在三个数据集上都最好；高阶的 Chebyshev 在 Pubmed 上反而掉到 74% 左右。不用图的 MLP 在 Cora 上只有 55.1%，图结构的贡献一目了然。\n\n### 叠深一点会怎样\n\n附录 B 把层数从 1 叠到 10，用全部标签做 5 折交叉验证，同时比较加不加残差连接：\n\n[![原论文 Figure 5：三张子图分别是 Citeseer、Cora、Pubmed，横轴是 1 到 10 层，纵轴是准确率。训练与测试曲线在 2 到 3 层附近最高；没有残差的虚线在 7 层之后急速下降，有残差的实线则大致持平。](/content/papers/assets/8678c3fe0abb2cce0863dc23cf622ad78187872d1ddebf951b3a6a7385d15405.png)](/content/papers/assets/8678c3fe0abb2cce0863dc23cf622ad78187872d1ddebf951b3a6a7385d15405.png)\n\n*原论文 Figure 5（Kipf 与 Welling），取自 [**PDF 第 14 页**](https://arxiv.org/pdf/1609.02907v4#page=14)。图注未收录。*\n\n三个数据集都是 2 到 3 层最好。超过 7 层，没有残差的模型连训练准确率都往下掉，作者说这时训练会变得很困难；加了残差之后，曲线大致持平，但也没有变得更好。\n\n### 和 WL 算法的关系\n\n附录 A 从另一个角度解读 GCN。Weisfeiler-Lehman（WL）算法是一种图同构检查法，每一轮把节点的颜色更新成「自己和邻居颜色组合的哈希」。把哈希函数换成可学的神经网络层，归一化常数取 $\\sqrt{d_id_j}$，就是 GCN 的传播规则。作者称 GCN 是 WL 算法的可微分、带参数的推广（他自己加了一句 loosely speaking）。\n\n顺着这个类比，作者拿 Zachary 空手道俱乐部的 34 位成员做实验。三层 GCN、权重完全随机、不训练，节点特征只用单位矩阵，输出的二维嵌入已经和社群结构很像，作者说这和需要额外训练的 DeepWalk 结果相当。每个社群各给一个标签、训练 300 步之后，模型就能把四个社群线性分开。\n\n### 四天后的一篇评论\n\n论文上传 arXiv 四天后，Ferenc Huszár 在博客写了一篇评论，标题叫〈How powerful are Graph Convolutions?〉。他把模型放到 8 邻接的图像网格上检查，发现每一层、每一个通道用的都是同一个固定形状的 3×3 核，彼此只差一个标量倍数。他认为这样的模型学不出边缘检测器或 Gabor 滤波器，简化让模型的通用性大打折扣，反而 ChebNet 的高阶多项式比较有前景。[inFERENCe，2016-09-13](https://www.inference.vc/how-powerful-are-graph-convolutions-review-of-kipf-welling-2016-2/)\n\n我们用定稿的 $\\hat A$ 验证过，在网格内部，正中间的像素对周围 9 格（含自己）各取 1/9，就是一个平均滤波器。\n\nKipf 在月底的博客文章回应。他同意在规则网格上退化成简单运算，是处理任意图的模型共同的缺点；评估这类模型时，应该看规则网格以外的数据，并承认其中的取舍。[Kipf，2016-09-30](https://tkipf.github.io/graph-convolutional-networks/)\n\n两人说的都对。在图像上，GCN 确实失去了 CNN 依位置分配权重的能力；在引用网络这种没有方向、度数又很分散的图上，前面那张传播方式的比较显示，简化反而比较好。\n\n### 论文自己列的限制\n\n- **内存**：全批量训练的内存随数据量线性成长。改成小批量时，$K$ 层模型得把每个节点 $K$ 步以内的邻居全部加载。\n- **边的种类**：只支持无向图，也不支持边特征。NELL 是先把有向、有标记的边改写成二部图，才放得进来。\n- **自环的份量**：模型隐含假设自己和邻居一样重要。作者建议改成 $\\tilde A=A+\\lambda I_N$，让 $\\lambda$ 也能学。\n\n第一点后来由 GraphSAGE 这类采样方法处理。第三点也可以从 GraphSAGE 的设计看到另一种做法，它把自己和邻居分开乘权重。\n\n## 结论\n\nGCN 从频域图卷积出发，砍到只剩一阶、一个参数，再用重新归一化稳住数值，得到一个一行写得完的传播规则。两层模型在三个引用网络上大幅超过当时的方法，训练也快。\n\n代价也很清楚。每个邻居分到的权重只由度数决定，放到图像网格上就只剩一个平均核；叠超过两三层就开始变差。后来的 GraphSAGE、GAT、GIN，很多都是从这两点出发。\n\n如果你想自己试，PyTorch Geometric 的 `GCNConv` 实现的就是这篇的传播规则。照论文的设置叠两层，隐藏层 16 维、dropout 0.5；论文在 Cora 上收敛只花了 4 秒。\n\n先从两层开始吧，多叠未必比较好。\n","imageSizes":{"/content/papers/assets/ded600c9ca8f4eda09d39ffb16b3c9b0ec730780063e55948b29924d00f14794.png":{"width":1122,"height":400},"/content/papers/assets/8678c3fe0abb2cce0863dc23cf622ad78187872d1ddebf951b3a6a7385d15405.png":{"width":1132,"height":454}}}
