{"notes":[{"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":""}]},{"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/gnn-plus","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"GNN+","subtitle":"老骥伏枥","author":"Z. Yuan","paperDate":"2025-02-13","publishedOn":"2025-12-06","paperTitle":"Can Classic GNNs Be Strong Baselines for Graph-level Tasks? Simple Architectures Meet Excellence","paperUrl":"https://arxiv.org/abs/2502.09263","bibliography":{"title":"Can Classic GNNs Be Strong Baselines for Graph-level Tasks? Simple Architectures Meet Excellence","authors":["Yuankai Luo","Lei Shi","Xiao-Ming Wu"],"url":"https://arxiv.org/abs/2502.09263","pdfUrl":"https://arxiv.org/pdf/2502.09263v3","codeUrl":"https://github.com/LUOyk1999/GNNPlus","preprint":{"id":"2502.09263","submittedOn":"2025-02-13","url":"https://arxiv.org/abs/2502.09263"},"publication":{"venue":"ICML","year":2025,"kind":"conference","url":"https://proceedings.mlr.press/v267/luo25h.html"},"citation":"@misc{graphlearninggnnplus2025,\n  title = {{Can Classic GNNs Be Strong Baselines for Graph-level Tasks? Simple Architectures Meet Excellence}},\n  author = {Yuankai Luo and Lei Shi and Xiao-Ming Wu},\n  year = {2025},\n  eprint = {2502.09263},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2502.09263}\n}\n","citationPath":"/content/papers/citations/graph-learning/gnn-plus.7d14d260e648.bib"},"thumbnail":{"src":"/content/papers/assets/0be1b8a606332519d042698f1c6afd3ef8857eb95682b95df1cdeb9e3bfe7648.png","width":604,"height":510},"locale":"zh-hans","path":"/content/papers/zh-hans/graph-learning/gnn-plus.15890d5dd1bb.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"两种任务","text":"两种任务","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},{"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/classic-gnns","relation":"referenced","topic":""},{"id":"graph-learning/graphgps","relation":"referenced","topic":""},{"id":"graph-learning/where-did-the-gap-go","relation":"referenced","topic":""}]}],"text":"到 2018 年，图神经网络的变体已经多到数不清。GCN、GraphSAGE、GAT 各有各的聚合方式，新论文大多靠实验证明自己比较好，至于为什么好、哪些图结构分辨不出来，很少有人说得清楚。\n\nMIT 的 Keyulu Xu、Stefanie Jegelka 与 Stanford 的 Weihua Hu、Jure Leskovec 换了一个问法。先不问准确率，先问一个 GNN 有没有能力把两张不同的图，映射成两个不同的表示。\n\n标题问的是「图神经网络有多强」。答案是有上限的，上限来自一个 1968 年的算法。\n\n## 定义问题\n\n### 邻居聚合的共同形式\n\n作者先把当时的 GNN 写成同一个形式。第 $k$ 层，每个节点 $v$ 先聚合邻居的表示，再和自己结合：\n\n$$\na_v^{(k)}=\\mathrm{AGGREGATE}^{(k)}\\left(\\left\\{h_u^{(k-1)}:u\\in\\mathcal N(v)\\right\\}\\right),\\qquad\nh_v^{(k)}=\\mathrm{COMBINE}^{(k)}\\left(h_v^{(k-1)},a_v^{(k)}\\right)\n$$\n\n做图分类时，最后再用一个 READOUT 把所有节点的表示合成整张图的表示。GraphSAGE 的聚合是 max pooling 加上串接；GCN 是把自己和邻居一起取平均，再乘权重、过 ReLU。\n\n### 邻居是一个多重集合\n\n关键的观察是，节点的邻居特征构成一个**多重集合**（multiset），同一个值可以出现好几次。两个蓝色邻居和三个蓝色邻居，是不同的多重集合。\n\n如果聚合函数会把两个不同的多重集合算成同一个结果，GNN 就分不出这两种邻域。所以「GNN 有多强」可以化约成另一个问题，它用的聚合函数，在多重集合上是不是**单射**？\n\n### WL 测试\n\n要衡量分辨能力，最直接的标准是图同构，同构的图给相同的表示，不同构的图给不同的表示。这个问题没有已知的多项式时间算法，作者改用一个比较弱、但很实用的标准，**Weisfeiler-Lehman（WL）测试**。\n\nWL 的做法是重复「着色」。一开始每个节点同一种颜色；每一轮，把节点自己的颜色和所有邻居颜色的多重集合合起来，对应到一种新颜色。两张图在某一轮的颜色统计不同，就一定不同构。\n\n写成程序，两张图要一起着色，颜色编号才能互相比较：\n\n```python\nfrom collections import Counter\n\ndef wl(graphs, rounds=3):\n    \"\"\"对多张图一起做 WL 着色；颜色编号在所有图之间共用，才能互相比较。\"\"\"\n    nbrs = []\n    for n, edges in graphs:\n        adj = [[] for _ in range(n)]\n        for i, j in edges:\n            adj[i].append(j)\n            adj[j].append(i)\n        nbrs.append(adj)\n    colors = [[0] * n for n, _ in graphs]           # 一开始大家同一种颜色\n    for r in range(rounds):\n        sigs = [[(c[v], tuple(sorted(c[u] for u in adj[v]))) for v in range(len(c))]\n                for c, adj in zip(colors, nbrs)]    # 自己的颜色 + 邻居颜色的多重集合\n        table = {s: k for k, s in enumerate(sorted({s for g in sigs for s in g}))}\n        colors = [[table[s] for s in g] for g in sigs]\n        print(f\"第 {r + 1} 轮:\", [sorted(Counter(c).items()) for c in colors])\n\npath = (4, [(0, 1), (1, 2), (2, 3)])          # 一条路径\nstar = (4, [(0, 1), (0, 2), (0, 3)])          # 一个星形\nwl([path, star])\n```\n\n```text\n第 1 轮: [[(0, 2), (1, 2)], [(0, 3), (2, 1)]]\n第 2 轮: [[(0, 2), (2, 2)], [(1, 3), (3, 1)]]\n第 3 轮: [[(0, 2), (2, 2)], [(1, 3), (3, 1)]]\n```\n\n每一轮印出两张图的「（颜色, 个数）」。第一轮就不一样了。路径是两个端点、两个中间点，星形是三个叶子、一个中心。WL 判定它们不同构。\n\n## 解决问题\n\n### GNN 的上限\n\n论文的 Lemma 2 说，任何用邻居聚合的 GNN，如果能把两张图映射到不同的表示，WL 测试也一定能判定它们不同构。也就是说，**这类 GNN 的分辨能力最多和 WL 一样**。\n\n反过来，Theorem 3 说只要邻居聚合、结合函数和 READOUT 都是单射，层数够多的 GNN 就能和 WL 一样强。\n\n道理不难理解。WL 每一轮做的事，就是一个在多重集合上单射的哈希函数；GNN 的聚合如果也是单射，就能一轮一轮模仿 WL，而且还能把相似的子结构映射到相近的向量，这是离散的颜色做不到的。\n\n### 加总、平均、最大值\n\n那么哪些聚合函数是单射？作者证明，**加总**可以表示多重集合上的单射函数，而常见的**平均**和**最大值**不行。\n\n[![原论文 Figure 2：左边是输入的多重集合，两个红球、四个蓝球；接着依序是加总、平均、最大值能保留的信息。加总保留整个多重集合，平均只保留红蓝的比例，最大值只保留出现过红和蓝两种颜色。](/content/papers/assets/1062d104bcaae50e5f8c9abf6c72f574a014c68e6a7bb4c6705f663336773b4f.png)](/content/papers/assets/1062d104bcaae50e5f8c9abf6c72f574a014c68e6a7bb4c6705f663336773b4f.png)\n\n*原论文 Figure 2（Xu 等人），取自 [**PDF 第 6 页**](https://arxiv.org/pdf/1810.00826v3#page=6)。图注未收录。*\n\n- **加总**抓到完整的多重集合。\n- **平均**抓到各种元素的比例。$\\{a, b\\}$ 和 $\\{a, a, b, b\\}$ 的平均一样。\n- **最大值**只抓到出现过哪些元素，重复几次都一样。\n\n用两维的 one-hot 向量代表两种邻居，实际比一比：\n\n```python\nimport numpy as np\na, b = np.array([1.0, 0.0]), np.array([0.0, 1.0])\ncases = {\"{a, a} vs {a, a, a}\": ([a, a], [a, a, a]),\n         \"{a, b} vs {a, a, b, b}\": ([a, b], [a, a, b, b]),\n         \"{a, b} vs {a, b, b}\": ([a, b], [a, b, b])}\nfor name, (X1, X2) in cases.items():\n    same = {agg: np.allclose(f(np.array(X1), axis=0), f(np.array(X2), axis=0))\n            for agg, f in [(\"sum\", np.sum), (\"mean\", np.mean), (\"max\", np.max)]}\n    print(f\"{name:<24}\", {k: \"分不出\" if v else \"分得出\" for k, v in same.items()})\n```\n\n```text\n{a, a} vs {a, a, a}      {'sum': '分得出', 'mean': '分不出', 'max': '分不出'}\n{a, b} vs {a, a, b, b}   {'sum': '分得出', 'mean': '分不出', 'max': '分不出'}\n{a, b} vs {a, b, b}      {'sum': '分得出', 'mean': '分得出', 'max': '分不出'}\n```\n\n这三组例子，分别对应原论文 Figure 3 的三种情况：\n\n[![原论文 Figure 3：三组图结构。(a) 节点 v 有两个同色邻居、v' 有三个，平均和最大值都分不出来；(b) v 有一绿一红、v' 有一绿两红，最大值分不出来；(c) v 有一绿一红、v' 有两绿两红，平均和最大值都分不出来。](/content/papers/assets/33c4b052156c190bc85033ddb47e50c70b500425938ac89108383fc039b88837.png)](/content/papers/assets/33c4b052156c190bc85033ddb47e50c70b500425938ac89108383fc039b88837.png)\n\n*原论文 Figure 3（Xu 等人），取自 [**PDF 第 6 页**](https://arxiv.org/pdf/1810.00826v3#page=6)。主图注未收录。*\n\n图 (a) 特别值得多看一眼。如果所有节点的特征都一样，平均和最大值算出来永远是那个值，不管邻居有几个，整张图的结构一点都看不到。\n\n### GIN\n\n有了加总，作者把邻居聚合和结合写成一步，用多层感知器（MLP）去学那个单射函数：\n\n$$\nh_v^{(k)}=\\mathrm{MLP}^{(k)}\\left(\\left(1+\\epsilon^{(k)}\\right)\\cdot h_v^{(k-1)}+\\sum_{u\\in\\mathcal N(v)}h_u^{(k-1)}\\right)\n$$\n\n$\\epsilon$ 可以学，也可以固定。自己乘上 $1+\\epsilon$，是为了让「自己」和「邻居」不会混在一起。Corollary 6 证明，$\\epsilon$ 取无理数等许多值时，这个式子对（自己, 邻居多重集合）这一对是单射。实验里固定 $\\epsilon=0$ 的版本叫 GIN-0。\n\n图分类时，作者把每一层的节点表示各自加总，再把所有层串接起来，当作整张图的表示：\n\n$$\nh_G=\\mathrm{CONCAT}\\left(\\mathrm{READOUT}\\left(\\left\\{h_v^{(k)}\\mid v\\in G\\right\\}\\right)\\ \\middle|\\ k=0,1,\\dots,K\\right)\n$$\n\n越深的层代表越大的子树结构，浅层的特征有时泛化得比较好，所以全部保留。\n\n接着前面的程序，用随机权重的 GIN-0 比较两组图。每层一个两层 MLP：\n\n```python\nrng = np.random.default_rng(0)\nmlps = [(rng.normal(size=(4, 8)), rng.normal(size=8), rng.normal(size=(8, 4)), rng.normal(size=4))\n        for _ in range(3)]                            # 每层一个两层 MLP（含偏置项）\n\ndef to_adj(g):\n    n, edges = g\n    M = np.zeros((n, n))\n    for i, j in edges:\n        M[i, j] = M[j, i] = 1\n    return M\n\ndef gin(g, eps=0.0):\n    M = to_adj(g)\n    h = np.ones((len(M), 4))                          # 没有节点特征，大家从同一个向量出发\n    readouts = [h.sum(0)]\n    for W1, b1, W2, b2 in mlps:\n        m = (1 + eps) * h + M @ h                     # (1+ε)·自己 + 邻居总和\n        h = np.maximum(np.maximum(m @ W1 + b1, 0) @ W2 + b2, 0)   # 两层 MLP\n        readouts.append(h.sum(0))                     # 每一层都做 sum readout\n    return np.concatenate(readouts)                   # 各层串接成整张图的表示\n\nhexagon = (6, [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 0)])\ntwo_triangles = (6, [(0, 1), (1, 2), (2, 0), (3, 4), (4, 5), (5, 3)])\nfor name, g1, g2 in [(\"路径 vs 星形\", path, star), (\"六边形 vs 两个三角形\", hexagon, two_triangles)]:\n    print(name, \"表示相同:\", np.allclose(gin(g1), gin(g2)))\n```\n\n```text\n路径 vs 星形 表示相同: False\n六边形 vs 两个三角形 表示相同: True\n```\n\n路径和星形分开了。六边形和两个三角形却分不开，换什么权重都一样；两张图里每个节点都刚好有两个邻居，WL 每一轮看到的完全一样，GIN 也就只能给出同样的表示。一张有两个三角形，一张一个也没有，聚合式的 GNN 看不出这个差别。\n\n\n> [!TIP]\n> \n> 如果只看第一层的 sum readout，拿掉 MLP 的偏置项后，路径和星形会分不开。没有偏置项的 ReLU 网络满足 $f(cx)=cf(x)$（$c>0$），输入又全是 1，第一层的加总最后只剩下「节点数加上总度数」；路径和星形都是 4 个节点、总度数 6，自然一样。论文的 Lemma 7 讲的就是这类情形，没有偏置项的单层感知器，会把某些不同的多重集合算成同一个结果。\n\n\n### 不够强，但不一定没用\n\n作者也说明了 GCN 和 GraphSAGE 的位置。它们用单层感知器、平均或最大值，分辨能力比 WL 弱，但各有用处。平均学的是分布，当任务在乎的是邻居特征的统计比例，而不是精确的结构时，平均就够了；节点特征很多样、很少重复时，平均和加总一样有力。作者认为这可以解释，为什么 GCN 这类平均式的模型，在论文主题分类、社群检测这些节点特征丰富的任务上表现不错。\n\n最大值学的是集合的骨架，适合需要找出代表性元素的任务。\n\n## 讨论\n\n### 实验设置\n\n作者用 9 个图分类数据集，4 个生物信息学（MUTAG、PTC、NCI1、PROTEINS）、5 个社交网络（COLLAB、IMDB-BINARY、IMDB-MULTI、REDDIT-BINARY、REDDIT-MULTI5K）。生物信息学的节点有类别特征；社交网络的节点没有特征，REDDIT 给每个节点同一个数字，其他用度数的 one-hot。评估用 10 折交叉验证。\n\n比较的对象除了当时的图核方法与 GNN，还有把 GIN 的加总换成平均、最大值，或把 MLP 换成单层感知器的变体。GCN 对应「平均、单层」，GraphSAGE 对应「最大值、单层」。\n\n### 训练集拟合得了吗\n\n理论讲的是表达力，最直接的检验是看训练准确率。作者画出各模型的训练曲线，用 MLP 的版本比单层感知器的版本拟合得好，用加总的比平均和最大值好；GIN-0 和 GIN-$\\epsilon$ 几乎都能把训练集拟合到接近 100%。\n\n所有 GNN 的训练准确率都没有超过 WL subtree kernel。这也符合理论，GNN 的分辨能力最多和 WL 一样。\n\n### 测试准确率\n\n| 数据集 | IMDB-B | IMDB-M | RDT-B | RDT-M5K | COLLAB | MUTAG | PROTEINS | PTC | NCI1 |\n| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |\n| WL subtree | 73.8 | 50.9 | 81.0 | 52.5 | 78.9 | **90.4** | 75.0 | 59.9 | **86.0** |\n| **GIN-0** | **75.1** | **52.3** | **92.4** | **57.5** | **80.2** | 89.4 | **76.2** | 64.6 | 82.7 |\n| 平均、MLP | 73.7 | 52.3 | 50.0 | 20.0 | 79.2 | 83.5 | 75.5 | **66.6** | 80.9 |\n| 平均、单层（GCN） | 74.0 | 51.9 | 50.0 | 20.0 | 79.0 | 85.6 | 76.0 | 64.2 | 80.2 |\n| 最大值、单层（GraphSAGE） | 72.3 | 50.9 | — | — | — | 85.1 | 75.9 | 63.9 | 77.7 |\n\n表中只列部分方法，数字是 10 折交叉验证的平均准确率（%）。最醒目的是两个 REDDIT 数据集。所有节点都拿同一个数字当特征，平均式的模型完全看不到结构。二分类的 RDT-B 是 50.0 ± 0.0%，五分类的 RDT-M5K 是 20.0 ± 0.0%，都是乱猜的水准。GIN-0 分别是 92.4% 和 57.5%。作者另外补充，就算给平均式的模型度数当特征，结果也只有 71.2% 和 41.3%。\n\n社交网络这五个数据集，GIN 都是最好的或并列最好。生物信息学的四个数据集就没有那么一面倒。NCI1 上 WL subtree kernel 明显较好（86.0% 对 82.7%），MUTAG 上 GIN 也低于 WL 和 PATCHY-SAN 的 92.6%，PTC 上反而是平均、MLP 的版本最高；这些数据集都很小，标准差也很大，PTC 的 GIN-0 是 64.6 ± 7.0%。\n\nGIN-0 和 GIN-$\\epsilon$ 的训练拟合程度差不多，但 GIN-0 在测试上一致地略好一点，作者推测是因为比较简单。\n\n## 结论\n\nGIN 这篇把「GNN 有多强」变成一个可以证明的问题。邻居聚合式的 GNN 分辨图的能力，上限是 WL 测试；要达到这个上限，聚合函数得在多重集合上是单射，加总做得到，平均和最大值做不到。照这个条件设计的 GIN，用加总加上 MLP，在社交网络的图分类上明显胜过平均式的模型。\n\n上限也就在那里。六边形和两个三角形，GIN 永远分不出来；后来许多研究在 GNN 里加上子结构计数、位置编码或更高阶的 WL，想突破的就是这道墙。\n\n如果你做的是图分类、节点又没什么特征，聚合请用加总，MLP 记得放偏置项。\n","imageSizes":{"/content/papers/assets/1062d104bcaae50e5f8c9abf6c72f574a014c68e6a7bb4c6705f663336773b4f.png":{"width":960,"height":214},"/content/papers/assets/33c4b052156c190bc85033ddb47e50c70b500425938ac89108383fc039b88837.png":{"width":1108,"height":240}}}
