انتقل إلى المحتوى الرئيسي

الوحدة 5 — التضمينات السياقية والنماذج المدرَّبة مسبقًا

للتضمينات الثابتة التي رأيناها في الوحدة السابقة حدّ صارم: كلمة واحدة، متّجه واحد. لكنّ الكلمة لا تعني الشيء نفسه في كلّ الجُمَل. عين في المراجعات قد تكون عضو النظر، أو ثقب المفتاح، أو نبع الماء، أو اسم علامة تجارية. Word2Vec يعطيها متّجهًا وسطيًّا لا يخدم أيّ استعمال منها. حان الوقت لأن نُنتج متّجهًا حسب الجملة، وهذا ما تفعله عائلة النماذج المدرَّبة مسبقًا التي تهيمن على المجال منذ 2018.

سنعرض التطوّر من ELMo إلى BERT، ثمّ نستعمل نموذجًا عربيًّا مدرَّبًا مسبقًا لتوليد متّجهات جُمَل تسمح ببناء بحث دلاليّ على جسم مراجعاتنا.

من ثبات المتّجه إلى ثبات المعنى

bank في جملة I went to the bank (المصرف) وbank في we sat by the bank (الضفّة) هي كلمة واحدة رسميًّا. Word2Vec يعالجها كذلك: متّجه واحد يعكس متوسّط الاستعمالَين. النموذج التنبّئي المبنيّ فوقها لا يستطيع أن يفصل بين المعنيَين، فيتعلّم قواعد ضعيفة على كلّ منهما.

التضمينات السياقية تحلّ هذه المسألة جذريًّا: لكلّ ورود للكلمة في نصّ، نُنتج متّجهًا فريدًا يعتمد على السياق كلّه. الكلمة نفسها في جملتين مختلفتين تحصل على متّجهين مختلفَين. المسافة بينهما تعكس فرق المعنى.

في العربية، هذا يحلّ حالات ثقيلة: عام صفة أو ظرف زمن؛ صفَّى طهّر السائل أو أنهى شركة؛ أهلي قرابة، أو ملكيّة، أو اسم نادٍ. متّجه سياقي واحد يحسم ذلك.

ELMo: البذرة التي فتحت الطريق

النموذج الأوّل الذي شعبت هذه الفكرة بشكل واسع هو ELMo (Embeddings from Language Models) في 2018. فكرته: بدل استعمال متّجه Word2Vec ثابت، ندرّب شبكة LSTM ثنائيّة الاتّجاه على مهمّة نمذجة لغويّة (التنبّؤ بالكلمة التالية والسابقة). ثمّ نستخدم الحالات الداخلية لهذه الشبكة كتضمينات سياقية.

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

ELMo تجاوزته BERT سريعًا، لكنّ فكرته الأساسية بقيت.

BERT: الجواب المزلزل

في نهاية 2018، أعلنت غوغل عن BERT (Bidirectional Encoder Representations from Transformers). أساسه محوّل ترميز (رأينا آليات الانتباه في الدورة 12)، ودُرِّب مسبقًا بمهمّتين:

  1. نمذجة لغويّة بالإخفاء (Masked Language Modeling): تخفَى 15 بالمئة من الكلمات في جملة، ويُطلب من النموذج التنبّؤ بها من السياق. مثال: المنتج [MASK] جدا وأنصح به — على النموذج أن يقترح جيد، ممتاز، رائع.

  2. التنبّؤ بالجملة التالية (Next Sentence Prediction): تُقدَّم جملتان، ويُسأَل النموذج إن كانت الثانية تتبع الأولى في النصّ الأصلي. (هذه المهمّة أُثبت لاحقًا أنّها قليلة الفائدة، وأُسقطت في RoBERTa وأخواتها.)

الابتكار الأكبر لBERT مقارنة بELMo هو ثنائيّة الاتّجاه الحقّة. الانتباه الذاتي يسمح لكلّ جُذاذة برؤية كلّ الجُذاذات الأخرى في الجملة، يمنى ويسرى، دون تسلسل. النتيجة: تمثيل يجمع كامل السياق دفعة واحدة.

بعد التدريب المسبق، يمكن استعمال BERT بطريقتين:

  • مِيزات ثابتة: نمرّر النصّ من النموذج، نأخذ متّجهات الطبقات الأعلى كخصائص، ونُدرّب فوقها مُصنِّفًا صغيرًا.
  • الضبط الدقيق (fine-tuning): نضيف طبقة تصنيف على BERT، وندرّب الجميع على مهمّتنا. هذا الحلّ يبلغ أفضل النتائج غالبًا.

للعربية، النماذج المتوفّرة كثيرة: AraBERT (بيانات عربية فقط، جيّد على العربية الفصحى الحديثة)، AraELECTRA (أسرع تدريبًا)، CAMeLBERT (فروع مخصّصة للفصحى والعامّية العربية والمصرية)، XLM-RoBERTa (متعدّد اللغات، عربية جيّدة). لكلّ واحد نقاط قوّته، ولا يوجد اختيار افتراضي؛ يُختبر على مهمّة المصبّ ويُنتقى.

Sentence-BERT: من كلمات إلى متّجهات جُمَل

BERT الأصلي يعطي متّجهًا لكلّ جُذاذة. للحصول على متّجه للجملة كاملة، الفكرة الساذجة هي أخذ متوسّط كلّ متّجهات الجُذاذات، أو أخذ متّجه الجُذاذة الخاصّة [CLS]. كلاهما يعمل، ولكن أقلّ ممّا يمكن.

Sentence-BERT (SBERT) في 2019 حلّ هذا رسميًّا. بدل توسيط أعمى، يُضبط BERT دقيقًا على مهمّة تُعلِّمه أن يُنتج متّجهًا واحدًا للجملة يفصل الجُمل المتشابهة عن غير المتشابهة. التقنية: أزواج من الجُمَل موسومة بدرجة تشابه، وخسارة ثلاثية (triplet loss) تدفع الجُمَل المتقاربة إلى نقاط قريبة والمتباعدة إلى نقاط بعيدة.

النتيجة: متّجه جملة قابل للاستعمال المباشر في البحث الدلالي، وحساب التشابه بين جملتين يصير جداءً قياسيًّا بدل تمرير كامل بالنموذج. هذا فارق ألف ضِعْف في السرعة.

بحث دلاليّ على مراجعاتنا

فلنبنِ استرجاعًا: يعطي المستخدم عبارة (مشكلة في التوصيل)، وأريد استخراج المراجعات ذات المعنى الأقرب، وليس فقط تلك التي تحوي هذه الكلمات حرفيًّا.

from sentence_transformers import SentenceTransformer, util
import numpy as np

# نموذج عربي أو متعدد اللغات
saber = SentenceTransformer("paraphrase-multilingual-mpnet-base-v2")

muraja3at = [
"الطلب وصل بعد أسبوعين من الشراء",
"المنتج ممتاز ولا ملاحظات",
"توصيل سريع وتغليف جيد",
"لم أستلم الطلب رغم أنه مرّ شهر",
"الجودة أقلّ من المتوقّع بالنسبة للسعر",
]

# تشفير مسبق للمراجعات كلها (يُنفَّذ مرّة واحدة)
mut = saber.encode(muraja3at, normalize_embeddings=True)

# استعلام المستخدم
istifsar = "مشكلة في التوصيل"
q = saber.encode(istifsar, normalize_embeddings=True)

# التشابه الجيبي: جداء قياسي لأن الأمة موحّدة
darajat = mut @ q
tartib = np.argsort(-darajat)[:3]

for i in tartib:
print(f"{darajat[i]:.3f}{muraja3at[i]}")

النموذج يُرتّب الطلب وصل بعد أسبوعين ولم أستلم الطلب رغم أنه مرّ شهر في القمّة، دون أن يحوي أيّ منهما كلمة مشكلة أو توصيل حرفيًّا. هذا ما لا يقدر عليه TF-IDF ولا Word2Vec: البحث على مستوى المعنى، لا الكلمة.

التشابه الجيبي مقابل المسافة الإقليدية

بعد تسوية المتّجهات (normalize_embeddings=Trueالتشابه الجيبي يصير جداءً قياسيًّا، والمسافة الإقليدية بينها ترتبط به بعلاقة أحاديّة النغمة:

uv2=22(uv)عندماu=v=1\|u - v\|^2 = 2 - 2 (u \cdot v) \quad \text{عندما} \quad \|u\| = \|v\| = 1

النتيجة: ترتيب البحث بالتشابه الجيبي أو بالمسافة الإقليدية على متّجهات موحّدة متطابق. الفارق في السرعة: جداء قياسي في مصفوفة كبيرة عملية عالية التحسين على GPU. من هنا التوصية الثابتة: وحِّد المتّجهات مرّة عند التشفير، ثمّ اضرب.

للاسترجاع على ملايين المراجعات، لا يكفي جداء قياسي مباشر. تُستعمل مكتبات مثل FAISS أو Annoy التي تبني قهارس تسمح بجيران تقريبيّين في زمن لوغاريتمي. الدقّة قد تسقط بواحد بالمئة، لكنّ زمن الاستجابة يصير قابلًا للنشر.

اختيار طول المتّجه ليس تفصيلًا

الاختصار إلى 384 بعدًا يوفّر ذاكرة وسرعة، لكنّه يفقد دقّة على المهامّ الدقيقة. اختيار 768 بعدًا أدقّ لكنّ التخزين مضاعف. للبحث على مليون مستند، الفرق بين 384 و768 قد يعني عدّة غيغابايتات وأضعاف الزمن. اختر بعد قياس على مهمّتك، لا بحسب ما يُقترَح في وثائق المكتبة.

حدّث المتّجهات دون إعادة تدريب النموذج

حين يتوسّع جسم المراجعات، لا تعِد تدريب النموذج المدرَّب مسبقًا. اكتفِ بحساب متّجهات المراجعات الجديدة بالنموذج نفسه وأضِفها إلى الفهرس. نموذج التضمين مستقلّ عن جسم البحث؛ هذا فصل جوهريّ يجعل تكلفة التحديث خفيفة.

في الخلاصة

  • التضمينات السياقية تُنتج متّجهًا فريدًا لكلّ ورود لكلمة حسب جملتها، فتحلّ تعدّد المعنى ولا تتجاهله كما تفعل Word2Vec.
  • BERT يقدّم انتباهًا ذاتيًّا ثنائيَّ الاتّجاه على أساس التدريب المسبق بمهمّة النمذجة اللغويّة بالإخفاء؛ عائلة عربية غنيّة (AraBERT، AraELECTRA، CAMeLBERT).
  • Sentence-BERT يُضبط دقيقًا لينتج متّجه جملة واحدًا قابلًا للمقارنة المباشرة بالتشابه الجيبي، وهو أساس البحث الدلالي الحديث.
  • بعد التسوية، التشابه الجيبي يصير جداءً قياسيًّا، والاسترجاع على مقياس واسع يعتمد قهارس تقريبية مثل FAISS.

الوحدة التالية: تصنيف النصوص وتحليل المشاعر، حيث نضبط النموذج المدرَّب مسبقًا على مهمّة محدّدة وننجز أوّل تصنيف كامل يتفوّق على الحدّ الأدنى TF-IDF.