نماذج اللغة2016تأسيسي10 دقيقة قراءة
ترجمة الكلمات النادرة آلياً باستخدام وحدات دون الكلمة
Neural Machine Translation of Rare Words with Subword Units
Sennrich, R. · Haddow, B. · Birch, A. — ACL
المشكلة
في عام 2015 كانت أنظمة العصبية مقيّدة بقاموس مفردات ثابت — غالباً بين 30,000 و50,000 كلمة. كل كلمة لا تظهر في هذا القاموس تُستبدل برمز <UNK> يعني ببساطة «لا أعرف هذه الكلمة». الأسماء والمركّبات والتصريفات النادرة كانت كلها تضيع بهذه الطريقة. كان الحل المتاح وقتها هو الاستعانة بقواميس احتياطية تملأ الفراغات بعد الترجمة، لكن هذا الحل كسر انسيابية التعلّم من طرف إلى طرف وبقي هشّاً أمام الكلمات المركّبة والتصريفات.
الإسهام
تكييف خوارزمية ترميز أزواج البايت — وهي في الأصل خوارزمية ضغط بيانات من عام 1994 — لتصبح أداة تجزئة دون مستوى الكلمة في أنظمة الترجمة الآلية العصبية. الفكرة بسيطة: بدلاً من دمج أزواج البايتات، ادمج أكثر أزواج الحروف تكراراً في بيانات التدريب حتى تصل إلى حجم القاموس المطلوب. الكلمات الشائعة تبقى كما هي، والنادرة تُفكّك إلى أجزاء معروفة. النتيجة: ترجمة مفتوحة القاموس فعلاً بلا رموز مجهولة ولا قواميس احتياطية ولا تعديلات في البنية — مجرد خطوة معالجة أولية حسّنت مقياس BLEU بمقدار +1.1 إلى +1.5 نقطة على الإنجليزية↔الألمانية والإنجليزية↔الروسية.
الأثر
أصبح ترميز أزواج البايت الطريقة المعتمَدة في كل النماذج اللغوية الكبرى التي جاءت بعده: GPT-1 وGPT-2 وGPT-3 وGNMT ومعظم الأنظمة المبنية على المُحوِّل. متغيراته مثل في BERT وSentencePiece في T5 وUnigram تشكّل اليوم العمود الفقري لتجزئة النصوص في معالجة اللغات الطبيعية. حلّت الورقة مشكلة بشكل جذري حتى اختفت قواميس الكلمات الثابتة تماماً من الساحة. في كل مرة تكتب فيها نصاً لنموذج لغوي، يمرّ نصك أولاً بتجزئة أزواج البايت قبل أي شيء آخر.
تخيّل مطبعة لا تملك إلا 5,000 قالب — قالب لكل كلمة شائعة. حين تأتي كلمة نادرة أو اسم أجنبي، لا يجد الطابع قالباً لها فيترك فراغاً ▒ مكانها.
يعمل كأنه ورشة بلاطات حروف بجانب المطبعة: يراقب أكثر أزواج الحروف ظهوراً معاً — مثل «ال»، «ين»، «ست» — ويصنع بلاطة جاهزة لكل زوج متكرر. بهذه الطريقة يستطيع الطابع تركيب أي كلمة من بضع بلاطات مألوفة، وتختفي الفراغات نهائياً.
المشكلة: سقف مُفرداتي يحجب الكلمات النادرة
في عام 2015 كانت نماذج الترجمة الآلية العصبية تعتمد ثابت الحجم — عادةً أكثر 30,000 إلى 50,000 كلمة شيوعاً في التدريبية. أي كلمة لا تظهر في هذا القاموس تتحوّل إلى رمز واحد <UNK> يعني «مجهول». ترتّب على ذلك ثلاث مشاكل مترابطة:
1. الأسماء والأرقام تضيع كلياً. اسم مثل "Bundesverteidigungsministerium" (وزارة الدفاع الألمانية الاتحادية) يصبح <UNK> — ولا سبيل لترجمته.
2. التصريفات تُفجّر حجم القاموس. كالألمانية والفنلندية والتركية تولّد كلمات مركّبة بطريقة توافقية لا تستطيع أي قائمة ثابتة استيعابها.
3. القواميس الاحتياطية تكسر التعلّم الشامل. الحل المتاح وقتها كان استبدال <UNK> بترجمات من قاموس خارجي بعد الترجمة — لكن هذه الخطوة قطعت مسار التدرّج النظيف الذي يمنح النماذج العصبية قوّتها، وكانت هشّة أمام الكلمات المركّبة.
<UNK>. ثم فعّل وضع ترميز أزواج البايت لترى كيف تتفكك إلى أجزاء معروفة.الفكرة: دع البيانات نفسها تبني القاموس
الملاحظة المحورية في هذه الورقة هي أن أغلب الكلمات النادرة ليست غريبة حقاً — بل هي تركيبات من مقاطع مألوفة. خذ مثلاً الكلمة الألمانية "Abwasserbehandlungsanlage" (محطة معالجة الصرف الصحي): ككتلة واحدة هي نادرة جداً، لكن أجزاءها — "Abwasser" (صرف) و"Behandlung" (معالجة) و"Anlage" (محطة) — شائعة كلٌّ على حدة. لو استطعنا تفكيك الكلمات النادرة إلى هذه الأجزاء المعروفة، سيتمكن النموذج من ترجمتها بالتركيب.
من هنا استعار سينريتش وزملاؤه أداةً من مجال ضغط البيانات: ترميز أزواج البايت الذي اقترحه غيج عام 1994. الفكرة الأصلية بسيطة: ابحث عن أكثر زوج بايتات تكراراً في الملف واستبدله ببايت واحد جديد لتقليص الحجم. ما فعله المؤلفون هو تطبيق المبدأ ذاته على النصوص: بدلاً من البايتات، ادمج أكثر أزواج الحروف تكراراً لتبني قاموس مفردات من مشتقّة مباشرةً من بيانات التدريب.
الخوارزمية: عُدّ، ادمِج، كرِّر
تعمل خوارزمية ترميز أزواج البايت على مرحلتين متتابعتين — مرحلة تدريب تتعلّم فيها قواعد الدمج، ومرحلة تطبيق تستخدم فيها تلك القواعد:
التدريب (بناء جدول الدمج): نبدأ بقاموس يضمّ كل الحروف المنفردة الموجودة في المدوّنة النصية التدريبية مع رمز خاص لنهاية الكلمة. بعدها نكرّر العملية التالية: (1) نعُدّ كل زوج حروف متجاور في المدوّنة كاملةً، (2) نحدّد الزوج الأكثر تكراراً، (3) ندمجه في رمز واحد جديد ونضيفه إلى القاموس، (4) نستبدل كل ظهوراته في المدوّنة. نستمر حتى نصل إلى العدد المطلوب من عمليات الدمج (مثلاً 30,000 عملية).
التطبيق (تجزئة نص جديد): عند الاستخدام الفعلي، نفكّك كل كلمة إلى حروفها ثم نُعيد تشغيل عمليات الدمج المتعلَّمة بالترتيب ذاته. العمليات المبكرة تنطلق أولاً (أزواج شائعة مثل "ا"+"ل" → "ال") ثم تتراكم تدريجياً حتى تتشكّل كلمات كاملة. أما الكلمات النادرة فلا تكتمل عمليات دمجها، وتبقى سلسلة من وحدات دون الكلمة معروفة للنموذج.
تخيّل الأمر كبناء بمكعبات ليغو. الخوارزمية تبدأ بأصغر المكعبات — أي الحروف المنفردة. ثم تراقب أي أزواج مكعبات تُركَّب معاً أكثر من غيرها عبر كل المباني (الكلمات) في مدينة التدريب (المدوّنة النصية). كل زوج متكرر تصهره في قطعة جاهزة أكبر وتضيفها إلى الكتالوج. بعد آلاف عمليات الصهر، تصبح المباني الشائعة قطعة واحدة كبيرة، بينما المباني غير المألوفة تظل قابلة للبناء بمزيج من القطع المتوسطة والصغيرة — ولا يغيب شيء من المجموعة أبداً.
الوصف الرسمي لترميز أزواج البايت
قبل الصيغة الرياضية، لنفهم ما تقوله ببساطة: نريد بناء أفضل قاموس مفردات ممكن بحجم معيّن، وذلك بدمج زوج الحروف الذي يضغط المدوّنة النصية أكثر من غيره في كل خطوة — أي الزوج الأكثر تكراراً.
الخوارزمية في الكود البرمجي
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import re, collections
def get_stats(vocab):
"""عدّ تكرار كل زوج رموز متجاور عبر كل الكلمات."""
pairs = collections.defaultdict(int)
for word, freq in vocab.items():
symbols = word.split()
for i in range(len(symbols) - 1):
pairs[(symbols[i], symbols[i+1])] += freq
return pairs
def merge_vocab(pair, vocab):
"""استبدل كل ظهور للزوج برمز مدموج واحد."""
out = {}
bigram = re.escape(' '.join(pair))
pattern = re.compile(r'(?<!\S)' + bigram + r'(?!\S)')
for word in vocab:
new_word = pattern.sub(''.join(pair), word)
out[new_word] = vocab[word]
return out
# --- مثال عملي ---
vocab = {'l o w </w>': 5, 'l o w e r </w>': 2,
'n e w e s t </w>': 6, 'w i d e s t </w>': 3}
num_merges = 10
for i in range(num_merges):
pairs = get_stats(vocab)
if not pairs:
break
best = max(pairs, key=pairs.get) # الاختيار الجشع
vocab = merge_vocab(best, vocab)
print(f"دمج #{i+1}: {best[0]} + {best[1]} → {''.join(best)}")
# بعد التدريب: "lowest" → "low" + "est</w>" (كلاهما معروف)
# كلمة نادرة مثل "newer" → "new" + "er</w>" (تركيبيّاً!)القاموس المشترك في مقابل المنفصل
من القرارات التصميمية المهمة: هل نتعلّم ترميز أزواج البايت بشكل منفصل لكل لغة، أم نتعلّمه بشكل مشترك على بيانات اللغتين معاً؟
الترميز المنفصل يتعلّم قواعد الدمج لكل لغة على حدة. هذا الخيار مناسب حين تستخدم اللغتان أنظمة كتابة مختلفة (كالإنجليزية والروسية مثلاً).
الترميز المشترك يجمع بيانات اللغتين في مدوّنة نصية واحدة ويتعلّم منها مجموعة قواعد دمج موحّدة. هذا الخيار فعّال جداً حين تتشارك اللغتان الأبجدية ذاتها (كالإنجليزية والألمانية) لأن والمستعارة مثل "Computer" و"Information" تُجزَّأ بطريقة متطابقة في كلتا اللغتين، وهذا يُوفّر للنموذج جسراً طبيعياً بينهما. وجدت الورقة أن الترميز المشترك بـ 90,000 عملية أعطى أفضل النتائج بين الإنجليزية والألمانية.
مُفاضلة حجم القاموس
عدد عمليات الدمج يتحكّم مباشرةً في ومدى نعومة التجزئة. فكّر فيه كمقبض تقريب وتبعيد:
عمليات دمج قليلة (قاموس صغير): الكلمات تتفكّك إلى قطع صغيرة كثيرة — أحياناً حروف منفردة. النموذج يرى قصيرة ومتكررة جداً لكنه يحتاج أطول لتمثيل النص ذاته. القاموس مدمج لكن المتتالية طويلة.
عمليات دمج كثيرة (قاموس كبير): الكلمات الشائعة تبقى كاملة والمتتالية قصيرة. لكن القاموس يكبر وجدول يستهلك ذاكرة أكبر، والكلمات النادرة داخل القاموس لا تظهر في التدريب مرات كافية لتعلّم تمثيلات جيدة لها.
وجدت الورقة أن 60,000 إلى 90,000 عملية دمج تحقّق نقطة التوازن المثلى للترجمة، حيث توازن بين تغطية القاموس وطول المتتالية.
النتائج والأثر
قيّمت الورقة أداء ترميز أزواج البايت على مهام ترجمة WMT 2015 بين الإنجليزية والألمانية وبين الإنجليزية والروسية. أبرز ما توصّلت إليه:
في الترجمة من الإنجليزية إلى الألمانية، حقّق الترميز المشترك بـ 90 ألف عملية تحسّناً بمقدار +1.1 نقطة في مقارنةً بخط الأساس القائم على الكلمات الكاملة مع قاموس احتياطي. أما على صعيد الكلمات النادرة تحديداً، فتحسّنت دقة F1 بشكل ملحوظ — لم يعد النموذج مضطراً لنسخ رموز مجهولة.
في الترجمة من الإنجليزية إلى الروسية (نظاما كتابة مختلفان)، أعطى الترميز المنفصل بـ 60 ألف عملية لكل لغة أفضل أداء، مع تعامل سلس مع تصريفات الأبجدية السيريلية.
والأهم من كل ذلك أن ترميز أزواج البايت لم يتطلّب أي تعديل في بنية نظام الترجمة. كان مجرد خطوة — جزّئ النص، ودرّب نموذج كالمعتاد، ثم أعِد تجميع الأجزاء بعد الترجمة (بإزالة علامات @@). هذه البساطة هي ما جعلت تبنّيه شاملاً وسريعاً.
ترميز أزواج البايت مقارنةً بأساليب التجزئة الأخرى
اختبرت الورقة أيضاً تجزئة ثنائيات الحروف المتداخلة (تقسيم الكلمات إلى أزواج حروف متراكبة) وقارنتها بترميز أزواج البايت. ثنائيات الحروف كانت أبسط لكنها أنتجت متتاليات أطول بكثير، ما أبطأ التدريب وخفض أداء الترجمة.
ترميز أزواج البايت يقع في نقطة توازن مثالية: يعتمد على البيانات فقط بلا قواعد لغوية، وينتج متتاليات مدمجة لأن الكلمات الشائعة تبقى كاملة، ويعمل مع أي لغة. المتغيرات التي جاءت لاحقاً صقلت هذه الفكرة الأساسية:
WordPiece (المستخدم في BERT وGNMT) يشبه ترميز أزواج البايت لكنه يختار عمليات الدمج بناءً على تعظيم احتمالية نموذج اللغة بدلاً من التكرار الخام.
SentencePiece يتخلّص من الحاجة إلى فصل الكلمات بمسافات مسبقاً ويعامل النص الخام كتيار متّصل — وهذا ضروري للغات كاليابانية والصينية التي لا تستخدم فراغات بين الكلمات.
نموذج Unigram (كودو 2018) يعمل بالاتجاه المعاكس: يبدأ بقاموس كبير ثم يُقلّمه تنازلياً مستخدماً نموذج لغة أحادي لاختيار الأجزاء التي يستحقّ الإبقاء عليها.
لماذا أصبح ترميز أزواج البايت ركيزة معالجة اللغات الطبيعية الحديثة
1994
ترميز أزواج البايت الأصلي (غيج)
خوارزمية ضغط بيانات تستبدل أكثر أزواج البايتات تكراراً برمز جديد بشكل متكرر. ضغط بحت — لم تُستخدم في معالجة اللغات بعد.
2016
ترميز أزواج البايت للترجمة الآلية العصبية (سينريتش وزملاؤه)
هذه الورقة. نقلت ترميز أزواج البايت من ضغط البايتات إلى تجزئة النصوص، فحلّت مشكلة القاموس المفتوح وأصبحت المعيار في تجزئة النصوص.
2016
GNMT وWordPiece (غوغل)
نظام غوغل للترجمة الآلية العصبية تبنّى WordPiece — متغيّر من ترميز أزواج البايت يختار الدمج بناءً على الاحتمالية بدلاً من التكرار. هذا النظام شغّل التحديث العصبي لترجمة غوغل.
2017
الوحدات الفرعية في fastText
أداة fastText من فيسبوك استخدمت مقاطع حرفية متداخلة (أسلوب أبسط لتجزئة الكلمات) لبناء تضمينات الكلمات، مما أتاح إنشاء تضمين لأي كلمة — مستلهمةً الرؤية ذاتها حول القاموس المفتوح.
2018
GPT-1 يتبنّى ترميز أزواج البايت
استخدم GPT-1 من OpenAI تجزئة بترميز أزواج البايت بنحو 40,000 عملية دمج. من هذه اللحظة، أصبح كل نموذج لغوي كبير يعتمد شكلاً ما من التجزئة دون مستوى الكلمة.
2018
SentencePiece (كودو)
أداة تجزئة مستقلة عن اللغة تعمل على النص الخام مباشرةً دون فصل مسبق للكلمات، وتجمع بين أسلوبَي ترميز أزواج البايت وUnigram. مُستخدمة في T5 وmBART والعديد من النماذج متعددة اللغات.
هذه الورقة مثال نادر على إسهام علمي ليس ببنية جديدة ولا بدالة خسارة مبتكرة، بل بمجرد خطوة معالجة أولية. الفكرة أن حيلة ضغط بسيطة من عام 1994 — بتعديل واحد وهو استخدام أزواج الحروف بدل أزواج البايتات — استطاعت حلّ واحدة من أعقد مشاكل الترجمة الآلية العصبية. وهذا يُبيّن قوة اختيار مستوى التجريد الصحيح: وحدة الترجمة ليست الكلمة الكاملة ولا الحرف المنفرد، بل شيء بينهما — الوحدة دون الكلمة. كل أداة تجزئة نصوص حديثة ترث هذه الفكرة.
المرجعSennrich, Haddow, Birch. Neural Machine Translation of Rare Words with Subword Units. ACL, 2016.
مصطلحات هذه الورقة
- ترميز زوج البايتByte Pair Encoding (BPE)
- التجزئة دون مستوى الكلمةSubword Segmentation
- عملية الدمجMerge Operation
- القاموس المفتوحOpen Vocabulary
- القاموس المشتركJoint Vocabulary
- سعة قاموس المفرداتVocabulary Size
- خارج قاموس المفرداتOut-of-Vocabulary (OOV)
- WordPieceWordPiece
- أداة تجزئة الجمل والكلماتSentencePiece
- الكلمة المتشابهة بين اللغاتCognate