{"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":"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/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":""}]}],"text":"GCN は深層学習の一式を借りました。層ごとに重み行列を置き、ReLU を挟み、最後に softmax をつなぎます。\n\nCornell の Felix Wu、Tianyi Zhang、Kilian Weinberger らは、一部は不要かもしれないと考えました。機械学習は普通、単純なものから始め、不足すれば複雑にします。線形パーセプトロンの限界から多層へ、固定の Sobel から学習可能な CNN へ進みました。GCN は珍しい例外で、ニューラルネットワーク復興後に生まれ、最初から多層で、単純な線形版がありませんでした。\n\n実用では今も多くの分類器は線形、たいていは最適化・解釈しやすいロジスティック回帰だ、という現実的な一言も添えます。\n\nそこで GCN を最小限まで分解し、何が残るかを調べます。\n\n## 問題設定\n\nGCN の一層を振り返ります。自己ループ付き正規化隣接行列 $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引用ネットワークで効くのはどれか。著者の仮説は一つ目です。隣同士が同じクラスになりやすく、平均で同類が似るため、分類器の仕事が容易になります。\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\nSGC（Simple Graph Convolution）です。$\\bar X=S^KX$ はパラメーターがなく、訓練前に一度計算できます。あとは多クラスのロジスティック回帰で、損失は凸、二次法でも確率的勾配降下でも使えます。\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):                      # 六ノードのパス\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))                      # 六ノード、各 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$ なら負、偶数なら正に戻り、高周波が抑えられません。\n\nTheorem 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 特徴量のスペクトル。左は低周波の係数が 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各図は伝播行列に対応します。左は導出途中の $I+D^{-1/2}AD^{-1/2}$ で、係数 $(2-\\lambda)^K$ が低周波で増大し、不安定さを示します。中央は自己ループなしで、高周波が $+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$ です。GCN とほぼ同等で、Citeseer は約 1 ポイント高く、少パラメーターで過学習しにくいためと考えています。GAT は Cora、Citeseer でなお最良です。GIN は原論文に沿って実装・調整しましたが、過学習で劣ります。\n\nSGC の標準偏差はほぼゼロです。凸目的なので初期化が違ってもほぼ同じ解に収束します。\n\n23 万ノードの Reddit は全 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\nGTX 1080 Ti で、$S^KX$ の事前計算も含む SGC に対する訓練時間を測りました。Pubmed は GCN 28 倍、FastGCN 6 倍。Reddit は SAGE-GCN 32 倍、SAGE-LSTM 180 倍、FastGCN 100 倍です。\n\n### 下流タスク\n\n五種類のタスクで GCN を SGC に替えます。\n\n1. **テキスト分類**：文書と単語をノードにする TextGCN を $K=2$ の SGC にすると、5 セットで同等、最大 83.6 倍速くなります。\n2. **ユーザーの地理的位置推定**：GEOTEXT、TWITTER-US、TWITTER-WORLD で highway 接続の GCN を上回り、TWITTER-WORLD で 30 時間以上節約します。\n3. **関係抽出**：C-GCN を置き換えると TACRED 精度は 67.0%、元は 66.4% です。\n4. **ゼロショット画像分類**：GCNZ を MLP と SGC にすると、パラメーターが 55% 減り、精度もやや上がります。\n5. **グラフ分類**：ここでは不十分です。DCGCN を替えると NCI1 は 71.0%、COLLAB は 76.2% で GCN と近いものの GIN に大きく遅れます。QM8 の MAE は SGC 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 は $K$ 回の平滑化とロジスティック回帰だけにしました。引用網や多くの下流タスクで GCN と同程度に正確で、訓練は一〜二桁高速です。自己ループがスペクトルを縮めて $S^K$ を低域通過にするという分析は、再正規化への説明にもなります。\n\n結果は GCN の境界も示します。引用網で効く部分は主に平滑化で、構造自体が必要なグラフ分類では、SGC も GCN も遅れます。\n\nGCN の新しい変形を比べるなら、SGC もベースラインに入れましょう。数秒の訓練です。これに勝てなければ、非線形性の話はそのあとです。\n","imageSizes":{"/content/papers/assets/42da0472259826c266fe1b1b617041ef7cb3aa49eda3558ac91dcd15aa5272e0.png":{"width":1366,"height":612},"/content/papers/assets/8025ac636ebdc23923398f9d8902317850a9937978d6dc393b96103e730fce8d.png":{"width":1080,"height":396}}}
