{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/gap-differentially-private-graph-neural","title":"GAP: Differentially Private Graph Neural Networks with Aggregation Perturbation","arxiv_id":"2203.00949","date":"2022-03-02","proceeding":null,"authors":["Sina Sajadmanesh","Ali Shahin Shamsabadi","Aurélien Bellet","Daniel Gatica-Perez"],"abstract":"In this paper, we study the problem of learning Graph Neural Networks (GNNs) with Differential Privacy (DP). We propose a novel differentially private GNN based on Aggregation Perturbation (GAP), which adds stochastic noise to the GNN's aggregation function to statistically obfuscate the presence of a single edge (edge-level privacy) or a single node and all its adjacent edges (node-level privacy). Tailored to the specifics of private learning, GAP's new architecture is composed of three separate modules: (i) the encoder module, where we learn private node embeddings without relying on the edge information; (ii) the aggregation module, where we compute noisy aggregated node embeddings based on the graph structure; and (iii) the classification module, where we train a neural network on the private aggregations for node classification without further querying the graph edges. GAP's major advantage over previous approaches is that it can benefit from multi-hop neighborhood aggregations, and guarantees both edge-level and node-level DP not only for training, but also at inference with no additional costs beyond the training's privacy budget. We analyze GAP's formal privacy guarantees using R\\'enyi DP and conduct empirical experiments over three real-world graph datasets. We demonstrate that GAP offers significantly better accuracy-privacy trade-offs than state-of-the-art DP-GNN approaches and naive MLP-based baselines. Our code is publicly available at https://github.com/sisaman/GAP.","url_abs":"https://arxiv.org/abs/2203.00949v3","url_pdf":"https://arxiv.org/pdf/2203.00949v3.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"gap-differentially-private-graph-neural","repo_url":"https://github.com/sisaman/gap","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"CC0-1.0"}}],"tasks":[{"task_slug":"node-classification","task_name":"Node Classification"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2203.00949","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2203.00949"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/sisaman/gap","reach":{"status":"ok","spdx":"CC0-1.0"}}],"summary":{"ran":6},"by_repo_kind":{"official":{"samples":6,"ran":6,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"657a879da36808ce","entry":"boolean","repo":"sisaman/gap","repo_kind":"official","path":"core/args/utils.py","file_url":"https://github.com/sisaman/gap/blob/HEAD/core/args/utils.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"CC0-1.0","inline_ok":true,"mcp_get_code":{"code_sha256":"657a879da36808ce"}},{"code_sha256_prefix":"3083dc7c7310cba3","entry":"bootstrap","repo":"sisaman/gap","repo_kind":"official","path":"core/utils.py","file_url":"https://github.com/sisaman/gap/blob/HEAD/core/utils.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"CC0-1.0","inline_ok":true,"mcp_get_code":{"code_sha256":"3083dc7c7310cba3"}},{"code_sha256_prefix":"f5e502a8909df4a3","entry":"confidence_interval","repo":"sisaman/gap","repo_kind":"official","path":"core/utils.py","file_url":"https://github.com/sisaman/gap/blob/HEAD/core/utils.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"CC0-1.0","inline_ok":true,"mcp_get_code":{"code_sha256":"f5e502a8909df4a3"}},{"code_sha256_prefix":"e2521bda2312168c","entry":"pairwise","repo":"sisaman/gap","repo_kind":"official","path":"core/utils.py","file_url":"https://github.com/sisaman/gap/blob/HEAD/core/utils.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"CC0-1.0","inline_ok":true,"mcp_get_code":{"code_sha256":"e2521bda2312168c"}},{"code_sha256_prefix":"08a161ae49cfc264","entry":"remove_prefix","repo":"sisaman/gap","repo_kind":"official","path":"core/args/utils.py","file_url":"https://github.com/sisaman/gap/blob/HEAD/core/args/utils.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"CC0-1.0","inline_ok":true,"mcp_get_code":{"code_sha256":"08a161ae49cfc264"}},{"code_sha256_prefix":"e14dcc590e6d88f1","entry":"strip_kwargs","repo":"sisaman/gap","repo_kind":"official","path":"core/args/utils.py","file_url":"https://github.com/sisaman/gap/blob/HEAD/core/args/utils.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"CC0-1.0","inline_ok":true,"mcp_get_code":{"code_sha256":"e14dcc590e6d88f1"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}