{"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-hant","path":"/content/papers/zh-hant/graph-learning/gin.9885ba3164a2.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-hant","path":"/content/papers/zh-hant/graph-learning/sgc.44503a2cc380.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-hant","path":"/content/papers/zh-hant/graph-learning/gnn-plus.3e66f7f0d156.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}}}
