{"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/gradual-domain-adaptation-theory-and","title":"Gradual Domain Adaptation: Theory and Algorithms","arxiv_id":"2310.13852","date":"2023-10-20","proceeding":null,"authors":["Yifei He","Haoxiang Wang","Bo Li","Han Zhao"],"abstract":"Unsupervised domain adaptation (UDA) adapts a model from a labeled source domain to an unlabeled target domain in a one-off way. Though widely applied, UDA faces a great challenge whenever the distribution shift between the source and the target is large. Gradual domain adaptation (GDA) mitigates this limitation by using intermediate domains to gradually adapt from the source to the target domain. In this work, we first theoretically analyze gradual self-training, a popular GDA algorithm, and provide a significantly improved generalization bound compared with Kumar et al. (2020). Our theoretical analysis leads to an interesting insight: to minimize the generalization error on the target domain, the sequence of intermediate domains should be placed uniformly along the Wasserstein geodesic between the source and target domains. The insight is particularly useful under the situation where intermediate domains are missing or scarce, which is often the case in real-world applications. Based on the insight, we propose $\\textbf{G}$enerative Gradual D$\\textbf{O}$main $\\textbf{A}$daptation with Optimal $\\textbf{T}$ransport (GOAT), an algorithmic framework that can generate intermediate domains in a data-dependent way. More concretely, we first generate intermediate domains along the Wasserstein geodesic between two given consecutive domains in a feature space, then apply gradual self-training to adapt the source-trained classifier to the target along the sequence of intermediate domains. Empirically, we demonstrate that our GOAT framework can improve the performance of standard GDA when the given intermediate domains are scarce, significantly broadening the real-world application scenarios of GDA. Our code is available at https://github.com/uiuctml/GOAT.","url_abs":"https://arxiv.org/abs/2310.13852v2","url_pdf":"https://arxiv.org/pdf/2310.13852v2.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":"gradual-domain-adaptation-theory-and","repo_url":"https://github.com/uiuctml/goat","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":null},{"paper_slug":"gradual-domain-adaptation-theory-and","repo_url":"https://github.com/yifei-he/goat","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"domain-adaptation","task_name":"Domain Adaptation"},{"task_slug":"unsupervised-domain-adaptation","task_name":"Unsupervised Domain Adaptation"}],"methods":[{"method_slug":"gradual-self-training","method_name":"Gradual Self-Training"}],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2310.13852","atlas_url":"https://app.syntology.ai/?focus=2310.13852","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2310.13852"}},"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/yifei-he/goat","reach":{"status":"ok","spdx":"MIT"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/uiuctml/goat","reach":null}],"summary":{"ran_honours":2,"ran":7,"ran_fixture":1,"unverified":5},"by_repo_kind":{"official":{"samples":15,"ran":10,"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":"87fd30c36abb62d4","entry":"calculate_modal_val_accuracy","repo":"yifei-he/goat","repo_kind":"official","path":"train_model.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/train_model.py","link_basis":"plan_row","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"87fd30c36abb62d4"}},{"code_sha256_prefix":"2683447b0d0da61c","entry":"get_angles","repo":"yifei-he/goat","repo_kind":"official","path":"util.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/util.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"2683447b0d0da61c"}},{"code_sha256_prefix":"562768e28e0b7b68","entry":"get_conf_idx","repo":"yifei-he/goat","repo_kind":"official","path":"ot_util.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/ot_util.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"562768e28e0b7b68"}},{"code_sha256_prefix":"8fa39421d6d44541","entry":"get_pseudo_labels","repo":"yifei-he/goat","repo_kind":"official","path":"da_algo.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/da_algo.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"8fa39421d6d44541"}},{"code_sha256_prefix":"6dcd56b2f85f042b","entry":"get_transported_labels","repo":"yifei-he/goat","repo_kind":"official","path":"ot_util.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/ot_util.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"6dcd56b2f85f042b"}},{"code_sha256_prefix":"e7acb448f66e84cb","entry":"load_portraits_data","repo":"yifei-he/goat","repo_kind":"official","path":"dataset.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/dataset.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"e7acb448f66e84cb"}},{"code_sha256_prefix":"206142c1def9d0e8","entry":"loss_function","repo":"yifei-he/goat","repo_kind":"official","path":"train_model.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/train_model.py","link_basis":"plan_row","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"206142c1def9d0e8"}},{"code_sha256_prefix":"73a5a29137cb1d07","entry":"shuffle","repo":"yifei-he/goat","repo_kind":"official","path":"dataset.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/dataset.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"73a5a29137cb1d07"}},{"code_sha256_prefix":"a2a03bffe9d25162","entry":"split_sizes","repo":"yifei-he/goat","repo_kind":"official","path":"dataset.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/dataset.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"a2a03bffe9d25162"}},{"code_sha256_prefix":"0a027f0cb95c0e29","entry":"test","repo":"yifei-he/goat","repo_kind":"official","path":"train_model.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/train_model.py","link_basis":"plan_row","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"0a027f0cb95c0e29"}},{"code_sha256_prefix":"08b2a40007332655","entry":"get_OT_plan","repo":"yifei-he/goat","repo_kind":"official","path":"ot_util.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/ot_util.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"08b2a40007332655"}},{"code_sha256_prefix":"99b23963ab09d0ec","entry":"get_rotated_dataset","repo":"yifei-he/goat","repo_kind":"official","path":"util.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/util.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"99b23963ab09d0ec"}},{"code_sha256_prefix":"21fe29bf19ff3038","entry":"get_single_rotate","repo":"yifei-he/goat","repo_kind":"official","path":"util.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/util.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"21fe29bf19ff3038"}},{"code_sha256_prefix":"8f756a4179f4b480","entry":"get_source_model","repo":"yifei-he/goat","repo_kind":"official","path":"experiments.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/experiments.py","link_basis":"plan_row","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"8f756a4179f4b480"}},{"code_sha256_prefix":"e1f64f917e8fc686","entry":"self_train","repo":"yifei-he/goat","repo_kind":"official","path":"da_algo.py","file_url":"https://github.com/yifei-he/goat/blob/HEAD/da_algo.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"e1f64f917e8fc686"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}