يحتوي هذا المستودع على رمز استغلال أسئلة cloze لتصنيف النص القليل من اللقطة واستدلال اللغة الطبيعية ، وليس فقط الحجم المهم: نماذج اللغة الصغيرة هي أيضًا متعلمين قليلون. تقدم الأوراق التدريب على استجواب الأنماط (PET) ، وهو إجراء تدريبي شبه خاضع للإشراف يعيد إعادة صياغة أمثلة على الإدخال كعبارات على غرار Cloze. في الإعدادات ذات الموارد المنخفضة ، يتفوق PET و IPET بشكل كبير على التدريب العادي العادي ، والعديد من خطوط الأساس شبه الخاضعة للإشراف وحتى GPT-3 على الرغم من طلب المعلمات أقل بنسبة 99.9 ٪. يدرب البديل التكراري للحيوانات الأليفة (IPET) أجيالًا متعددة من النماذج ويمكن استخدامه دون أي بيانات تدريب.
| #Examples | وضع التدريب | Yelp (ممتلئ) | أخبار AG | أسئلة ياهو | mnli |
|---|---|---|---|---|---|
| 0 | غير خاضع للإشراف | 33.8 | 69.5 | 44.0 | 39.1 |
| ipet | 56.7 | 87.5 | 70.7 | 53.6 | |
| 100 | تحت الإشراف | 53.0 | 86.0 | 62.9 | 47.9 |
| حيوان أليف | 61.9 | 88.3 | 69.2 | 74.7 | |
| ipet | 62.9 | 89.6 | 71.2 | 78.4 |
ملاحظة : لإعادة إنتاج النتائج أعلاه بالضبط ، تأكد من استخدام V1.1.0 ( --branch v1.1.0 ).
؟ يثبت
استخدام CLI
استخدام API
؟ تدريب حيوانك الأليف الخاص بك
اقتباس
يمكن العثور على جميع متطلبات PET في requirements.txt . يمكنك تثبيت جميع الحزم المطلوبة مع pip install -r requirements.txt .
تدعم واجهة سطر الأوامر cli.py في هذا المستودع حاليًا ثلاثة أوضاع تدريب مختلفة (PET و IPET والتدريب الخاضع للإشراف) وطريقتين إضافيتين للتقييم (غير الخاضع للإشراف والطهي) و 13 مهمة مختلفة. للحصول على مراجعات Yelp ، أخبار AG ، أسئلة Yahoo ، Mnli و X-Stance ، انظر الورقة الأصلية لمزيد من التفاصيل. لمهام SuperGlue 8 ، انظر هذه الورقة.
لتدريب وتقييم نموذج PET لأحد المهام المدعومة ، ما عليك سوى تشغيل الأمر التالي:
python3 cli.py
--method pet
--pattern_ids $PATTERN_IDS
--data_dir $DATA_DIR
--model_type $MODEL_TYPE
--model_name_or_path $MODEL_NAME_OR_PATH
--task_name $TASK
--output_dir $OUTPUT_DIR
--do_train
--do_eval
أين
$PATTERN_IDS يحدد استخدام PVPs. على سبيل المثال ، إذا كنت ترغب في استخدام جميع الأنماط ، فحدد PATTERN_IDS 0 1 2 3 4 لأخبار AG وأسئلة Yahoo أو PATTERN_IDS 0 1 2 3 لمراجعات Yelp و Mnli.$DATA_DIR هو الدليل الذي يحتوي على ملفات القطار والاختبار (تحقق tasks.py .$MODEL_TYPE هو اسم النموذج المستخدم ، على سبيل المثال albert ، bert أو roberta .$MODEL_NAME هو اسم نموذج مسبق (على سبيل المثال ، roberta-large أو albert-xxlarge-v2 ) أو المسار إلى نموذج مسبق.$TASK_NAME هو اسم المهمة للتدريب والتقييم.$OUTPUT_DIR هو اسم الدليل الذي يتم فيه حفظ النموذج المدربين ونتائج التقييم. يمكنك بالإضافة إلى ذلك تحديد معلمات التدريب المختلفة لكل من مجموعة نماذج PET المقابلة لـ PVPs الفردية (البادئة --pet_ ) ونموذج تصنيف التسلسل النهائي (بادئة --sc_ ). على سبيل المثال ، المعلمات الافتراضية المستخدمة لتقييم SuperGlue لدينا هي:
--pet_per_gpu_eval_batch_size 8
--pet_per_gpu_train_batch_size 2
--pet_gradient_accumulation_steps 8
--pet_max_steps 250
--pet_max_seq_length 256
--pet_repetitions 3
--sc_per_gpu_train_batch_size 2
--sc_per_gpu_unlabeled_batch_size 2
--sc_gradient_accumulation_steps 8
--sc_max_steps 5000
--sc_max_seq_length 256
--sc_repetitions 1
لكل نمط $P و repetition $I ، يقوم تشغيل الأمر أعلاه بإنشاء دليل $OUTPUT_DIR/p$Pi$I الذي يحتوي على الملفات التالية:
pytorch_model.bin : النموذج المبتسم ، ربما جنبا إلى جنب مع بعض الملفات الخاصة بالنموذج (على سبيل المثال ، spiece.model ، special_tokens_map.json )wrapper_config.json : تكوين النموذج المستخدمtrain_config.json : التكوين المستخدم للتدريبeval_config.json : التكوين المستخدم للتقييمlogits.txt : تنبؤات النموذج على البيانات غير المسماةeval_logits.txt : تنبؤ النموذج على بيانات التقييمresults.json : ملف JSON يحتوي على نتائج مثل الدقة النهائية للنموذجpredictions.jsonl يمكن العثور على النموذج النهائي (المقطر) لكل تكرار $I في $OUTPUT_DIR/final/p0-i$I ، والذي يحتوي على نفس الملفات كما هو موضح أعلاه.
إذا نفد GPU الخاص بك من الذاكرة أثناء التدريب ، فيمكنك محاولة تقليل كل من pet_per_gpu_train_batch_size و sc_per_gpu_unlabeled_batch_size مع زيادة كل من pet_gradient_accumulation_steps و sc_gradient_accumulation_steps .
لتدريب وتقييم نموذج IPET لأحد المهام المدعومة ، ما عليك سوى تشغيل نفس الأمر على النحو الوارد أعلاه ، ولكن استبدل --method pet مع --method ipet . هناك العديد من معلمات IPET إضافية يمكنك تعديلها ؛ كلهم مسبودون بـ --ipet_ .
لكل جيل $G ، النمط $P و $I ، هذا ينشئ دليل $OUTPUT_DIR/g$G/p$Pi$I الذي تم تنظيمه بالنسبة للحيوانات الأليفة العادية. يمكن العثور مرة أخرى على الطراز النهائي (المقطر) في $OUTPUT_DIR/final/p0-i$I .
إذا كنت تستخدم IPET مع أمثلة تدريبية صفرية ، فأنت بحاجة إلى تحديد عدد الأمثلة لكل تسمية يجب اختيارها في الجيل الأول وتحتاج إلى تغيير استراتيجية الاختزال إلى: --ipet_n_most_likely 100 --reduction mean .
لتدريب وتقييم مصنف التسلسل العادي بطريقة خاضعة للإشراف ، ما عليك سوى تشغيل نفس الأمر على النحو الوارد أعلاه ، ولكن استبدل --method pet بـ --method sequence_classifier . هناك العديد من المعلمات الإضافية لمصنف التسلسل الذي يمكنك تعديله ؛ كلهم مسبودون مع --sc_ .
لتقييم نموذج اللغة المسبق مع أنماط الحيوانات الأليفة الافتراضية واللفظ ، ولكن بدون صقلها ، قم بإزالة الوسيطة- --do_train وأضف- --no_distillation بحيث لا يتم تنفيذ التقطير النهائي.
إذا كنت ترغب في استخدام التمهيدي ، فقم بإزالة الوسيطة --do_train وأضف الوسائط --priming --no_distillation يتم استخدام جميع أمثلة التدريب للتطبيق ولا يتم تنفيذ أي تقطير نهائي.
تذكر أنك قد تحتاج إلى زيادة الحد الأقصى لطول التسلسل إلى قيمة أكبر بكثير ، على سبيل المثال --pet_max_seq_length 5000 . يعمل هذا فقط مع نماذج اللغة التي تدعم مثل هذه التسلسلات الطويلة ، على سبيل المثال XLNET. لاستخدام XLNET ، يمكنك تحديد- --model_type xlnet --model_name_or_path xlnet-large-cased --wrapper_type plm .
بدلاً من استخدام واجهة سطر الأوامر ، يمكنك أيضًا استخدام واجهة برمجة تطبيقات PET مباشرةً ، ومعظمها يتم تعريفه في pet.modeling . من خلال تضمين import pet ، يمكنك الوصول إلى طرق مثل train_pet و train_ipet و train_classifier . تحقق من وثائقهم لمزيد من المعلومات.
لاستخدام PET للمهام المخصصة ، تحتاج إلى تحديد شيئين:
examples/custom_task_processor.py للحصول على مثال.examples/custom_task_pvp.py للحصول على مثال.بعد تنفيذ DataProcessor و PVP ، يمكنك تدريب نموذج PET باستخدام سطر الأوامر كما هو موضح أعلاه. أدناه ، يمكنك العثور على معلومات إضافية حول كيفية تحديد المكونين من PVP ، واللفظ والأنماط .
يتم استخدام اللفظات لتعيين ملصقات المهام للكلمات في اللغة الطبيعية. على سبيل المثال ، في مهمة تصنيف المعنويات الثنائية ، يمكنك تعيين التسمية الإيجابية ( +1 ) إلى كلمة good والتسمية السلبية ( -1 ) إلى كلمة bad . تتحقق اللفظات من خلال طريقة verbalize() من PVP. أبسط طريقة لتحديد المُشهد اللفظي هي استخدام القاموس:
VERBALIZER = { "+1" : [ "good" ], "-1" : [ "bad" ]}
def verbalize ( self , label ) -> List [ str ]:
return self . VERBALIZER [ label ] الأهم من ذلك ، في الإصدار الحالي للحيوانات الأليفة ، يتم تقتصر المفرطات بشكل افتراضي على الرموز المفردة في مفردات LMS الأساسية (لاستخدام أكثر من رمز واحد ، انظر أدناه). بالنظر إلى الرمز المميز لنموذج اللغة ، يمكنك بسهولة التحقق مما إذا كانت الكلمة تتوافق مع رمز واحد عن طريق التحقق من أن len(tokenizer.tokenize(word)) == 1 .
يمكنك أيضًا تحديد العديد من اللفظات لعلامة واحدة. على سبيل المثال ، إذا لم تكن متأكدًا من الكلمات التي تمثل أفضل ما تمثل الملصقات في مهمة تصنيف المعنويات الثنائية ، فيمكنك تحديد المُحفر اللفظي على النحو التالي:
VERBALIZER = { "+1" : [ "great" , "good" , "wonderful" , "perfect" ], "-1" : [ "bad" , "terrible" , "horrible" ]} تُستخدم الأنماط لجعل نموذج اللغة يفهم مهمة معينة ؛ يجب أن تحتوي على رمز واحد <MASK> واحد تم ملؤه باستخدام اللفظي. لتصنيف المشاعر الثنائية بناءً على ملخص المراجعة ( <A> ) والجسم ( <B> ) ، قد يكون نمط مناسب <A>. <B>. Overall, it was <MASK>. تتحقق الأنماط من خلال طريقة get_parts() من PVP ، والتي تُرجع زوجًا من تسلسل النص (حيث يتم تمثيل كل تسلسل بقائمة من السلاسل):
def get_parts ( self , example : InputExample ):
return [ example . text_a , '.' , example . text_b , '.' ], [ 'Overall, it was ' , self . mask ]إذا كنت لا ترغب في استخدام زوج من التسلسلات ، يمكنك ببساطة ترك التسلسل الثاني فارغًا:
def get_parts ( self , example : InputExample ):
return [ example . text_a , '.' , example . text_b , '. Overall, it was ' , self . mask ], [] إذا كنت ترغب في تحديد العديد من الأنماط ، فما عليك سوى استخدام سمة PVP S pattern_id :
def get_parts ( self , example : InputExample ):
if self . pattern_id == 1 :
return [ example . text_a , '.' , example . text_b , '.' ], [ 'Overall, it was ' , self . mask ]
elif self . pattern_id == 2 :
return [ 'It was just ' , self . mask , '!' , example . text_a , '.' , example . text_b , '.' ], [] عند تدريب النموذج باستخدام سطر الأوامر ، حدد جميع الأنماط المراد استخدامها (على سبيل المثال ، --pattern_ids 1 2 ).
الأهم من ذلك ، إذا كان التسلسل أطول من طول التسلسل الأقصى المحدد لـ LM الأساسي ، فيجب أن يعرف PET أي أجزاء من المدخلات يمكن اختصارها وأيها لا يمكن (على سبيل المثال ، أن يكون رمز القناع موجودًا دائمًا). لذلك ، يوفر PVP طريقة shortenable() للإشارة إلى أنه يمكن تقصير نص من النص:
def get_parts ( self , example : InputExample ):
text_a = self . shortenable ( example . text_a )
text_b = self . shortenable ( example . text_b )
return [ text_a , '.' , text_b , '. Overall, it was ' , self . mask ], []بشكل افتراضي ، يدعم التنفيذ الحالي لـ PET و IPET مجموعة ثابتة من الملصقات التي يتم مشاركتها عبر جميع الأمثلة والشفوية التي تتوافق مع رمز واحد. ومع ذلك ، بالنسبة لبعض المهام ، قد يكون من الضروري استخدام اللفظات التي تتوافق مع الرموز المتعددة (كما هو موضح هنا). للقيام بذلك ، تحتاج ببساطة إلى التعديلين التاليين:
أضف الأسطر التالية في معالج بيانات مهمتك (انظر examples/custom_task_processor.py ):
from pet . tasks import TASK_HELPERS
from pet . task_helpers import MultiMaskTaskHelper
TASK_HELPERS [ 'my_task' ] = MultiMaskTaskHelper حيث 'my_task' هو اسم مهمتك.
في PVP الخاص بك ، تأكد من أن طريقة get_parts() تدرج دائمًا الحد الأقصى لعدد الرموز الرموز المطلوبة لأي شفهي. على سبيل المثال ، إذا +1 خرائط الشفوية الخاصة بك إلى "رائع حقًا" و -1 إلى "فظيع" ، وإذا كانت هذه الرمز مميزًا مثل ["really", "awe", "##some"] و ["terrible"] ، على التوالي ، يجب أن تُرجع طريقة get_parts() دائمًا تسلسلًا يحتوي على 3 ألوان فقط.
مع هذا التعديل ، يمكنك الآن استخدام اللفظات التي تتكون من الرموز المميزة المتعددة:
VERBALIZER = { "+1" : [ "really good" ], "-1" : [ "just bad" ]}ومع ذلك ، هناك عدة قيود يجب مراعاتها:
MultiMaskTaskHelper ، فإن الحد الأقصى لحجم الدُفعة للتقييم هو 1.MultiMaskTaskHelper هي ميزة تجريبية لم يتم اختبارها بدقة. على وجه الخصوص ، تم اختبار هذه الميزة فقط للحيوانات الأليفة وليس ل IPT. إذا لاحظت شيئًا غريبًا ، فيرجى إثارة مشكلة. للحصول على مزيد من المرونة ، يمكنك أيضًا كتابة TaskHelper مخصصة. كنقطة انطلاق ، يمكنك الاطلاع على الفئات CopaTaskHelper و WscTaskHelper و RecordTaskHelper في pet/task_helpers.py .
إذا قمت باستخدام الكود في هذا المستودع ، فيرجى الاستشهاد بالأوراق التالية:
@article{schick2020exploiting,
title={Exploiting Cloze Questions for Few-Shot Text Classification and Natural Language Inference},
author={Timo Schick and Hinrich Schütze},
journal={Computing Research Repository},
volume={arXiv:2001.07676},
url={http://arxiv.org/abs/2001.07676},
year={2020}
}
@article{schick2020small,
title={It's Not Just Size That Matters: Small Language Models Are Also Few-Shot Learners},
author={Timo Schick and Hinrich Schütze},
journal={Computing Research Repository},
volume={arXiv:2009.07118},
url={http://arxiv.org/abs/2009.07118},
year={2020}
}