كيفية تدريب نموذج بيرت من الصفر

عقدة المصدر: 1013329

كيفية تدريب نموذج بيرت من الصفر

قابل ابن عم بيرت الإيطالي ، فيليبيرتو.


By جيمس بريجز، عالم البيانات



بيرت، ولكن في إيطاليا — الصورة من قبل المؤلف

 

لقد ركزت العديد من مقالاتي على BERT - النموذج الذي جاء وهيمن على عالم معالجة اللغة الطبيعية (NLP) وشكل عصرًا جديدًا لنماذج اللغة.

بالنسبة لأولئك منكم الذين ربما لم يستخدموا نماذج المحولات (على سبيل المثال ما هو BERT) من قبل، تبدو العملية كما يلي:

  • pip install transformers
  • تهيئة نموذج المحولات المدربة مسبقًا - from_pretrained.
  • اختباره على بعض البيانات.
  • ربما قم بضبط النموذج (قم بتدريبه أكثر).

الآن، هذا نهج رائع، ولكن إذا فعلنا ذلك فقط، فإننا نفتقر إلى الفهم الكامن وراء إنشاء نماذج المحولات الخاصة بنا.

وإذا لم نتمكن من إنشاء نماذج المحولات الخاصة بنا - فيجب أن نعتمد على وجود نموذج مدرب مسبقًا يناسب مشكلتنا، فهذا ليس هو الحال دائمًا:



بعض التعليقات تسأل عن نماذج BERT غير الإنجليزية

 

لذلك، في هذه المقالة، سوف نستكشف الخطوات التي يجب علينا اتخاذها لبناء نموذج المحول الخاص بنا - وتحديدًا نسخة مطورة أخرى من BERT، تسمى RoBERTa.

لمحة عامة

 
 
هناك بضع خطوات لهذه العملية، لذا قبل أن نتعمق فيها، دعونا أولاً نلخص ما يتعين علينا القيام به. في المجموع، هناك أربعة أجزاء رئيسية:

  • الحصول على البيانات
  • بناء رمز مميز
  • إنشاء خط أنابيب الإدخال
  • تدريب النموذج

بمجرد الانتهاء من العمل على كل قسم من هذه الأقسام، سنأخذ الرمز المميز والنموذج الذي أنشأناه - ونحفظهما معًا حتى نتمكن بعد ذلك من استخدامهما بنفس الطريقة التي نستخدمها عادةً مع from_pretrained.

الحصول على البيانات

 
 
كما هو الحال مع أي مشروع للتعلم الآلي، نحتاج إلى البيانات. فيما يتعلق بالبيانات اللازمة لتدريب نموذج المحولات، فنحن حقًا مدللون للاختيار - يمكننا استخدام أي بيانات نصية تقريبًا.



مقطع فيديو تفصيلي لتنزيل مجموعة بيانات OSCAR باستخدام مكتبة مجموعات بيانات HuggingFace

 

وإذا كان هناك شيء واحد متوفر لدينا بكثرة على الإنترنت، فهو البيانات النصية غير المنظمة.

واحدة من أكبر مجموعات البيانات في مجال النص المستخرج من الإنترنت هي مجموعة بيانات OSCAR.

تضم مجموعة بيانات OSCAR عددًا كبيرًا من اللغات المختلفة - وواحدة من أوضح حالات الاستخدام للتدريب من الصفر هي أن نتمكن من تطبيق BERT على بعض اللغات الأقل استخدامًا، مثل Telugu أو Navajo.

لسوء الحظ، اللغة الوحيدة التي يمكنني التحدث بها بأي درجة من الكفاءة هي اللغة الإنجليزية - لكن صديقتي إيطالية، ولذا ستقوم - لورا، بتقييم نتائج نموذج BERT الناطق باللغة الإيطالية - FiliBERTO.

لذا، لتنزيل الجزء الإيطالي من مجموعة بيانات OSCAR، سنستخدم HuggingFace's datasets المكتبة - والتي يمكننا التثبيت بها pip install datasets. ثم نقوم بتنزيل OSCAR_IT باستخدام:

دعونا نلقي نظرة على dataset موضوع.

رائع، فلنقم الآن بتخزين بياناتنا بتنسيق يمكننا استخدامه عند إنشاء رمزنا المميز. نحن بحاجة إلى إنشاء مجموعة من الملفات النصية العادية التي تحتوي فقط على text ميزة من مجموعة البيانات لدينا، وسوف نقوم بتقسيم كل منها عينة باستخدام السطر الجديد n.

في موقعنا data/text/oscar_it الدليل سوف نجد :


لقطة شاشة تعرض نافذة مستكشف Windows مليئة بملفات .txt - التي تمثل بيانات OSCAR ذات النص العادي
الدليل الذي يحتوي على ملفات OSCAR ذات النص العادي

 

بناء رمز مميز

 
 
التالي هو الرمز المميز! عند استخدام المحولات، نقوم عادةً بتحميل رمز مميز، جنبًا إلى جنب مع نموذج المحول الخاص به - يعد رمز الرمز المميز مكونًا رئيسيًا في العملية.



مقطع فيديو تفصيلي لإنشاء أداة الرموز المميزة الخاصة بنا

 

عند إنشاء أداة الرمز المميزة الخاصة بنا، سنقوم بتزويدها بجميع بيانات OSCAR الخاصة بنا، وتحديد حجم المفردات لدينا (عدد الرموز المميزة في أداة الرمز المميزة)، وأي رموز مميزة خاصة.

الآن، تبدو رموز RoBERTa المميزة كما يلي:

لذلك، نحن نتأكد من إدراجها ضمن special_tokens معلمة الرمز المميز الخاص بنا train طريقة الاتصال.

أصبح رمزنا المميز جاهزًا الآن، ويمكننا حفظه في ملف لاستخدامه لاحقًا:

الآن لدينا ملفان يحددان ملفنا الجديد فيليبيرتو رمز مميز:

  • merges.txt - ينفذ التعيين الأولي للنص إلى الرموز المميزة
  • vocab.json - يقوم بتعيين الرموز المميزة لمعرفات الرمز المميز

ومع ذلك، يمكننا الانتقال إلى تهيئة أداة الرمز المميزة الخاصة بنا حتى نتمكن من استخدامها كما نستخدم أي أداة أخرى from_pretrained رمز مميز.

تهيئة الرمز المميز

 
 
نقوم أولاً بتهيئة أداة الرمز المميز باستخدام الملفين اللذين أنشأناهما من قبل — باستخدام ملف بسيط from_pretrained:

الآن أصبح برنامج الرمز المميز الخاص بنا جاهزًا، ويمكننا محاولة تشفير بعض النصوص باستخدامه. عند التشفير نستخدم نفس الطريقتين اللتين نستخدمهما عادة، encode و  encode_batch.

من كائن الترميزات tokens سوف نقوم باستخراج input_ids و  attention_mask الموترات للاستخدام مع FiliBERTo.

إنشاء خط أنابيب الإدخال

 
 
يعد مسار المدخلات لعملية التدريب لدينا هو الجزء الأكثر تعقيدًا من العملية برمتها. وهو يتألف من أخذ بياناتنا التدريبية الأولية لـ OSCAR، وتحويلها، وتحميلها إلى ملف DataLoader جاهز للتدريب.



فيديو تفصيلي لخط أنابيب إدخال الامتيازات والرهونات البحرية

 

تجهيز البيانات

 
 
سنبدأ بعينة واحدة ونعمل من خلال منطق الإعداد.

أولاً، نحتاج إلى فتح ملفنا - نفس الملفات التي حفظناها بها .رسالة قصيرة الملفات في وقت سابق. قمنا بتقسيم كل منها بناءً على أحرف السطر الجديد n كما يشير هذا إلى العينات الفردية.

ثم نقوم بتشفير بياناتنا باستخدام tokenizer - التأكد من تضمين المعلمات الرئيسية مثل max_lengthpaddingو truncation.

والآن يمكننا الانتقال إلى إنشاء الموترات الخاصة بنا - سنقوم بتدريب نموذجنا من خلال نمذجة اللغة المقنعة (MLM). لذلك، نحن بحاجة إلى ثلاثة الموترات:

  • المدخلات - ملكنا token_ids مع إخفاء ~15% من الرموز باستخدام رمز القناع <mask>.
  • قناع_الاهتمام - موتر 1الصورة و 0s، لتحديد موضع الرموز المميزة/رموز الحشو "الحقيقية" - المستخدمة في حسابات الانتباه.
  • التسميات - ملكنا token_ids مع لا قناع.

إذا لم تكن على دراية بالامتيازات والرهون البحرية، فقد شرحت ذلك هنا.

الأهداف و attention_mask و  labels يتم استخراج الموترات ببساطة من موقعنا batchinput_ids تتطلب الموترات مزيدًا من الاهتمام، ومع ذلك، بالنسبة لهذا الموتر، نقوم بإخفاء 15% تقريبًا من الرموز المميزة - ونخصص لها معرف الرمز المميز 3.

في الإخراج النهائي، يمكننا أن نرى جزءا من المشفرة input_ids الموتر. معرف الرمز المميز الأول هو 1 - لل [CLS] رمز مميز. منقط حول الموتر لدينا عدة 3 معرفات الرموز المميزة - هذه هي معرفاتنا المضافة حديثًا [MASK] الرموز.

بناء محمل البيانات

 
 
بعد ذلك، نحدد لدينا Dataset فئة - والتي نستخدمها لتهيئة الموترات الثلاثة المشفرة لدينا باسم PyTorch torch.utils.data.Dataset شاء.

أخيرًا ، لدينا dataset يتم تحميله في PyTorch DataLoader الكائن - الذي نستخدمه لتحميل بياناتنا في نموذجنا أثناء التدريب.

تدريب النموذج

 
 
نحن بحاجة إلى شيئين للتدريب، لدينا DataLoader ونموذج. ال DataLoader لدينا - ولكن لا يوجد نموذج.



تهيئة النموذج

 
 
للتدريب نحتاج إلى خام (غير مدرب مسبقًا) BERTLMHeadModel. لإنشاء ذلك، نحتاج أولاً إلى إنشاء كائن تكوين RoBERTa لوصف المعلمات التي نرغب في تهيئة FiliBERTo بها.

بعد ذلك، نقوم باستيراد وتهيئة نموذج RoBERTa الخاص بنا باستخدام رأس نمذجة اللغة (LM).

إعداد التدريب

 
 
قبل الانتقال إلى حلقة التدريب الخاصة بنا، نحتاج إلى إعداد بعض الأشياء. أولاً، قمنا بإعداد استخدام GPU/CPU. ثم نقوم بتنشيط وضع التدريب الخاص بنموذجنا، وأخيرًا، نقوم بتهيئة مُحسِّننا.

قادة الإيمان

 
 
وأخيرا – وقت التدريب! نحن نتدرب تمامًا كما نفعل عادةً عند التدريب عبر PyTorch.

إذا توجهنا إلى Tensorboard فسنجد خسارتنا بمرور الوقت - يبدو الأمر واعدًا.



الخسارة / الوقت - تم دمج جلسات تدريبية متعددة معًا في هذا المخطط

 

الاختبار الحقيقي

 
 
والآن حان وقت الاختبار الحقيقي. أنشأنا خط أنابيب الامتيازات والرهونات البحرية – وطلبنا من لورا تقييم النتائج. يمكنكم مشاهدة المراجعة بالفيديو عند الساعة 22:44 هنا:



نقوم أولا بتهيئة أ pipeline الكائن باستخدام 'fill-mask' دعوى. ثم ابدأ باختبار نموذجنا كالتالي:

"تشاو تأتي فا؟" هو الجواب الصحيح! هذا هو المستوى المتقدم الذي وصلت إليه لغتي الإيطالية - لذا، دعنا نسلمه إلى لورا.

نبدأ مع "buongiorno، تعال فا؟" - أو "يوم جيد كيف حالك؟":

الجواب الأول، "buongiorno، chi va؟" يعني "يوم جيد، من هناك؟" - على سبيل المثال لا معنى له. لكن إجابتنا الثانية هي الصحيحة!

التالي، عبارة أصعب قليلا، "تشاو، حمامة ci incontriamo oggi pomeriggio؟" - أو "مرحبا، أين سنلتقي بعد ظهر هذا اليوم؟":

ونعود ببعض النتائج الإيجابية:

✅ "hi, where do we see each other this afternoon?"
✅ "hi, where do we meet this afternoon?"
❌ "hi, where here we are this afternoon?"
✅ "hi, where are we meeting this afternoon?"
✅ "hi, where do we meet this afternoon?"

وأخيرًا، جملة أخرى أصعب، "لماذا يجب أن يكون النجاح سريعًا في يوم آخر؟" - أو "ماذا كان سيحدث لو اخترنا يومًا آخر؟":

نعيد بعض الإجابات الجيدة هنا أيضًا:

✅ "what would have happened if we had chosen another day?"
✅ "what would have happened if I had chosen another day?"
✅ "what would have happened if they had chosen another day?"
✅ "what would have happened if you had chosen another day?"
❌ "what would have happened if another day was chosen?"

بشكل عام، يبدو أن نموذجنا اجتاز اختبارات Laura - ولدينا الآن نموذج كفؤ باللغة الإيطالية يسمى FiliBERTo!

هذا كل ما في هذه الإرشادات التفصيلية لتدريب نموذج BERT من الصفر!

لقد غطينا الكثير من الأمور، بدءًا من الحصول على بياناتنا وتنسيقها - وصولاً إلى استخدام نمذجة اللغة لتدريب نموذج BERT الأولي الخاص بنا.

آمل أن يحظى هذا المقال بإعجابكم! إذا كان لديك أي أسئلة، اسمحوا لي أن أعرف عبر  تويتر أو في التعليقات أدناه. إذا كنت تريد المزيد من المحتوى مثل هذا، فأنا أقوم بالنشر  يوتيوب أيضا.

شكرا للقراءة!

 

70٪ خصم! معالجة اللغات الطبيعية: البرمجة اللغوية العصبية مع المحولات في بيثون

نماذج المحولات هي المعيار الفعلي في البرمجة اللغوية العصبية الحديثة. لقد أثبتوا أنهم الأكثر تعبيرا …
 

* جميع الصور من قبل المؤلف ما لم ينص على خلاف ذلك

 
السيرة الذاتية: جيمس بريجز هو عالم بيانات متخصص في معالجة اللغة الطبيعية ويعمل في القطاع المالي ، ومقره لندن ، المملكة المتحدة. وهو أيضًا مرشد مستقل وكاتب ومنشئ محتوى. يمكنك الوصول إلى المؤلف عبر البريد الإلكتروني (jamescalam94@gmail.com).

أصلي. تم إعادة النشر بإذن.

هذا الموضوع ذو علاقة بـ:

المصدر: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

الطابع الزمني:

اكثر من KD nuggets