{"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":"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/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":""}]}],"text":"GCN 從深度學習借來了一整套做法。一層接一層，每層一個權重矩陣，中間夾著 ReLU，最後接 softmax。\n\nCornell 的 Felix Wu、Tianyi Zhang 與 Kilian Weinberger 等人懷疑，這套做法裡有些部分可能是多餘的。他們在引言裡回顧，機器學習的方法大多從簡單出發，不夠用時才加複雜度；線性感知器的極限催生了多層感知器，Sobel 這類固定的濾波器後來才演變成可學習的 CNN。GCN 是少見的例外，它在神經網路復興之後才提出，一開始就建立在多層網路上，從來沒有一個更簡單的線性版本。\n\n作者還補了一句很實際的話。現實世界的應用，大多數分類器其實還是線性的，通常是邏輯迴歸，容易最佳化，也容易解釋。\n\n於是他們把 GCN 一路拆到最簡單，看看還剩下什麼。\n\n## 定義問題\n\n先回顧 GCN 的一層。令 $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這三件事裡，哪一件真正讓 GCN 在引用網路上表現好？作者的假設是第一件。在這類圖上，相鄰節點通常屬於同一類，把鄰居的特徵平均進來，同類的節點就會變得更像，後面的分類器也就好做了。\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\n這就是 SGC（Simple Graph Convolution）。$\\bar X=S^KX$ 完全沒有參數，可以在訓練前算好一次；之後整個訓練，就是一個以 $\\bar X$ 為輸入的多類別邏輯迴歸，損失函數是凸的，用什麼二階方法或隨機梯度下降都行。\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):                      # 一條 6 個節點的路徑\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))                      # 6 個節點、每個 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$ 是奇數時係數是負的，$K$ 是偶數時又變回正的，高頻成分並沒有被壓掉。\n\n作者證明，加上自環以後（論文的 Theorem 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 個特徵的頻譜。一階 Chebyshev 的係數在低頻處爆增到 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三張圖各是一種傳播矩陣。左邊是 GCN 推導途中的一階 Chebyshev 濾波器 $I+D^{-1/2}AD^{-1/2}$，對應的係數是 $(2-\\lambda)^K$，低頻處隨 $K$ 爆增，這正是 GCN 論文說會數值不穩的地方。中間不加自環，右端的高頻係數在 $+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$。SGC 和 GCN 幾乎打平，Citeseer 上還高了 1 個百分點左右；作者認為是參數少，比較不會過擬合。GAT 在 Cora、Citeseer 上仍然最好。GIN 是作者照原論文實作、另外調過的，在這裡反而因為過擬合表現較差。\n\nSGC 的標準差幾乎是 0。它的目標函數是凸的，不同的初始化會收斂到幾乎相同的解。\n\nReddit 有 23 萬個節點，完整的 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\n作者在 GTX 1080 Ti 上量了相對於 SGC 的訓練時間，SGC 的時間已經包含預先計算 $S^KX$ 的部分。Pubmed 上，GCN 要 SGC 的 28 倍，FastGCN 是 6 倍。Reddit 上，SAGE-GCN 是 32 倍，SAGE-LSTM 是 180 倍，FastGCN 是 100 倍。\n\n### 下游任務\n\n作者把 SGC 換進五種下游任務，取代原本模型裡的 GCN：\n\n1. **文字分類**：把文件和詞都當成節點的 TextGCN，換成 $K=2$ 的 SGC，在 5 個資料集上表現相當，最多快 83.6 倍。\n2. **使用者地理定位**：在 GEOTEXT、TWITTER-US、TWITTER-WORLD 上勝過帶 highway 連接的 GCN，TWITTER-WORLD 上省下 30 多個小時。\n3. **關係抽取**：把 C-GCN 裡的 GCN 換掉，TACRED 準確率 67.0%，C-GCN 是 66.4%。\n4. **零樣本影像分類**：用 MLP 接 SGC 取代 GCNZ，參數少了 55%，準確率還略高。\n5. **圖分類**：這裡就不行了。換進 DCGCN 之後，NCI1 是 71.0%、COLLAB 是 76.2%，和 GCN 版本差不多，但遠遠落後 GIN。QM8 量子化學資料集上，SGC 的 MAE 是 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 把 GCN 拆到只剩兩步，在圖上平滑 $K$ 次，再做一次邏輯迴歸。在引用網路和不少下游任務上，它和 GCN 一樣準，訓練卻快上一兩個數量級。從頻域看，加自環把頻譜縮小，讓 $S^K$ 成為低通濾波器，這也替 GCN 的 renormalization trick 補上了一個解釋。\n\n這篇的結果也劃出了 GCN 的邊界。它在引用網路上有用的部分，主要就是平滑；任務需要的是結構本身，例如圖分類，SGC 和 GCN 一起落後。\n\n有人拿 GCN 的新變體來比的時候，記得把 SGC 也放進基準。訓練幾秒鐘的事，打不過它，就先別談那些非線性了。\n","imageSizes":{"/content/papers/assets/42da0472259826c266fe1b1b617041ef7cb3aa49eda3558ac91dcd15aa5272e0.png":{"width":1366,"height":612},"/content/papers/assets/8025ac636ebdc23923398f9d8902317850a9937978d6dc393b96103e730fce8d.png":{"width":1080,"height":396}}}
