{"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":"ja","path":"/content/papers/ja/graph-learning/appnp.2aa21b4277dd.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":"ja","path":"/content/papers/ja/graph-learning/deeper-insights.dba605607ed9.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 は、無限に重ねた先の収束先を問いました。出発点に依存しない分布なら、出発点を覚えさせよう。一歩ごとに一定確率で帰るのです。\n\n（第一著者は発表時 Johannes Klicpera で、2022 年の arXiv 版では現在の姓になっています。）\n\n## 問題設定\n\nGCN 型のメッセージパッシングで近傍を広げにくい理由は二つです。\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):                      # 七ノードのパス：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 層の伝播（重みと非線形性は除く）\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 です。検索エンジン向けの変種 **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\n0 番から出発: [0.34 0.24 0.13 0.08 0.05 0.03 0.02]\n6 番から出発: [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\nPPNP（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$ なら、伝播は 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\nAPPNP は積が多く、一 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）は上がって横ばいになる。](/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最良の帰還確率はデータごとに異なり、おおむね 0.05〜0.2 です。大きいほど速く収束します。\n\n### いつ伝播するか\n\n訓練だけ、推論だけ、両方、どちらもなしを比べます。なしなら特徴量だけを見る MLP です。\n\n両方が最良ですが、推論だけでもかなり有効です。普通の MLP を訓練し、推論で予測をグラフに流すだけなので、訓練済みモデルにもほぼ追加コストなく使える改善です。\n\n### ラベルが少ない場合\n\n少ないほど GCN との差が広がります。広い範囲への伝播が少数ラベルを遠くに届けるため、と説明します。付録でも訓練セットから遠いノードほど範囲拡大の恩恵が大きくなります。\n\n## 結論\n\nGCN とランダムウォークの関係から、出発点を忘れる 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}}}
