الأسبوع الماضي كان الموضوع لسه يشبه مشروع هندسي أكثر من كونه دراسة منهجية.
Ember يحمّل نماذج GGUF، يشغل inference على المعالج، يسحب hidden states، ويحفظ activations تكفي لتدريب probes. هذا كان هدف واضح: خلّيني أوصل لداخل النموذج من كود Rust أتحكم فيه.
هذا الأسبوع تغير السؤال. مو بس: هل أقدر أستخرج hidden states؟ صار: هل أقدر أثق إن الـ probe يقيس الشيء اللي أقول إنه يقيسه؟
النتيجة صارت أقل لمعاناً. لكنها صارت أصدق.
الورقة الحالية ما زالت preprint draft، مو منشور محكّم نهائي. لكن الادعاء الأساسي صار أضيق بما يكفي إني أقدر أدافع عنه: بعض إشارات الصرف تبقى بعد ما نصعّب التسرب.
عنوان المسودة الآن: Leakage-Aware Probing of Arabic Morphology in Small Language Models. الاسم مناسب أكثر. الشغل ما عاد مجرد جدول probes على وسوم صرفية. صار عن سياسة التقسيم، وموضع التوكن، ومحتوى الـ prompt، والـ baseline، وصحة مسار التشغيل.
نتيجة الـ probe ما لها قيمة كبيرة إذا كان التقسيم ما يختبر نوع التعميم اللي ندّعيه.
الـ pipeline الأول كان بسيط:
هذا ما زال الخط الأساسي، لكن تفسيره تغير. استخراج hidden states مو ميزة جانبية. هو أداة القياس.
البيانات الحالية فيها 4,701 محفز صرفي عربي من PADT / CAMeL-style annotations. الوسوم تشمل: الجذر، اللمّة، POS، الوزن المجرد، الوزن المحسوس، الجنس، والعدد.
لكن مو كل وسم ينقاس بنفس الطريقة. بعض الوسوم قليلة الفئات. بعضها عنده مئات الفئات. وبعضها موجود تقريباً داخل الـ prompt إذا ما سوّيت ablation.
النماذج الصالحة الآن اثنين فقط:
أزلت نتائج Qwen2.5. هذا مو فشل من النموذج في العربي. التصحيح أبسط: مسار التشغيل وتحميل الـ tokenizer عندي أنتجوا hidden states غير صالحة. إذن ما تدخل الورقة. الجدول يصير أصغر، لكنه أنظف.
النسخة الأولى استخدمت random CV في أماكن ما كان ينفع فيها العشوائي. في الصرف العربي، كلمات كثيرة تشترك في جذر أو لمّة. إذا دخلت عائلة معجمية في التدريب والاختبار معاً، الـ probe ممكن يطلع قوي لأنه عرف العائلة، مو لأنه عمّم صرفياً.
هذا مهم تحديداً مع نظام الجذر والوزن. لو شاف النموذج عدة صيغ من نفس الجذر في التدريب، وبعدها شاف صيغة قريبة في الاختبار، النجاح يصير ملتبس: هل استرجع بنية صرفية؟ أو استفاد من overlap معجمي؟
لذلك التقييم الأشد يستخدم GroupKFold:
هذا يخفض بعض الأرقام. ممتاز. هذا هو الاختبار الحقيقي.
ادعاء أضيق ممكن يكون نتيجة أقوى.
أقوى نتيجة الآن هي POS.
POS يصمد تحت تقييم lemma/root-heldout في Qwen3-0.6B و Llama-3.2-1B. وعنده lift فوق baseline سطحي من character n-grams: +19.2 نقطة لـ Qwen3 تحت lemma-heldout، و +15.2 نقطة لـ Llama تحت نفس التقسيم.
هذا لا يعني إن النماذج "تفهم الصرف العربي". يعني شيء أضيق: التمثيلات تحتوي معلومة قابلة للاسترجاع خطياً عن الفئة النحوية/الصرفية، حتى بعد تقليل طريق التسرب المعجمي السهل.
الجنس والعدد أيضاً عندهم lift موجب، لكن أهدأ. مفيد، بس ما أبغى أحمّله أكثر مما يحتمل.
هنا صار عندي تصحيح مهم. الجذر واللمّة والوزن مو مثل POS والجنس والعدد.
POS والجنس والعدد فئات قليلة. غالباً كل الفئات موجودة في التدريب والاختبار. مصنف مغلق يقدر يتنبأ بها بشكل منطقي.
الجذر واللمّة والوزن عندهم مئات الفئات. تحت heldout splits، الاختبار ممكن يحتوي labels ما ظهرت أبداً في التدريب. مصنف closed-set ما يقدر يتنبأ بفئة ما شافها.
لذلك فشل root probe تحت تقسيم صارم لا يعني تلقائياً إن النموذج ما يمثل الجذر. ممكن يعني إن التقييم يطلب من مصنف مغلق يحل مسألة مفتوحة الفئات.
الجذر واللمّة والوزن يحتاجون إطار ثاني: retrieval، هندسة تمثيلات، nearest neighbors، اختبارات contrastive، أو محفزات nonce مصممة للتعميم. النسخة الحالية من الورقة ما تتظاهر إن نفس المصنف يصلح لكل الوسوم.
تصحيح ثاني: موضع التوكن. التمثيلات هنا مأخوذة من توكن النقطة في نهاية الـ prompt، مو من آخر subword للكلمة العربية.
هذا مقصود. توكن النقطة ثابت أكثر بين النماذج، ويأتي بعد ما يقرأ النموذج كل الـ prompt. هذا يخلي المقارنة بين Qwen و Llama أنظف من اختيار توكن عربي يختلف حسب الـ tokenizer.
لكنه يغير الادعاء. هذا مو direct word-token probing. أنا أقيس تمثيل نهاية الـ prompt بعد ما شاف النموذج كل الحقول، لا تمثيل الكلمة العربية نفسها فقط.
الـ prompt الأصلي كان يحتوي:
هذا prompt غني جداً. ممكن يكون مناسب لسؤال معين، لكنه مو محايد. إذا أعطيت النموذج اللمّة والجذر والوزن، فالـ probe يمكن يقيس تمثيل التحليل المعطى، مو فقط ما استخرجه النموذج من الكلمة السطحية.
لذلك شغلت نسخة ablated تحذف Lemma و Root و Pattern.
الدرس: الـ task-informative prompts تحتاج ablation checks. والاعتماد على الـ prompt ممكن يختلف حسب النموذج والوسم.
في أشياء كثيرة هذا الأسبوع كانت تصحيحات، لكنها مهمة:
هذه مو أشياء لامعة. لكنها هي اللي تخلي الأرقام الباقية قابلة للثقة.
كود الأنظمة جزء من أداة القياس.
إذا مسار الـ tokenizer غلط، الـ hidden states غلط. إذا فهرس الطبقة غلط، التفسير غلط. إذا الـ baseline يتحرك بين التشغيلات، الـ lift ما عاد traceable. هذا هو الشيء اللي صار واضح أكثر مع Ember.
Ember بدأ كمحرك inference بـ Rust لنماذج GGUF على المعالج. هذا ما زال الأساس. لكن الآن صار واضح إنه يتحول إلى reproducible probing pipeline.
الهندسة هنا مو منفصلة عن البحث. استخراج hidden states هو القياس نفسه. لازم أعرف النموذج، والـ tokenizer، والـ prompt، وموضع التوكن، والتقسيم، والـ baseline لكل رقم في الجدول.
الخطوات الجاية: نماذج أكثر، confidence intervals أقوى، وتقييم أفضل للجذر والوزن واللمّة. أحتاج أيضاً direct-token probing كدليل مكمّل، عشان أفصل تمثيل الكلمة نفسها عن تمثيل نهاية الـ prompt.
الادعاء الآن أضيق. POS يصمد في نموذجين صغيرين تحت تقييم أشد، مع lift موجب فوق surface baselines. الجنس والعدد إشارتهم أهدأ. الجذر واللمّة والوزن ما زالت مركزية في اتجاه البحث، لكنها تحتاج إطار تقييم أفضل قبل ما أتعامل معها كنتائج مثبتة.
النتيجة أقل لمعاناً. وهذا غالباً أفضل شيء صار لها هذا الأسبوع.