معالجة اللغات الطبيعية متقدم · Advanced 15 دقيقة

BERT

تمثيلات ثنائية الاتجاه من المحوّلات: التدريب بالكلمات المقنَّعة، والرمز CLS، والضبط الدقيق.

تقدّمك في المسار0%

المدخل

[CLS] الطقس جميل اليوم [SEP] سنخرج إلى الحديقة [SEP]

لكل رمز ثلاثة تضمينات تُجمع: الرمز، والموضع، والمقطع (الجملة الأولى أو الثانية).

التدريب المسبق

  • MLM: تُختار 15% من الرموز؛ 80% منها تُستبدل بـ [MASK]، و10% برمز عشوائي، و10% تبقى، ويتنبأ النموذج بالأصل.
  • NSP: هل الجملة الثانية تتبع الأولى فعلاً؟ (أُزيلت في تطويرات لاحقة مثل RoBERTa.)

الأحجام الأصلية

النموذجالطبقاتالأبعادالرؤوسالمعاملات
BERT-Base1276812~110 مليون
BERT-Large24102416~340 مليون

الضبط الدقيق للتصنيف

from datasets import load_dataset
from transformers import (AutoTokenizer, AutoModelForSequenceClassification,
                          TrainingArguments, Trainer)
import numpy as np, evaluate

name = "bert-base-uncased"
ds = load_dataset("imdb")                           # يُنزَّل عند أول استخدام
tok = AutoTokenizer.from_pretrained(name)
ds = ds.map(lambda b: tok(b["text"], truncation=True, max_length=256), batched=True)
model = AutoModelForSequenceClassification.from_pretrained(name, num_labels=2)
acc = evaluate.load("accuracy")

def metrics(p):
    return acc.compute(predictions=np.argmax(p.predictions, -1), references=p.label_ids)

args = TrainingArguments("out-bert", learning_rate=2e-5, per_device_train_batch_size=16,
                         num_train_epochs=2, eval_strategy="epoch", weight_decay=0.01)
trainer = Trainer(model=model, args=args, train_dataset=ds["train"].shuffle(seed=0).select(range(4000)),
                  eval_dataset=ds["test"].shuffle(seed=0).select(range(2000)),
                  processing_class=tok, compute_metrics=metrics)
trainer.train()

أسماء بعض المعاملات تتغير بين إصدارات المكتبة؛ راجع التوثيق للإصدار المثبت لديك. يُفضّل تشغيل هذا المثال على GPU.

إرشادات الضبط

  • معدل تعلم صغير (\(2\times10^{-5}\) إلى \(5\times10^{-5}\)) وحقب قليلة (2–4).
  • طول أقصى مناسب للبيانات؛ الحد الأقصى في BERT الأصلي 512 رمزاً.
  • كرر التجربة ببذور عشوائية مختلفة؛ نتائج الضبط الدقيق قد تتفاوت بين التشغيلات.

مصطلحات الدرس

الانتباه ثنائي الاتجاه Bidirectional Attention
انتباه يسمح لكل رمز برؤية الرموز السابقة واللاحقة معاً.
الرمز [CLS] Classification Token
رمز خاص يوضع في بداية المدخل، ويُستخدم تمثيله النهائي ملخصاً للتسلسل في مهام التصنيف.
نمذجة اللغة المقنَّعة Masked Language Modeling
مهمة تدريب مسبق تُخفى فيها نسبة من الرموز عشوائياً ويتنبأ النموذج بها من السياق المحيط.

الملخص

BERT الذي قدمه Devlin وزملاؤه في Google عام 2018 مشفر محوّل يُدرب مسبقاً على مهمتين: التنبؤ بالكلمات المقنَّعة (MLM) والتنبؤ بالجملة التالية (NSP). لأن الانتباه ثنائي الاتجاه، يستفيد تمثيل كل كلمة من السياق السابق واللاحق. يُضبط ضبطاً دقيقاً بإضافة طبقة بسيطة فوق تمثيل الرمز [CLS] للتصنيف أو فوق تمثيلات الرموز للوسم، وحقق عند صدوره أفضل النتائج في مجموعة واسعة من معايير الفهم.

أسئلة مراجعة

  1. ما نسبة الرموز المقنَّعة في تدريب BERT الأصلي؟

    15% من الرموز، يُستبدل 80% منها بـ [MASK] و10% برمز عشوائي و10% تبقى كما هي.

  2. لماذا لا يناسب BERT توليد النصوص الطويلة مباشرة؟

    لأنه مشفر ثنائي الاتجاه دُرب على ملء الفراغات وليس على التنبؤ بالرمز التالي تسلسلياً.

المصادر والمراجع

  1. Devlin et al. (2018) BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding — arXiv
  2. Liu et al. (2019) RoBERTa: A Robustly Optimized BERT Pretraining Approach — arXiv
  3. Hugging Face — Text classification (fine-tuning guide)

إكمال الدرس