{"notes":[{"id":"graph-learning/appnp","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"APPNP","subtitle":"記得回家","author":"Z. Yuan","paperDate":"2018-10-14","publishedOn":"2024-01-17","world":"external/appnp","paperTitle":"Predict then Propagate: Graph Neural Networks meet Personalized PageRank","paperUrl":"https://arxiv.org/abs/1810.05997","bibliography":{"title":"Predict then Propagate: Graph Neural Networks meet Personalized PageRank","authors":["Johannes Gasteiger","Aleksandar Bojchevski","Stephan Günnemann"],"url":"https://arxiv.org/abs/1810.05997","pdfUrl":"https://arxiv.org/pdf/1810.05997v6","codeUrl":"https://www.kdd.in.tum.de/ppnp","preprint":{"id":"1810.05997","submittedOn":"2018-10-14","url":"https://arxiv.org/abs/1810.05997"},"publication":{"venue":"ICLR","year":2019,"kind":"conference","url":"https://arxiv.org/abs/1810.05997"},"citation":"@misc{graphlearningappnp2018,\n  title = {{Predict then Propagate: Graph Neural Networks meet Personalized PageRank}},\n  author = {Johannes Gasteiger and Aleksandar Bojchevski and Stephan Günnemann},\n  year = {2018},\n  eprint = {1810.05997},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1810.05997}\n}\n","citationPath":"/content/papers/citations/graph-learning/appnp.eae593f21b4d.bib"},"thumbnail":{"src":"/content/papers/assets/9ad06d29a0d48e1de136b4cd8560f14defc55b0aaf289f07b8319c40f033b844.png","width":908,"height":370},"locale":"zh-hant","path":"/content/papers/zh-hant/graph-learning/appnp.d5272f045f40.md","headings":[{"id":"定義問題","text":"定義問題","depth":2},{"id":"疊到無限多層會怎樣","text":"疊到無限多層會怎樣","depth":3},{"id":"解決問題","text":"解決問題","depth":2},{"id":"personalized-pagerank","text":"Personalized PageRank","depth":3},{"id":"ppnp先預測再傳播","text":"PPNP：先預測，再傳播","depth":3},{"id":"appnp用冪迭代近似","text":"APPNP：用冪迭代近似","depth":3},{"id":"和-gcn-差在哪","text":"和 GCN 差在哪","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":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"graph-learning/deeper-insights","relation":"referenced","topic":""}]},{"id":"graph-learning/deeper-insights","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Deeper Insights","subtitle":"抹得太平了","author":"Z. Yuan","paperDate":"2018-01-22","publishedOn":"2023-11-29","paperTitle":"Deeper Insights into Graph Convolutional Networks for Semi-Supervised Learning","paperUrl":"https://arxiv.org/abs/1801.07606","bibliography":{"title":"Deeper Insights into Graph Convolutional Networks for Semi-Supervised Learning","authors":["Qimai Li","Zhichao Han","Xiao-Ming Wu"],"url":"https://arxiv.org/abs/1801.07606","pdfUrl":"https://arxiv.org/pdf/1801.07606v1","codeUrl":null,"preprint":{"id":"1801.07606","submittedOn":"2018-01-22","url":"https://arxiv.org/abs/1801.07606"},"publication":{"venue":"AAAI","year":2018,"kind":"conference","url":"https://ojs.aaai.org/index.php/AAAI/article/view/11604"},"citation":"@misc{graphlearningdeeperinsights2018,\n  title = {{Deeper Insights into Graph Convolutional Networks for Semi-Supervised Learning}},\n  author = {Qimai Li and Zhichao Han and Xiao-Ming Wu},\n  year = {2018},\n  eprint = {1801.07606},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1801.07606}\n}\n","citationPath":"/content/papers/citations/graph-learning/deeper-insights.52354c86fac9.bib"},"thumbnail":{"src":"/content/papers/assets/2a13880b48fae6456e19c622cee1d7c7907f8c31d6890722d4980a381fddb06a.png","width":1396,"height":268},"locale":"zh-hant","path":"/content/papers/zh-hant/graph-learning/deeper-insights.8ca58f8b9ca8.md","headings":[{"id":"定義問題","text":"定義問題","depth":2},{"id":"解決問題","text":"解決問題","depth":2},{"id":"先和全連接網路比","text":"先和全連接網路比","depth":3},{"id":"拉普拉斯平滑","text":"拉普拉斯平滑","depth":3},{"id":"平滑太多次","text":"平滑太多次","depth":3},{"id":"太淺也不行","text":"太淺也不行","depth":3},{"id":"補救讓-gcn-多看到一些標籤","text":"補救：讓 GCN 多看到一些標籤","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"graph-learning/appnp","relation":"referenced","topic":""},{"id":"graph-learning/sgc","relation":"referenced","topic":""}]}],"text":"兩層 GCN，每個節點只看得到兩步以內的鄰居。\n\n想看遠一點，直覺的做法是多疊幾層，結果 GCN 的論文自己就畫過，超過兩三層準確率就開始往下掉。疊得越深，所有節點的表示越來越像，最後分不出彼此。\n\n慕尼黑工業大學的 Johannes Gasteiger、Aleksandar Bojchevski 與 Stephan Günnemann 從另一個方向找答案。他們先問，GCN 疊到無限多層時，到底會收斂成什麼？答案是一個和起點無關的分布。那就讓它記得起點，每走一步，都有一定的機率回家。\n\n（第一作者在論文發表時名為 Johannes Klicpera，2022 年的 arXiv 版本已改為現在的姓名。）\n\n## 定義問題\n\n作者指出，GCN 這類訊息傳遞模型很難把鄰域擴大，原因有兩個。\n\n第一，用平均來聚合，層數一多就會 **over-smoothing**，失去對局部鄰域的關注。\n\n\n> [!TIP]\n> \n> over-smoothing 這個說法的出處，可以參考我們的筆記：\n> \n> - **[[18.01] Deeper Insights：抹得太平了](/blog/papers/graph-learning/deeper-insights)**\n\n\n第二，大部分的聚合方式，每一層都有自己的權重矩陣。想看遠一點，就得加深網路、加更多參數。但「需要看多遠」和「網路要多深」本來是兩件無關的事，綁在一起只會逼人做出不好的妥協。\n\n### 疊到無限多層會怎樣\n\n先處理第一個問題。作者引用 Jumping Knowledge 論文的分析，$k$ 層 GCN 裡，節點 $x$ 對節點 $y$ 的影響，期望值上正比於從 $x$ 出發、略作修改的 $k$ 步隨機遊走走到 $y$ 的機率。$k\\rightarrow\\infty$ 時，只要圖是不可約、非週期的，這個機率就收斂到隨機遊走的極限分布。\n\n極限分布是整張圖的性質，和從哪個節點出發無關。\n\n拿一條七個節點的路徑看看。這裡只看傳播本身，不管權重和非線性；$\\hat A^K$ 的第 $j$ 欄，就是 $j$ 號節點的特徵，經過 $K$ 層以後散到各節點的比例：\n\n```python\nimport numpy as np\nnp.set_printoptions(precision=2, suppress=True)\n\nn = 7\nA = np.zeros((n, n))\nfor i in range(n - 1):                      # 一條 7 個節點的路徑：0-1-2-3-4-5-6\n    A[i, i + 1] = A[i + 1, i] = 1\nA_t = A + np.eye(n)\nd = A_t.sum(1)\nA_hat = A_t / np.sqrt(np.outer(d, d))\n\nfor K in (2, 10, 100):\n    P = np.linalg.matrix_power(A_hat, K)    # 疊 K 層 GCN 的傳播（不看權重與非線性）\n    print(f\"K={K:>3}  從 0 號出發: {P[:, 0]}  從 6 號出發: {P[:, 6]}\")\n```\n\n```text\nK=  2  從 0 號出發: [0.42 0.34 0.14 0.   0.   0.   0.  ]  從 6 號出發: [0.   0.   0.   0.   0.14 0.34 0.42]\nK= 10  從 0 號出發: [0.2  0.22 0.18 0.12 0.07 0.04 0.02]  從 6 號出發: [0.02 0.04 0.07 0.12 0.18 0.22 0.2 ]\nK=100  從 0 號出發: [0.11 0.13 0.13 0.13 0.13 0.13 0.11]  從 6 號出發: [0.11 0.13 0.13 0.13 0.13 0.13 0.11]\n```\n\n兩層時，兩端的節點各自影響自己附近；十層時已經擴散到大半條路徑；一百層以後，兩端的分布一模一樣，誰也不記得自己從哪裡來。\n\n## 解決問題\n\n### Personalized PageRank\n\n隨機遊走的極限分布，就是 PageRank。PageRank 有一個為了搜尋引擎發展出來的變體，**personalized PageRank**：每走一步，都有 $\\alpha$ 的機率傳送回指定的根節點 $x$。\n\n$$\n\\pi_{\\text{ppr}}(i_x)=(1-\\alpha)\\hat A\\,\\pi_{\\text{ppr}}(i_x)+\\alpha i_x\n$$\n\n$i_x$ 是根節點的指示向量。解這個方程式，得到：\n\n$$\n\\pi_{\\text{ppr}}(i_x)=\\alpha\\left(I_n-(1-\\alpha)\\hat A\\right)^{-1}i_x\n$$\n\n這裡的 $\\hat A$ 是加了自環的對稱正規化鄰接矩陣，和 GCN 用的同一個。把 $i_x$ 換成單位矩陣，就得到整張圖的 personalized PageRank 矩陣：\n\n$$\n\\Pi_{\\text{ppr}}=\\alpha\\left(I_n-(1-\\alpha)\\hat A\\right)^{-1}\n$$\n\n$(\\Pi_{\\text{ppr}})_{yx}$ 就是 $x$ 對 $y$ 的影響。因為傳送回家的機率一直都在，即使在極限狀態，影響也集中在根節點附近，離得越遠越小；衰減得多快，由 $\\alpha$ 決定。\n\n同一條路徑，取 $\\alpha=0.1$：\n\n```python\nalpha = 0.1\nPi = alpha * np.linalg.inv(np.eye(n) - (1 - alpha) * A_hat)   # personalized PageRank 矩陣\nprint(\"從 0 號出發:\", Pi[:, 0])\nprint(\"從 6 號出發:\", Pi[:, 6])\n\nH = np.eye(n)                               # 每個節點的預測先用 one-hot 代替\nZ = H.copy()\nfor k in range(1, 31):\n    Z = (1 - alpha) * A_hat @ Z + alpha * H # APPNP 的一步\n    if k in (2, 10, 30):\n        print(f\"迭代 {k:>2} 步，和精確解的最大差距: {np.abs(Z - Pi).max():.3f}\")\n```\n\n```text\n從 0 號出發: [0.34 0.24 0.13 0.08 0.05 0.03 0.02]\n從 6 號出發: [0.02 0.03 0.05 0.08 0.13 0.24 0.34]\n迭代  2 步，和精確解的最大差距: 0.143\n迭代 10 步，和精確解的最大差距: 0.015\n迭代 30 步，和精確解的最大差距: 0.000\n```\n\n這是無限多步的結果，兩端的分布仍然各自集中在自己附近。後半段先別管，下一節會用到。\n\n### PPNP：先預測，再傳播\n\n作者把模型拆成兩段。第一段，用一個神經網路 $f_\\theta$ 對每個節點**各自**做預測，完全不看圖；第二段，用 personalized PageRank 把預測傳播出去：\n\n$$\nZ_{\\text{PPNP}}=\\mathrm{softmax}\\left(\\alpha\\left(I_n-(1-\\alpha)\\hat A\\right)^{-1}H\\right),\\qquad H_{i,:}=f_\\theta(X_{i,:})\n$$\n\n這個模型叫 PPNP（personalized propagation of neural predictions）。\n\n[![原論文 Figure 1：左邊是每個節點的特徵 x_i 各自經過神經網路 f_θ 得到預測 h_i；右邊是 personalized PageRank 的傳播，綠色箭頭沿著圖的邊傳遞，紅色虛線標示每一步以機率 α 傳送回根節點，最後得到 z_i。](/content/papers/assets/9ad06d29a0d48e1de136b4cd8560f14defc55b0aaf289f07b8319c40f033b844.png)](/content/papers/assets/9ad06d29a0d48e1de136b4cd8560f14defc55b0aaf289f07b8319c40f033b844.png)\n\n*原論文 Figure 1（Gasteiger 等人），取自 [**PDF 第 3 頁**](https://arxiv.org/pdf/1810.05997v6#page=3)。圖說未收錄。*\n\n拆開之後，前面提到的第二個問題也一起解決了。傳播本身沒有參數，要傳多遠由 $\\alpha$ 決定，神經網路要多深是另一回事；$f_\\theta$ 甚至可以換成任何模型，例如處理影像的 CNN。\n\n推論時是先預測、再傳播，但訓練是端到端的，梯度會穿過傳播的部分回到 $f_\\theta$，等於隱含地考慮了無限多層的聚合。\n\n### APPNP：用冪迭代近似\n\nPPNP 有一個實際的問題。$\\Pi_{\\text{ppr}}$ 是一個 $n\\times n$ 的稠密矩陣，儲存與每次傳播都需要 $O(n^2)$；精確求逆的前處理另有計算成本。\n\n作者換個角度看，把 $H$ 的每一欄（每個類別）當成一個主題，這就是 topic-sensitive PageRank，可以用冪迭代近似。每一步都是一次帶重啟的隨機遊走：\n\n$$\nZ^{(0)}=H,\\qquad Z^{(k+1)}=(1-\\alpha)\\hat AZ^{(k)}+\\alpha H,\\qquad Z^{(K)}=\\mathrm{softmax}\\left((1-\\alpha)\\hat AZ^{(K-1)}+\\alpha H\\right)\n$$\n\n$H$ 同時是起點，也是每一步要傳送回去的地方。每一步只需要一次稀疏矩陣乘法，不用建出 $n\\times n$ 的矩陣。這就是 APPNP。\n\n回到上一段程式的後半段。把每個節點的預測 $H$ 先換成 one-hot，迭代的結果就是 $\\Pi_{\\text{ppr}}$ 本身；迭代 10 步，和精確解的最大差距只剩 0.015，30 步就看不出差別了。\n\n### 和 GCN 差在哪\n\n把 $\\alpha$ 設成 0，APPNP 的傳播就是 GCN 式的 $\\hat A^K$。兩者的差別只在每一步加回去的那一項 $\\alpha H$。\n\n另一個差別在參數。GCN 每多傳播一步就要多一層權重；APPNP 不管傳播幾步，參數都只在 $f_\\theta$ 裡。\n\n## 討論\n\n### 嚴格的評估\n\n這篇論文很在意實驗的做法。作者指出，當時很多評估只用一組資料切分、驗證集和測試集分得不清楚、超參數還依資料集甚至依切分各自調整；而訊息傳遞模型對切分和初始化又非常敏感。\n\n所以他們這樣做：\n\n- 每個實驗跑 100 次，涵蓋多組隨機切分與初始化。\n- 資料分成可見集和測試集，測試集只在最後用一次，從來不用來選超參數或模型。\n- 所有資料集共用同樣的層數、隱藏單元、dropout、L2 和學習率；各模型的超參數都在 Citeseer 和 Cora-ML 上做 grid search，再用同一套早停規則。\n- 用 bootstrap 算 95% 信賴區間，主要結論附上成對 t 檢定的 p 值。\n\n四個資料集都只取最大連通分量，包括三個引用網路 Citeseer、Cora-ML、PubMed，以及一個共同作者網路 MS Academic。APPNP 用 $\\alpha=0.1$、$K=10$；MS Academic 的結構不太一樣，改用 $\\alpha=0.2$。\n\n### 主要結果\n\n| 方法 | Citeseer | Cora-ML | PubMed | MS Academic |\n| --- | ---: | ---: | ---: | ---: |\n| V. GCN | 73.51 | 82.30 | 77.65 | 91.65 |\n| GCN | 75.40 | 83.41 | 78.68 | 92.10 |\n| N-GCN | 74.25 | 82.25 | 77.43 | 92.86 |\n| GAT | 75.39 | 84.37 | 77.76 | 91.22 |\n| JK | 73.03 | 82.69 | 77.88 | 91.71 |\n| PPNP | **75.83** | **85.29** | 記憶體不足 | 記憶體不足 |\n| APPNP | 75.73 | 85.09 | **79.73** | **93.27** |\n\n數字是平均準確率（%），信賴區間大多在 ±0.5 以內。作者在表格標題寫得很直接，在他們的嚴格設定下，先前回報的進步消失了；例如 Citeseer 上，GAT 和 GCN 只差 0.01 個百分點。PPNP 和 APPNP 則在四個資料集都顯著勝出。\n\n訓練時間方面，APPNP 每個 epoch 平均比 GCN 慢約 25%，因為矩陣乘法比較多；但比 GAT 快得多，PubMed 上 APPNP 是 64.1 ms，GAT 是 1029.8 ms。\n\n### 要傳幾步、多常回家\n\n[![原論文 Figure 4：四個資料集的子圖，橫軸是傳播步數 K（0、10、20 與無限大），縱軸是準確率。藍色的 GCN 式傳播（α=0）在 K 增加時準確率明顯下降，橘色的 APPNP（α=0.1）則隨 K 上升後持平。](/content/papers/assets/541a2a6626ac4eda1d710c61856129ff289cfdff224f1b0bd1a6a894c4877c13.png)](/content/papers/assets/541a2a6626ac4eda1d710c61856129ff289cfdff224f1b0bd1a6a894c4877c13.png)\n\n*原論文 Figure 4（Gasteiger 等人），取自 [**PDF 第 7 頁**](https://arxiv.org/pdf/1810.05997v6#page=7)。圖說未收錄。*\n\n藍點是 $\\alpha=0$，也就是 GCN 式的傳播，步數一多，準確率就崩掉，因為它趨近全域的 PageRank。橘點是 $\\alpha=0.1$，準確率隨步數上升，然後收斂到無限多步的 PPNP。作者發現 $K=10$ 就夠接近，而且這個數字恰好等於資料集中任一節點到訓練集的最長最短路徑。\n\n傳送機率 $\\alpha$ 的最佳值因資料集而異，大致落在 0.05 到 0.2 之間。$\\alpha$ 越大，收斂越快。\n\n### 傳播用在哪裡\n\n作者還做了一個拆解實驗，比較傳播只用在訓練、只用在推論、兩者都用、兩者都不用的差別。都不用，就是一個只看節點特徵的 MLP。\n\n兩者都用最好。有意思的是，只在推論時傳播也相當不錯，也就是先訓練一個普通的 MLP，推論時再把預測沿著圖傳開。對已經訓練好的模型，這是一個幾乎不花成本的改進。\n\n### 標籤很少的時候\n\n標籤越少，APPNP 和 GCN 的差距越大。作者的解釋是，傳播範圍大的模型，能把少數訓練節點的資訊送得更遠；附錄的分析也顯示，離訓練集越遠的節點，從擴大範圍得到的好處越多。\n\n## 結論\n\nAPPNP 從 GCN 和隨機遊走的關係出發，把會遺忘起點的 PageRank 換成會回家的 personalized PageRank。疊再多步也不會 over-smoothing，傳播又沒有參數，網路深度和傳播範圍終於可以分開決定。\n\n這篇的評估做法，和它的模型一樣值得記住。同樣的 GCN、GAT，換成多組切分、100 次重跑、測試集只用一次，許多先前回報的進步就不見了。\n\n想試的話，先用論文的 $\\alpha=0.1$、$K=10$。手上已經有訓練好的 MLP，也可以只在推論時把它的預測沿著圖傳開，不用重新訓練，看看能多出幾個百分點。\n","imageSizes":{"/content/papers/assets/9ad06d29a0d48e1de136b4cd8560f14defc55b0aaf289f07b8319c40f033b844.png":{"width":908,"height":370},"/content/papers/assets/541a2a6626ac4eda1d710c61856129ff289cfdff224f1b0bd1a6a894c4877c13.png":{"width":1068,"height":274}}}
