{"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":"ja","path":"/content/papers/ja/graph-learning/gin.cdab0b396c3e.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":"ja","path":"/content/papers/ja/graph-learning/sgc.6a6528dac858.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":"ja","path":"/content/papers/ja/graph-learning/gnn-plus.b29a25afa6e6.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 年には、GNN の変形は数えきれなくなっていました。GCN、GraphSAGE、GAT は集約方法が異なり、新論文の多くは実験で優位を示します。しかし理由や、区別できない構造を説明できる人は少数でした。\n\nMIT の Keyulu Xu、Stefanie Jegelka と Stanford の Weihua Hu、Jure Leskovec は、問いを替えます。精度の前に、二つの異なるグラフを異なる表現に写す能力があるかを問います。\n\n「GNN はどれほど強いか」という題への答えには、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 は区別できません。したがって強さの問いは、多重集合上で集約関数が**単射**か、に置き換えられます。\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\nLemma 2 は、近傍集約 GNN が二グラフを異なる表現に写せるなら、WL も非同型と判定できると述べます。つまり**この種類の識別力は最大でも WL と同じ**です。\n\n逆に Theorem 3 は、集約・結合・READOUT がすべて単射なら、十分な層数の GNN は WL と同じ強さになると述べます。\n\n理由は直感的です。WL は多重集合上で単射なハッシュを使います。GNN の集約も単射なら各ラウンドを模倣でき、さらに似た部分構造を近いベクトルに写せます。離散色にはできないことです。\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先のコードで、各層に二層 MLP を置く、ランダム重みの GIN-0 で二組を比較します。\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\nGCN と GraphSAGE は単層パーセプトロン、平均や最大値を使い、WL より弱いものの用途があります。平均は分布を学び、正確な構造より特徴量の比率が重要なら十分です。特徴量が多様で重複が少ないと、総和と同じくらい強力です。論文主題分類やコミュニティ検出など、特徴量が豊かなタスクで平均型 GCN がよく働く理由だと著者は考えます。\n\n最大値は集合の骨組みを学び、代表要素を見つけるタスクに適します。\n\n## 議論\n\n### 実験設定\n\nグラフ分類 9 データセットを使います。生物情報の MUTAG、PTC、NCI1、PROTEINS と、SNS の 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 以下でした。上限が 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五つの SNS では GIN が単独か同率の最良です。四つの生物情報は一様ではなく、NCI1 は WL が 86.0% 対 82.7% で明確に上回ります。MUTAG も 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 はどれだけ強いか」を証明できる問いにしました。近傍集約型の上限は WL で、達するには多重集合上で単射な集約が必要です。総和は可能で、平均・最大値は不可能です。総和と MLP の GIN は SNS グラフ分類で平均型を明確に上回ります。\n\n上限は残ります。六角形と二つの三角形は永遠に区別できません。後続の部分構造カウント、位置符号化、高次 WL が超えようとする壁です。\n\n特徴量の少ないノードのグラフ分類なら、集約は総和にし、MLP のバイアスも忘れずに。\n","imageSizes":{"/content/papers/assets/1062d104bcaae50e5f8c9abf6c72f574a014c68e6a7bb4c6705f663336773b4f.png":{"width":960,"height":214},"/content/papers/assets/33c4b052156c190bc85033ddb47e50c70b500425938ac89108383fc039b88837.png":{"width":1108,"height":240}}}
