يحتوي هذا المستودع على الكود والبيانات للورقة التالية:
MIXCE: تدريب نماذج لغة الانحدار التلقائي عن طريق خلط المقاطع عبر الأمام والعكس
@inproceedings{zhang2023mixce,
title={MixCE: Training Autoregressive Language Models by Mixing Forward and Reverse Cross-Entropies},
author={Zhang, Shiyue and Wu, Shijie and İrsoy, Ozan and Lu, Steven and Bansal, Mohit and Dredze, Mark and Rosenberg, David},
booktitle={Proceedings of the 61th Annual Meeting of the Association for Computational Linguistics},
year={2023}
}
مؤلف الكود: Shiyue Zhang
python -m pip install -r requirements.txtاختياري: لتجنب أي اشتباكات إصدار مع الحزم الموجودة ، قد ترغب في تنفيذ التثبيت تحت بيئة افتراضية:
python -m venv yourenv
. yourenv/bin/activate # for bash, might be something else for your particular shell
python -m pip install -r requirements.txtSynthetic.py هو البرنامج النصي لتشغيل التجارب الاصطناعية. إجراء التجارب بسيطة للغاية ، فقط قم بالتشغيل:
python synthetic.py
يمكن تحديد التكوينات (مثل البذور ، وحجم المفردات ، وما إلى ذلك) وتغييرها داخل البرنامج النصي وتحت if __name__ == '__main__': .
هناك بعض التكوينات المهمة داخل Synthetic.py التي تحدد نوع التجارب الاصطناعية التي يمكنك تشغيلها:
real_dataset : إذا كان None ، فسيتم تهيئة مصفوفة الانتقال بشكل عشوائي ؛ أو إذا كان 'webtext' ، فسيتم تهيئة مصفوفة الانتقال من مصفوفات الانتقال المسبقة مسبقًا على WebText.
Zero_percent : يحدد عدد القيم zero_percent==0.5 في مصفوفة الانتقال 0.
vocab_size : حجم المفردات. نختبر 21 أو 51 أو 101 أو 501 أو 1001. لاحظ أن 21 يعني أن لدينا 20 رمزًا طبيعيًا (بما في ذلك EOS) ورمز وسادة واحد.
البذور : ندير 5 بذور (7 ، 42 ، 777 ، 4222 ، 99999) لكل تجربة.
LOSS_FUNC : نختبر 4 وظائف الخسارة: (1) 'two_xens' : يُشار إليه على أنه mixce* في ورقتنا ويستخدم توزيع بيانات الذهب P و Gumbel Softmax ؛ (2) 'qlogq_mix' : إنها وظيفة فقدان الخليط تقريبا ؛ (3) 'two_kls' : مزيج من اثنين من kl الاختلاف ؛ (4) 'js' : JS Divergence.
Train_eta : نسبة الخلط لوظائف الخسارة هذه. إذا كان train_eta==1.0 لـ 'two_xens' ، فهو MLE. إذا كان train_eta==1.0 لـ 'two_kls' ، فهو متخلف KL (يساوي أيضًا MLE). إذا كان train_eta==0.0 لـ 'two_kls' ، فهذا هو KL العكسي. نستخدم تعريفًا عامًا لـ JS (انظر هذه الورقة لمزيد من التفاصيل) ، ويتقارب JS إلى 0 عندما تقترب train_eta من 0.0 أو 1.0. عند Train_eta = 0.5 ، فإن هذا هو التعريف الطبيعي لتباعد JS.
نقوم بتقييم Bigram LMS المدربين صناعياً من خلال مقارنة مصفوفة الانتقال المستفادة مقابل مصفوفة الانتقال الذهبية. نستخدم مقايين:
(1) متوسط. JS : نقوم بحساب تباعد JS بين كل صف من الذهب ومصفوفات الانتقال المستفادة والمتوسط عبر الصفوف.
(2) متوسط. 0S : نحصل على القيم من المصفوفة المستفادة في احتمال الذهب = 0 مواضع ثم متوسطها.
يتم استخدام وظيفة compare_parameters() في sinthetic.py لحساب هاتين المقاينين.
سيتم حفظ جميع النماذج ضمن الدليل synthetic_logs/ . يبدأ اسم كل دليل نموذج مع DateTime تم تشغيل التجربة. ضمن دليل النموذج ، ستجد أيضًا ملفات أحداث Tensorboard ، بالإضافة إلى all_best_metrics.json التي تحفظ أفضل درجات المقاييس لكل نسبة خلط. انظر الأمثلة تحت cynthetic_logs/.
يتم إجراء تقييم النموذج بعد كل فترة ، ويتم تحديد أفضل نقطة تفتيش بناءً على الخسارة على مجموعة DEV.
في نهاية المطاف ، لكل تجربة ، نقوم متوسط النتائج من 5 بذور ؛ ولكل هدف ، نختار أفضل نسبة خلط بناءً على AVG. JS.
get_synthetic_results() في results.py هي وظيفة تستخدم في متوسط النتائج من 5 بذور وفرز نتائج نسب الخلط المختلفة إلى AVG. JS.
لاستخدام get_synthetic_results() ، تحتاج أولاً إلى تحضير conthetic_models.json لتحديد الدلائل النموذجية. يظهر مثال في conthetic_models.json. بعد ذلك ، يمكنك الحصول على نتيجة التجربة التي تستخدم مصفوفة Transition Transition WebText ، VOCAB = 20 و Objective = two_kls عن طريق تشغيل get_synthetic_results('webtext', '20', 'two_kls') .
مخطئ. تحتاج أولاً إلى تنزيل detokenizer.perl من موسى هنا ، ووضعه ضمن data/detokenizer.perl لأن البرامج النصية Python التالية تعتمد عليها.
ثم:
cd data
python wikitext_data.py
python webtext_data.py
curl https://dl.fbaipublicfiles.com/fairseq/data/writingPrompts.tar.gz | tar xvzf -
python writingprompts_data.py
سيتم حفظ البيانات المعالجة مسبقًا ضمن data/wikitext ، data/webtext ، data/writingPrompts .
استنساخ نماذج GPT-2 باستخدام git lfs باتباع التعليمات المقدمة عن طريق معانقة الوجه.
git lfs install
git clone https://huggingface.co/gpt2
GPT2 هو أصغر نموذج GPT-2. نحن أيضا تجربة مع GPT2-Medium و GPT2-LARGE. يتم استخدام GPT2-LARGE في حساب MAUVE ، لذا يرجى تنزيلها أيضًا:
git clone https://huggingface.co/gpt2-medium
git clone https://huggingface.co/gpt2-large
قم بعمل نسخة من GPT2-LARGE لـ MAUVE:
cp -r gpt2-large gpt2-large-mauve
لأننا سنكتب مباشرة إلى GPT2-LARGE ، والتي ستؤثر على حساب MAUVE.
يمكنك ببساطة البدء في إجراء التجارب من خلال القيام:
python run.py
يمكن تحديد التكوينات يدويًا داخل run.py انظر مثالًا if __name__ == '__main__' .
هناك بعض التكوينات المهمة في Run.py :
Training_size : حجم بيانات التدريب ، نختبر '10K' و '25K' و '50K' و '100K' ؛ بشكل افتراضي ، نستخدم '50K' .
النموذج : يمكن أن يكون 'gpt2' أو 'gpt2-meidum' أو 'gpt2-large' .
مجموعة البيانات : يمكن أن تكون "wikitext" أو "webtext" أو "writingPrompts" .
mixing_ratio : نبحث من خلال [0.0, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 0.99, 1.0] واختر أفضل mixing_ratio استنادًا إلى درجة mauve مجموعة dev.
Train_batch_size ، التراكم ، eval_batch_size : يجب تحديد هذه التكوينات بواسطة النظام الأساسي الذي تستخدمه. نستخدم وحدة معالجة الرسومات Tesla V100 (ذاكرة 32 جم) واحدة ، والتكوينات الموصى بها في هذا الإعداد قيد run.py .
هناك قول واحد وثلاث وظائف في Run.py :
data_sets {} : يحفظ مسارات ملفات البيانات.
RUN_NO_TRAINER () : الوظيفة المستخدمة للتدريب وتقييم النماذج.
RUN_NO_TRAINER_EVAL () : الوظيفة المستخدمة لتقييم النموذج فقط.
run_no_trainer_turn_topp () : الوظيفة المستخدمة لضبط أخذ العينات العلوية p.
إلى جانب Run.py ، أقدم هنا البرامج النصية المهمة الأخرى للتدريب والتقييم النموذجي:
يحتوي GPT2.Py (الملف الأكثر أهمية) على فئة نموذج GPT2MixModel التي تنفذ وظيفة فقدان الخليط الخاصة بنا .
Run_clm_no_trainer.py هو البرنامج النصي لتدريب وتقييم نماذج GPT-2.
Run_clm_no_trainer_tune_topp.py يشبه run_clm_no_trainer.py ، باستثناء أنه يتم استخدامه فقط لضبط مقياس P hyperparameter من أخذ العينات العلوية.
يحتوي metircs.py على المقاييس التي نستخدمها لتقييم أجيال النموذج.
سيتم حفظ النماذج تحت train/ الدليل.
يبدأ اسم كل دليل نموذج مع DateTime تم تشغيل التجربة. ضمن دليل النموذج ، نقوم بحفظ أفضل نقطة تفتيش (تم تحديدها بناءً على فقدان Dev).
dev/test.sample ، dev/test.sample1 ، dev/test.sample2 ، و dev/test.human هي 3 أجيال أخذ عينات غير متحيزة والنص البشري.
dev/test_results.json حفظ نتائج الحيرة والتنوع والتكرار.
بعد ضبط P لأخذ عينات من أعلى P ، dev/test.topp(p=*) هي أجيال أخذ العينات من أعلى P مع قيم p مختلفة.
بعد حساب MAUVE والتماسك (انظر القسم التالي للحصول على التفاصيل) ، dev/test_mauve_coherence_*.json
بعد حساب الخبازي والتماسك المتحكم فيه (انظر القسم التالي للحصول على التفاصيل) ، يتم التحكم dev/test_controlled_mauve_coherence_*.json
نبلغ عن عشرات 6 مقاييس في ورقتنا:
يتم حساب الحيرة جنبا إلى جنب مع التدريب/التقييم النموذج (انظر Run_clm_no_trainer.py ).
يتم تنفيذ التنوع من خلال وظيفة diversity() في metircs.py ، ويتم حسابه أيضًا إلى جانب التدريب/التقييم النموذجي عن طريق استدعاء وظيفة compute_diversity_repetition() في run_clm_no_trainer.py . لاحظ أن التكرار هو مقياس آخر قمنا بتنفيذه ولكن لم نقدم تقريرًا في ورقتنا ؛ إنه يتحقق من نسبة النسبة المئوية للنص هي حلقات التكرار وأيضًا إرجاع طول العبارة المتكررة.
يتم حساب MAUVE والتماسك بطريقة ما بعد المخصصة باستخدام ملفات الجيل المحفوظة. compute_mauve() و compute_coherence() في metrics.py هما وظيفتان مساعدتان لحساب mauve والتماسك. يتم استدعاؤها بواسطة وظيفة compute_mauve_coherence() في results.py . لاستخدام compute_mauve_coherence() ، يجب عليك أولاً إعداد النماذج . json لتحديد أسماء دليل النموذج للتقييم.
وبالمثل ، يمكن أيضًا حساب mauve المتحكم فيه والتحكم في طريقة ما بعد المخصصة عن طريق وظيفة compute_controlled_mauve_coherence() في results.py .
| مجموعة البيانات | حجم النموذج | حجم بيانات التدريب | موضوعي | معانقة اسم محور الوجه |
|---|---|---|---|---|
| wikitext | GPT2-LARGE | 50 كيلو | MLE | Shiyue/wikitext_train50k_gpt2-large_mix1.0 |
| wikitext | GPT2-LARGE | 50 كيلو | mixce (eta = 0.1) | Shiyue/wikitext_train50k_gpt2-large_mix0.1 |
| WebText | GPT2-LARGE | 50 كيلو | MLE | Shiyue/WebText_Train50K_GPT2-LARGE_MIX1.0 |
| WebText | GPT2-LARGE | 50 كيلو | mixce (eta = 0.3) | Shiyue/WebText_train50k_gpt2-large_mix0.3 |
| الكتابة | GPT2-LARGE | 50 كيلو | MLE | shiyue/truckprompts_train50k_gpt2-large_mix1.0 |
| الكتابة | GPT2-LARGE | 50 كيلو | Mixce (ETA = 0.7) | shiyue/trintsprompts_train50k_gpt2-large_mix0.7 |
جرب النماذج المسبقة بالطرق التالية:
>>> from gpt2 import GPT2MIXModel
>>> from transformers import GPT2Tokenizer
>>> model = GPT2MIXModel.from_pretrained("shiyue/wikitext_train50K_gpt2-large_mix1.0")
>>> tokenizer = GPT2Tokenizer.from_pretrained('shiyue/wikitext_train50K_gpt2-large_mix1.0')
>>> text = "Hey, how are you?"
>>> encoded_input = tokenizer(text, return_tensors='pt')
>>> model.eval()
>>> out_ids = model.lm.generate(inputs=encoded_input["input_ids"], max_length=50, do_sample=True)
>>> print(tokenizer.batch_decode(out_ids, skip_special_tokens=True))
نحن المساهمات.
هل كانت لديك تجربة جيدة مع هذا المشروع؟ لماذا لا تشارك بعض الحب والمساهمة في رمز ، أو فقط أخبرنا بأي مشكلات تواجهها؟
نرحب بتقارير القضية هنا ؛ تأكد من اختيار قالب المشكلة المناسب لمشكلتك ، حتى نتمكن من التأكد من تزويدنا بالمعلومات اللازمة.
قبل إرسال طلب سحب ، يرجى التأكد من قراءة إرشادات المساهمة الخاصة بنا.
يتم استعارة الملفان التاليان واعتمادهما من مستودع transformers ، وبالتالي يحتفظان بحقوق الطبع والنشر الأصلية.
يتم التقاط هذا في الأصل من https://github.com/huggingface/transformers/blob/main/mamples/pytorch/language-modeling/run_clm_no_trainer.py. علاوة على ذلك ، طبقنا التعديلات التالية:
--test_file--reduction--mixing_ratio--max_length--prompt_length--eval_prompt_length--cache_dir--do_train--do_evalpush_to_hub ".DataCollatorWithPadding بدلاً من المجمع الافتراضي.do_eval " ، ومعظمها يذهب إلى الوظيفة الجديدة " evaluate() ". يتم تعديل هذا الملف من run_clm_no_trainer.py (انظر أعلاه) عن طريق تغيير كيفية استدعاء وظيفة generate() لتمكين ضبط خيار top_p .
اعتمد هذا المشروع مدونة قواعد السلوك. إذا كان لديك أي مخاوف بشأن الكود ، أو السلوك الذي شهدته في المشروع ، فيرجى الاتصال بنا على [email protected].