{"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-hans","path":"/content/papers/zh-hans/graph-learning/appnp.84d419b594d8.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-hans","path":"/content/papers/zh-hans/graph-learning/deeper-insights.3dfb15278376.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}}}
