{"id":18941147,"url":"https://github.com/gaussalgo/adaptor","last_synced_at":"2025-08-30T14:17:18.962Z","repository":{"id":39887753,"uuid":"437816305","full_name":"gaussalgo/adaptor","owner":"gaussalgo","description":"ACL 2022: Adaptor: a library to easily adapt a language model to your own task, domain, or custom objective(s).","archived":false,"fork":false,"pushed_at":"2025-03-28T12:46:46.000Z","size":873,"stargazers_count":27,"open_issues_count":1,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-30T11:11:44.419Z","etag":null,"topics":["domain-adaptation","multi-objective-optimization","ner","nlp","pytorch","robustness","text-classification","text-generation","transformers"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gaussalgo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-12-13T09:45:52.000Z","updated_at":"2025-03-24T15:36:30.000Z","dependencies_parsed_at":"2022-08-09T15:35:57.095Z","dependency_job_id":"ef4bb817-80c1-4bfa-8fa5-331fc2ff858e","html_url":"https://github.com/gaussalgo/adaptor","commit_stats":{"total_commits":126,"total_committers":5,"mean_commits":25.2,"dds":"0.39682539682539686","last_synced_commit":"93332d004ad0d1b539a31adb2096f1b89a16985a"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/gaussalgo/adaptor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaussalgo%2Fadaptor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaussalgo%2Fadaptor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaussalgo%2Fadaptor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaussalgo%2Fadaptor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gaussalgo","download_url":"https://codeload.github.com/gaussalgo/adaptor/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaussalgo%2Fadaptor/sbom","scorecard":{"id":419827,"data":{"date":"2025-08-11","repo":{"name":"github.com/gaussalgo/adaptor","commit":"8680cb053ec6d0a443ce77ba92ce039d09e1d593"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":1,"reason":"Found 2/15 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/gaussalgo/adaptor/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:66: update your workflow using https://app.stepsecurity.io/secureworkflow/gaussalgo/adaptor/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/gaussalgo/adaptor/test.yml/master?enable=pin","Warn: containerImage not pinned by hash: dockerfile.in:2: pin your Docker image by updating pytorch/pytorch:latest to pytorch/pytorch:latest@sha256:11691e035a3651d25a87116b4f6adc113a27a29d8f5a6a583f8569e0ee5ff897","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:25","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:26","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:27","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:46","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:47","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:48","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:71","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:72","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:73","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   9 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.2.0 not signed: https://api.github.com/repos/gaussalgo/adaptor/releases/81056919","Warn: release artifact v0.2.0 does not have provenance: https://api.github.com/repos/gaussalgo/adaptor/releases/81056919"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T00:55:19.014Z","repository_id":39887753,"created_at":"2025-08-19T00:55:19.014Z","updated_at":"2025-08-19T00:55:19.014Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272858568,"owners_count":25005100,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-30T02:00:09.474Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["domain-adaptation","multi-objective-optimization","ner","nlp","pytorch","robustness","text-classification","text-generation","transformers"],"created_at":"2024-11-08T12:26:17.479Z","updated_at":"2025-08-30T14:17:18.942Z","avatar_url":"https://github.com/gaussalgo.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Adaptor: Objective-centric Adaptation library\n\n[![Tests](https://github.com/gaussalgo/adaptor/actions/workflows/test.yml/badge.svg)](https://github.com/gaussalgo/adaptor/actions)\n[![PyPI version](https://badge.fury.io/py/adaptor.svg)](https://badge.fury.io/py/adaptor)\n\nAdaptor will help you to easily adapt a language model to your own **data domain(s)**, **task(s)**,\nor **custom objective(s)**.\n\nIf you want to jump right in, take a look at the [tutorials](tutorials).\n\n## Table of Content\n\u003cdetails\u003e\n\u003csummary\u003eClick to expand\u003c/summary\u003e\n\n- [Background](#how-to-use-adaptor)\n    - [Benefits of Task and Domain Adaptation](#benefits-of-task-and-domain-adaptation)\n    - [How Can Adaptor Help](#how-can-adaptor-help)\n- [Usage](#usage)\n    - [Install](#usage)\n    - [Use-cases](#adapted-named-entity-recognition)\n    - **[Tutorials](tutorials)**\n- [How to Contribute](CONTRIBUTING.md)\n- [Cite](#citing-adaptor)\n\u003c/details\u003e\n\n\n### Benefits of Task and Domain Adaptation\n\nBoth domain adaptation (e.g. [Beltagy, 2019](https://aclanthology.org/D19-1371/)) \nand task adaptation (e.g. [Gururangan, 2020](https://aclanthology.org/2020.acl-main.740/))\nare reported to improve quality of the language models on end tasks, \nand improve model's comprehension on more *niche* domains,\nsuggesting that it's usually a good idea to adapt pre-trained model before the final fine-tuning. \nHowever, it is still not a common practice, maybe because it is still a tedious thing to do. In the model-centric training, the multi-step, \nor multi-objective training requires a separate configuration of every training step due to the differences in the models' \narchitectures specific to the chosen training objective and data set.\n\n### How Adaptor handles training?\n\nAdaptor framework abstracts the term of *Objective* away from the model.\nWith Adaptor, *Any* objective can be applied to *any* model, for as long as the trained model has some *head* of a compatible shape.\n\nThe ordering in which the `Objective`s are applied is determined by the given `Schedule`.\nIn conventional adaptation, the objectives are applied *sequentially* (that's what `SequentialSchedule` does), \nbut they might as well be applied in a combilation (`ParallelSchedule`), or balanced dynamically, \ne.g. according to its objectives` losses.\n\n![Adaptation scheme](https://github.com/gaussalgo/adaptor/raw/477b88d41d5d5fe1a172e4b115d18cf0619d15d2/docs/user_flow.png)\n\nIn the `Adaptor` framework, instead of providing the `Trainer` with a model encoded dataset both compatible\nwith specific training task,\na user constructs a `Schedule` composed of the initialised `Objective`s, where each Objective performs its\ndataset sampling and objective-specific feature alignment (compliant with `objective.compatible_head`).\n\nWhen training classic `transformers` models, a selection of objectives is model-agnostic: each objective takes care\nof resolving its own compatible head within given `LangModule`. \n\n### How Can Adaptor Help\n\nAdaptor introduces objective-centric, instead of model-centric approach to the training process, \nthat makes it **easier** to experiment with **multi-objective** training, creating **custom objectives**. Thanks to that, you can do some things,\nthat are difficult, or impossible in other NLP frameworks (like HF Transformers, FairSeq or NLTK). For example:\n* **Domain adaptation** or **Task adaptation**: you do not have to handle the model \nbetween different training scripts, minimising a chance of error and improving reproducibility \n* Seamlessly experiment with different **schedule** strategies, allowing you, e.g. to backpropagate based \non multiple objectives in every training step\n* **Track the progress** of the model, concurrently on *each* relevant objective, allowing you to easier \nrecognise weak points of your model\n* Easily perform **Multi-task learning**, which that [can](https://direct.mit.edu/tacl/article/doi/10.1162/tacl_a_00335/96483/An-Empirical-Study-on-Robustness-to-Spurious) \nimproves model robustness\n* Although Adaptor aims primarily for training the models of the transformer family, the library is designed to\nwork with **any PyTorch model**\n\nBuilt upon the well-established and maintained 🤗 Transformers library, Adaptor will automatically support \nfuture new NLP models out-of-box. The upgrade of Adaptor to a different version of Hugging Face Transformers library \nshould not take longer than a few minutes.\n\n### Usage\n\nFirst, install the library: \n```shell\npip install adaptor\n```\n\nIf you clone it, you can also run and modify the provided example scripts.\n```shell\ngit clone {this repo}\ncd adaptor\npython -m pip install -e .\n```\n\nYou can also find and run full examples below with all the imports in \n[`tests/end2end_usecases_test.py`](tests/end2end_usecases_test.py).\n\n#### Adapted Named Entity Recognition\n\nSay you have nicely annotated entities in a set of news articles, but eventually, you want to use the language model\nto detect entities in office documents. You can either train the NER model on news articles, hoping that\nit will not lose much accuracy on other domains. Or you can concurrently train on both data sets:\n\n```python\n# 1. pick the model base\nlang_module = LangModule(\"bert-base-multilingual-cased\")\n\n# 2. pick objectives\n# Objectives take either List[str] for in-memory iteration, or a source file path for streamed iteration\nobjectives = [MaskedLanguageModeling(lang_module,\n                                     batch_size=16,\n                                     texts_or_path=\"tests/mock_data/domain_unsup.txt\"),\n              TokenClassification(lang_module,\n                                  batch_size=16,\n                                  texts_or_path=\"tests/mock_data/ner_texts_sup.txt\",\n                                  labels_or_path=\"tests/mock_data/ner_texts_sup_labels.txt\")]\n# 3. pick a schedule of the selected objectives\n# This one will initially fit the first objective until convergence on its eval set, then fits the second one \nschedule = ParallelSchedule(objectives, training_arguments)\n\n# 4. Run the training using Adapter, similarly to running HF.Trainer, only adding `schedule`\nadapter = Adapter(lang_module, schedule, training_arguments)\nadapter.train()\n\n# 5. save the trained lang_module (with all heads)\nadapter.save_model(\"entity_detector_model\")\n\n# 6. reload and use it like any other Hugging Face model\nner_model = AutoModelForTokenClassification.from_pretrained(\"entity_detector_model/TokenClassification\")\ntokenizer = AutoTokenizer.from_pretrained(\"entity_detector_model/TokenClassification\")\n\ninputs = tokenizer(\"Is there any Abraham Lincoln here?\", return_tensors=\"pt\")\noutputs = ner_model(**inputs)\nner_tags = [ner_model.config.id2label[label_id.item()] for label_id in outputs.logits[0].argmax(-1)]\n```\n**Try this example** on real data, in [`tutorials/adapted_named_entity_recognition.ipynb`](tutorials/adapted_named_entity_recognition.ipynb)\n\n#### Adapted Machine Translation\n\nSay you have a lot of clean parallel texts for news articles (like you can find on [OPUS](https://opus.nlpl.eu/)),\nbut eventually, you need to translate a different domain, for example chats with a lot of typos, \nor medicine texts with a lot of latin expressions.\n\n```python\n# 1. pick the base model\nlang_module = LangModule(\"Helsinki-NLP/opus-mt-en-de\")\n\n# (optional) pick train and validation evaluators for the objectives\nseq2seq_evaluators = [BLEU(decides_convergence=True)]\n\n# 2. pick objectives - we use BART's objective for adaptation and mBART's seq2seq objective for fine-tuning\nobjectives = [BackTranslation(lang_module,\n                              batch_size=1,\n                              texts_or_path=\"tests/mock_data/domain_unsup.txt\",\n                              back_translator=BackTranslator(\"Helsinki-NLP/opus-mt-de-en\"),\n                              val_evaluators=seq2seq_evaluators),\n              Sequence2Sequence(lang_module, \n                                batch_size=1,\n                                texts_or_path=\"tests/mock_data/seq2seq_sources.txt\",\n                                labels_or_path=\"tests/mock_data/seq2seq_targets.txt\",\n                                val_evaluators=seq2seq_evaluators,\n                                source_lang_id=\"en\", target_lang_id=\"cs\")]\n\n# this one will shuffle the batches of both objectives\nschedule = ParallelSchedule(objectives, adaptation_arguments)\n\n# 4. train using Adapter\nadapter = Adapter(lang_module, schedule, adaptation_arguments)\nadapter.train()\n\n# 5. save the trained (multi-headed) lang_module\nadapter.save_model(\"translator_model\")\n\n# 6. reload and use it like any other Hugging Face model\ntranslator_model = AutoModelForSeq2SeqLM.from_pretrained(\"translator_model/Sequence2Sequence\")\ntokenizer = AutoTokenizer.from_pretrained(\"translator_model/Sequence2Sequence\")\n\ninputs = tokenizer(\"A piece of text to translate.\", return_tensors=\"pt\")\noutput_ids = translator_model.generate(**inputs)\noutput_text = tokenizer.batch_decode(output_ids, skip_special_tokens=True)\nprint(output_text)\n```\n**Try this example** on real data, in [`tutorials/unsupervised_machine_translation.ipynb`](tutorials/unsupervised_machine_translation.ipynb)\n\n#### Single-objective training\nIt also makes sense to use the comfort of adaptor high-level interface in simple use-cases \nwhere it's enough to apply one objective.\n```python\n# 1. pick the base model\nlang_module = LangModule(test_base_models[\"sequence_classification\"])\n\n# 2. pick any objective - note that all objectives have almost identical interface\nclassification = SequenceClassification(lang_module=lang_module,\n                                        texts_or_path=\"tests/mock_data/supervised_texts.txt\",\n                                        labels_or_path=\"tests/mock_data/supervised_texts_sequence_labels.txt\",\n                                        batch_size=1)\n# 3. Schedule choice does not matter in single-objective training\nschedule = SequentialSchedule(objectives=[classification], args=training_arguments)\n\n# 4. train using Adapter\nadapter = Adapter(lang_module=lang_module, schedule=parallel_schedule, args=training_arguments)\nadapter.train()\n\n# 5. save the trained lang_module\nadapter.save_model(\"output_model\")\n\n# 6. reload and use it like any other Hugging Face model\nclassifier = AutoModelForSequenceClassification.from_pretrained(\"output_model/SequenceClassification\")\ntokenizer = AutoTokenizer.from_pretrained(\"output_model/SequenceClassification\")\n\ninputs = tokenizer(\"A piece of text to translate.\", return_tensors=\"pt\")\noutput = classifier(**inputs)\noutput_label_id = output.logits.argmax(-1)[0].item()\nprint(\"Your new model predicted class: %s\" % classifier.config.id2label[output_label_id])\n```\n**Try this example** on real data in [`tutorials/simple_sequence_classification.ipynb`](tutorials/simple_sequence_classification.ipynb)\n\n### More examples\n\nYou can find more examples in [tutorials](tutorials). Your contributions are welcome :) (see *[CONTRIBUTING.md](CONTRIBUTING.md)*)\n\n### Motivation for objective-centric training\n\nWe've seen that transformers can outstandingly perform on relatively complicated tasks, which makes us \nthink that experimenting with custom objectives can also improve their desperately-needed\ngeneralisation abilities (many studies report transformers inability to generalise the end task, e.g. on \n[language inference](https://aclanthology.org/P19-1334/), \n[paraphrase detection](https://aclanthology.org/N19-1131/), or\n[machine translation](https://aclanthology.org/2021.scil-1.3/)).\n\nThis way, we're also hoping to enable the easy use of the most accurate deep language models for more\n**specialised domains** of application, where a little supervised data is available, but\nmuch more unsupervised sources can be found (a typical *Domain adaptation* case).\nSuch applications include for instance machine translation of non-canonical domains (chats or expert texts) or personal names recognition in texts of a domain with none of its own labeled names, but the use-cases are limitless.\n\n### How can you contribute?\n\n* If you want to add a new objective or schedule, see [CONTRIBUTING.md](https://github.com/gaussalgo/adaptor/blob/master/CONTRIBUTING.md). \n\n* If you find an issue, please report it [in this repository](https://github.com/gaussalgo/adaptor/issues) and if you'd\nalso be able to fix it, don't hesitate to contribute and create a PR.\n\n* If you'd just like to share your general impressions or personal experience with others, \nwe're happy to get into a discussion in the [Discussions section](https://github.com/gaussalgo/adaptor/discussions).\n\n## Citing Adaptor\n\nIf you use Adaptor in your research, please cite it as follows.\n\n### Text\n\nŠTEFÁNIK, Michal, Vít NOVOTNÝ, Nikola GROVEROVÁ and Petr SOJKA. Adaptor: Objective-Centric Adaptation Framework for Language Models. In  *Proceedings of 60th Annual Meeting of the Association for Computational Linguistics: Demonstrations*. ACL, 2022. 7 pp.\n\n### BibTeX\n\n``` bib\n@inproceedings{stefanik2022adaptor,\n  author = {\\v{S}tef\\'{a}nik, Michal and Novotn\\'{y}, V\\'{i}t and Groverov{\\'a}, Nikola and Sojka, Petr},\n  title = {Adapt\\$\\mathcal\\{O\\}\\$r: Objective-Centric Adaptation Framework for Language Models},\n  booktitle = {Proceedings of 60th Annual Meeting of the Association for Computational Linguistics: Demonstrations},\n  publisher = {ACL},\n  numpages = {7},\n  url = {https://aclanthology.org/2022.acl-demo.26},\n}\n```\n\n-------\nIf you have any other question(s), feel free to create an issue.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaussalgo%2Fadaptor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgaussalgo%2Fadaptor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaussalgo%2Fadaptor/lists"}