Path: blob/main/transformers_doc/ar/tensorflow/masked_language_modeling.ipynb
4544 views
نمذجة اللغة المقنعة (Masked language modeling)
تتنبأ نمذجة اللغة المقنعة برمز مقنع في تسلسل، ويمكن للنموذج الانتباه إلى الرموز بشكل ثنائي الاتجاه. هذا يعني أن النموذج لديه إمكانية الوصول الكاملة إلى الرموز الموجودة على اليسار واليمين. تعد نمذجة اللغة المقنعة ممتازة للمهام التي تتطلب فهمًا سياقيًا جيدًا لتسلسل كامل. BERT هو مثال على نموذج لغة مقنع.
سيوضح لك هذا الدليل كيفية:
تكييف DistilRoBERTa على مجموعة فرعية r/askscience من مجموعة بيانات ELI5.
استخدام نموذج المدرب الخاص بك للاستدلال.
لمعرفة جميع البنى والنسخ المتوافقة مع هذه المهمة، نوصي بالتحقق من صفحة المهمة
قبل أن تبدأ، تأكد من تثبيت جميع المكتبات الضرورية:
نحن نشجعك على تسجيل الدخول إلى حساب Hugging Face الخاص بك حتى تتمكن من تحميل ومشاركة نموذجك مع المجتمع. عندما تتم مطالبتك، أدخل رمزك لتسجيل الدخول:
تحميل مجموعة بيانات ELI5
ابدأ بتحميل أول 5000 مثال من مجموعة بيانات ELI5-Category باستخدام مكتبة 🤗 Datasets. سيعطيك هذا فرصة للتجربة والتأكد من أن كل شيء يعمل قبل قضاء المزيد من الوقت في التدريب على مجموعة البيانات الكاملة.
قم بتقسيم مجموعة البيانات train
إلى مجموعتي تدريب واختبار باستخدام الدالة train_test_split
:
ثم ألق نظرة على مثال:
على الرغم من أن هذا قد يبدو كثيرًا، إلا أنك مهتم حقًا بحقل text
. ما هو رائع حول مهام نمذجة اللغة هو أنك لا تحتاج إلى تسميات (تُعرف أيضًا باسم المهمة غير الخاضعة للإشراف) لأن الكلمة التالية هي التسمية.
معالجة مسبقة (Preprocess)
بالنسبة لنمذجة اللغة المقنعة، فإن الخطوة التالية هي تحميل معالج DistilRoBERTa لمعالجة حقل text
الفرعي:
ستلاحظ من المثال أعلاه، أن حقل text
موجود بالفعل داخل answers
. هذا يعني أنك ستحتاج إلى استخراج حقل text
الفرعي من بنيته المضمنة باستخدام الدالة flatten
:
كل حقل فرعي هو الآن عمود منفصل كما هو موضح بواسطة بادئة answers
، وحقل text
هو قائمة الآن. بدلاً من معالجة كل جملة بشكل منفصل، قم بتحويل القائمة إلى سلسلة حتى تتمكن من معالجتها بشكل مشترك.
هنا أول دالة معالجة مسبقة لربط قائمة السلاسل لكل مثال ومعالجة النتيجة:
لتطبيق دالة المعالجة المسبقة على مجموعة البيانات بأكملها، استخدم الدالة 🤗 Datasets map
. يمكنك تسريع دالة map
عن طريق تعيين batched=True
لمعالجة عدة عناصر في وقت واحد، وزيادة عدد العمليات باستخدام num_proc
. احذف أي أعمدة غير ضرورية:
تحتوي مجموعة البيانات هذه على تسلسلات رمزية، ولكن بعضها أطول من الطول الأقصى للمدخلات للنموذج.
يمكنك الآن استخدام دالة معالجة مسبقة ثانية لـ:
تجميع جميع التسلسلات
تقسيم التسلسلات المجمّعة إلى أجزاء أقصر محددة بـ
block_size
، والتي يجب أن تكون أقصر من الحد الأقصى لطول المدخلات ومناسبة لذاكرة GPU.
طبق دالة group_texts
على مجموعة البيانات بأكملها:
الآن، قم بإنشاء دفعة من الأمثلة باستخدام DataCollatorForLanguageModeling
. من الأكثر كفاءة أن تقوم بـ الحشو الديناميكي ليصل طولها إلى أطول جملة في الدفعة أثناء التجميع، بدلاً من حشو مجموعة البيانات بأكملها إلى الطول الأقصى.
استخدم رمز نهاية التسلسل كرمز الحشو وحدد mlm_probability
لحجب الرموز عشوائياً كل مرة تكرر فيها البيانات:
التدريب (Train)
إذا لم تكن على دراية بتعديل نموذج باستخدام Keras، ألق نظرة على الدليل الأساسي هنا!
ثم يمكنك تحميل DistilRoBERTa باستخدام TFAutoModelForMaskedLM
:
قم بتحويل مجموعات بياناتك إلى تنسيق tf.data.Dataset
باستخدام prepare_tf_dataset()
:
قم بتهيئة النموذج للتدريب باستخدام compile
. لاحظ أن نماذج Transformers لديها جميعها دالة خسارة افتراضية ذات صلة بالمهمة، لذلك لا تحتاج إلى تحديد واحدة ما لم تكن تريد ذلك:
يمكن القيام بذلك عن طريق تحديد مكان دفع نموذجك ومعالج الرموز في PushToHubCallback
:
أخيراً، أنت مستعد لبدء تدريب نموذجك! قم باستدعاء fit
مع مجموعات بيانات التدريب والتحقق، وعدد العصور، والتعليقات الخاصة بك لتعديل النموذج:
بمجرد اكتمال التدريب، يتم تحميل نموذجك تلقائياً إلى Hub حتى يتمكن الجميع من استخدامه!
لمثال أكثر تفصيلاً حول كيفية تعديل نموذج للنمذجة اللغوية المقنعة، ألق نظرة على الدفتر المقابل دفتر PyTorch أو دفتر TensorFlow.
الاستدلال
رائع، الآن بعد أن قمت بتعديل نموذج، يمكنك استخدامه للاستدلال!
جهّز بعض النصوص التي تريد أن يملأ النموذج الفراغات فيها، واستخدم الرمز الخاص <mask>
للإشارة إلى الفراغ:
أبسط طريقة لتجربة نموذجك المعدل للاستدلال هي استخدامه في pipeline()
. قم بإنشاء كائن pipeline
لملء الفراغ مع نموذجك، ومرر نصك إليه. إذا أردت، يمكنك استخدام معلمة top_k
لتحديد عدد التنبؤات التي تريد إرجاعها:
قم بتقسيم النص إلى رموز وإرجاع input_ids
كـ TensorFlow tensors. ستحتاج أيضًا إلى تحديد موضع رمز <mask>
:
قم بتمرير المدخلات إلى النموذج وإرجاع logits
للرمز المقنع:
ثم قم بإرجاع الرموز الثلاثة المقنعة ذات الاحتمالية الأعلى وطباعتها: