{"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/controlling-directions-orthogonal-to-a-1","title":"Controlling Directions Orthogonal to a Classifier","arxiv_id":"2201.11259","date":"2022-01-27","proceeding":"ICLR 2022 4","authors":["Yilun Xu","Hao He","Tianxiao Shen","Tommi Jaakkola"],"abstract":"We propose to identify directions invariant to a given classifier so that these directions can be controlled in tasks such as style transfer. While orthogonal decomposition is directly identifiable when the given classifier is linear, we formally define a notion of orthogonality in the non-linear case. We also provide a surprisingly simple method for constructing the orthogonal classifier (a classifier utilizing directions other than those of the given classifier). Empirically, we present three use cases where controlling orthogonal variation is important: style transfer, domain adaptation, and fairness. The orthogonal classifier enables desired style transfer when domains vary in multiple aspects, improves domain adaptation with label shifts and mitigates the unfairness as a predictor. The code is available at http://github.com/Newbeeer/orthogonal_classifier","url_abs":"https://arxiv.org/abs/2201.11259v1","url_pdf":"https://arxiv.org/pdf/2201.11259v1.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":"controlling-directions-orthogonal-to-a-1","repo_url":"https://github.com/newbeeer/orthogonal_classifier","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":0,"framework":"pytorch","reach":{"status":"ok"}}],"tasks":[{"task_slug":"domain-adaptation","task_name":"Domain Adaptation"},{"task_slug":"fairness","task_name":"Fairness"},{"task_slug":"style-transfer","task_name":"Style Transfer"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2201.11259","atlas_url":"https://app.syntology.ai/?focus=2201.11259","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2201.11259"}},"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":"deterministic:regex_extraction","url":"https://github.com/Newbeeer/orthogonal_classifier","reach":{"status":"ok"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/newbeeer/orthogonal_classifier","reach":{"status":"ok"}}],"summary":{"ran_fixture":1,"ran":2,"unverified":3},"by_repo_kind":{"official":{"samples":6,"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":6,"samples":[{"code_sha256_prefix":"20eba8a32c4f4158","entry":"Featurizer","repo":"newbeeer/orthogonal_classifier","repo_kind":"official","path":"style_transfer/algorithms.py","file_url":"https://github.com/newbeeer/orthogonal_classifier/blob/HEAD/style_transfer/algorithms.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"20eba8a32c4f4158"}},{"code_sha256_prefix":"0630c355646ca40d","entry":"MNIST_CNN","repo":"newbeeer/orthogonal_classifier","repo_kind":"official","path":"style_transfer/algorithms.py","file_url":"https://github.com/newbeeer/orthogonal_classifier/blob/HEAD/style_transfer/algorithms.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"0630c355646ca40d"}},{"code_sha256_prefix":"339f350fff5dd33c","entry":"SqueezeLastTwo","repo":"newbeeer/orthogonal_classifier","repo_kind":"official","path":"style_transfer/algorithms.py","file_url":"https://github.com/newbeeer/orthogonal_classifier/blob/HEAD/style_transfer/algorithms.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":"339f350fff5dd33c"}},{"code_sha256_prefix":"448c00adc68aba1e","entry":"Algorithm","repo":"newbeeer/orthogonal_classifier","repo_kind":"official","path":"style_transfer/algorithms.py","file_url":"https://github.com/newbeeer/orthogonal_classifier/blob/HEAD/style_transfer/algorithms.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":"448c00adc68aba1e"}},{"code_sha256_prefix":"48e9a562be89feeb","entry":"EC","repo":"newbeeer/orthogonal_classifier","repo_kind":"official","path":"style_transfer/algorithms.py","file_url":"https://github.com/newbeeer/orthogonal_classifier/blob/HEAD/style_transfer/algorithms.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":"48e9a562be89feeb"}},{"code_sha256_prefix":"8eb84d95ee592c49","entry":"ResNet","repo":"newbeeer/orthogonal_classifier","repo_kind":"official","path":"style_transfer/algorithms.py","file_url":"https://github.com/newbeeer/orthogonal_classifier/blob/HEAD/style_transfer/algorithms.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":"8eb84d95ee592c49"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}