نماذج اللغة2019متقدم12 دقيقة قراءة

XLNet: تدريب مسبق ذاتي الانحدار مُعمَّم لفهم اللغة

XLNet: Generalized Autoregressive Pretraining for Language Understanding

Yang, Z. · Dai, Z. · Yang, Y. · Carbonell, J. · Salakhutdinov, R. · Le, Q. V. — NeurIPS

المشكلة

بحلول 2019، كان مجال للنماذج اللغوية قد انقسم إلى مدرستين، كلتاهما تقدّم شيئاً وتخسر شيئاً. النماذج ذاتية الانحدار مثل GPT تقرأ الجملة من اليسار إلى اليمين فتُنتج تقديرات احتمالية سليمة رياضياً، لكنها عمياء عن أي كلمة لم تأتِ بعد. في المقابل، نماذج الترميز الذاتي مثل BERT ترى السياق من الاتجاهين لأنها تُخفي رموزاً عشوائية ثم تتنبأ بها — لكنها تدفع ثمنين: أولاً، رمز [MASK] يظهر في أثناء ولا وجود له عند ، فتنشأ فجوة بين مرحلتَي التدريب والاستخدام. ثانياً، BERT يتنبأ بالرموز المُخفاة كلاً على حدة، كأنها مستقلة عن بعضها، فيفقد العلاقات المشتركة بينها. لم يكن هناك نموذج يحصد فوائد السياق دون هذه التنازلات.

الإسهام

XLNet هو أسلوب تدريب مسبق مُعمَّم يمنح النموذج فهماً ثنائي الاتجاه للسياق دون الحاجة إلى تقنيع أي رمز. الفكرة الجوهرية هي : بدلاً من التنبؤ دائماً من اليسار إلى اليمين، يُدرَّب النموذج على تعظيم الاحتمالية المتوقعة عبر جميع ترتيبات التحليل الممكنة للتسلسل. بهذا يرى كل رمز سياقاً من الاتجاهين دون التخلي عن قاعدة الضرب الذاتية الانحدارية، فيتجنّب مشكلتَي BERT: افتراض الاستقلال . ولتنفيذ هذه الفكرة، يستخدم XLNet انتباهاً ذاتياً ثنائي التدفق يتكوّن من تيار للمحتوى وتيار للاستعلام، ويدمج آلية من Transformer-XL لالتقاط الاعتماديات بعيدة المدى. تفوّق النموذج على BERT في 20 مهمة وحقّق أفضل أداء في 18 منها، تشمل SQuAD وGLUE وRACE وترتيب المستندات.

الأثر

أظهر XLNet أن النماذج ذاتية الانحدار قادرة على منافسة نماذج التقنيع الثنائية الاتجاه وتجاوزها إذا دُرِّبت بأسلوب التبديل. كما أكّد أن آلية التكرار المستعارة من Transformer-XL عنصر أساسي في التعامل مع السياق الطويل. صحيح أن نماذج لاحقة مثل RoBERTa أثبتت أن تحسين إعدادات تدريب BERT يردم جزءاً من الفجوة، لكن فكرة نمذجة اللغة بالتبديل أثّرت في أعمال تالية مثل UniLM وMPNet. وتحوّلت ثنائي التدفق إلى مرجع معماري للمهام التي تتطلب تنبؤاً يراعي الموضع من غير تسريب معلومات.

تخيّل أنك تُركّب أحجية (Puzzle)، لكنك في كل مرة تبدأ من مكان مختلف: مرة تبدأ بقطع السماء، ومرة بالعشب، ومرة بالمنزل في الوسط. بعد أن تُركّب الأحجية نفسها عشرات المرات بترتيبات مختلفة، تصبح تفهم علاقة كل قطعة بكل قطعة أخرى — لا بجارتها المباشرة فقط.

هذا بالضبط ما يفعله XLNet مع الجمل. BERT يتبع أسلوباً مختلفاً: يُغطّي بعض القطع ويحاول تخمينها، لكنه لا يتعلّم في أي ترتيب تترابط هذه القطع. GPT يسير دائماً من اليسار إلى اليمين فلا يرى إلا ما سبقه. أما XLNet فيُغيّر ترتيب التركيب في كل مرة — مع الالتزام بقاعدة «قطعة واحدة في كل خطوة» — حتى يتعلّم في النهاية كل العلاقات من كل الاتجاهات.

المشكلة: معسكران وتنازلان

بحلول 2019، كان التدريب المسبق للنماذج اللغوية قد انقسم إلى مدرستين، كل منهما تحمل قيداً جوهرياً.

مثل GPT تُفكّك الاحتمال المشترك للتسلسل إلى سلسلة من ، دائماً من اليسار إلى اليمين: P(x₁) · P(x₂|x₁) · P(x₃|x₁,x₂) · ... الأسلوب نظيف رياضياً — كل يُتنبَّأ به من توزيع احتمالي حقيقي. لكن المشكلة أن النموذج لا يرى إلا ما يسبق الكلمة الحالية. في مهمة مثل الإجابة عن الأسئلة — حيث قد تعتمد الإجابة على كلمات تأتي قبل الموضع المطلوب وبعده — تتحوّل هذه الرؤية الأحادية إلى عائق حقيقي.

نماذج الترميز الذاتي مثل BERT تتغلّب على ذلك بإخفاء رموز عشوائية ثم التنبؤ بها اعتماداً على كامل السياق المحيط — يميناً ويساراً. لكن هذا الحل يأتي بثمنين. الأول هو الفجوة بين التدريب المسبق والضبط الدقيق: في أثناء التدريب المسبق يتعامل BERT مع رموز [MASK] مصطنعة، لكن هذه الرموز تختفي تماماً عند الضبط الدقيق — فينشأ عدم تطابق بين التوزيعين. الثمن الثاني هو افتراض الاستقلال: BERT يتنبأ بكل الرموز المُخفاة دفعة واحدة كأنها مستقلة عن بعضها. مثلاً، إذا أُخفيت كلمتا «نيو» و«يورك» معاً، يتنبأ بكل منهما على حدة دون أن يلتقط العلاقة المشتركة بينهما.

افتح في المختبر
قارن بين طريقة GPT (ذاتي الانحدار) وطريقة BERT (ترميز ذاتي) في معالجة الجملة نفسها — ولاحظ ما يُضحّي به كل أسلوب.
تستيقظ التجربة عند وصولك…

الفكرة المحورية: نمذجة اللغة بالتبديل

فكرة XLNet أنيقة وبسيطة: بدلاً من الاختيار بين التحليل من اليسار إلى اليمين كما في GPT، أو التقنيع كما في BERT — لماذا لا نُحلّل احتمالية التسلسل بكل ممكن؟

لنأخذ مثالاً عملياً: جملة من أربعة رموز: [x₁, x₂, x₃, x₄]. النموذج الذاتي الانحداري التقليدي يُحلّلها دائماً بالترتيب: P(x₁) · P(x₂|x₁) · P(x₃|x₁,x₂) · P(x₄|x₁,x₂,x₃).

لكن هذا ترتيب واحد فقط من أصل 4! = 24 ترتيباً ممكناً. تخيّل أننا جرّبنا الترتيب [x₃, x₁, x₄, x₂]، فنحسب: P(x₃) · P(x₁|x₃) · P(x₄|x₃,x₁) · P(x₂|x₃,x₁,x₄).

لاحظ ما حدث: عند التنبؤ بـ x₂، استخدم النموذج x₃ وx₁ وx₄ كسياق — أي أن x₂ رأى سياقاً من يمينه ويساره معاً، رغم أن التحليل ظل ذاتي الانحدار بالكامل. حين نُدرّب على جميع التبديلات الممكنة (بالقيمة المتوقعة)، يرى كل رمز في النهاية كل رمز آخر كسياق. النتيجة: فهم ثنائي الاتجاه بهدف ذاتي الانحدار نظيف — بلا رموز [MASK] وبلا افتراض استقلال.

النقطة الحاسمة هنا أن XLNet لا يُحرّك الرموز من أماكنها. الرموز تبقى في مواضعها الأصلية تماماً. ما يتغيّر هو التي تتحكّم في أي الرموز يُسمح لها برؤية أي رموز أخرى — وبذلك يُحاكي النموذج ترتيب التحليل المُبدَّل مع الحفاظ على الطبيعي.

افتح في المختبر
اضغط «بدِّل» لاستكشاف ترتيبات تحليل مختلفة. لاحظ كيف يتغيّر السياق المتاح لكل رمز بتغيُّر الترتيب.
تستيقظ التجربة عند وصولك…
maxθ    EzZT[t=1Tlogpθ ⁣(xztxz<t)]\max_\theta \;\; \mathbb{E}_{\mathbf{z} \sim \mathcal{Z}_T} \left[ \sum_{t=1}^{T} \log \, p_\theta\!\left(x_{z_t} \mid \mathbf{x}_{\mathbf{z}_{<t}}\right) \right]
هدف نمذجة اللغة بالتبديللتسلسل بطول T، نسحب تبديلاً عشوائياً z من جميع الترتيبات الممكنة (عددها T!). عند كل موضع z_t في هذا التبديل، نتنبأ بالرمز x_{z_t} مستخدمين فقط الرموز التي سبقته في الترتيب المُبدَّل (x_{z_{<t}}). الهدف هو تعظيم القيمة المتوقعة للوغاريتم الاحتمالية عبر كل التبديلات. بهذه الطريقة، يلتقط هدف تدريبي واحد الاعتماديات ثنائية الاتجاه من خلال قاعدة الضرب ذاتية الانحدار.

الآلية: الانتباه الذاتي ثنائي التدفق

نمذجة اللغة بالتبديل تطرح تحدّياً تقنياً دقيقاً. حين يريد النموذج التنبؤ بالرمز عند الموضع z_t، يحتاج أن يعرف أين يقع هذا الرمز (موضعه)، لكن يجب ألّا يرى ما هو (محتواه) — وإلا أصبح التنبؤ بلا معنى لأن الإجابة أمامه. في المقابل، الرموز التي تُشكّل السياق (المواضع التي سبقت z_t في التبديل) يحتاج النموذج إلى مواضعها ومحتوياتها معاً.

تخيّل طاولة اجتماع: كل مشارك (رمز) يحمل بطاقة باسمه (الموضع) ومجلّداً فيه معلوماته (المحتوى). حين يحين دورك للعرض، يعرف رئيس الجلسة أين تجلس لأنه يرى بطاقتك، لكنه يسحب مجلّدك — لا يعرف ماذا تحمل من معلومات. أما بقية الحاضرين فبطاقاتهم ومجلّداتهم مرئية. هذا التباين بين «أعرف أين أنت لكن لا أعرف ماذا تحمل» هو بالضبط ما يحتاجه XLNet.

القياسي لا يستطيع تحقيق ذلك — فهو إما يرى الرمز بالكامل أو لا يراه أبداً. حلّ XLNet هو ، الذي يتكوّن من تيارين يعملان بالتوازي:

يعمل تماماً كـ المعتاد: يرى موضع ومحتوى جميع الرموز بما فيها الرمز نفسه، ويبني التمثيل السياقي.

يرى مواضع جميع الرموز، لكنه لا يرى المحتوى إلا لتلك التي سبقته في ترتيب التبديل الحالي — ولا يرى محتوى نفسه. هذا التيار هو المسؤول فعلياً عن التنبؤ.

افتح في المختبر
انتقل بين تيار المحتوى وتيار الاستعلام لتلاحظ الفرق: تيار الاستعلام يحجب محتوى الرمز المستهدف بينما يُبقي موضعه مرئياً.
تستيقظ التجربة عند وصولك…
gzt(m)Attention ⁣(Q=gzt(m1),  KV=hz<t(m1);  θ)g_{z_t}^{(m)} \leftarrow \mathrm{Attention}\!\left( Q = g_{z_t}^{(m-1)},\; KV = \mathbf{h}_{\mathbf{z}_{<t}}^{(m-1)};\; \theta \right)
تحديث تيار الاستعلامفي الطبقة m، يُوجّه تمثيل الاستعلام g عند الموضع z_t انتباهه إلى تمثيلات المحتوى h لكل المواضع التي تسبقه في التبديل، لكنه **لا** يصل إلى h_{z_t} الخاص به. بهذا نضمن عدم تسرّب محتوى الرمز المستهدف إلى عملية التنبؤ.
hzt(m)Attention ⁣(Q=hzt(m1),  KV=hzt(m1);  θ)h_{z_t}^{(m)} \leftarrow \mathrm{Attention}\!\left( Q = h_{z_t}^{(m-1)},\; KV = \mathbf{h}_{\mathbf{z}_{\leq t}}^{(m-1)};\; \theta \right)
تحديث تيار المحتوىتحديث تيار المحتوى يعمل تماماً كالانتباه الذاتي المعتاد في المحوِّل: الموضع z_t يُوجّه انتباهه إلى كل المواضع حتى موضعه هو (z_{≤t})، فيرى المواضع والمحتويات معاً. يبني هذا التيار التمثيل السياقي الكامل الذي تعتمد عليه تيارات الاستعلام في الرموز الأخرى.

السياق طويل المدى: دمج Transformer-XL

المحوِّلات القياسية تعمل ضمن ثابتة — عادةً 512 رمزاً في حالة BERT. أي شيء خارج هذه النافذة لا يراه النموذج. يستعير XLNet من Transformer-XL فكرتين ذكيتين لتجاوز هذا القيد:

التكرار على مستوى المقاطع: بعد أن يُعالج النموذج مقطعاً من النص، يحتفظ بـ من جميع الطبقات في ذاكرة مؤقتة. حين ينتقل إلى المقطع التالي، تتحوّل هذه الحالات المُخزّنة إلى سياق إضافي يستطيع النموذج الانتباه إليه. الأمر أشبه بنافذة منزلقة في الذاكرة: النموذج يُجزّئ النص إلى قطع ثابتة الطول، لكن كل قطعة تستطيع «النظر للخلف» إلى تمثيلات القطعة السابقة. هذا يمدّ السياق الفعلي إلى ما هو أبعد بكثير من طول أي مقطع بمفرده.

: بما أن النموذج أصبح يُوجّه انتباهه عبر حدود المقاطع، فإن (كتلك المستخدمة في BERT) ستُسبّب ارتباكاً — الموضع 0 في المقطع الثاني ليس الموضع 0 في المقطع الأول. يستخدم XLNet ترميزاً موضعياً نسبياً يعتمد على المسافة بين الرموز بدلاً من مواقعها المطلقة، فيستطيع النموذج مدّ الانتباه عبر المقاطع بسلاسة دون تعارض في المواضع.

افتح في المختبر
لاحظ كيف تُوسّع الحالات الخفية المحفوظة من المقطع الأول نطاق السياق الذي يراه المقطع الثاني، فتتضاعف نافذة السياق الفعلية.
تستيقظ التجربة عند وصولك…

التنبؤ الجزئي: كفاءة دون التضحية بالجودة

لو طبّقنا نمذجة اللغة بالتبديل حرفياً، لاحتجنا إلى التنبؤ بكل رمز في كل تبديل — وهذا مُكلف حسابياً بشكل هائل. الحل العملي الذي يعتمده XLNet هو التنبؤ الجزئي: بدلاً من التنبؤ بجميع الرموز الـ T، يكتفي بالتنبؤ بآخر c رمز فقط في كل تسلسل مُبدَّل (تُختار c بحيث تكون نسبة الرموز المتنبَّأ بها نحو 15%، قريبة من نسبة التقنيع في BERT).

لماذا نختار الرموز الأخيرة تحديداً؟ السبب بسيط: في أي ترتيب مُبدَّل، الرموز المتأخرة هي التي تملك أغنى سياق — فقد «شاهدت» أكبر عدد من الرموز الأخرى قبل أن يحين دورها. أما الرموز في بداية التبديل فسياقها شحيح جداً، وتنبؤاتها تكون مشوّشة وقليلة الفائدة. بالتركيز على المواضع الغنية بالمعلومات، يحصل النموذج على إشارة تعلّم أقوى مقابل كل وحدة حساب يستهلكها.

maxθ    EzZT[t=c+1zlogpθ ⁣(xztxz<t)]\max_\theta \;\; \mathbb{E}_{\mathbf{z} \sim \mathcal{Z}_T} \left[ \sum_{t=c+1}^{|\mathbf{z}|} \log \, p_\theta\!\left(x_{z_t} \mid \mathbf{x}_{\mathbf{z}_{<t}}\right) \right]
هدف التنبؤ الجزئيتُحسب الخسارة فقط على آخر (|z| - c) رمز في كل تبديل. أول c رمز تعمل كسياق داعم فحسب ولا تدخل في حساب هدف التدريب. بهذا يتركّز التعلّم على التنبؤات التي يتوفّر لها أغنى سياق ممكن.

الفكرة في الكود

نمذجة اللغة بالتبديل في XLNet — المنطق الأساسيpython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

import numpy as np

def sample_permutation(seq_len):
    """اختر ترتيب تحليل عشوائي."""
    return np.random.permutation(seq_len)

def build_attention_mask(perm, predict_start):
    """ابنِ قناع الانتباه الذي يفرض الترتيب المُبدَّل.

    للموضع perm[t]:
      - تيار المحتوى: يرى perm[0], ..., perm[t] (بما فيه نفسه)
      - تيار الاستعلام: يرى perm[0], ..., perm[t-1] (بدون نفسه)
    التنبؤ فقط من predict_start فصاعداً (تنبؤ جزئي).
    """
    T = len(perm)
    content_mask = np.zeros((T, T), dtype=bool)
    query_mask   = np.zeros((T, T), dtype=bool)

    for t in range(T):
        pos = perm[t]
        # المواضع المرئية: كل ما سبق في التبديل
        for s in range(t + 1):
            content_mask[pos, perm[s]] = True   # المحتوى يرى نفسه + السابقين
        for s in range(t):
            query_mask[pos, perm[s]] = True      # الاستعلام يرى السابقين فقط

    return content_mask, query_mask

def xlnet_loss(model, tokens, predict_ratio=0.15):
    """خطوة تدريب واحدة لنمذجة اللغة بالتبديل في XLNet."""
    T = len(tokens)
    perm = sample_permutation(T)

    # تنبأ فقط بآخر 15% من الرموز في هذا التبديل
    predict_start = int(T * (1 - predict_ratio))
    content_mask, query_mask = build_attention_mask(perm, predict_start)

    # تمرير أمامي بالانتباه ثنائي التدفق
    content_h, query_g = model.two_stream_forward(
        tokens, content_mask, query_mask
    )

    # احسب الخسارة على المواضع المُتنبَّأ بها فقط
    loss = 0
    count = 0
    for t in range(predict_start, T):
        pos = perm[t]
        logits = query_g[pos] @ model.vocab_proj.T
        loss += cross_entropy(logits, tokens[pos])
        count += 1
    return loss / count

# الفكرة الأساسية: الرموز لا تتحرّك أبداً! فقط أقنعة الانتباه تتغير.
# التبديل يُحدّد مَن يرى مَن — وليس أين تجلس الرموز.

البنية: تجميع كل القطع معاً

يأتي XLNet بحجمين صُمِّما ليوازيا أحجام BERT لتكون المقارنة عادلة:

  • XLNet-Base: 12 طبقة، 768 بُعداً خفياً، 12 رأس انتباه — يوازي BERT-Base
  • XLNet-Large: 24 طبقة، 1024 بُعداً خفياً، 16 رأس انتباه — يوازي BERT-Large

البنية في جوهرها هي Transformer-XL مُعدَّل بآلية الانتباه الذاتي ثنائي التدفق. كل طبقة تُشغّل تيار المحتوى وتيار الاستعلام بالتوازي، ولكل تيار قناع انتباه مستقل. تيار المحتوى يعمل بـالانتباه الذاتي القياسي (يرى نفسه والسياق السابق). تيار الاستعلام يستخدم قناعاً مُقيَّداً يحجب محتوى الرمز المستهدف.

عند الضبط الدقيق، يُستغنى عن تيار الاستعلام — تيار المحتوى وحده يكفي، وهو يسلك سلوك محوِّل قياسي تماماً. لذلك فإن الضبط الدقيق في XLNet بسيط كما في BERT: نُضيف رأس مهمة فوق النموذج ونضبط جميع المعاملات.

افتح في المختبر
استكشف بنية XLNet طبقةً بطبقة. انقر على أي مكوّن لترى دوره.
تستيقظ التجربة عند وصولك…

النتائج: تفوّق على BERT في 20 مهمة

عند المقارنة في ظروف متكافئة (البيانات نفسها وحجم النموذج متقارب)، تفوّق XLNet على BERT في كل اختُبر عليه:

  • SQuAD 1.1: ارتفعت دقة F1 من 94.9 (BERT) إلى 95.5 (XLNet) — فهم القراءة مع إجابات مضمونة
  • SQuAD 2.0: من 89.1 إلى 90.6 — ويشمل أسئلة قد لا تملك إجابة
  • RACE (فهم القراءة): الدقة قفزت من 81.8 إلى 85.0 — نتيجة لافتة لأن RACE يتطلّب استدلالاً على فقرات طويلة
  • : حقّق XLNet-Large أفضل النتائج على عدة مهام
  • تصنيف النصوص: تحسينات واضحة على مجموعات Yelp وIMDB وDBpedia وAG News ومراجعات Amazon
  • ترتيب المستندات (ClueWeb09-B): تقدّم ملموس على BERT

اللافت أن XLNet حقّق كل ذلك بدون (NSP). أكّدت أن NSP لم تُضِف شيئاً للأداء، وهو ما أكّده RoBERTa لاحقاً بشكل مستقل.

افتح في المختبر
قارن أداء XLNet وBERT على المعايير الرئيسية. مرّر المؤشر فوق أي محور لعرض التفاصيل.
تستيقظ التجربة عند وصولك…

XLNet في مشهد النماذج اللغوية

  1. 2017

    المحوِّل

    بنية الانتباه الذاتي التي حلّت محل التكرار. تصميمه القائم على مرمِّز وفاكّ ترميز فتح الباب أمام BERT وGPT معاً.

  2. 2018

    GPT-1

    تدريب مسبق ذاتي الانحدار يقرأ النص من اليسار إلى اليمين. أثبت جدوى التدريب المسبق غير المُشرف ثم الضبط الدقيق، لكنه لا يرى السياق إلا من اتجاه واحد.

  3. 2018

    BERT

    نمذجة اللغة المُقنَّعة تتيح رؤية السياق من الاتجاهين. تصدّر 11 معياراً، لكنه يُدخل فجوة رمز [MASK] ويتعامل مع الرموز المُقنَّعة كأنها مستقلة عن بعضها.

  4. 2019

    Transformer-XL

    يعتمد التكرار على مستوى المقاطع والترميز الموضعي النسبي لالتقاط الاعتماديات بعيدة المدى. شكّل الأساس المعماري الذي بنى عليه XLNet.

  5. 2019

    XLNet

    يجمع بين نمذجة اللغة بالتبديل والانتباه ثنائي التدفق وتكرار Transformer-XL. تفوّق على BERT في 20 مهمة دون استخدام رموز [MASK].

  6. 2019

    RoBERTa

    أظهر أن تحسين إعدادات تدريب BERT (بيانات أكثر، تدريب أطول، حذف NSP) يردم جزءاً من الفارق مع XLNet، مما يؤكد أن المنهجيتين كلتيهما فعّالتان.

  7. 2020

    ELECTRA

    استبدل التقنيع بمهمة كشف الرموز المُستبدَلة، فيحصل كل رمز على إشارة تدريبية. حقّق نتائج بمستوى BERT بتكلفة حسابية أقل بكثير.

أثر XLNet مزدوج. من جهة، أثبت أن الإطار الذاتي الانحداري أمرن بكثير مما كان يُظنّ — فمع التدريب بالتبديل يستطيع التقاط سياق ثنائي الاتجاه بكفاءة تُضاهي أساليب التقنيع. من جهة أخرى، أبرز أهمية التعامل مع السياق بعيد المدى عبر آلية التكرار في Transformer-XL. ورغم أن النماذج اللاحقة سلكت مسارات مختلفة — RoBERTa عاد إلى تدريب BERT بصورة أبسط، وELECTRA اتّجه نحو أهداف تدريبية أكفأ — إلا أن ابتكارات XLNet تركت بصمتها على بنيات مثل UniLM وMPNet التي واصلت استكشاف المنطقة الوسطى بين التدريب الذاتي الانحداري والترميز الذاتي.

المرجعYang, Dai, Yang, Carbonell, Salakhutdinov, Le. XLNet: Generalized Autoregressive Pretraining for Language Understanding. NeurIPS, 2019.

مصطلحات هذه الورقة