Electra هي طريقة لتعلم تمثيل اللغة الخاضع للإشراف ذاتيا. يمكن استخدامه لشبكات محولات ما قبل التدريب باستخدام حساب ضئيل نسبيًا. يتم تدريب نماذج Electra على التمييز بين الرموز المميزة لـ "REAL" مقابل "الرموز المزيفة" المزيفة التي تم إنشاؤها بواسطة شبكة عصبية أخرى ، على غرار تمييز GAN. على نطاق صغير ، يحقق Electra نتائج قوية حتى عند تدريبه على وحدة معالجة الرسومات الواحدة. على نطاق واسع ، تحقق Electra نتائج أحدث على مجموعة بيانات Squad 2.0.
للحصول على وصف مفصل ونتائج تجريبية ، يرجى الرجوع إلى Electra Paper 2020: ترميز النصوص قبل التدريب على أنها تمييزات بدلاً من المولدات.
يحتوي هذا المستودع على رمز لإلكترى قبل التدريب ، بما في ذلك نماذج Electra الصغيرة على وحدة معالجة الرسومات الواحدة. كما أنه يدعم صياغة Electra بشكل جيد في مهام المصب بما في ذلك مهام التصنيف (على سبيل المثال ، Glue) ، ومهام ضمان الجودة (على سبيل المثال ، Squad) ، ومهام وضع العلامات التسلسلية (على سبيل المثال ، تقطيع النص).
يحتوي هذا المستودع أيضًا على رمز للكهرباء ، وهو إصدار من Electra مستوحى من النماذج القائمة على الطاقة. يوفر Electric رؤية أكثر مبدئيًا لـ Electra كنموذج "أخذ عينات سلبية". كما يمكن أن تنتج بكفاءة درجات الاحتمالية الزائفة للنص ، والتي يمكن استخدامها لإعادة تصنيف مخرجات التعرف على الكلام أو أنظمة الترجمة الآلية. للحصول على تفاصيل حول Electric ، يرجى الرجوع إلى محولات EMNLP 2020 قبل التدريب على أنها نماذج مرفقة تعتمد على الطاقة.
نحن في البداية نطلق ثلاثة نماذج مسبقة:
| نموذج | طبقات | الحجم المخفي | params | درجة الغراء (مجموعة الاختبار) | تحميل |
|---|---|---|---|---|---|
| Electra-Small | 12 | 256 | 14m | 77.4 | وصلة |
| القاعدة الكهربائية | 12 | 768 | 110 م | 82.7 | وصلة |
| Electra-large | 24 | 1024 | 335m | 85.2 | وصلة |
تم تدريب النماذج على النص الإنجليزي غير القائم. أنها تتوافق مع Electra-Small ++ ، Electra-Base ++ ، Electra-1.75m في ورقتنا. نأمل أن نطلق نماذج أخرى ، مثل النماذج متعددة اللغات ، في المستقبل.
على الغراء ، درجات Electra-large أفضل قليلاً من ألبرت/XLNET ، درجات Electra-Base أفضل من Bert-Large ، ويسجل Electra-Small أسوأ قليلاً من Tinybert (ولكن لا يستخدم التقطير). راجع قسم النتائج المتوقعة أدناه للحصول على أرقام أداء مفصلة.
استخدم build_pretraining_dataset.py لإنشاء مجموعة بيانات قبل التدريب من تفريغ النص الخام. لديها الحجج التالية:
--corpus-dir : دليل يحتوي على ملفات نصية خام يتحول إلى أمثلة Electra. يمكن أن يحتوي ملف نصي على مستندات متعددة ذات خطوط فارغة تفصلها.--vocab-file : ملف تعريف المفردات WordPiece.--output-dir : أين تكتب أمثلة Electra.--max-seq-length : عدد الرموز الرموز لكل مثال (128 بشكل افتراضي).--num-processes : إذا كان> 1 موازاة عبر عمليات متعددة (1 بشكل افتراضي).--blanks-separate-docs : ما إذا كانت الأسطر الفارغة تشير إلى حدود المستند (صحيح بشكل افتراضي).--do-lower-case/--no-lower-case : ما إذا كان لخفض نص الإدخال (صحيح بشكل افتراضي). استخدم run_pretraining.py لتدريب نموذج Electra قبل. لديها الحجج التالية:
--data-dir : دليل حيث يتم تخزين بيانات ما قبل التدريب ، أوزان النماذج ، وما إلى ذلك. بشكل افتراضي ، يقوم التدريب بتحميل أمثلة من <data-dir>/pretrain_tfrecords ومفردات من <data-dir>/vocab.txt .--model-name : اسم للنموذج الذي يتم تدريبه. سيتم حفظ أوزان النموذج في <data-dir>/models/<model-name> افتراضيًا.--hparams (اختياري): قولان JSON أو مسار إلى ملف JSON يحتوي على مواد عالية من النماذج ، مسارات البيانات ، إلخ configure_pretraining.py إذا تم إيقاف التدريب ، فسيستمر إعادة تشغيل run_pretraining.py مع نفس الحجج في التدريب حيث توقف.
يمكنك متابعة التدريب المسبق من نقاط تفتيش Electra التي تم إصدارها بواسطة
--model-name electra_small إذا قمت بتنزيل الأوزان إلى $DATA_DIR/electra_small ).num_train_steps بواسطة (على سبيل المثال) إضافة "num_train_steps": 4010000 إلى --hparams . سيستمر هذا في تدريب النموذج الصغير مقابل 10000 خطوة أخرى (تم تدريبه بالفعل على خطوات 4E6).learning_rate HPARAM إلى 2E-4 * (4E6 + 10000) / 10000."generator_hidden_size": 1.0 في hparams لأننا لم نستخدم مولدًا صغيرًا لهذا النموذج. هذه التعليمات قبل تدريب نموذج Electra صغير (12 طبقة ، 256 الحجم المخفي). لسوء الحظ ، فإن البيانات التي استخدمناها في الورقة غير متوفرة للجمهور ، لذلك سنستخدم OpenWebTextCorpus الصادرة عن آرون جوكاسلان وفانيا كوهين بدلاً من ذلك. يجب أن يؤدي النموذج المدرب بالكامل (حوالي 4 أيام على وحدة معالجة الرسومات V100) تقريبًا بين GPT و Bert-Base من حيث أداء الغراء. بشكل افتراضي ، يتم تدريب النموذج على تسلسل طول 128 ، لذلك فهو غير مناسب للتشغيل عند الإجابة على الأسئلة. راجع قسم "النتائج المتوقعة" أدناه لمزيد من التفاصيل حول أداء النموذج.
$DATA_DIR/vocab.txt . استخدمت جميع نماذج Electra لدينا نفس المفردات تمامًا مثل English Unclar Bert ، والتي يمكنك تنزيلها هنا.tar xf openwebtext.tar.xz ). ضعه في $DATA_DIR/openwebtext .python3 build_openwebtext_pretraining_dataset.py --data-dir $DATA_DIR --num-processes 5 . إنه يعبّر مسبقًا/يربح البيانات ويخرج أمثلة كملفات tfrecord تحت $DATA_DIR/pretrain_tfrecords . تتطلب tfrecords حوالي 30 جرام من مساحة القرص. قم بتشغيل python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt لتدريب نموذج Electra صغير لمدة مليون خطوة على البيانات. هذا يستغرق قليلاً أكثر من 4 أيام على وحدة معالجة الرسومات Tesla V100. ومع ذلك ، يجب أن يحقق النموذج نتائج لائقة بعد 200 ألف خطوة (10 ساعات من التدريب على وحدة معالجة الرسومات V100).
لتخصيص التدريب ، أضف --hparams '{"hparam1": value1, "hparam2": value2, ...}' إلى الأمر run. -يمكن أن يكون --hparams أيضًا طريقًا إلى ملف .json يحتوي على مقاييس البارامات. بعض الخيارات المفيدة بشكل خاص:
"debug": true Trase A Model Electra Tiny BOOD LOTS."model_size": one of "small", "base", or "large" : يحدد حجم النموذج"electra_objective": false نموذجًا بنمذجة اللغة المقنعة بدلاً من اكتشاف الرمز المميز (BERT بشكل أساسي مع التقنيع الديناميكي وليس التنبؤ بالالتحام التالي)."num_train_steps": n يتحكم في المدة التي يتم فيها تدريب النموذج مسبقًا."pretrain_tfrecords": <paths> يحدد مكان وجود بيانات ما قبل التدريب. ملاحظة أنك بحاجة إلى تحديد الملفات المحددة وليس فقط الدليل (على سبيل المثال ، <data-dir>/pretrain_tf_records/pretrain_data.tfrecord* )"vocab_file": <path> و "vocab_size": n لتعيين مفردات Wordpiece مخصصة."learning_rate": lr, "train_batch_size": n ، إلخ."model_size" "model_hparam_overrides": {"hidden_size": n, "num_hidden_layers": m} ، إلخ. راجع configure_pretraining.py للاطلاع على مجموعة كاملة من المقاييس البارزة المدعومة.
لتقييم النموذج في مهمة المصب ، راجع تعليمات الإثبات أدناه. لتقييم المولد/التمييز على بيانات OpenWebText Run python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt --hparams '{"do_train": false, "do_eval": true}' . سيؤدي ذلك إلى طباعة مقاييس تقييم مثل دقة المولد والتمييز ، وأيضًا كتابة المقاييس إلى data-dir/model-name/results .
استخدم run_finetuning.py لضبط وتقييم نموذج Electra على مهمة NLP المصب. يتوقع ثلاث حجج:
--data-dir : يتم تخزين دليل حيث يتم تخزين البيانات والأوزان النموذجية وما إلى ذلك. بشكل افتراضي ، يقوم البرنامج النصي بتحميل بيانات FinetUning من <data-dir>/finetuning_data/<task-name> والمفردات من <data-dir>/vocab.txt .--model-name : اسم النموذج الذي تم تدريبه مسبقًا: يجب أن توجد الأوزان التي تم تدريبها مسبقًا في data-dir/models/model-name .--hparams : dict json التي تحتوي على نموذج فرطميات النموذج ، ومسارات البيانات ، وما إلى ذلك (على سبيل المثال ، --hparams '{"task_names": ["rte"], "model_size": "base", "learning_rate": 1e-4, ...}' ). راجع configure_pretraining.py للاطلاع على فرط البرارمامات المدعومة. بدلاً من القولون ، يمكن أن يكون هذا أيضًا طريقًا إلى ملف .json يحتوي على أجهزة التحكم المفرطة. يجب عليك تحديد "task_names" و "model_size" (انظر الأمثلة أدناه). سيتم حفظ مقاييس EVAL في data-dir/model-name/results وسيتم حفظ أوزان النماذج في data-dir/model-name/finetuning_models افتراضيًا. يتم التقييم على DEV تعيين افتراضيا. لتخصيص التدريب ، أضف --hparams '{"hparam1": value1, "hparam2": value2, ...}' إلى الأمر run. بعض الخيارات المفيدة بشكل خاص:
"debug": true يطفو على سبيل المثال نموذج Electra صغيرًا لبضع خطوات."task_names": ["task_name"] : يحدد المهام للتدريب عليها. قائمة لأن قاعدة الشفرة تدعم اسميا التعلم متعدد المهام ، (على الرغم من أن يتم تحذير هذا لم يتم اختباره بدقة)."model_size": one of "small", "base", or "large" : يحدد حجم النموذج ؛ يجب عليك تعيين هذا بنفس حجم النموذج الذي تم تدريبه مسبقًا."do_train" and "do_eval" : تدريب و/أو تقييم نموذج (يتم تعيين كلاهما على صواب افتراضيًا). لاستخدام "do_eval": true with "do_train": false ، تحتاج إلى تحديد init_checkpoint ، eg ، python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["mnli"], "do_train": false, "do_eval": true, "init_checkpoint": "<data-dir>/models/electra_base/finetuning_models/mnli_model_1"}'"num_trials": n : if> 1 ، هل يتم تشغيل العديد من التقييم/التقييم مع بذور عشوائية مختلفة."learning_rate": lr, "train_batch_size": n ، وما إلى ذلك يمكن استخدامها لتغيير التدريب على فرطميات."model_size" "model_hparam_overrides": {"hidden_size": n, "num_hidden_layers": m} ، إلخ. احصل على نموذج Electra الذي تم تدريبه مسبقًا إما عن طريق تدريبك الخاص (انظر تعليمات ما قبل التدريب أعلاه) ، أو تنزيل أوزان Electra الإصدار وفهمها بموجب $DATA_DIR/models (على سبيل المثال ، يجب أن يكون لديك دليل $DATA_DIR/models/electra_large إذا كنت تستخدم النموذج الكبير).
قم بتنزيل بيانات الغراء عن طريق تشغيل هذا البرنامج النصي. قم بإعداد البيانات عن طريق تشغيل mv CoLA cola && mv MNLI mnli && mv MRPC mrpc && mv QNLI qnli && mv QQP qqp && mv RTE rte && mv SST-2 sst && mv STS-B sts && mv diagnostic/diagnostic.tsv mnli && mkdir -p $DATA_DIR/finetuning_data && mv * $DATA_DIR/finetuning_data .
ثم run_finetuning.py . على سبيل المثال ، لضبط القاعدة الكهرما على mnli
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["mnli"]}'
أو ضبط طراز صغير تم تدريبه مسبقًا باستخدام التعليمات المذكورة أعلاه على كولا.
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_small_owt --hparams '{"model_size": "small", "task_names": ["cola"]}'
يدعم الرمز فرقة 1.1 و 2.0 ، وكذلك مجموعات البيانات في مهمة 2019 MRQA المشتركة
$DATA_DIR/finetuning_data/squadv1/(train|dev).json$DATA_DIR/finetuning_data/squad/(train|dev).json$DATA_DIR/finetuning_data/(newsqa|naturalqs|triviaqa|searchqa)/(train|dev).jsonl .ثم قم بتشغيل (على سبيل المثال)
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["squad"]}'
يستخدم هذا المستودع رمز التقييم الرسمي الذي صدره مؤلفو الفريق ومهمة MRQA المشتركة لحساب المقاييس
قم بتنزيل مجموعة بيانات CONLL-2000 لتكتل النص من هنا ووضعها تحت $DATA_DIR/finetuning_data/chunk/(train|dev).txt . ثم ركض
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["chunk"]}'
أسهل طريقة للتشغيل في مهمة جديدة هي تنفيذ finetune.task.Task جديد ، وإضافتها إلى finetune.task_builder.py ، ثم استخدام run_finetuning.py كالمعتاد. بالنسبة للتصنيف/QA/تسلسل العلامات ، يمكنك أن ترث من finetune.classification.classification_tasks.ClassificationTask أو finetune.qa.qa_tasks.QATask أو finetune.tagging.tagging_tasks.TaggingTask . لبيانات المعالجة المسبقة ، نستخدم نفس الرمز المميز مثل Bert.
فيما يلي نتائج متوقعة لـ Electra في مختلف المهام (مجموعة الاختبار للقطع ، مجموعة DEV للمهام الأخرى). لاحظ أن التباين في الضبط الدقيق يمكن أن يكون كبيرًا جدًا ، لذا فإن بعض المهام قد ترى تقلبات كبيرة في الدرجات عند ضبطها من نفس نقطة التفتيش عدة مرات. تظهر الدرجات أدناه الأداء المتوسط على عدد كبير من البذور العشوائية. Electra-Small/Base/Large هي نماذجنا التي تم إصدارها. Electra-Small-Owt هو نموذج OpenWebText المدربين من الأعلى (وهو يؤدي أسوأ قليلاً من Electra-Small بسبب تدريبه لفترة أقل وعلى مجموعة بيانات أصغر).
| كولا | SST | MRPC | STS | QQP | mnli | qnli | RTE | فرقة 1.1 | فرقة 2.0 | chunking | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| المقاييس | MCC | ACC | ACC | الرامح | ACC | ACC | ACC | ACC | م | م | F1 |
| Electra-large | 69.1 | 96.9 | 90.8 | 92.6 | 92.4 | 90.9 | 95.0 | 88.0 | 89.7 | 88.1 | 97.2 |
| القاعدة الكهربائية | 67.7 | 95.1 | 89.5 | 91.2 | 91.5 | 88.8 | 93.2 | 82.7 | 86.8 | 80.5 | 97.1 |
| Electra-Small | 57.0 | 91.2 | 88.0 | 87.5 | 89.0 | 81.3 | 88.4 | 66.7 | 75.8 | 70.1 | 96.5 |
| Electra-small-owt | 56.8 | 88.3 | 87.4 | 86.8 | 88.3 | 78.9 | 87.9 | 68.5 | - | - | - |
انظر هنا للحصول على منحنيات الخسائر / التدريب للنماذج أثناء التدريب قبل التدريب.
لتدريب الكهرباء ، استخدم نفس البرنامج النصي قبل التدريب والقيادة كـ Electra. تمرير "electra_objective": false و "electric_objective": true مع المفرطات. نحن نخطط لإطلاق نماذج كهربائية مدربة مسبقًا قريبًا!
إذا كنت تستخدم هذا الرمز لنشرك ، فيرجى الاستشهاد بالورقة الأصلية:
@inproceedings{clark2020electra,
title = {{ELECTRA}: Pre-training Text Encoders as Discriminators Rather Than Generators},
author = {Kevin Clark and Minh-Thang Luong and Quoc V. Le and Christopher D. Manning},
booktitle = {ICLR},
year = {2020},
url = {https://openreview.net/pdf?id=r1xMH1BtvB}
}
إذا كنت تستخدم الرمز للكهرباء ، فيرجى الاستشهاد بالورقة الكهربائية:
@inproceedings{clark2020electric,
title = {Pre-Training Transformers as Energy-Based Cloze Models},
author = {Kevin Clark and Minh-Thang Luong and Quoc V. Le and Christopher D. Manning},
booktitle = {EMNLP},
year = {2020},
url = {https://www.aclweb.org/anthology/2020.emnlp-main.20.pdf}
}
للحصول على المساعدة أو المشكلات التي تستخدم Electra ، يرجى تقديم مشكلة github.
للاتصال الشخصي المتعلق بـ Electra ، يرجى الاتصال بـ Kevin Clark ( [email protected] ).