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

الوحدة 8 — المرمّز وفاكّ الترميز: T5 والترجمة

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

هذه الوحدة تُغلق دائرة المشروع الموجّه بجمع الكتلتَين، ثمّ تُظهر كيف أعاد T5 عام 2019 صياغة كلّ مسائل NLP في إطار موحّد.

الانتباه المتقاطع

في الانتباه الذاتي، الاستعلام والمفتاح والقيمة يأتون من نفس التسلسل. في الانتباه المتقاطع، الاستعلام يأتي من فاكّ الترميز، والمفتاح والقيمة يأتيان من مخرَج المرمّز:

Q=decoder_hiddenWQ,K=encoder_outWK,V=encoder_outWVQ = \text{decoder\_hidden} \cdot W_Q, \quad K = \text{encoder\_out} \cdot W_K, \quad V = \text{encoder\_out} \cdot W_V

المعنى واضح: فاكّ الترميز، وهو يُولّد جتونه التالي، يستفسر المرمّز عن أيّ جزء من الجملة المصدر يحتاجه الآن. في الترجمة من الفرنسية إلى العربية، جتون فاكّ الترميز الذي يُنتج الفعل يستعلم عن الفعل في المصدر، وليس عن الفاعل. هذا يجعل الاصطفاف بين اللغتَين مُتَعَلَّمًا، لا مفروضًا.

الميكانيك نفسه الذي في الوحدة 3، ما عدا أنّ الاستعلام مختلف الحجم عن المفاتيح والقيم في العرض العامّ:

  • استعلام من فاكّ الترميز: (B,ntgt,dmodel)(B, n_{\text{tgt}}, d_{\text{model}}).
  • مفتاح وقيمة من المرمّز: (B,nsrc,dmodel)(B, n_{\text{src}}, d_{\text{model}}).
  • المخرج: (B,ntgt,dmodel)(B, n_{\text{tgt}}, d_{\text{model}}).

مصفوفة الأوزان الوسيطة تحمل الحجم (B,h,ntgt,nsrc)(B, h, n_{\text{tgt}}, n_{\text{src}})، والنظرة إليها تُعرِّي الاصطفاف بين اللغتَين. حين نُدرّب على الترجمة ونعرض هذه الخرائط، نرى نمطًا شبه قطري: كلّ جتون هدف يوزّع اهتمامه على جتونات مصدرها الترجمية.

كتلة فاكّ ترميز كاملة

فاكّ الترميز في معمارية encoder-decoder يحتوي ثلاث كتل فرعيّة، لا كتلتَين:

  1. انتباه ذاتي مقنَّع سببيًّا على الجتونات المولّدة سابقًا.
  2. انتباه متقاطع بين استعلام فاكّ الترميز ومخرَج المرمّز.
  3. شبكة أمامية.

لكلّ منها وصلة متبقّية وLayerNorm.

import torch
import torch.nn as nn

# نفترض MultiHeadAttention وFeedForward وResidualBlock من الوحدات السابقة

class Seq2SeqDecoderLayer(nn.Module):
def __init__(self, d_model, num_heads, d_ff, dropout=0.1):
super().__init__()
self.self_attn = MultiHeadAttention(d_model, num_heads)
self.cross_attn = MultiHeadAttention(d_model, num_heads)
self.ff = FeedForward(d_model, d_ff, dropout)
self.res1 = ResidualBlock(d_model, dropout)
self.res2 = ResidualBlock(d_model, dropout)
self.res3 = ResidualBlock(d_model, dropout)

def forward(self, x, memory, causal_mask, src_mask=None):
# x: (B, n_tgt, d) استعلام مولّد
# memory: (B, n_src, d) مخرَج المرمّز
x = self.res1(x, lambda z: self.self_attn(z, z, z, mask=causal_mask))
x = self.res2(x, lambda z: self.cross_attn(z, memory, memory, mask=src_mask))
x = self.res3(x, self.ff)
return x

src_mask يُشير إلى جتونات padding في الجملة المصدر: القناع هنا ليس سببيًّا، لأنّ فاكّ الترميز يجوز له النظر إلى كلّ الجملة المصدر (وقد قرأها المرمّز بالفعل).

T5: كلّ شيء نصّ إلى نصّ

في 2019 اقترح Raffel وزملاؤه في Google ورقة عنوانها «Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer». الفكرة تحاول أن تُوحّد كلّ مسائل NLP في مسألة واحدة: تحويل نصّ إلى نصّ.

  • التصنيف؟ المدخل النصّ، المخرج اسم الصنف كنصّ.
  • الترجمة؟ المدخل «translate French to English: ...», المخرج الترجمة.
  • الإجابة على أسئلة؟ المدخل السؤال والسياق، المخرج الإجابة كنصّ.
  • التلخيص؟ المدخل «summarize: ...», المخرج الملخّص.

هذا التوحيد له فائدة عمليّة قصوى: نموذج واحد ووزن واحد لكلّ المهمّات. المعمارية المستعملة هي encoder-decoder كاملة، مع مهمّة تدريب مسبق مبتكرة: إخفاء أجزاء متتالية (spans) من النصّ، وإطلاب فاكّ الترميز بإعادتها.

T5 قدّم أيضًا نتائج قياس: مقارنة مضبوطة بين عدّة أحجام (small, base, large, 3B, 11B) وعدّة أهداف تدريب مسبق. الاستنتاج الأشهر: النتائج تتحسّن على كلّ المهمّات مع زيادة الحجم، دون تشبّع واضح — وهو ما سماه الباحثون لاحقًا قوانين التحجيم (scaling laws).

متى نُفضّل أيّ عائلة

سؤال عمليّ محوري: ما العائلة الأنسب لمشروعي؟

المهمّةمرمّز فقط (BERT)فاكّ ترميز فقط (GPT)مرمّز-فاكّ ترميز (T5)
تصنيف نصّممتاز، رأس صغير على CLSممكن لكنّه ثقيلممكن، مبالغ فيه
استخراج معلومات (NER)ممتاز، رأس على كلّ جتونممكن مع صياغة توليديةممكن
توليد نصّ حرّلا يُولّدممتاز، الأداة الطبيعيّةممكن، لكنّه مقيّد بمهمّة
ترجمة، تلخيص، إعادة صياغةلا يُنتج بشكل طبيعيممكن مع تلقين طويلممتاز، صُمّم لهذا
أسئلة عامّة على معرفة النموذجلاممتازجيّد
أسئلة مع سياق مُقدَّمجيّد بmerge نصّ+سؤالجيّدممتاز

مفتاح القرار: هل المهمّة تحويل (transformation) نصّ إلى نصّ آخر مُحدَّد؟ فاختر encoder-decoder. هل هي توليد حرّ؟ فاختر decoder-only. هل هي فهم (تصنيف، استخراج)؟ فاختر encoder-only. طبعًا الحدود ذابت جزئيًّا مع النماذج الكبيرة الحديثة: GPT-4 يقوم بكلّ شيء، لكنّ ذلك يأتي بثمن الحوسبة.

عائلة encoder-decoder المفتوحة

قائمة موجزة من مكتبة transformers:

النموذجالعاممساعدة اختيار
T5 (small إلى 11B)2019خطّ أساس لأيّ مهمّة text-to-text
mT52020نسخة متعدّدة اللغات من T5 (101 لغة، بينها العربية)
BART2019يشبه T5، مُصمَّم للتلخيص وإعادة الصياغة أساسًا
MarianMT2020مجموعة نماذج ترجمة ثنائية اللغة، خفيفة نسبيًّا
mBART2020ترجمة متعدّدة اللغات مع دعم عربي جيّد
Flan-T52022T5 مضبوط بتعليمات، أفضل على zero-shot
Aya-1012024نموذج متعدّد اللغات من Cohere بدعم عربي قويّ

مثال ترجمة سريع:

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
import torch

model_name = "Helsinki-NLP/opus-mt-fr-ar"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

texts = ["Le chat mange le poisson.", "La bibliothèque ouvre à neuf heures."]
enc = tokenizer(texts, padding=True, return_tensors="pt")
out = model.generate(**enc, max_new_tokens=40, num_beams=4)
print(tokenizer.batch_decode(out, skip_special_tokens=True))

يستعمل generate بحث الشعاع افتراضيًّا، ويُعالج الانتباه المتقاطع ومهمّة <bos> وذاكرة KV تلقائيًّا.

قبل أن تُطلق نموذجًا كبيرًا للتلخيص

لا تفترض أنّ الحلّ هو نموذج ضخم عامّ. لمهمّة تلخيص أخبار بالعربية، نموذج mBART-large بحجم 610 مليون معامل أو AraT5 يمنحك عدّة نقاط أفضل من GPT-3.5 المفتوح، مع كلفة استدلال أقلّ بأربعين مرّة. القاعدة: على مهمّة محدّدة وذات بيانات تدريب متوفّرة، النموذج المخصّص يفوز.

في الخلاصة

  • الانتباه المتقاطع يستعمل استعلامًا من فاكّ الترميز ومفاتيح/قيم من المرمّز؛ يتعلّم الاصطفاف بين الجملتَين المصدر والهدف بطبيعته.
  • كتلة فاكّ ترميز الكاملة تحوي ثلاث طبقات فرعيّة: انتباه ذاتي مقنَّع، انتباه متقاطع، شبكة أمامية.
  • T5 أعاد صياغة كلّ مسائل NLP في إطار «نصّ إلى نصّ» موحّد؛ وقاس بذلك قوانين التحجيم قبل ازدهارها في LLM.
  • الاختيار بين مرمّز-فاكّ ترميز، ومرمّز فقط، وفاكّ ترميز فقط، ليس عقيدة: بل يعتمد على شكل المهمّة (تحويل، فهم، توليد حرّ) وميزانية الحوسبة.

الوحدة التالية: نلتفت إلى المشكلة التي يحمل حلّها Transformer نفسه — الكلفة التربيعية للانتباه في الطول — ونستعرض ما بعد FlashAttention والأنماط الإفرادية.