***** الجديد 11 مارس ، 2020: نماذج Bert الأصغر *****
هذا إصدار من 24 طرازًا أصغر من Bert (اللغة الإنجليزية فقط ، غير قائمة على أساس ، مدرب مع إخفاء وورد) المشار إليه في الطلاب المقروءين بشكل أفضل: على أهمية النماذج المدمجة قبل التدريب.
لقد أظهرنا أن وصفة Bert القياسية (بما في ذلك بنية النموذج وهدف التدريب) فعالة على مجموعة واسعة من أحجام النماذج ، خارج Bert-Base و Bert-Large. نماذج BERT الأصغر مخصصة للبيئات ذات الموارد الحسابية المقيدة. يمكن ضبطها بنفس الطريقة مثل نماذج BERT الأصلية. ومع ذلك ، فهي أكثر فعالية في سياق تقطير المعرفة ، حيث يتم إنتاج ملصقات الضبط من قبل مدرس أكبر وأكثر دقة.
هدفنا هو تمكين البحث في المؤسسات التي لديها عدد أقل من الموارد الحسابية وتشجيع المجتمع على البحث عن توجيهات للابتكار بديل لزيادة السعة النموذجية.
يمكنك تنزيل كل 24 من هنا ، أو بشكل فردي من الجدول أدناه:
H = 128 | H = 256 | H = 512 | H = 768 | |
---|---|---|---|---|
L = 2 | 2/128 (بيرت تيني) | 2/256 | 2/512 | 2/768 |
ل = 4 | 4/128 | 4/256 (بيرت ميني) | 4/512 (Bert-Small) | 4/768 |
L = 6 | 6/128 | 6/256 | 6/512 | 6/768 |
L = 8 | 8/128 | 8/256 | 8/512 (Bert-Medium) | 8/768 |
L = 10 | 10/128 | 10/256 | 10/512 | 10/768 |
L = 12 | 12/128 | 12/256 | 12/512 | 12/768 (Bert-Base) |
لاحظ أن نموذج Bert-Base في هذا الإصدار يتم تضمينه للاكتمال فقط ؛ تم إعادة تدريبه تحت نفس النظام مثل النموذج الأصلي.
فيما يلي درجات الغراء المقابلة في مجموعة الاختبار:
نموذج | نتيجة | كولا | SST-2 | MRPC | STS-B | QQP | mnli-m | mnli-mm | qnli (v2) | RTE | wnli | الفأس |
---|---|---|---|---|---|---|---|---|---|---|---|---|
بيرت تيني | 64.2 | 0.0 | 83.2 | 81.1/71.1 | 74.3/73.6 | 62.2/83.4 | 70.2 | 70.3 | 81.5 | 57.2 | 62.3 | 21.0 |
بيرت ميني | 65.8 | 0.0 | 85.9 | 81.1/71.8 | 75.4/73.3 | 66.4/86.2 | 74.8 | 74.3 | 84.1 | 57.9 | 62.3 | 26.1 |
بيرت سمال | 71.2 | 27.8 | 89.7 | 83.4/76.2 | 78.8/77.0 | 68.1/87.0 | 77.6 | 77.0 | 86.4 | 61.8 | 62.3 | 28.6 |
بيرت ميديوم | 73.5 | 38.0 | 89.6 | 86.6/81.6 | 80.4/78.4 | 69.6/87.9 | 80.0 | 79.1 | 87.7 | 62.2 | 62.3 | 30.5 |
لكل مهمة ، اخترنا أفضل المقاييس المفرطة المفرطة في القوائم أدناه ، وتدربنا على 4 عصر:
إذا كنت تستخدم هذه النماذج ، فيرجى الاستشهاد بالورقة التالية:
@article{turc2019,
title={Well-Read Students Learn Better: On the Importance of Pre-training Compact Models},
author={Turc, Iulia and Chang, Ming-Wei and Lee, Kenton and Toutanova, Kristina},
journal={arXiv preprint arXiv:1908.08962v2 },
year={2019}
}
***** جديد 31 مايو 2019: نماذج إخفاء الكلمة الكاملة *****
هذا إصدار من العديد من النماذج الجديدة التي كانت نتيجة لتحسين رمز المعالجة المسبقة.
في رمز المعالجة المسبقة الأصلية ، نختار بشكل عشوائي رمز WordPiece للقناع. على سبيل المثال:
Input Text: the man jumped up , put his basket on phil ##am ##mon ' s head
Original Masked Input: [MASK] man [MASK] up , put his [MASK] on phil [MASK] ##mon ' s head
تسمى التقنية الجديدة إخفاء الكلمة الكاملة. في هذه الحالة ، نقوم دائمًا بإخفاء جميع الرموز المميزة التي تتوافق مع كلمة في وقت واحد. لا يزال معدل التقنيع العام كما هو.
Whole Word Masked Input: the man [MASK] up , put his basket on [MASK] [MASK] [MASK] ' s head
التدريب متطابق - ما زلنا نتوقع كل رمز Wordpiece المقنع بشكل مستقل. يأتي التحسن من حقيقة أن مهمة التنبؤ الأصلية كانت "سهلة" للغاية بالنسبة للكلمات التي تم تقسيمها إلى قطع نصية متعددة.
يمكن تمكين ذلك أثناء توليد البيانات عن طريق تمرير العلامة --do_whole_word_mask=True
to create_pretraining_data.py
.
ترتبط النماذج المدربة مسبقًا مع إخفاء الكلمة الكاملة أدناه. كانت البيانات والتدريب متطابقين على خلاف ذلك ، والنماذج لها بنية متطابقة ومفردات المفردات للنماذج الأصلية. نحن فقط ندرج نماذج بيرت large. عند استخدام هذه النماذج ، يرجى توضيحها في الورقة أنك تستخدم متغير إخفاء الكلمة بالكامل من Bert-Large.
BERT-Large, Uncased (Whole Word Masking)
: 24 طبقة ، 1024-Hidden ، 16 رأس ، 340 متر معلمات
BERT-Large, Cased (Whole Word Masking)
: 24 طبقة ، 1024-Hidden ، 16 رأس ، 340 متر معلمات
نموذج | فرقة 1.1 f1/em | دقة متعددة NLI |
---|---|---|
Bert-Large ، غير قائم على (أصلي) | 91.0/84.3 | 86.05 |
Bert-Large ، غير قائم (إخفاء الكلمة الكاملة) | 92.8/86.7 | 87.07 |
Bert-Large ، Cased (الأصلي) | 91.5/84.8 | 86.09 |
Bert-Large ، cased (إخفاء الكلمة الكاملة) | 92.9/86.7 | 86.46 |
***** الجديد 7 فبراير 2019: وحدة Tfhub *****
تم تحميل Bert إلى TensorFlow Hub. راجع run_classifier_with_tfhub.py
للحصول على مثال على كيفية استخدام وحدة TF Hub ، أو تشغيل مثال في المتصفح على كولاب.
***** الجديد في 23 نوفمبر ، 2018: نموذج متعدد اللغات غير طبيعي + تايلاندي + منغوليان *****
قمنا بتحميل نموذج جديد متعدد اللغات لا يؤدي أي تطبيع على المدخلات (لا يوجد غلاف أقل ، تجريد لهجة ، أو تطبيع يونيكود) ، بالإضافة إلى التايلاندية والمنغولية.
يوصى باستخدام هذا الإصدار لتطوير نماذج متعددة اللغات ، وخاصة على اللغات ذات الحروف الحرارية غير اللاتينية.
هذا لا يتطلب أي تغييرات رمز ، ويمكن تنزيلها هنا:
BERT-Base, Multilingual Cased
: 104 Languages ، 12 طبقة ، 768-Hidden ، 12 رأس ، 110 متر معلمات***** الجديد في 15 نوفمبر 2018: SOTA SQUAD 2.0 SYSTEM *****
أصدرنا تغييرات رمز لإعادة إنتاج نظام F1 Squad 2.0 بنسبة 83 ٪ ، والذي يحتل المركز الأول على المتصدرين بنسبة 3 ٪. انظر قسم Squad 2.0 من ReadMe للحصول على التفاصيل.
***** جديد في 5 نوفمبر 2018: إصدارات Pytorch و Chainer الطرف الثالث متاح ***** *****
قام باحثو NLP من Huggingface بإصدار Pytorch من Bert المتاح وهو متوافق مع نقاط التفتيش التي تم تدريبنا مسبقًا وقادرة على إعادة إنتاج نتائجنا. قام Sosuke Kobayashi أيضًا بتقديم نسخة من Bert من Bert (شكرًا!) لم نشارك في إنشاء أو صيانة تطبيق Pytorch ، لذا يرجى توجيه أي أسئلة تجاه مؤلفي هذا المستودع.
***** الجديد في 3 نوفمبر 2018: النماذج المتعددة اللغات والصينية المتاحة *****
لقد قمنا بتوفير نموذجين جديدين لـ Bert:
BERT-Base, Multilingual
(غير موصى به ، استخدم Multilingual Cased
بدلاً من ذلك) : 102 لغة ، 12 طبقة ، 768 ، و 12 رأسًا ، 110 مترًا.BERT-Base, Chinese
: الصينية مبسطة وتقليدية ، من 12 طبقة ، 768-حار ، 12 رأس ، 110 متر معلمات نحن نستخدم الرمز المميز القائم على الشخصية للصينيين ، ورمز وورد لجميع اللغات الأخرى. يجب أن يعمل كلا النموذجين خارج الصندوق دون أي تغييرات رمز. لقد قمنا بتحديث تنفيذ BasicTokenizer
في tokenization.py
لدعم رمز الشخصية الصينية ، لذا يرجى تحديث إذا كنت متشعبًا. ومع ذلك ، لم نغير واجهة برمجة تطبيقات الرمز المميز.
لمزيد من المعلومات ، راجع ReadMe متعدد اللغات.
***** إنهاء معلومات جديدة *****
Bert ، أو B idirectional e ncoder r epresentations من transformers ، هي طريقة جديدة لتمثيلات اللغة قبل التدريب التي تحصل على نتائج أحدث على مجموعة واسعة من مهام معالجة اللغة الطبيعية (NLP).
يمكن العثور على ورقة الأكاديمية التي تصف Bert بالتفصيل وتوفر نتائج كاملة على عدد من المهام هنا: https://arxiv.org/abs/1810.04805.
لإعطاء عدد قليل من الأرقام ، إليك النتائج في مهمة الإجابة على أسئلة Squad v1.1:
فرقة V1.1 المتصدرين (8 أكتوبر 2018) | اختبار م | اختبار F1 |
---|---|---|
فرقة المركز الأول - بيرت | 87.4 | 93.2 |
فرقة المركز الثاني - nlnet | 86.0 | 91.7 |
المركز الأول نموذج واحد - بيرت | 85.1 | 91.8 |
النموذج الفردي للمركز الثاني - nlnet | 83.5 | 90.1 |
والعديد من مهام الاستدلال في اللغة الطبيعية:
نظام | multinli | سؤال nli | غنيمة |
---|---|---|---|
بيرت | 86.7 | 91.1 | 86.3 |
Openai GPT (السابق سوتا) | 82.2 | 88.1 | 75.0 |
بالإضافة إلى العديد من المهام الأخرى.
علاوة على ذلك ، تم الحصول على جميع هذه النتائج مع عدم وجود تصميم بنية الشبكة العصبية الخاصة بالمهمة.
إذا كنت تعرف بالفعل ماهية بيرت وتريد فقط البدء ، فيمكنك تنزيل النماذج التي تم تدريبها مسبقًا وتشغيل أحدث طراز في بضع دقائق فقط.
BERT هي طريقة لتمثيلات اللغة قبل التدريب ، وهذا يعني أننا ندرب نموذج "فهم اللغة" للأغراض العامة على مجموعة نصية كبيرة (مثل ويكيبيديا) ، ثم استخدم هذا النموذج لمهام NLP المصب التي نهتم بها (مثل السؤال الرد). يتفوق BERT على الطرق السابقة لأنه أول نظام ثنائي الاتجاه غير خاضع للإشراف على NLP قبل التدريب.
يعني عدم الإشراف أن Bert تم تدريبه باستخدام مجموعة نصية عادي فقط ، وهو أمر مهم لأن كمية هائلة من بيانات النص العادي متوفرة للجمهور على الويب بعدة لغات.
يمكن أن تكون التمثيلات التي تم تدريبها مسبقًا أيضًا خالية من السياق أو السياق ، ويمكن أن تكون التمثيلات السياقية أحادية الاتجاه أو ثنائية الاتجاه . تنشئ النماذج الخالية من السياق مثل Word2Vec أو Glove تمثيلًا واحدًا "تضمين الكلمات" لكل كلمة في المفردات ، لذلك سيكون bank
نفس التمثيل في bank deposit
river bank
. بدلاً من ذلك ، تقوم النماذج السياقية بإنشاء تمثيل لكل كلمة تستند إلى الكلمات الأخرى في الجملة.
تم بناء BERT على العمل الأخير في التمثيلات السياقية قبل التدريب-بما في ذلك تعلم التسلسل شبه الخاضع للإشراف ، والتدريب قبل التدريب ، ELMO ، و ULMFIT-ولكن هذه النماذج هي كلها غير الاتجاهية أو ثنائية الاتجاه ضحلة . هذا يعني أن كل كلمة يتم سياقها فقط باستخدام الكلمات إلى يسارها (أو يمين). على سبيل المثال ، في الجملة I made a bank deposit
يعتمد التمثيل أحادي الاتجاه bank
فقط على I made a
deposit
ولكن ليس. تجمع بعض الأعمال السابقة بين التمثيلات من نماذج السياق الأيسر والسياق الأيمن المنفصل ، ولكن فقط بطريقة "ضحلة". يمثل Bert "بنك" باستخدام كل من السياق الأيسر واليمين - I made a ... deposit
- بدءًا من الجزء السفلي من الشبكة العصبية العميقة ، لذلك فهو ثنائي الاتجاه عميق .
يستخدم Bert نهجًا بسيطًا لهذا: نقوم بإخفاء 15 ٪ من الكلمات الموجودة في الإدخال ، ونقوم بتشغيل التسلسل بأكمله من خلال تشفير محول ثنائي الاتجاه عميق ، ثم نتوقع فقط الكلمات المقنعة. على سبيل المثال:
Input: the man went to the [MASK1] . he bought a [MASK2] of milk.
Labels: [MASK1] = store; [MASK2] = gallon
من أجل تعلم العلاقات بين الجمل ، نقوم أيضًا بالتدريب على مهمة بسيطة يمكن إنشاؤها من أي مجموعة أحادية اللغة: بالنظر إلى جملتين A
و B
، هي B
الفعلية التالية التي تأتي بعد A
، أو مجرد جملة عشوائية من Corpus ؟
Sentence A: the man went to the store .
Sentence B: he bought a gallon of milk .
Label: IsNextSentence
Sentence A: the man went to the store .
Sentence B: penguins are flightless .
Label: NotNextSentence
ثم نقوم بتدريب نموذج كبير (محول من 12 طبقة إلى 24 طبقة) على مجموعة كبيرة (ويكيبيديا + بوككوربوس) لفترة طويلة (خطوات تحديث 1M) ، وهذا بيرت.
باستخدام BERT مرحلتين: التدريب المسبق والضبط .
التدريب المسبق مكلف إلى حد ما (أربعة أيام على 4 إلى 16 سحابة TPUs) ، ولكنه إجراء لمرة واحدة لكل لغة (النماذج الحالية هي اللغة الإنجليزية فقط ، ولكن سيتم إصدار نماذج متعددة اللغات في المستقبل القريب). نقوم بإصدار عدد من النماذج المدربة مسبقًا من الورقة التي تم تدريبها مسبقًا في Google. لن يحتاج معظم الباحثين في NLP إلى تدريب نموذجهم الخاص من نقطة الصفر.
صقل جيد غير مكلف. يمكن تكرار جميع النتائج في الورقة في غضون ساعة واحدة على الأقل على TPU سحابة واحدة ، أو بضع ساعات على وحدة معالجة الرسومات ، بدءًا من نفس النموذج الذي تم تدريبه مسبقًا. على سبيل المثال ، يمكن تدريب Squad في حوالي 30 دقيقة على TPU سحابة واحدة لتحقيق درجة DEV F1 بنسبة 91.0 ٪ ، وهي حالة أحادية النظام.
الجانب المهم الآخر من BERT هو أنه يمكن تكييفه مع العديد من أنواع مهام NLP بسهولة بالغة. في الورقة ، نوضح النتائج الحديثة على مستوى الجملة (على سبيل المثال ، SST-2) ، مستوى الجملة (على سبيل المثال ، متعددة) ، مستوى الكلمات (على سبيل المثال ، NER) ، والمستوى الممتد (على سبيل المثال ، فرقة) المهام مع عدم وجود تعديلات خاصة بالمهمة.
نحن نطلق ما يلي:
BERT-Base
و BERT-Large
من الورقة.جميع الكود في هذا المستودع يعمل خارج الصندوق مع وحدة المعالجة المركزية و GPU و Cloud TPU.
نحن نطلق نماذج BERT-Base
و BERT-Large
من الورقة. يعني Uncased
أن النص قد تم تنظيمه قبل رمز WordPiece ، على سبيل المثال ، يصبح John Smith
john smith
. النموذج Uncased
أيضًا على قيادة أي علامات لهجة. Cased
يعني أنه يتم الحفاظ على الحالات الحقيقية وعلامات لهجة. عادةً ما يكون النموذج Uncased
أفضل إلا إذا كنت تعلم أن معلومات الحالة مهمة لمهمتك (على سبيل المثال ، التعرف على الكيان المسمى أو وضع علامة على جزء من الكلام).
يتم إصدار جميع هذه النماذج تحت نفس الترخيص مثل رمز المصدر (Apache 2.0).
للحصول على معلومات حول النموذج متعدد اللغات والصيني ، راجع ReadMe متعدد اللغات.
عند استخدام نموذج مغلف ، تأكد من تمرير --do_lower=False
في البرامج النصية التدريبية. (أو تمرير do_lower_case=False
مباشرة إلى FullTokenizer
إذا كنت تستخدم البرنامج النصي الخاص بك.)
الروابط إلى النماذج موجودة هنا (انقر بزر الماوس الأيمن ، "حفظ الرابط باسم ..." على الاسم):
BERT-Large, Uncased (Whole Word Masking)
: 24 طبقة ، 1024-Hidden ، 16 رأس ، 340 متر معلماتBERT-Large, Cased (Whole Word Masking)
: 24 طبقة ، 1024-Hidden ، 16 رأس ، 340 متر معلماتBERT-Base, Uncased
: 12 طبقة ، 768-hidden ، 12 رأس ، 110m المعلماتBERT-Large, Uncased
: 24 طبقة ، 1024-Hidden ، 16 رأس ، 340 متر معلماتBERT-Base, Cased
: 12 طبقة ، 768-Hidden ، 12 رأس ، 110 متر معلماتBERT-Large, Cased
: 24 طبقة ، 1024-Hidden ، 16 رأس ، 340 متر معلماتBERT-Base, Multilingual Cased (New, recommended)
: 104 لغات ، 12 طبقة ، 768-hidden ، 12 رأس ، 110m المعلماتBERT-Base, Multilingual Uncased (Orig, not recommended)
(غير مستحسن ، استخدم Multilingual Cased
بدلاً من ذلك) : 102 لغة ، 12 طبقة ، 768-حدوث 12 رأسًا ، 110 مترًا.BERT-Base, Chinese
: الصينية مبسطة وتقليدية ، من 12 طبقة ، 768-حار ، 12 رأس ، 110 متر معلماتيحتوي كل ملف .zip على ثلاثة عناصر:
bert_model.ckpt
) التي تحتوي على الأوزان التي تم تدريبها مسبقًا (والتي هي في الواقع 3 ملفات).vocab.txt
) لرسم خريطة WordPiece إلى Word ID.bert_config.json
) الذي يحدد المقاييس المفرطة للنموذج. هام : تم ضبط جميع النتائج على الورقة على سحابة واحدة TPU ، والتي لديها 64 جيجابايت من ذاكرة الوصول العشوائي. لا يمكن حاليًا إعادة إنتاج معظم نتائج BERT-Large
على الورقة باستخدام GPU مع ذاكرة وصول عشوائي من ذاكرة الوصول العشوائي 12 جيجابايت-16 جيجابايت ، لأن الحد الأقصى لحجم الدُفعة الذي يمكن أن يتناسب مع الذاكرة صغير جدًا. نحن نعمل على إضافة رمز إلى هذا المستودع الذي يسمح بحجم دفعة فعال أكبر بكثير على وحدة معالجة الرسومات. راجع القسم الخاص بقضايا خارج الذاكرة لمزيد من التفاصيل.
تم اختبار هذا الرمز مع TensorFlow 1.11.0. تم اختباره باستخدام Python2 و Python3 (ولكن بشكل أكثر شمولية مع Python2 ، لأن هذا هو ما يستخدم داخليًا في Google).
يجب أن تكون أمثلة الضبط التي تستخدم BERT-Base
قادرة على التشغيل على وحدة معالجة الرسومات التي تحتوي على 12 جيجابايت على الأقل من ذاكرة الوصول العشوائي باستخدام فرط البرارامترات المعطاة.
تفترض معظم الأمثلة أدناه أنك ستقوم بتدريب/تقييم على جهازك المحلي ، باستخدام وحدة معالجة الرسومات مثل Titan X أو GTX 1080.
ومع ذلك ، إذا كان لديك إمكانية الوصول إلى TPU السحابة التي تريد التدريب عليها ، فما عليك سوى إضافة الأعلام التالية إلى run_classifier.py
أو run_squad.py
:
--use_tpu=True
--tpu_name=$TPU_NAME
يرجى الاطلاع على البرنامج التعليمي لـ Google Cloud TPU لكيفية استخدام Cloud TPUs. بدلاً من ذلك ، يمكنك استخدام دفتر Google Colab "Bert Finetuning مع Cloud TPUs".
على السحابة tpus ، يجب أن يكون النموذج المسبق ودليل الإخراج على تخزين السحابة من Google. على سبيل المثال ، إذا كان لديك دلو اسمه some_bucket
، فيمكنك استخدام الأعلام التالية بدلاً من ذلك:
--output_dir=gs://some_bucket/my_output_dir/
يمكن أيضًا العثور على ملفات النماذج غير المدربين مسبقًا في مجلد Google Cloud Storage gs://bert_models/2018_10_18
. على سبيل المثال:
export BERT_BASE_DIR=gs://bert_models/2018_10_18/uncased_L-12_H-768_A-12
قبل تشغيل هذا المثال ، يجب عليك تنزيل بيانات الغراء عن طريق تشغيل هذا البرنامج النصي وتفريغه إلى بعض الدليل $GLUE_DIR
. بعد ذلك ، قم بتنزيل نقطة تفتيش BERT-Base
وفك ضغطها إلى بعض الدليل $BERT_BASE_DIR
.
رمز هذا المثال ، يقوم BERT-Base
بشكل جيد على مجموعة Microsoft Research Pararase Corpus (MRPC) ، والتي تحتوي فقط على 3600 أمثلة ويمكنها ضبطها في بضع دقائق على معظم وحدات معالجة الرسومات.
export BERT_BASE_DIR=/path/to/bert/uncased_L-12_H-768_A-12
export GLUE_DIR=/path/to/glue
python run_classifier.py
--task_name=MRPC
--do_train=true
--do_eval=true
--data_dir= $GLUE_DIR /MRPC
--vocab_file= $BERT_BASE_DIR /vocab.txt
--bert_config_file= $BERT_BASE_DIR /bert_config.json
--init_checkpoint= $BERT_BASE_DIR /bert_model.ckpt
--max_seq_length=128
--train_batch_size=32
--learning_rate=2e-5
--num_train_epochs=3.0
--output_dir=/tmp/mrpc_output/
يجب أن ترى الإخراج مثل هذا:
***** Eval results *****
eval_accuracy = 0.845588
eval_loss = 0.505248
global_step = 343
loss = 0.505248
وهذا يعني أن دقة مجموعة DEV كانت 84.55 ٪. مجموعات صغيرة مثل MRPC لها تباين عالي في دقة مجموعة DEV ، حتى عند البدء من نفس نقطة التفتيش قبل التدريب. إذا قمت بإعادة تشغيل عدة مرات (مع التأكد من الإشارة إلى output_dir
مختلفة) ، فيجب أن ترى نتائج تتراوح بين 84 ٪ و 88 ٪.
يتم تنفيذ بعض النماذج الأخرى التي تم تدريبها مسبقًا على الرف في run_classifier.py
، لذلك يجب أن يكون من السهل اتباع هذه الأمثلة لاستخدام Bert لأي مهمة تصنيف للبيع أو الجملة.
ملاحظة: قد ترى رسالة Running train on CPU
. هذا يعني حقًا أنه يعمل على شيء آخر غير سحابة TPU ، والذي يتضمن وحدة معالجة الرسومات.
بمجرد تدريب المصنف الخاص بك ، يمكنك استخدامه في وضع الاستدلال باستخدام -do_predict = الأمر الحقيقي. تحتاج إلى الحصول على ملف اسمه test.tsv في مجلد الإدخال. سيتم إنشاء الإخراج في ملف يسمى test_results.tsv في مجلد الإخراج. سيحتوي كل سطر على إخراج لكل عينة ، الأعمدة هي احتمالات الفئة.
export BERT_BASE_DIR=/path/to/bert/uncased_L-12_H-768_A-12
export GLUE_DIR=/path/to/glue
export TRAINED_CLASSIFIER=/path/to/fine/tuned/classifier
python run_classifier.py
--task_name=MRPC
--do_predict=true
--data_dir= $GLUE_DIR /MRPC
--vocab_file= $BERT_BASE_DIR /vocab.txt
--bert_config_file= $BERT_BASE_DIR /bert_config.json
--init_checkpoint= $TRAINED_CLASSIFIER
--max_seq_length=128
--output_dir=/tmp/mrpc_output/
مجموعة بيانات الإجابة على أسئلة Stanford (Squad) هي مجموعة بيانات معيارية شائعة في الإجابة على أسئلة. يحصل BERT (في وقت الإصدار) على نتائج حديثة على الفريق مع عدم وجود تعديلات بنية الشبكة الخاصة بالمهمة أو زيادة البيانات. ومع ذلك ، فإنه يتطلب المعالجة المسبقة لبيانات ما قبل البيانات وبعد المعالجة للتعامل مع (أ) الطبيعة المتغيرة طول الفقرات في سياق الفريق ، و (ب) التعليقات التوضيحية للإجابة على مستوى الشخصية التي تستخدم لتدريب الفريق. يتم تنفيذ هذه المعالجة وتوثيقها في run_squad.py
.
لتشغيل Squad ، ستحتاج أولاً إلى تنزيل مجموعة البيانات. لا يبدو أن موقع Squad يربط بمجموعات بيانات V1.1 ، ولكن يمكن العثور على الملفات اللازمة هنا:
قم بتنزيل هذه إلى بعض الدليل $SQUAD_DIR
.
لا يمكن استنساخ فرقة الفريق الحديثة من الورقة حاليًا على وحدة معالجة الرسومات بحجم 12 جيجا بايت إلى 16 جيجابايت بسبب قيود الذاكرة (في الواقع ، لا يبدو أن حجم الدُفعات 1 يتناسب مع وحدة معالجة الرسومات بحجم 12 جيجابايت باستخدام BERT-Large
). ومع ذلك ، يمكن تدريب نموذج BERT-Base
قوي بشكل معقول على وحدة معالجة الرسومات مع هذه المقاييس المفرطة:
python run_squad.py
--vocab_file= $BERT_BASE_DIR /vocab.txt
--bert_config_file= $BERT_BASE_DIR /bert_config.json
--init_checkpoint= $BERT_BASE_DIR /bert_model.ckpt
--do_train=True
--train_file= $SQUAD_DIR /train-v1.1.json
--do_predict=True
--predict_file= $SQUAD_DIR /dev-v1.1.json
--train_batch_size=12
--learning_rate=3e-5
--num_train_epochs=2.0
--max_seq_length=384
--doc_stride=128
--output_dir=/tmp/squad_base/
سيتم حفظ تنبؤات مجموعة DEV في ملف يسمى predictions.json
في output_dir
:
python $SQUAD_DIR /evaluate-v1.1.py $SQUAD_DIR /dev-v1.1.json ./squad/predictions.json
التي يجب أن تنتج ناتج مثل هذا:
{ " f1 " : 88.41249612335034, " exact_match " : 81.2488174077578}
يجب أن ترى نتيجة مشابهة لـ 88.5 ٪ المذكورة في الورقة لـ BERT-Base
.
إذا كان لديك إمكانية الوصول إلى TPU السحابة ، فيمكنك التدريب مع BERT-Large
. فيما يلي مجموعة من أجهزة Hyperparameters (مختلفة قليلاً عن الورقة) التي تحصل باستمرار على حوالي 90.5 ٪ -91.0 ٪ من نظام F1 واحد فقط على الفريق:
python run_squad.py
--vocab_file= $BERT_LARGE_DIR /vocab.txt
--bert_config_file= $BERT_LARGE_DIR /bert_config.json
--init_checkpoint= $BERT_LARGE_DIR /bert_model.ckpt
--do_train=True
--train_file= $SQUAD_DIR /train-v1.1.json
--do_predict=True
--predict_file= $SQUAD_DIR /dev-v1.1.json
--train_batch_size=24
--learning_rate=3e-5
--num_train_epochs=2.0
--max_seq_length=384
--doc_stride=128
--output_dir=gs://some_bucket/squad_large/
--use_tpu=True
--tpu_name= $TPU_NAME
على سبيل المثال ، ينتج تشغيل عشوائي واحد مع هذه المعلمات درجات DEV التالية:
{ " f1 " : 90.87081895814865, " exact_match " : 84.38978240302744}
إذا قمت بتشغيل حقبة واحدة على TriviaQa قبل ذلك ، فستكون النتائج أفضل ، ولكن ستحتاج إلى تحويل TriviaQa إلى تنسيق JSON Squad.
يتم تنفيذ هذا النموذج أيضًا وتوثيقه في run_squad.py
.
لتشغيل Squad 2.0 ، ستحتاج أولاً إلى تنزيل مجموعة البيانات. يمكن العثور على الملفات اللازمة هنا:
قم بتنزيل هذه إلى بعض الدليل $SQUAD_DIR
.
على Cloud TPU ، يمكنك الركض باستخدام Bert-Large على النحو التالي:
python run_squad.py
--vocab_file= $BERT_LARGE_DIR /vocab.txt
--bert_config_file= $BERT_LARGE_DIR /bert_config.json
--init_checkpoint= $BERT_LARGE_DIR /bert_model.ckpt
--do_train=True
--train_file= $SQUAD_DIR /train-v2.0.json
--do_predict=True
--predict_file= $SQUAD_DIR /dev-v2.0.json
--train_batch_size=24
--learning_rate=3e-5
--num_train_epochs=2.0
--max_seq_length=384
--doc_stride=128
--output_dir=gs://some_bucket/squad_large/
--use_tpu=True
--tpu_name= $TPU_NAME
--version_2_with_negative=True
نفترض أنك قمت بنسخ كل شيء من دليل الإخراج إلى دليل محلي يسمى ./squad/. ستكون تنبؤات مجموعة DEV الأولية في ./squad/predictions.json والاختلافات بين درجة عدم وجود إجابة ("") وأفضل إجابة غير نار لكل سؤال ستكون في الملف ./squad/null_odds.json
قم بتشغيل هذا البرنامج النصي لضبط عتبة للتنبؤ بالإجابات الخالية مقابل الإجابات غير الفريدة:
Python $ squad_dir/evalate-v2.0.py $ squad_dir/dev-v2.0.json ./squad/predictions.json-na-prob-file ./squad/null_odds.json
افترض أن البرنامج النصي يخرج "best_f1_thresh" عتبة. (القيم النموذجية تتراوح بين -1.0 و -5.0). يمكنك الآن إعادة تشغيل النموذج لإنشاء تنبؤات مع العتبة المشتقة أو بدلاً من ذلك يمكنك استخراج الإجابات المناسبة من ./squad/nbest_predictions.json.
python run_squad.py
--vocab_file= $BERT_LARGE_DIR /vocab.txt
--bert_config_file= $BERT_LARGE_DIR /bert_config.json
--init_checkpoint= $BERT_LARGE_DIR /bert_model.ckpt
--do_train=False
--train_file= $SQUAD_DIR /train-v2.0.json
--do_predict=True
--predict_file= $SQUAD_DIR /dev-v2.0.json
--train_batch_size=24
--learning_rate=3e-5
--num_train_epochs=2.0
--max_seq_length=384
--doc_stride=128
--output_dir=gs://some_bucket/squad_large/
--use_tpu=True
--tpu_name= $TPU_NAME
--version_2_with_negative=True
--null_score_diff_threshold= $THRESH
تم ضبط جميع التجارب في الورقة على سحابة TPU ، والتي تحتوي على 64 جيجابايت من ذاكرة الوصول العشوائي. لذلك ، عند استخدام GPU مع ذاكرة الوصول العشوائي 12 جيجابايت-16 جيجابايت ، من المحتمل أن تواجه مشكلات خارج الذاكرة إذا كنت تستخدم نفس المقاييس الموضحة في الورقة.
العوامل التي تؤثر على استخدام الذاكرة هي:
max_seq_length
: تم تدريب النماذج التي تم إصدارها بأطوال تسلسل تصل إلى 512 ، ولكن يمكنك ضبطها مع طول تسلسل أقصر أقصر لحفظ ذاكرة كبيرة. يتم التحكم في هذا بواسطة علامة max_seq_length
في رمز المثال الخاص بنا.
train_batch_size
: استخدام الذاكرة يتناسب مباشرة مع حجم الدُفعة.
نوع النموذج ، BERT-Base
مقابل BERT-Large
: يتطلب طراز BERT-Large
ذاكرة أكثر بكثير من BERT-Base
.
Optimizer : المحسن الافتراضي لـ BERT هو آدم ، الذي يتطلب الكثير من الذاكرة الإضافية لتخزين متجهات m
و v
يمكن أن يؤدي التحول إلى مُحسِّن أكثر كفاءة في الذاكرة إلى تقليل استخدام الذاكرة ، ولكن يمكن أن يؤثر أيضًا على النتائج. لم نجرب محسّلات أخرى للضبط.
باستخدام البرامج النصية للتدريب الافتراضية ( run_classifier.py
و run_squad.py
) ، قمنا بتقييم الحد الأقصى لحجم الدفعة على GPU Titan X (12 جيجابايت من ذاكرة الوصول العشوائي) مع TensorFlow 1.11.0:
نظام | طول SEQ | حجم الدُفعة القصوى |
---|---|---|
BERT-Base | 64 | 64 |
... | 128 | 32 |
... | 256 | 16 |
... | 320 | 14 |
... | 384 | 12 |
... | 512 | 6 |
BERT-Large | 64 | 12 |
... | 128 | 6 |
... | 256 | 2 |
... | 320 | 1 |
... | 384 | 0 |
... | 512 | 0 |
لسوء الحظ ، فإن أحجام الدُفعات القصوى هذه لـ BERT-Large
صغيرة جدًا لدرجة أنها ستضر فعليًا بدقة النموذج ، بغض النظر عن معدل التعلم المستخدم. نحن نعمل على إضافة رمز إلى هذا المستودع الذي سيتيح استخدام أحجام دفع فعالة أكبر بكثير على وحدة معالجة الرسومات. سوف يعتمد الرمز على واحد (أو كليهما) من التقنيات التالية:
تراكم التدرج : عادة ما تكون العينات الموجودة في الحافلة الصغيرة مستقلة فيما يتعلق بالحساب التدريجي (باستثناء تطبيع الدفعة ، والذي لم يتم استخدامه هنا). هذا يعني أنه يمكن تجميع تدرجات الحصارات الصغيرة المتعددة قبل إجراء تحديث الوزن ، وسيكون هذا مكافئًا تمامًا لتحديث أكبر.
تحديد التدرج : الاستخدام الرئيسي لذاكرة GPU/TPU أثناء التدريب DNN هو التخزين المؤقت للتنشيطات الوسيطة في التمريرة الأمامية الضرورية للحساب الفعال في الممر الخلفي. تتداول "تحديد التدرج" ذاكرة "لحساب الوقت عن طريق إعادة حساب التنشيط بطريقة ذكية.
ومع ذلك ، لا يتم تنفيذ هذا في الإصدار الحالي.
في بعض الحالات ، بدلاً من صياغة النموذج الذي تم تدريبه بالكامل ، قد يكون من المفيد الحصول على التضمينات السياقية التي تم تدريبها مسبقًا ، وهي تمثيلات سياقية ثابتة لكل رمز مدخلات تم إنشاؤها من الطبقات المخفية من قبل ما قبل -نموذج مدرب. يجب أن يخفف هذا أيضًا من معظم القضايا خارج الذاكرة.
على سبيل المثال ، نقوم بتضمين البرنامج النصي extract_features.py
الذي يمكن استخدامه مثل هذا:
# Sentence A and Sentence B are separated by the ||| delimiter for sentence
# pair tasks like question answering and entailment.
# For single sentence inputs, put one sentence per line and DON'T use the
# delimiter.
echo ' Who was Jim Henson ? ||| Jim Henson was a puppeteer ' > /tmp/input.txt
python extract_features.py
--input_file=/tmp/input.txt
--output_file=/tmp/output.jsonl
--vocab_file= $BERT_BASE_DIR /vocab.txt
--bert_config_file= $BERT_BASE_DIR /bert_config.json
--init_checkpoint= $BERT_BASE_DIR /bert_model.ckpt
--layers=-1,-2,-3,-4
--max_seq_length=128
--batch_size=8
سيؤدي ذلك إلى إنشاء ملف JSON (سطر واحد لكل سطر من الإدخال) يحتوي على تنشيط BERT من كل طبقة محول محددة بواسطة layers
(-1 هي الطبقة الخفية النهائية للمحول ، إلخ)
لاحظ أن هذا البرنامج النصي سوف ينتج ملفات إخراج كبيرة جدًا (افتراضيًا ، حوالي 15 كيلو بايت لكل رمز إدخال).
إذا كنت بحاجة إلى الحفاظ على المحاذاة بين الكلمات الأصلية والرمز المميز (لإسقاط ملصقات التدريب) ، راجع قسم الرمز المميز أدناه.
ملاحظة: قد ترى رسالة مثل Could not find trained model in model_dir: /tmp/tmpuB5g5c, running initialization to predict.
من المتوقع هذه الرسالة ، فهذا يعني فقط أننا نستخدم API init_from_checkpoint()
بدلاً من واجهة برمجة تطبيقات النموذج المحفوظة. إذا لم تحدد نقطة تفتيش أو حدد نقطة تفتيش غير صالحة ، فسيشتكي هذا البرنامج النصي.
بالنسبة لمهام المهام على مستوى الجملة (أو زوج الجملة) ، فإن الرمز المميز بسيط للغاية. ما عليك سوى اتباع رمز المثال في run_classifier.py
و extract_features.py
. الإجراء الأساسي للمهام على مستوى الجملة هو:
إنشاء مثيل من tokenizer = tokenization.FullTokenizer
رمز النص الخام مع tokens = tokenizer.tokenize(raw_text)
.
اقتطاع إلى الحد الأقصى لطول التسلسل. (يمكنك استخدام ما يصل إلى 512 ، ولكن ربما تريد استخدام أقصر إذا كان ذلك ممكنًا لأسباب الذاكرة والسرعة.)
أضف الرموز المميزة [CLS]
و [SEP]
في المكان الصحيح.
تعد المهام على مستوى النصوص والمستوى الممتد (على سبيل المثال ، Squad و NER) أكثر تعقيدًا ، نظرًا لأنك تحتاج إلى الحفاظ على المحاذاة بين نص الإدخال ونص الإخراج الخاص بك بحيث يمكنك عرض ملصقات التدريب الخاصة بك. يعد Squad مثالًا معقدًا بشكل خاص لأن ملصقات الإدخال قائمة على الشخصية ، وغالبًا ما تكون فقرات الفريق أطول من طول التسلسل الأقصى لدينا. راجع الرمز في run_squad.py
لإظهار كيفية التعامل مع هذا.
قبل وصف الوصفة العامة للتعامل مع مهام مستوى الكلمات ، من المهم أن نفهم بالضبط ما يفعله الرمز المميز. لديها ثلاث خطوات رئيسية:
تطبيع النص : قم بتحويل جميع أحرف المساحة البيضاء إلى المساحات ، و (بالنسبة للنموذج Uncased
) قم بتخفيف الإدخال وتجريد علامات لهجمة. على سبيل المثال ، John Johanson's, → john johanson's,
.
تقسيم علامات الترقيم : تقسيم جميع أحرف علامات الترقيم على كلا الجانبين (أي ، أضف مساحة بيضاء حول جميع أحرف علامات الترقيم). يتم تعريف أحرف علامات الترقيم على أنها (أ) أي شيء يحتوي على فئة P*
unicode ، (ب) أي حرف غير حرفي/رقم/فضاء ASCII (على سبيل المثال ، أحرف مثل $
التي من الناحية الفنية غير علامات الترقيم). على سبيل المثال ، john johanson's, → john johanson ' s ,
رمز WordPiece : قم بتطبيق الرمز المميز للمسافة البيضاء على إخراج الإجراء أعلاه ، وقم بتطبيق رمز WordPiece على كل رمز بشكل منفصل. (يعتمد تنفيذنا مباشرة على واحد من tensor2tensor
، وهو مرتبط). على سبيل المثال ، john johanson ' s , → john johan ##son ' s ,
ميزة هذا المخطط هي أنه "متوافق" مع معظم المميزات الإنجليزية الحالية. على سبيل المثال ، تخيل أن لديك مهمة وضع علامة على جزء من الكلام والتي تبدو هكذا:
Input: John Johanson 's house
Labels: NNP NNP POS NN
سيبدو الإخراج المميز هكذا:
Tokens: john johan ##son ' s house
من الأهمية بمكان ، سيكون هذا هو نفس الناتج كما لو كان النص الخام هو John Johanson's house
(بدون مساحة 's
).
إذا كان لديك تمثيل مسبقًا مع تعليقات التعليقات التوضيحية على مستوى الكلمات ، فيمكنك ببساطة رمز كل كلمة إدخال بشكل مستقل ، والحفاظ على محاذاة أصلية إلى محسوسة:
### Input
orig_tokens = [ "John" , "Johanson" , "'s" , "house" ]
labels = [ "NNP" , "NNP" , "POS" , "NN" ]
### Output
bert_tokens = []
# Token map will be an int -> int mapping between the `orig_tokens` index and
# the `bert_tokens` index.
orig_to_tok_map = []
tokenizer = tokenization . FullTokenizer (
vocab_file = vocab_file , do_lower_case = True )
bert_tokens . append ( "[CLS]" )
for orig_token in orig_tokens :
orig_to_tok_map . append ( len ( bert_tokens ))
bert_tokens . extend ( tokenizer . tokenize ( orig_token ))
bert_tokens . append ( "[SEP]" )
# bert_tokens == ["[CLS]", "john", "johan", "##son", "'", "s", "house", "[SEP]"]
# orig_to_tok_map == [1, 2, 4, 6]
الآن يمكن استخدام orig_to_tok_map
لتسجيل labels
للتمثيل المميز.
هناك مخططات رمزية شائعة باللغة الإنجليزية والتي من شأنها أن تسبب عدم تطابق طفيف بين كيفية تدريب Bert مسبقًا. على سبيل المثال ، إذا انقسمت رمز الإدخال الخاص بك عن الانقباضات كما do n't
، فسيؤدي ذلك إلى عدم تطابق. إذا كان من الممكن القيام بذلك ، فيجب عليك تجهيز بياناتك مسبقًا لتحويلها إلى النص الخام ، ولكن إذا لم يكن ذلك ممكنًا ، فمن المحتمل أن يكون عدم التطابق هذا أمرًا كبيرًا.
نقوم بإصدار رمز للقيام "Masked LM" و "التنبؤ بالجملة التالية" على مجموعة نصية تعسفية. لاحظ أن هذا ليس هو الكود الدقيق الذي تم استخدامه للورقة (تمت كتابة الرمز الأصلي في C ++ ، وكان لديه بعض التعقيد الإضافي) ، لكن هذا الرمز يولد بيانات ما قبل التدريب كما هو موضح في الورقة.
إليك كيفية تشغيل توليد البيانات. الإدخال هو ملف نصي عادي ، مع جملة واحدة لكل سطر. (من المهم أن تكون هذه الجمل الفعلية لمهمة "التنبؤ بالجملة التالية"). يتم تحديد المستندات بخطوط فارغة. الإخراج عبارة عن مجموعة من tf.train.Example
S المسلسل في تنسيق ملف TFRecord
.
يمكنك إجراء تجزئة الجملة مع مجموعة أدوات NLP خارج الجرف مثل Spacy. سيقوم برنامج create_pretraining_data.py
بتسلق الأجزاء حتى تصل إلى الحد الأقصى لطول التسلسل لتقليل النفايات الحسابية من الحشو (انظر البرنامج النصي لمزيد من التفاصيل). ومع ذلك ، قد ترغب في إضافة كمية طفيفة من الضوضاء عن عمد إلى بيانات الإدخال الخاصة بك (على سبيل المثال ، اقتطاع 2 ٪ بشكل عشوائي من قطاعات الإدخال) لجعلها أكثر قوة إلى المدخلات غير الوضعية أثناء الضبط.
يقوم هذا البرنامج النصي بتخزين جميع الأمثلة على ملف الإدخال بأكمله في الذاكرة ، لذلك بالنسبة لملفات البيانات الكبيرة ، يجب عليك تقطيع ملف الإدخال والاتصال بالبرنامج النصي عدة مرات. (يمكنك المرور في ملف ملف إلى run_pretraining.py
، على سبيل المثال ، tf_examples.tf_record*
.)
max_predictions_per_seq
هو الحد الأقصى لعدد التنبؤات LM المقنعة لكل تسلسل. يجب عليك تعيين هذا إلى max_seq_length
* masked_lm_prob
(البرنامج النصي لا يفعل ذلك تلقائيًا لأن القيمة الدقيقة تحتاج إلى تمريرها إلى كلا النصوص).
python create_pretraining_data.py
--input_file=./sample_text.txt
--output_file=/tmp/tf_examples.tfrecord
--vocab_file= $BERT_BASE_DIR /vocab.txt
--do_lower_case=True
--max_seq_length=128
--max_predictions_per_seq=20
--masked_lm_prob=0.15
--random_seed=12345
--dupe_factor=5
إليك كيفية تشغيل التدريب المسبق. لا تتضمن init_checkpoint
إذا كنت تدرب مسبقًا من الصفر. تم تحديد تكوين النموذج (بما في ذلك حجم المفردات) في bert_config_file
. هذا الرمز التجريبي هذا فقط مسبقات فقط لعدد صغير من الخطوات (20) ، ولكن في الممارسة العملية ربما ترغب في تعيين num_train_steps
على 10000 خطوة أو أكثر. يجب أن تكون معلمات max_seq_length
و max_predictions_per_seq
التي تم تمريرها إلى run_pretraining.py
هي نفسها مثل create_pretraining_data.py
.
python run_pretraining.py
--input_file=/tmp/tf_examples.tfrecord
--output_dir=/tmp/pretraining_output
--do_train=True
--do_eval=True
--bert_config_file= $BERT_BASE_DIR /bert_config.json
--init_checkpoint= $BERT_BASE_DIR /bert_model.ckpt
--train_batch_size=32
--max_seq_length=128
--max_predictions_per_seq=20
--num_train_steps=20
--num_warmup_steps=10
--learning_rate=2e-5
سيؤدي هذا إلى إنتاج مثل هذا:
***** Eval results *****
global_step = 20
loss = 0.0979674
masked_lm_accuracy = 0.985479
masked_lm_loss = 0.0979328
next_sentence_accuracy = 1.0
next_sentence_loss = 3.45724e-05
لاحظ أنه نظرًا لأن ملف sample_text.txt
صغير جدًا ، فإن التدريب على هذا المثال سيتغلب على البيانات في بضع خطوات فقط وينتج أرقام دقة عالية بشكل غير واقعي.
vocab_size
في bert_config.json
. إذا كنت تستخدم مفردات أكبر دون تغيير هذا ، فمن المحتمل أن تحصل على NANS عند التدريب على GPU أو TPU بسبب وصول غير مرغوب فيه.max_seq_length
.BERT-Base
على سحابة واحدة مسبقًا TPU V2 ، والتي تستغرق حوالي أسبوعين بتكلفة حوالي 500 دولار أمريكي (بناءً على الأسعار في أكتوبر 2018) . سيتعين عليك تقليص حجم الدفعة عند التدريب فقط على سحابة واحدة من TPU ، مقارنة بما تم استخدامه في الورقة. يوصى باستخدام أكبر حجم دفعة يناسب ذاكرة TPU. لن نتمكن من إصدار مجموعات البيانات المعالجة مسبقًا المستخدمة في الورقة. بالنسبة إلى ويكيبيديا ، فإن المعالجة المسبقة الموصى بها هي تنزيل أحدث تفريغ ، واستخراج النص باستخدام WikiExtractor.py
، ثم تطبيق أي تنظيف ضروري لتحويله إلى نص عادي.
لسوء الحظ ، لم يعد الباحثون الذين جمعوا BookCorpus متاحًا للتنزيل العام. مجموعة بيانات Project Guttenberg هي مجموعة أصغر إلى حد ما (200 متر كلمة) من الكتب القديمة التي هي المجال العام.
الزحف الشائع هو مجموعة كبيرة جدًا من النصوص ، ولكن على الأرجح سيتعين عليك القيام بالمعالجة المسبقة والتنظيف بشكل كبير لاستخراج مجموعة قابلة للاستخدام لبرت قبل التدريب.
لا يتضمن هذا المستودع رمزًا لتعلم مفردات وورد جديدة. The reason is that the code used in the paper was implemented in C++ with dependencies on Google's internal libraries. For English, it is almost always better to just start with our vocabulary and pre-trained models. For learning vocabularies of other languages, there are a number of open source options available. However, keep in mind that these are not compatible with our tokenization.py
library:
Google's SentencePiece library
tensor2tensor's WordPiece generation script
Rico Sennrich's Byte Pair Encoding library
If you want to use BERT with Colab, you can get started with the notebook "BERT FineTuning with Cloud TPUs". At the time of this writing (October 31st, 2018), Colab users can access a Cloud TPU completely for free. Note: One per user, availability limited, requires a Google Cloud Platform account with storage (although storage may be purchased with free credit for signing up with GCP), and this capability may not longer be available in the future. Click on the BERT Colab that was just linked for more information.
Yes, all of the code in this repository works out-of-the-box with CPU, GPU, and Cloud TPU. However, GPU training is single-GPU only.
See the section on out-of-memory issues for more information.
There is no official PyTorch implementation. However, NLP researchers from HuggingFace made a PyTorch version of BERT available which is compatible with our pre-trained checkpoints and is able to reproduce our results. We were not involved in the creation or maintenance of the PyTorch implementation so please direct any questions towards the authors of that repository.
There is no official Chainer implementation. However, Sosuke Kobayashi made a Chainer version of BERT available which is compatible with our pre-trained checkpoints and is able to reproduce our results. We were not involved in the creation or maintenance of the Chainer implementation so please direct any questions towards the authors of that repository.
Yes, we plan to release a multi-lingual BERT model in the near future. We cannot make promises about exactly which languages will be included, but it will likely be a single model which includes most of the languages which have a significantly-sized Wikipedia.
BERT-Large
be released? So far we have not attempted to train anything larger than BERT-Large
. It is possible that we will release larger models if we are able to obtain significant improvements.
All code and models are released under the Apache 2.0 license. انظر ملف LICENSE
لمزيد من المعلومات.
For now, cite the Arxiv paper:
@article{devlin2018bert,
title={BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding},
author={Devlin, Jacob and Chang, Ming-Wei and Lee, Kenton and Toutanova, Kristina},
journal={arXiv preprint arXiv:1810.04805},
year={2018}
}
If we submit the paper to a conference or journal, we will update the BibTeX.
This is not an official Google product.
For help or issues using BERT, please submit a GitHub issue.
For personal communication related to BERT, please contact Jacob Devlin ( [email protected]
), Ming-Wei Chang ( [email protected]
), or Kenton Lee ( [email protected]
).