نماذج اللغة2018متوسط8 دقيقة قراءة
BERT: التدريب المسبق لمحوِّلات عميقة ثنائية الاتجاه لفهم اللغة
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
Devlin, J. · Chang, M.-W. · Lee, K. · Toutanova, K. — NAACL
المشكلة
حتى عام 2018، كانت النماذج اللغوية تقرأ النص باتجاه واحد فقط: GPT يقرأ من اليسار إلى اليمين، وELMo يُشغّل نموذجين منفصلين — واحد بكل اتجاه — ثم يدمج نتائجهما بشكل سطحي في النهاية. لم يستطع أيٌّ منهما بناء تمثيلات عميقة تأخذ السياق الكامل من الاتجاهين في آنٍ واحد. والمشكلة الأكبر أن كل مهمة — تحليل المشاعر، الإجابة عن الأسئلة، استخراج الكيانات — كانت تتطلب بنية مصمَّمة خصيصاً لها. لم يكن هناك نموذج واحد مُدرَّب مسبقاً يمكن تكييفه لأي مهمة.
الإسهام
قدّم BERT مرمِّزاً مبنياً على ومُدرَّباً مسبقاً بمهمتين ذاتيتي الإشراف: الأولى هي ، حيث تُخفى 15% من الرموز ويتعلّم النموذج التنبؤ بها من السياق الكامل بالاتجاهين، والثانية هي ، التي تُعلِّم النموذج فهم العلاقة بين الجمل. النتيجة نموذج واحد يمكن ضبطه بإضافة طبقة إخراج وحيدة فقط ليحقق أفضل النتائج على 11 معياراً، منها GLUE بنسبة 80.5% وSQuAD v1.1 بدقة F1 تبلغ 93.2 وSQuAD v2.0 بدقة F1 تبلغ 83.1.
الأثر
رسّخ BERT منهجية «درِّب مسبقاً ثم اضبط» التي أصبحت المعيار السائد في معالجة اللغة الطبيعية. أثبت أن فهم السياق العميق من الاتجاهين أمرٌ جوهري، وأن بنيةً واحدة قادرة على التعامل مع مهام متعددة. وُلدت من BERT عائلة كاملة — RoBERTa وALBERT وDistilBERT وSpanBERT وXLM — ولا يزال مرمِّزه يعمل في صلب أنظمة الاسترجاع ومحركات البحث ونماذج حتى اليوم. كان BERT الجسر بين ورقة المحوِّل وعصر التوسيع الذي قادته نماذج GPT.
تخيّل أنك تقرأ جملة من خلال فتحة ضيّقة تنزلق من اليسار إلى اليمين فقط — هذا ما يفعله GPT: عند كل كلمة لا يرى إلا ما سبقها، أما ما بعدها فمجهول تماماً. ELMo يحاول حلّ المشكلة بفتحتين منفصلتين — واحدة تتحرك للأمام وأخرى للخلف — ثم يلصق ما شاهدته كل فتحة في النهاية. حلّ وسط، لكنه سطحي.
BERT يتعامل مع الموضوع بشكل مختلف كلياً: يزيل الجدار ويجلس في غرفة زجاجية حيث كل كلمة ترى كل الكلمات الأخرى في نفس اللحظة. لكن كيف يمنع النموذج من الغش بنسخ الإجابة مباشرة؟ يُغطّي أعين 15% من الكلمات ويطلب من البقية: «خمّنوا ما الكلمات المخفية.»
المشكلة: النماذج أحادية الاتجاه لا ترى إلا نصف الصورة
لنأخذ مثالاً بسيطاً: «ضفة النهر كانت مغطاة بالأزهار البرية.»
النموذج الذي يقرأ من اليسار إلى اليمين حين يصل إلى كلمة «النهر» يكون قد قرأ كلمة «ضفة» فقط — وهذه الكلمة غامضة وتحتمل أكثر من معنى. الكلمات التي تأتي بعدها هي التي توضّح أننا نتحدث عن ضفة نهر وليس شيئاً آخر. بمعنى آخر، النموذج مُضطر لتخمين المعنى قبل أن تصله القرائن.
ELMo يحاول معالجة هذا بتشغيل شبكتي — واحدة تقرأ للأمام وأخرى تقرأ للخلف — ثم يدمج بالربط المباشر. لكن المشكلة أن هذا الدمج سطحي: كل اتجاه يبني بمعزل تام عن الآخر، ثم تُلصق النتائج في النهاية. السياق الذي قبل الكلمة والسياق الذي بعدها لا يتبادلان أي معلومات أثناء عملية الترميز نفسها.
الفكرة: أخفِ ثم تنبّأ من جميع الاتجاهات
فكرة BERT في جوهرها بسيطة: استخدم مرمِّز المحوِّل وليس فاكّ الترميز — أي بدون — بحيث يستطيع كل أن يرى كل رمز آخر في الجملة. لكن إذا كان كل رمز يرى الجملة كاملة، فما الذي يمنع النموذج من الغش بأن ينسخ الكلمة المطلوبة من موقعها الأصلي؟
الحلّ هو نمذجة اللغة المُقنَّعة (MLM). قبل إدخال الجملة إلى BERT، نختار عشوائياً 15% من الرموز ونستبدلها وفق القاعدة التالية:
- 80% منها تُستبدل بالرمز الخاص
[MASK] - 10% تُستبدل برمز عشوائي من المفردات
- 10% تبقى كما هي بدون تغيير
مهمة النموذج هي التنبؤ بالرمز الأصلي في كل موضع مُقنَّع. ولأن القناع يمكن أن يقع على أي كلمة في الجملة، يُضطر كل رمز لبناء تمثيل غني يصلح للتنبؤ بأي موضع — وهذا بالضبط ما يفرض على النموذج بناء فهم عميق ثنائي الاتجاه للنص.
المهمة الثانية: التنبؤ بالجملة التالية
كثير من المهام — مثل و — لا تعتمد على فهم الكلمات بمفردها بل على فهم العلاقة بين جملتين. نمذجة اللغة المُقنَّعة وحدها لا تُدرِّب النموذج على هذا النوع من الفهم، لذلك أضاف BERT مهمة تدريب مسبق ثانية:
التنبؤ بالجملة التالية (NSP): يأخذ النموذج زوجاً من الجمل [الجملة أ، الجملة ب] ويتعلّم التمييز: هل الجملة ب تتبع الجملة أ فعلاً في النص الأصلي (التسمية: تالية)، أم أُخذت عشوائياً من مكان آخر (التسمية: ليست تالية)؟ النسبة مناصفة بين الحالتين.
صيغة الإدخال تستخدم رموزاً خاصة: [CLS] الجملة أ [SEP] الجملة ب [SEP]. التمثيل النهائي لرمز هو الذي يُستخدم في الثنائي. هذه الصيغة تنتقل كما هي إلى مرحلة الضبط الدقيق: رمز [CLS] يصبح متجه التصنيف لأي مهمة.
البنية: مرمِّز المحوِّل بحجمين
بنية BERT هي المحوِّل من الورقة الأصلية — بدون فاكّ ترميز وبدون قناع سببي. الابتكار هنا ليس في البنية نفسها بل في طريقة التدريب المسبق.
قدّم الباحثون حجمين:
- BERT-Base: 12 ، 768 بُعداً خفياً، 12 — 110 مليون
- BERT-Large: 24 طبقة، 1024 بُعداً خفياً، 16 رأس انتباه — 340 مليون معامل
صُمِّم BERT-Base ليكون بنفس حجم GPT-1 تقريباً حتى تكون المقارنة عادلة. أما تمثيل المدخلات فهو مجموع ثلاثة تضمينات: (باستخدام مفردات من 30,000 وحدة)، و (يُحدّد أي جملة ينتمي إليها الرمز: أ أو ب)، و (مُتعلَّم، يصل إلى 512 رمزاً).
الضبط الدقيق: نموذج واحد لمهام كثيرة
ربما تكون أقوى أفكار BERT هي بساطة الضبط الدقيق. النموذج المُدرَّب مسبقاً يُستخدم كما هو بالكامل — كل ما تحتاجه هو إضافة طبقة إخراج واحدة فوقه حسب المهمة:
- التصنيف (تحليل المشاعر، الاستدلال اللغوي): نأخذ تمثيل رمز
[CLS]← طبقة خطية ← . - المهام على مستوى الرمز (استخراج الكيانات، تحديد أجزاء الكلام): نأخذ ناتج كل رمز ← طبقة خطية ← تسمية لكل رمز.
- الإجابة عن الأسئلة (SQuAD): نأخذ ناتج كل رمز ← نتنبأ بموضعَي بداية ونهاية نطاق الإجابة.
- مهام أزواج الجمل: نُرمِّز الجملتين مع
[SEP]بينهما ونُصنِّف من[CLS].
جميع المعاملات — بما فيها المُدرَّبة مسبقاً — تُضبط معاً. العملية عادةً لا تتجاوز 2–4 بـ بين 2e-5 و5e-5. لا حاجة لتصميم بنية خاصة بكل مهمة.
الفكرة في الكود
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import numpy as np
def mask_tokens(tokens, vocab_size, mask_id, mask_prob=0.15):
"""طبِّق استراتيجية التقنيع 80/10/10 في BERT."""
masked = tokens.copy()
labels = np.full_like(tokens, -1) # -1 = لا تتنبأ هنا
for i in range(len(tokens)):
if np.random.random() < mask_prob:
labels[i] = tokens[i] # احفظ الرمز الحقيقي
roll = np.random.random()
if roll < 0.8:
masked[i] = mask_id # 80% ← [MASK]
elif roll < 0.9:
masked[i] = np.random.randint(vocab_size) # 10% ← عشوائي
# وإلا: 10% ← أبقِ الأصلي (masked[i] بلا تغيير)
return masked, labels
def bert_mlm_loss(model, tokens, mask_id, vocab_size):
"""خطوة تدريب واحدة لهدف MLM في BERT."""
masked_input, labels = mask_tokens(tokens, vocab_size, mask_id)
# تمرير أمامي: انتباه ثنائي الاتجاه كامل — بلا قناع سببي!
hidden = model.encode(masked_input) # (طول_التسلسل, d_model)
loss = 0
count = 0
for i in range(len(tokens)):
if labels[i] != -1: # احسب الخسارة في المواضع المُقنَّعة فقط
logits = hidden[i] @ model.vocab_proj.T # تنبأ بالرمز الأصلي
loss += cross_entropy(logits, labels[i])
count += 1
return loss / count
# المرمِّز هو نفسه مرمِّز المحوِّل من ورقة «الانتباه هو كل ما تحتاجه».
# الفرق الوحيد: لا قناع سببي. كل رمز يرى كل رمز آخر.
# بعد التدريب المسبق، الضبط الدقيق = النموذج نفسه + طبقة خطية واحدة فوقه.النتائج: تصدُّر 11 معياراً دفعةً واحدة
حقّق BERT-Large نتائج غير مسبوقة على جميع المعايير:
- معيار : متوسط 80.5% — بتحسّن مطلق قدره 7.7 نقطة عن أفضل نتيجة سابقة. تصدّر BERT المهام الثمانية كاملة، من تحليل المشاعر إلى الاستلزام النصي.
- SQuAD v1.1: دقة F1 بلغت 93.2، متجاوزاً الأداء البشري (91.2) لأول مرة في معيار فهم القراءة هذا.
- SQuAD v2.0: دقة F1 بلغت 83.1 — بتحسّن 5.1 نقطة. هذه النسخة أصعب لأنها تتضمن أسئلة لا توجد إجابتها في النص أصلاً.
- SWAG (الاستدلال بالمعرفة العامة): دقة 86.3% — قفزة كبيرة أثبتت أن BERT يلتقط معرفة حقيقية عن العالم وليس مجرد قواعد نحوية.
النقطة الجوهرية أن كل هذه النتائج جاءت من النموذج المُدرَّب مسبقاً نفسه مع تغيير طبقة الإخراج فقط حسب المهمة. لا حاجة لتصميم بنية مخصصة لكل مهمة على حدة.
ما الذي فتحه BERT
2018
BERT
نمذجة لغة مُقنَّعة مع مرمِّز ثنائي الاتجاه. تدريب مسبق مرة واحدة ثم ضبط دقيق لأي مهمة. تصدُّر 11 معياراً دفعةً واحدة.
2019
RoBERTa — تحسين متين لـ BERT
حذف مهمة NSP، وتدريب أطول على بيانات أكثر مع تقنيع ديناميكي. البنية نفسها لكن بوصفة أفضل. أثبت أن BERT الأصلي لم يُستغلّ بكامل طاقته.
2019
ALBERT — نسخة خفيفة من BERT
مشاركة المعاملات بين الطبقات مع تحليل التضمين إلى مصفوفتين. تقليص عدد المعاملات 18 مرة مع الحفاظ على أداء تنافسي.
2019
DistilBERT
تقطير المعرفة من BERT-Base إلى نموذج بست طبقات فقط. 60% من الحجم، 97% من الأداء، وأسرع بنسبة 60%.
2019
XLNet
استبدل التقنيع بنمذجة اللغة بالتبديل، فيلتقط السياق من الاتجاهين دون الوقوع في مشكلة الفجوة بين التدريب والاستخدام الناتجة عن رمز [MASK].
2020
ELECTRA
استبدل نمذجة اللغة المُقنَّعة بمهمة كشف الرموز المُستبدَلة. كل رمز يحصل على إشارة تدريبية (وليس 15% فقط)، مما يرفع كفاءة التدريب أربع مرات.
2020
Sentence-BERT
ضبط BERT بشبكات سيامية متوازية لحساب تشابه الجمل بكفاءة. جعل تضمينات BERT قابلة للاستخدام العملي في أنظمة البحث والاسترجاع.
الإرث الحقيقي لـ BERT ليس في معاملاته بل في المنهجية التي أرساها. قبل BERT، كانت كل مهمة في معالجة اللغة تحتاج بنيةً مصمّمة خصيصاً لها. بعد BERT، أصبحت الوصفة واحدة للجميع: (1) درِّب مرمِّزاً كبيراً على كميات ضخمة من النصوص غير المُعنونة، (2) ثم اضبطه على مهمتك المحددة بإضافة طبقة إخراج بسيطة. هذا النمط انتقل مباشرة إلى نماذج GPT — مع اختلاف في هدف التدريب المسبق (التنبؤ بالرمز التالي بدل التقنيع)، لكن الفكرة الجوهرية واحدة: الحجم + التدريب المسبق + الضبط الدقيق هو كل ما تحتاجه.
المرجعDevlin, Chang, Lee, Toutanova. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. NAACL, 2019.
مصطلحات هذه الورقة
- نمذجة اللغة المُقنَّعة (MLM)Masked Language Modeling (MLM)
- التنبؤ بالجملة التالية (NSP)Next Sentence Prediction (NSP)
- ثنائي الاتجاهBidirectional
- رمز [CLS][CLS] Token
- تضمين المقطعSegment Embedding
- WordPieceWordPiece
- الضبط الدقيقFine-Tuning
- التدريب المسبقPretraining