Electra เป็นวิธีการเรียนรู้การเป็นตัวแทนภาษาที่ดูแลตนเอง มันสามารถใช้ในการฝึกอบรมเครือข่ายหม้อแปลงล่วงหน้าโดยใช้การคำนวณค่อนข้างน้อย รุ่น Electra ได้รับการฝึกฝนให้แยกโทเค็นอินพุต "ของจริง" กับโทเค็นอินพุต "ปลอม" ที่สร้างขึ้นโดยเครือข่ายประสาทอื่นซึ่งคล้ายกับตัวเลือกของ GAN ในระดับเล็ก Electra จะได้ผลลัพธ์ที่แข็งแกร่งแม้ว่าจะได้รับการฝึกฝนใน GPU เดียว ในขนาดใหญ่ Electra จะได้ผลลัพธ์ที่ล้ำสมัยในชุดข้อมูล Squad 2.0
สำหรับคำอธิบายโดยละเอียดและผลการทดลองโปรดดูที่ ICLR 2020 Paper Electra ของเรา: การเข้ารหัสข้อความก่อนการฝึกอบรมในฐานะผู้จำแนกมากกว่าเครื่องกำเนิดไฟฟ้า
ที่เก็บนี้มีรหัสไปยังอิเลคตร้าก่อนรถไฟรวมถึงรุ่นอิเลคตร้าขนาดเล็กบน GPU เดียว นอกจากนี้ยังรองรับ Electra ที่ปรับจูนอย่างละเอียดในงานดาวน์สตรีมรวมถึงงานการจำแนกประเภท (เช่นกาว) งาน QA (เช่นทีม) และงานการติดแท็กลำดับ (เช่นการถ่ายภาพข้อความ)
ที่เก็บนี้ยังมีรหัสสำหรับ ไฟฟ้า รุ่นของ Electra ที่ได้รับแรงบันดาลใจจากรุ่นที่ใช้พลังงาน Electric ให้มุมมองที่สำคัญยิ่งขึ้นของ Electra เป็นแบบจำลอง "การสุ่มตัวอย่างเชิงลบ" แบบจำลอง นอกจากนี้ยังสามารถสร้างคะแนนความน่าจะเป็นแบบหลอกสำหรับข้อความซึ่งสามารถใช้ในการจัดอันดับผลลัพธ์ของการรู้จำเสียงพูดหรือระบบการแปลของเครื่องอีกครั้ง สำหรับรายละเอียดเกี่ยวกับไฟฟ้าโปรดดูที่ Transformers การฝึกอบรม PAPER PAPER TRAINING PAPER EMNLP 2020 เป็นแบบจำลองการปิดบังพลังงาน
ตอนแรกเรากำลังปล่อยรุ่นที่ผ่านการฝึกอบรมมาก่อนสามรุ่น:
| แบบอย่าง | ชั้น | ขนาดที่ซ่อน | พารามิเตอร์ | คะแนนกาว (ชุดทดสอบ) | การดาวน์โหลด |
|---|---|---|---|---|---|
| ควันเล็ก ๆ | 12 | 256 | 14m | 77.4 | การเชื่อมโยง |
| เบสอิเลคตร้า | 12 | 768 | 110m | 82.7 | การเชื่อมโยง |
| ขนาดใหญ่ | 24 | 1024 | 335m | 85.2 | การเชื่อมโยง |
โมเดลได้รับการฝึกฝนเกี่ยวกับข้อความภาษาอังกฤษที่ไม่ได้ใช้ พวกเขาสอดคล้องกับ Electra-Small ++, Electra-Base ++, Electra-1.75m ในกระดาษของเรา เราหวังว่าจะปล่อยรุ่นอื่น ๆ เช่นโมเดลหลายภาษาในอนาคต
บนกาวมีคะแนน Electra-large ดีกว่า Albert/XLNet เล็กน้อยคะแนน Electra-base ดีกว่า Bert-Large และคะแนน Electra-small ที่แย่ที่สุดเล็กน้อยกว่า Tinybert เล็กน้อย (แต่ไม่ต้องกลั่น) ดูส่วนผลลัพธ์ที่คาดหวังด้านล่างสำหรับหมายเลขประสิทธิภาพโดยละเอียด
ใช้ build_pretraining_dataset.py เพื่อสร้างชุดข้อมูลการฝึกอบรมล่วงหน้าจากการถ่ายโอนข้อความดิบ มันมีข้อโต้แย้งต่อไปนี้:
--corpus-dir : ไดเรกทอรีที่มีไฟล์ข้อความดิบเพื่อเปลี่ยนเป็นตัวอย่างอิเลคร้า ไฟล์ข้อความสามารถมีหลายเอกสารที่มีบรรทัดว่างแยกกัน--vocab-file : ไฟล์ที่กำหนดคำศัพท์ WordPiece--output-dir : สถานที่เขียนตัวอย่างอิเลคตร้า--max-seq-length : จำนวนโทเค็นต่อตัวอย่าง (128 โดยค่าเริ่มต้น)--num-processes : ถ้า> 1 ขนานกันข้ามหลายกระบวนการ (1 โดยค่าเริ่มต้น)--blanks-separate-docs : ไม่ว่าจะเป็นบรรทัดที่ว่างเปล่าระบุขอบเขตเอกสาร (จริงโดยค่าเริ่มต้น)--do-lower-case/--no-lower-case : ไม่ว่าจะลดข้อความอินพุต (จริงตามค่าเริ่มต้น) ใช้ run_pretraining.py เพื่อฝึกอบรมรุ่นอิเลคตร้าล่วงหน้า มันมีข้อโต้แย้งต่อไปนี้:
--data-dir : ไดเรกทอรีที่มีการจัดเก็บข้อมูลก่อนการฝึกน้ำหนักแบบจำลอง ฯลฯ โดยค่าเริ่มต้นการฝึกอบรมจะโหลดตัวอย่างจาก <data-dir>/pretrain_tfrecords และคำศัพท์จาก <data-dir>/vocab.txt--model-name : ชื่อสำหรับแบบจำลองที่ได้รับการฝึกฝน น้ำหนักของรุ่นจะถูกบันทึกใน <data-dir>/models/<model-name> โดยค่าเริ่มต้น--hparams (ไม่บังคับ): JSON DICT หรือ PATH ไปยังไฟล์ JSON ที่มี HyperParameters รุ่น, เส้นทางข้อมูล ฯลฯ ดู configure_pretraining.py สำหรับ hyperparameters ที่รองรับ หากการฝึกอบรมหยุดชะงักให้รัน run_pretraining.py อีกครั้งพร้อมกับอาร์กิวเมนต์เดียวกันจะดำเนินการฝึกอบรมต่อไป
คุณสามารถฝึกอบรมล่วงหน้าจากจุดตรวจอิเลคตร้าที่ปล่อยออกมาได้โดย
--model-name electra_small หากคุณดาวน์โหลดน้ำหนักเป็น $DATA_DIR/electra_small )num_train_steps โดย (ตัวอย่าง) การเพิ่ม "num_train_steps": 4010000 เป็น --hparams สิ่งนี้จะยังคงฝึกอบรมรุ่นเล็ก ๆ สำหรับขั้นตอนเพิ่มเติม 10,000 ขั้นตอน (ได้รับการฝึกอบรมมาแล้วสำหรับ 4E6 ขั้นตอน)learning_rate hParam เป็น 2e-4 * (4e6 + 10,000) / 10,000"generator_hidden_size": 1.0 ใน hparams เพราะเราไม่ได้ใช้เครื่องกำเนิดไฟฟ้าขนาดเล็กสำหรับรุ่นนั้น คำแนะนำเหล่านี้ก่อนหน้านี้รุ่นอิเลคตร้าขนาดเล็ก (12 ชั้น, 256 ขนาดที่ซ่อนอยู่) น่าเสียดายที่ข้อมูลที่เราใช้ในกระดาษนั้นไม่ได้เปิดเผยต่อสาธารณะดังนั้นเราจะใช้ OpenWebTextCorpus ที่ออกโดย Aaron Gokaslan และ Vanya Cohen แทน โมเดลที่ผ่านการฝึกอบรมอย่างเต็มที่ (~ 4 วันใน V100 GPU) ควรดำเนินการอย่างคร่าวๆระหว่าง GPT และ Bert-base ในแง่ของประสิทธิภาพของกาว โดยค่าเริ่มต้นโมเดลได้รับการฝึกฝนตามลำดับความยาว -128 ดังนั้นจึงไม่เหมาะสำหรับการตอบคำถาม ดูส่วน "ผลลัพธ์ที่คาดหวัง" ด้านล่างสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับประสิทธิภาพของโมเดล
$DATA_DIR/vocab.txt รุ่น Electra ของเราทั้งหมดใช้คำศัพท์ที่แน่นอนเช่นเดียวกับ Bert ภาษาอังกฤษที่ไม่ได้ใช้งานซึ่งคุณสามารถดาวน์โหลดได้ที่นี่tar xf openwebtext.tar.xz ) วางไว้ใน $DATA_DIR/openwebtextpython3 build_openwebtext_pretraining_dataset.py --data-dir $DATA_DIR --num-processes 5 มันล่วงหน้า/tokenizes ตัวอย่างข้อมูลและเอาต์พุตเป็นไฟล์ tfrecord ภายใต้ $DATA_DIR/pretrain_tfrecords tfrecords ต้องการพื้นที่ดิสก์ประมาณ 30 กรัม เรียกใช้ python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt เพื่อฝึกอบรมรุ่นอิเลคตร้าขนาดเล็กสำหรับข้อมูล 1 ล้านขั้นตอน ใช้เวลามากกว่า 4 วันใน Tesla V100 GPU อย่างไรก็ตามแบบจำลองควรได้รับผลลัพธ์ที่เหมาะสมหลังจากขั้นตอน 200K (10 ชั่วโมงของการฝึกอบรมเกี่ยวกับ V100 GPU)
ในการปรับแต่งการฝึกอบรมให้เพิ่ม --hparams '{"hparam1": value1, "hparam2": value2, ...}' ไปยังคำสั่ง RUN --hparams ยังสามารถเป็นเส้นทางไปยังไฟล์ .json ที่มี hyperparameters ตัวเลือกที่มีประโยชน์โดยเฉพาะอย่างยิ่ง:
"debug": true Trains รุ่น Electra เล็ก ๆ ไม่กี่ขั้นตอน"model_size": one of "small", "base", or "large" : กำหนดขนาดของโมเดล"electra_objective": false ที่มีการสร้างแบบจำลองภาษาที่สวมหน้ากากแทนการตรวจจับโทเค็นที่ถูกแทนที่"num_train_steps": n ควบคุมระยะเวลาที่โมเดลได้รับการฝึกอบรมล่วงหน้า"pretrain_tfrecords": <paths> กำหนดตำแหน่งที่ข้อมูลการฝึกอบรมก่อนอยู่ หมายเหตุคุณต้องระบุไฟล์เฉพาะไม่เพียง แต่ไดเรกทอรี (เช่น <data-dir>/pretrain_tf_records/pretrain_data.tfrecord* )"vocab_file": <path> และ "vocab_size": n สามารถใช้เพื่อตั้งค่าคำศัพท์คำศัพท์ที่กำหนดเอง"learning_rate": lr, "train_batch_size": n ฯลฯ สามารถใช้เพื่อเปลี่ยนการฝึกอบรม hyperparameters"model_hparam_overrides": {"hidden_size": n, "num_hidden_layers": m} , ฯลฯ สามารถใช้เพื่อเปลี่ยน hyperparameters สำหรับหม้อแปลงพื้นฐาน ( "model_size" ตั้งค่าค่าเริ่มต้น) ดู configure_pretraining.py สำหรับชุดพารามิเตอร์ที่รองรับเต็มรูปแบบ
ในการประเมินโมเดลในงานดาวน์สตรีมให้ดูคำแนะนำด้านล่าง ในการประเมินเครื่องกำเนิด/discriminator บน data openwebtext เรียกใช้ python3 run_pretraining.py --data-dir $DATA_DIR --model-name electra_small_owt --hparams '{"do_train": false, "do_eval": true}' สิ่งนี้จะพิมพ์ตัวชี้วัดการประเมินเช่นความแม่นยำของเครื่องกำเนิดไฟฟ้าและ discriminator และยังเขียนตัวชี้วัดออกไปยัง 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 : JSON DICT ที่มีโมเดลไฮเปอร์พารามิเตอร์, เส้นทางข้อมูล, ฯลฯ (เช่น --hparams '{"task_names": ["rte"], "model_size": "base", "learning_rate": 1e-4, ...}' ) ดู configure_pretraining.py สำหรับ hyperparameters ที่รองรับ แทนที่จะเป็น dict นี่อาจเป็นเส้นทางไปยังไฟล์ .json ที่มี hyperparameters คุณต้องระบุ "task_names" และ "model_size" (ดูตัวอย่างด้านล่าง) Eval Metrics จะถูกบันทึกใน data-dir/model-name/results และน้ำหนักของรุ่นจะถูกบันทึกใน data-dir/model-name/finetuning_models โดยค่าเริ่มต้น การประเมินผลจะดำเนินการในชุด Dev ที่กำหนดโดยค่าเริ่มต้น ในการปรับแต่งการฝึกอบรมให้เพิ่ม --hparams '{"hparam1": value1, "hparam2": value2, ...}' ไปยังคำสั่ง RUN ตัวเลือกที่มีประโยชน์โดยเฉพาะอย่างยิ่ง:
"debug": true ปรับแต่งแบบจำลองเล็ก ๆ แบบจำลองเล็ก ๆ ในไม่กี่ขั้นตอน"task_names": ["task_name"] : ระบุงานที่จะฝึกอบรม รายการเนื่องจาก Codebase สนับสนุนการเรียนรู้แบบหลายงาน (แม้ว่าจะได้รับการเตือนว่าสิ่งนี้ยังไม่ได้รับการทดสอบอย่างละเอียด)"model_size": one of "small", "base", or "large" : กำหนดขนาดของโมเดล; คุณต้องตั้งค่านี้ให้มีขนาดเท่ากันกับรุ่นที่ผ่านการฝึกอบรมมาก่อน"do_train" and "do_eval" : รถไฟและ/หรือประเมินโมเดล (ทั้งสองถูกตั้งค่าเป็นจริงโดยค่าเริ่มต้น) สำหรับการใช้ "do_eval": true ด้วย "do_train": false คุณต้องระบุ init_checkpoint เช่น 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 : ถ้า> 1, การปรับจูน/การประเมินผลหลายครั้งทำงานด้วยเมล็ดสุ่มที่แตกต่างกัน"learning_rate": lr, "train_batch_size": n ฯลฯ สามารถใช้เพื่อเปลี่ยนการฝึกอบรม hyperparameters"model_hparam_overrides": {"hidden_size": n, "num_hidden_layers": m} , ฯลฯ สามารถใช้เพื่อเปลี่ยน hyperparameters สำหรับหม้อแปลงพื้นฐาน ( "model_size" ตั้งค่าค่าเริ่มต้น) รับแบบจำลอง 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 ตัวอย่างเช่นการปรับแต่ง electra-base บน MNLI
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_base --hparams '{"model_size": "base", "task_names": ["mnli"]}'
หรือปรับแต่งโมเดลขนาดเล็กที่ผ่านการฝึกอบรมล่วงหน้าโดยใช้คำแนะนำข้างต้นเกี่ยวกับ COLA
python3 run_finetuning.py --data-dir $DATA_DIR --model-name electra_small_owt --hparams '{"model_size": "small", "task_names": ["cola"]}'
รหัสรองรับทีม 1.1 และ 2.0 รวมถึงชุดข้อมูลในงานที่ใช้ร่วมกันของ MRQA 2019
$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 เพื่อคำนวณตัวชี้วัด
ดาวน์โหลดชุดข้อมูล chunking ข้อความ 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/Sequence Tagging คุณสามารถสืบทอดได้จาก finetune.classification.classification_tasks.ClassificationTask , finetune.qa.qa_tasks.QATask หรือ finetune.tagging.tagging_tasks.TaggingTask สำหรับข้อมูลการประมวลผลล่วงหน้าเราใช้ tokenizer เดียวกันเป็น Bert
นี่คือผลลัพธ์ที่คาดหวังสำหรับ Electra ในงานต่าง ๆ (ชุดทดสอบสำหรับ chunking, dev ตั้งค่าสำหรับงานอื่น ๆ ) โปรดทราบว่าความแปรปรวนในการปรับแต่งอาจมีขนาดค่อนข้างใหญ่ดังนั้นสำหรับงานบางอย่างคุณอาจเห็นความผันผวนอย่างมากในคะแนนเมื่อปรับจูนจากจุดตรวจสอบเดียวกันหลายครั้ง คะแนนด้านล่างแสดงประสิทธิภาพเฉลี่ยของเมล็ดสุ่มจำนวนมาก Electra-small/base/large เป็นรุ่นที่เราเปิดตัว Electra-Small-OWT เป็นรุ่นที่ได้รับการฝึกฝนจาก OpenWebText จากด้านบน (ทำงานได้แย่กว่า Electra-Small เล็กน้อยเนื่องจากได้รับการฝึกฝนมานานน้อยลงและในชุดข้อมูลที่เล็กกว่า)
| โคล่า | SST | MRPC | STS | qqp | mnli | qnli | rte | ทีม 1.1 | ทีม 2.0 | การตี | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| ตัวชี้วัด | MCC | ACC | ACC | คนหอก | ACC | ACC | ACC | ACC | em | em | F1 |
| ขนาดใหญ่ | 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 |
| ควันเล็ก ๆ | 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 กับ Hyperparameters เราวางแผนที่จะเปิดตัวรุ่นไฟฟ้าที่ผ่านการฝึกอบรมมาแล้วเร็ว ๆ นี้!
หากคุณใช้รหัสนี้สำหรับสิ่งพิมพ์ของคุณโปรดอ้างอิงกระดาษต้นฉบับ:
@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] )