{"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/two-tales-of-single-phase-contrastive-hebbian","title":"Two Tales of Single-Phase Contrastive Hebbian Learning","arxiv_id":"2402.08573","date":"2024-02-13","proceeding":null,"authors":["Rasmus Kjær Høier","Christopher Zach"],"abstract":"The search for ``biologically plausible'' learning algorithms has converged on the idea of representing gradients as activity differences. However, most approaches require a high degree of synchronization (distinct phases during learning) and introduce substantial computational overhead, which raises doubts regarding their biological plausibility as well as their potential utility for neuromorphic computing. Furthermore, they commonly rely on applying infinitesimal perturbations (nudges) to output units, which is impractical in noisy environments. Recently it has been shown that by modelling artificial neurons as dyads with two oppositely nudged compartments, it is possible for a fully local learning algorithm named ``dual propagation'' to bridge the performance gap to backpropagation, without requiring separate learning phases or infinitesimal nudging. However, the algorithm has the drawback that its numerical stability relies on symmetric nudging, which may be restrictive in biological and analog implementations. In this work we first provide a solid foundation for the objective underlying the dual propagation method, which also reveals a surprising connection with adversarial robustness. Second, we demonstrate how dual propagation is related to a particular adjoint state method, which is stable regardless of asymmetric nudging.","url_abs":"https://arxiv.org/abs/2402.08573v3","url_pdf":"https://arxiv.org/pdf/2402.08573v3.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":"two-tales-of-single-phase-contrastive-hebbian","repo_url":"https://github.com/Rasmuskh/dualprop_icml_2024","is_official":1,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"jax","reach":{"status":"ok"}}],"tasks":[{"task_slug":"adversarial-robustness","task_name":"Adversarial Robustness"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2402.08573","atlas_url":"https://app.syntology.ai/?focus=2402.08573","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2402.08573"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-25T09:33:49+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/Rasmuskh/dualprop_icml_2024","reach":{"status":"ok"}}],"summary":{"ran":3,"ran_honours":1,"unverified":2},"by_repo_kind":{"official":{"samples":6,"ran":4,"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":6,"samples":[{"code_sha256_prefix":"72f016c45e58c123","entry":"flatten","repo":"Rasmuskh/dualprop_icml_2024","repo_kind":"official","path":"src/models.py","file_url":"https://github.com/Rasmuskh/dualprop_icml_2024/blob/HEAD/src/models.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"72f016c45e58c123"}},{"code_sha256_prefix":"aaf2dc834399968b","entry":"hs","repo":"Rasmuskh/dualprop_icml_2024","repo_kind":"official","path":"config/cli_config.py","file_url":"https://github.com/Rasmuskh/dualprop_icml_2024/blob/HEAD/config/cli_config.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"aaf2dc834399968b"}},{"code_sha256_prefix":"9910e2fc297f8665","entry":"identity","repo":"Rasmuskh/dualprop_icml_2024","repo_kind":"official","path":"src/models.py","file_url":"https://github.com/Rasmuskh/dualprop_icml_2024/blob/HEAD/src/models.py","link_basis":"harvester_set","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"9910e2fc297f8665"}},{"code_sha256_prefix":"40cc3c0ba25bd7a0","entry":"maxpool2x2","repo":"Rasmuskh/dualprop_icml_2024","repo_kind":"official","path":"src/models.py","file_url":"https://github.com/Rasmuskh/dualprop_icml_2024/blob/HEAD/src/models.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"40cc3c0ba25bd7a0"}},{"code_sha256_prefix":"9a9fdb229d44e628","entry":"compute_metrics","repo":"Rasmuskh/dualprop_icml_2024","repo_kind":"official","path":"src/training_utils.py","file_url":"https://github.com/Rasmuskh/dualprop_icml_2024/blob/HEAD/src/training_utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"9a9fdb229d44e628"}},{"code_sha256_prefix":"8a9389d40f435482","entry":"loss_func","repo":"Rasmuskh/dualprop_icml_2024","repo_kind":"official","path":"config/cli_config.py","file_url":"https://github.com/Rasmuskh/dualprop_icml_2024/blob/HEAD/config/cli_config.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"8a9389d40f435482"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}