{"notes":[{"id":"graph-learning/appnp","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"APPNP","subtitle":"Penser à rentrer chez soi","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":"fr","path":"/content/papers/fr/graph-learning/appnp.497491064447.md","headings":[{"id":"poser-le-problème","text":"Poser le problème","depth":2},{"id":"et-avec-une-infinité-de-couches-","text":"Et avec une infinité de couches ?","depth":3},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"personalized-pagerank","text":"Personalized PageRank","depth":3},{"id":"ppnp--prédire-puis-propager","text":"PPNP : prédire, puis propager","depth":3},{"id":"appnp--approcher-par-itération-de-puissance","text":"APPNP : approcher par itération de puissance","depth":3},{"id":"la-différence-avec-gcn","text":"La différence avec GCN","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"une-évaluation-rigoureuse","text":"Une évaluation rigoureuse","depth":3},{"id":"résultats-principaux","text":"Résultats principaux","depth":3},{"id":"combien-de-pas-et-quelle-fréquence-de-retour-","text":"Combien de pas et quelle fréquence de retour ?","depth":3},{"id":"où-appliquer-la-propagation-","text":"Où appliquer la propagation ?","depth":3},{"id":"quand-les-étiquettes-sont-rares","text":"Quand les étiquettes sont rares","depth":3},{"id":"conclusion","text":"Conclusion","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":"Trop bien lissé","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":"fr","path":"/content/papers/fr/graph-learning/deeper-insights.3da7994e8311.md","headings":[{"id":"poser-le-problème","text":"Poser le problème","depth":2},{"id":"résoudre-le-problème","text":"Résoudre le problème","depth":2},{"id":"comparer-au-réseau-entièrement-connecté","text":"Comparer au réseau entièrement connecté","depth":3},{"id":"le-lissage-laplacien","text":"Le lissage laplacien","depth":3},{"id":"lisser-trop-souvent","text":"Lisser trop souvent","depth":3},{"id":"trop-peu-de-couches-pose-aussi-problème","text":"Trop peu de couches pose aussi problème","depth":3},{"id":"le-remède--donner-plus-détiquettes-à-gcn","text":"Le remède : donner plus d'étiquettes à GCN","depth":3},{"id":"discussion","text":"Discussion","depth":2},{"id":"conclusion","text":"Conclusion","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"graph-learning/appnp","relation":"referenced","topic":""},{"id":"graph-learning/sgc","relation":"referenced","topic":""}]}],"text":"Avec deux couches de GCN, chaque nœud ne voit que ses voisins à deux sauts.\n\nPour aller plus loin, on empile intuitivement. Mais l'article de GCN lui-même montrait l'exactitude chuter au-delà de deux ou trois couches. Plus on approfondit, plus les représentations se ressemblent, jusqu'à devenir indiscernables.\n\nJohannes Gasteiger, Aleksandar Bojchevski et Stephan Günnemann, de l'université technique de Munich, cherchent ailleurs. Vers quoi converge GCN avec une infinité de couches ? Vers une distribution indépendante du point de départ. Il suffit alors de lui rappeler ce départ : à chaque pas, une certaine probabilité de rentrer chez soi.\n\n(Le premier auteur se nommait Johannes Klicpera lors de la parution ; la version arXiv de 2022 porte son nom actuel.)\n\n## Poser le problème\n\nLes auteurs avancent deux raisons pour lesquelles les modèles à passage de messages, comme GCN, élargissent mal leur voisinage.\n\nD'abord, agréger par moyenne entraîne de l'**over-smoothing** quand les couches se multiplient : l'attention au voisinage local disparaît.\n\n\n> [!TIP]\n> \n> Pour l'origine du terme over-smoothing, voir notre note :\n> \n> - **[[18.01] Deeper Insights : Trop bien lissé](/blog/papers/graph-learning/deeper-insights)**\n\n\nEnsuite, la plupart des agrégations ont une matrice de poids par couche. Voir plus loin oblige à approfondir et ajouter des paramètres. La portée nécessaire et la profondeur du réseau sont pourtant deux choix indépendants ; les lier impose de mauvais compromis.\n\n### Et avec une infinité de couches ?\n\nPour le premier problème, les auteurs reprennent l'analyse de Jumping Knowledge : dans un GCN à $k$ couches, l'influence attendue de $x$ sur $y$ est proportionnelle à la probabilité qu'une marche aléatoire légèrement modifiée atteigne $y$ depuis $x$ en $k$ pas. Quand $k\\rightarrow\\infty$, si le graphe est irréductible et apériodique, cette probabilité converge vers la distribution limite de la marche.\n\nCette distribution appartient au graphe entier et ne dépend plus du nœud de départ.\n\nRegardons un chemin de sept nœuds, avec la propagation seule, sans poids ni non-linéarité. La colonne $j$ de $\\hat A^K$ indique comment les caractéristiques du nœud $j$ se répartissent entre les nœuds après $K$ couches :\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):                      # Chemin de 7 nœuds : 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)    # Propagation de K couches GCN, sans poids ni non-linéarité\n    print(f\"K={K:>3}  Départ 0: {P[:, 0]}  Départ 6: {P[:, 6]}\")\n```\n\n```text\nK=  2  Départ 0: [0.42 0.34 0.14 0.   0.   0.   0.  ]  Départ 6: [0.   0.   0.   0.   0.14 0.34 0.42]\nK= 10  Départ 0: [0.2  0.22 0.18 0.12 0.07 0.04 0.02]  Départ 6: [0.02 0.04 0.07 0.12 0.18 0.22 0.2 ]\nK=100  Départ 0: [0.11 0.13 0.13 0.13 0.13 0.13 0.11]  Départ 6: [0.11 0.13 0.13 0.13 0.13 0.13 0.11]\n```\n\nÀ deux couches, chaque extrémité influence ses environs ; à dix, l'influence couvre déjà la majeure partie du chemin ; à cent, les deux distributions coïncident. Chacune a oublié d'où elle venait.\n\n## Résoudre le problème\n\n### Personalized PageRank\n\nLa distribution limite d'une marche aléatoire est PageRank. Une variante née pour les moteurs de recherche, le **PageRank personnalisé**, téléporte à chaque pas vers un nœud racine $x$ avec une probabilité $\\alpha$.\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$ est le vecteur indicateur de la racine. Résoudre cette équation donne :\n\n$$\n\\pi_{\\text{ppr}}(i_x)=\\alpha\\left(I_n-(1-\\alpha)\\hat A\\right)^{-1}i_x\n$$\n\nIci, $\\hat A$ est l'adjacence à boucles propres normalisée symétriquement, identique à celle de GCN. Remplacer $i_x$ par l'identité donne la matrice de PageRank personnalisé du graphe entier :\n\n$$\n\\Pi_{\\text{ppr}}=\\alpha\\left(I_n-(1-\\alpha)\\hat A\\right)^{-1}\n$$\n\n$(\\Pi_{\\text{ppr}})_{yx}$ est l'influence de $x$ sur $y$. La probabilité de retour reste toujours présente : même à la limite, l'influence demeure concentrée près de la racine et décroît avec la distance, à un rythme réglé par $\\alpha$.\n\nSur le même chemin, avec $\\alpha=0.1$ :\n\n```python\nalpha = 0.1\nPi = alpha * np.linalg.inv(np.eye(n) - (1 - alpha) * A_hat)   # Matrice de PageRank personnalisé\nprint(\"Départ 0:\", Pi[:, 0])\nprint(\"Départ 6:\", Pi[:, 6])\n\nH = np.eye(n)                               # Remplacer les prédictions des nœuds par des one-hot\nZ = H.copy()\nfor k in range(1, 31):\n    Z = (1 - alpha) * A_hat @ Z + alpha * H # Un pas d'APPNP\n    if k in (2, 10, 30):\n        print(f\"Après {k:>2} pas, écart maximal à la solution exacte: {np.abs(Z - Pi).max():.3f}\")\n```\n\n```text\nDépart 0: [0.34 0.24 0.13 0.08 0.05 0.03 0.02]\nDépart 6: [0.02 0.03 0.05 0.08 0.13 0.24 0.34]\nAprès  2 pas, écart maximal à la solution exacte: 0.143\nAprès 10 pas, écart maximal à la solution exacte: 0.015\nAprès 30 pas, écart maximal à la solution exacte: 0.000\n```\n\nC'est le résultat d'une infinité de pas ; les deux distributions restent concentrées près de leur propre départ. La seconde moitié du code servira dans la prochaine section.\n\n### PPNP : prédire, puis propager\n\nLes auteurs séparent le modèle en deux parties. D'abord, un réseau $f_\\theta$ prédit pour chaque nœud **séparément**, sans regarder le graphe. Ensuite, le PageRank personnalisé propage ces prédictions :\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\nCe modèle s'appelle PPNP, personalized propagation of neural predictions.\n\n[![Figure 1 de l'article : à gauche, les caractéristiques x_i de chaque nœud passent séparément dans f_θ pour produire h_i. À droite, PageRank personnalisé propage les prédictions : les flèches vertes suivent les arêtes et les pointillés rouges indiquent le retour à la racine avec probabilité α à chaque pas, pour produire z_i.](/content/papers/assets/9ad06d29a0d48e1de136b4cd8560f14defc55b0aaf289f07b8319c40f033b844.png)](/content/papers/assets/9ad06d29a0d48e1de136b4cd8560f14defc55b0aaf289f07b8319c40f033b844.png)\n\n*Figure 1 de l'article (Gasteiger et al.), extraite de la [**page 3 du PDF**](https://arxiv.org/pdf/1810.05997v6#page=3). Légende originale omise.*\n\nCette séparation résout aussi le deuxième problème. La propagation n'a pas de paramètres ; $\\alpha$ règle sa portée, indépendamment de la profondeur du réseau. $f_\\theta$ peut même être un autre modèle, comme un CNN traitant des images.\n\nÀ l'inférence, on prédit puis on propage ; l'entraînement reste de bout en bout. Le gradient traverse la propagation et revient à $f_\\theta$, ce qui considère implicitement une infinité de couches d'agrégation.\n\n### APPNP : approcher par itération de puissance\n\nPPNP a un problème pratique : $\\Pi_{\\text{ppr}}$ est une matrice dense $n\\times n$. Son stockage et chaque propagation coûtent $O(n^2)$ ; le calcul de l’inverse exact ajoute un coût de prétraitement distinct.\n\nLes auteurs voient chaque colonne de $H$, donc chaque classe, comme un thème. On obtient alors un PageRank sensible au thème, approchable par itération de puissance : chaque pas est une marche avec redémarrage.\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$ est à la fois le départ et la destination de retour à chaque pas. Une seule multiplication creuse par étape suffit, sans construire la matrice $n\\times n$ : c'est APPNP.\n\nRevenons à la seconde moitié du code : en remplaçant les prédictions $H$ par des one-hot, l'itération approche $\\Pi_{\\text{ppr}}$ elle-même. Après 10 pas, l'écart maximal à la solution exacte n'est que 0.015 ; à 30, il n'est plus visible.\n\n### La différence avec GCN\n\nAvec $\\alpha=0$, APPNP propage comme GCN par $\\hat A^K$. La différence est le terme $\\alpha H$ réinjecté à chaque pas.\n\nLes paramètres diffèrent aussi : GCN ajoute une couche de poids par pas de propagation ; APPNP garde tous ses paramètres dans $f_\\theta$, quel que soit le nombre de pas.\n\n## Discussion\n\n### Une évaluation rigoureuse\n\nL'article soigne particulièrement l'évaluation. Les auteurs critiquent les expériences à partition unique, les frontières floues entre validation et test, et les hyperparamètres réglés par jeu, voire par partition, alors que ces modèles sont très sensibles aux partitions et aux initialisations.\n\nIls procèdent donc ainsi :\n\n- Chaque expérience est répétée 100 fois, avec plusieurs partitions et initialisations aléatoires.\n- Les données sont séparées en ensemble visible et test ; celui-ci n'est utilisé qu'une fois à la fin, jamais pour choisir les hyperparamètres ou le modèle.\n- Tous les jeux partagent profondeur, unités cachées, dropout, L2 et taux d'apprentissage. Les hyperparamètres de chaque modèle sont choisis par recherche sur grille sur Citeseer et Cora-ML, puis le même arrêt anticipé s'applique.\n- Des intervalles de confiance à 95% sont calculés par bootstrap, avec des valeurs p de tests t appariés pour les principales conclusions.\n\nSeule la plus grande composante connexe des quatre jeux est gardée : les réseaux de citations Citeseer, Cora-ML et PubMed, et le réseau de coauteurs MS Academic. APPNP utilise $\\alpha=0.1$ et $K=10$, sauf sur MS Academic, dont la structure différente demande $\\alpha=0.2$.\n\n### Résultats principaux\n\n| Méthode | 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** | Mémoire insuffisante | Mémoire insuffisante |\n| APPNP | 75.73 | 85.09 | **79.73** | **93.27** |\n\nLes chiffres sont les exactitudes moyennes (%), avec des intervalles généralement inférieurs à ±0.5. Les auteurs écrivent franchement dans la légende que leurs conditions rigoureuses font disparaître les progrès précédemment rapportés : GAT et GCN ne diffèrent par exemple que de 0.01 point sur Citeseer. PPNP et APPNP gagnent en revanche significativement sur les quatre jeux.\n\nAPPNP prend environ 25% de plus par époque que GCN à cause des produits matriciels supplémentaires, mais reste bien plus rapide que GAT : sur PubMed, 64.1 ms contre 1029.8 ms.\n\n### Combien de pas et quelle fréquence de retour ?\n\n[![Figure 4 de l'article : quatre panneaux, un par jeu de données. L'axe horizontal donne K, le nombre de pas (0, 10, 20 et l'infini), le vertical l'exactitude. La propagation de type GCN, en bleu (α=0), baisse nettement avec K ; APPNP, en orange (α=0.1), monte puis se stabilise.](/content/papers/assets/541a2a6626ac4eda1d710c61856129ff289cfdff224f1b0bd1a6a894c4877c13.png)](/content/papers/assets/541a2a6626ac4eda1d710c61856129ff289cfdff224f1b0bd1a6a894c4877c13.png)\n\n*Figure 4 de l'article (Gasteiger et al.), extraite de la [**page 7 du PDF**](https://arxiv.org/pdf/1810.05997v6#page=7). Légende originale omise.*\n\nLes points bleus ont $\\alpha=0$, comme la propagation GCN : l'exactitude s'effondre quand les pas se multiplient, car on approche le PageRank global. Les points orange, avec $\\alpha=0.1$, montent puis convergent vers PPNP à une infinité de pas. Les auteurs trouvent $K=10$ suffisamment proche ; ce nombre coïncide avec la plus longue des plus courtes distances d'un nœud à l'entraînement.\n\nLa meilleure probabilité de téléportation $\\alpha$ dépend du jeu, généralement entre 0.05 et 0.2. Plus elle est grande, plus la convergence est rapide.\n\n### Où appliquer la propagation ?\n\nUne ablation compare la propagation à l'entraînement seulement, à l'inférence seulement, aux deux ou à aucun. Sans propagation, il reste un MLP sur les caractéristiques des nœuds.\n\nL'appliquer aux deux étapes est le meilleur choix. Mais l'inférence seule fonctionne déjà bien : entraîner un MLP ordinaire, puis diffuser ses prédictions sur le graphe. Pour un modèle existant, c'est une amélioration presque gratuite.\n\n### Quand les étiquettes sont rares\n\nPlus les étiquettes sont rares, plus APPNP prend l'avantage sur GCN. Les auteurs l'expliquent par sa capacité à transmettre plus loin l'information des rares nœuds d'entraînement. L'annexe montre aussi que les nœuds les plus éloignés de l'entraînement bénéficient le plus d'une portée élargie.\n\n## Conclusion\n\nPartant du lien entre GCN et marches aléatoires, APPNP remplace PageRank, qui oublie son départ, par sa version personnalisée qui rentre chez elle. Accumuler les pas n'entraîne plus de surlissage ; sans paramètres dans la propagation, profondeur et portée se choisissent enfin séparément.\n\nSon protocole mérite autant d'être retenu que le modèle. Les mêmes GCN et GAT, évalués sur plusieurs partitions avec 100 répétitions et un seul usage du test, perdent beaucoup de leurs progrès annoncés.\n\nPour essayer, commencez par $\\alpha=0.1$ et $K=10$. Si vous avez déjà un MLP entraîné, propagez simplement ses prédictions à l'inférence, sans réentraîner, et voyez combien de points vous gagnez.\n","imageSizes":{"/content/papers/assets/9ad06d29a0d48e1de136b4cd8560f14defc55b0aaf289f07b8319c40f033b844.png":{"width":908,"height":370},"/content/papers/assets/541a2a6626ac4eda1d710c61856129ff289cfdff224f1b0bd1a6a894c4877c13.png":{"width":1068,"height":274}}}
