{"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/understanding-gradual-domain-adaptation","title":"Understanding Gradual Domain Adaptation: Improved Analysis, Optimal Path and Beyond","arxiv_id":"2204.08200","date":"2022-04-18","proceeding":null,"authors":["Haoxiang Wang","Bo Li","Han Zhao"],"abstract":"The vast majority of existing algorithms for unsupervised domain adaptation (UDA) focus on adapting from a labeled source domain to an unlabeled target domain directly in a one-off way. Gradual domain adaptation (GDA), on the other hand, assumes a path of $(T-1)$ unlabeled intermediate domains bridging the source and target, and aims to provide better generalization in the target domain by leveraging the intermediate ones. Under certain assumptions, Kumar et al. (2020) proposed a simple algorithm, Gradual Self-Training, along with a generalization bound in the order of $e^{O(T)} \\left(\\varepsilon_0+O\\left(\\sqrt{log(T)/n}\\right)\\right)$ for the target domain error, where $\\varepsilon_0$ is the source domain error and $n$ is the data size of each domain. Due to the exponential factor, this upper bound becomes vacuous when $T$ is only moderately large. In this work, we analyze gradual self-training under more general and relaxed assumptions, and prove a significantly improved generalization bound as $\\varepsilon_0+ O \\left(T\\Delta + T/\\sqrt{n}\\right) + \\widetilde{O}\\left(1/\\sqrt{nT}\\right)$, where $\\Delta$ is the average distributional distance between consecutive domains. Compared with the existing bound with an exponential dependency on $T$ as a multiplicative factor, our bound only depends on $T$ linearly and additively. Perhaps more interestingly, our result implies the existence of an optimal choice of $T$ that minimizes the generalization error, and it also naturally suggests an optimal way to construct the path of intermediate domains so as to minimize the accumulative path length $T\\Delta$ between the source and target. To corroborate the implications of our theory, we examine gradual self-training on multiple semi-synthetic and real datasets, which confirms our findings. We believe our insights provide a path forward toward the design of future GDA algorithms.","url_abs":"https://arxiv.org/abs/2204.08200v2","url_pdf":"https://arxiv.org/pdf/2204.08200v2.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":"understanding-gradual-domain-adaptation","repo_url":"https://github.com/Haoxiang-Wang/gradual-domain-adaptation","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":0,"framework":"none","reach":{"status":"ok","spdx":"MIT"}},{"paper_slug":"understanding-gradual-domain-adaptation","repo_url":"https://github.com/uiuctml/goat","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"pytorch","reach":null},{"paper_slug":"understanding-gradual-domain-adaptation","repo_url":"https://github.com/yifei-he/goat","is_official":0,"mentioned_in_paper":0,"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/2204.08200","atlas_url":"https://app.syntology.ai/?focus=2204.08200","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2204.08200"}},"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/Haoxiang-Wang/gradual-domain-adaptation","reach":{"status":"ok","spdx":"MIT"}},{"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_fixture":1,"unverified":1},"by_repo_kind":{"listed":{"samples":4,"ran":3,"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":"uiuctml/goat","repo_kind":"listed","path":"train_model.py","file_url":"https://github.com/uiuctml/goat/blob/HEAD/train_model.py","link_basis":"first_harvest_node","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":"206142c1def9d0e8","entry":"loss_function","repo":"uiuctml/goat","repo_kind":"listed","path":"train_model.py","file_url":"https://github.com/uiuctml/goat/blob/HEAD/train_model.py","link_basis":"first_harvest_node","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":"0a027f0cb95c0e29","entry":"test","repo":"uiuctml/goat","repo_kind":"listed","path":"train_model.py","file_url":"https://github.com/uiuctml/goat/blob/HEAD/train_model.py","link_basis":"first_harvest_node","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":"8f756a4179f4b480","entry":"get_source_model","repo":"uiuctml/goat","repo_kind":"listed","path":"experiments.py","file_url":"https://github.com/uiuctml/goat/blob/HEAD/experiments.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":"8f756a4179f4b480"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}