هذا المقال يتطلب مستوى: متوسط
لو بتدفع في استضافة نموذج بحجم 70 مليار باراميتر، وكل استدعاء بياخد مئات الميلي ثانية ويكلّفك أضعاف ما تتخيّل، فيه طريقة تنزّل الحجم والتكلفة بشكل كبير من غير ما تفقد جودة تُذكر. الأداة اسمها تقطير المعرفة (Knowledge Distillation).
تقطير المعرفة: نموذج صغير يرث ذكاء نموذج كبير
المشكلة باختصار
النماذج الكبيرة دقيقة، لكنها غالية في الاستدلال وبطيئة وصعبة النشر على أجهزة محدودة. الحل الشائع الغلط إنك تدرّب نموذج صغير من الصفر على نفس البيانات وتتمنى يوصل لنفس الدقة. الطريقة دي بتفشل غالبًا: النموذج الصغير معندوش سعة كافية يكتشف نفس الأنماط لوحده من إشارة "الإجابة الصحيحة" وبس. تقطير المعرفة بيحل ده بإنه ينقل من المعلّم الكبير مش الإجابة النهائية فقط، لكن طريقة "تفكيره" كلها.
الفكرة بمثال بسيط: المعلّم والطالب
تخيّل معلّم خبير وطالبين. الطالب الأول بيحفظ الإجابة النهائية بس: "الصورة دي كلب". الطالب التاني بيسمع المعلّم وهو بيفكر بصوت عالٍ: "دي كلب باحتمال 62%، بس ممكن تبقى قطة باحتمال 26%، وثعلب باحتمال 12%". الطالب التاني اتعلّم حاجة إضافية مهمة: إن القطة أقرب شبهًا للكلب من الثعلب. المعلومة دي — اللي بنسمّيها "المعرفة الغامقة" (dark knowledge) — مش موجودة في الإجابة النهائية الجافة، لكنها موجودة في توزيع الاحتمالات كامل. تقطير المعرفة ببساطة بيخلّي الطالب يتعلّم من التوزيع كله، مش من الإجابة النهائية بس.
الشرح العلمي: soft labels ودرجة الحرارة
النموذج بيطلّع في آخر طبقة أرقام خام اسمها logits، وبتتحول لاحتمالات عبر دالة softmax. لو طبّقت softmax عادية، النموذج القوي بيطلّع توزيع "حاد": 0.99 للإجابة الصحيحة وشبه صفر لباقي الفئات، فالمعلومة عن العلاقات بين الفئات بتضيع. هنا بييجي دور درجة الحرارة (Temperature، ويرمزلها T). لما تقسم الـ logits على T أكبر من 1 قبل الـ softmax، التوزيع بيبقى أنعم وبيكشف الاحتمالات الصغيرة المخفية. ده اللي بنسمّيه soft labels.
الافتراض هنا إن عندك وصول للنموذج المعلّم لتوليد توزيعاته على بياناتك. خسارة التدريب بتبقى مزيج من حاجتين: خسارة على الإجابة الصحيحة الحقيقية (hard label)، وخسارة تقارب توزيع الطالب من توزيع المعلّم المخفّف، وبتُقاس بـ تباعد كولباك-لايبلر (KL divergence). الورقة الأصلية من Hinton وزملائه سنة 2015 وضّحت إن ضرب خسارة الـ KL في T² بيوازن تدرّج الإشارة بشكل صحيح.
كود PyTorch شغّال
دي دالة الخسارة الأساسية للتقطير. قابلة للنسخ ومختصرة:
import torch
import torch.nn.functional as F
def distillation_loss(student_logits, teacher_logits, labels, T=4.0, alpha=0.5):
# 1) الطالب يقلّد توزيع المعلّم المخفّف (soft targets)
soft_teacher = F.softmax(teacher_logits / T, dim=-1)
soft_student = F.log_softmax(student_logits / T, dim=-1)
kd = F.kl_div(soft_student, soft_teacher, reduction="batchmean") * (T * T)
# 2) الطالب برضه يتعلّم من الإجابة الصحيحة الحقيقية (hard labels)
ce = F.cross_entropy(student_logits, labels)
# المزيج: alpha يوازن بين تقليد المعلّم والتعلّم من الحقيقة
return alpha * kd + (1.0 - alpha) * ce
القيم T=4 و alpha=0.5 نقطة بداية معقولة. لو زوّدت T أكتر من اللازم التوزيع بيبقى مسطّح ومفيش معلومة، ولو خلّيته 1 رجعت للحالة الحادة. جرّب بين 2 و 6 وقيس على بيانات التحقق.
سيناريو واقعي بأرقام
خد أشهر مثال منشور: نموذج DistilBERT. الفريق قطّر معرفة BERT-base في نموذج طالب أصغر، والنتيجة المقاسة: أقل بـ 40% في عدد الباراميترات، أسرع بـ 60% في الاستدلال، ومع ذلك بيحتفظ بحوالي 97% من أداء BERT على مقياس GLUE لفهم اللغة. يعني بتخسر 3% دقة تقريبًا مقابل مكسب ضخم في السرعة والحجم.
ترجم ده لحالة عملية: لو عندك مصنّف نوايا لشات بوت عربي بيستقبل مليون طلب في اليوم على نموذج كبير بزمن استجابة 120ms لكل طلب، تقطيره لنموذج أصغر ممكن ينزّل الزمن لحوالي 50ms ويقلّل عدد أو حجم سيرفرات الـ GPU المطلوبة للنصف تقريبًا. التوفير الشهري هنا مش رقم تجميلي، ده فرق فاتورة حقيقي.
الـ trade-offs بوضوح
كل مكسب معاه ثمن. لازم تعرفهم قبل ما تبدأ:
- محتاج المعلّم شغّال: لازم تولّد توزيعات المعلّم على بياناتك، يعني تكلفة استدلال إضافية مرة واحدة أثناء التدريب.
- سقف الطالب = جودة المعلّم: النموذج الصغير مش هيتفوّق على معلّمه. لو المعلّم بيغلط في فئة، الطالب هيرث الغلط ده.
- تكلفة تدريب مقدّمة: بتدفع وقت وحساب دلوقتي عشان توفّر في الاستدلال على المدى الطويل. المقايضة دي مربحة بس لو النموذج هيشتغل كتير.
- مرتبط بالمهمة والتوزيع: الطالب بيتفوّق في نطاق البيانات اللي اتقطّر عليها، وممكن يضعف بره النطاق ده.
متى لا تستخدم هذه الطريقة
تقطير المعرفة مش دايمًا الحل. متستخدموش في الحالات دي: لو المعلّم نفسه ضعيف أو دقته غير كافية، لأنك بتنسخ الضعف. لو محتاج تصغير سريع بمجهود قليل، جرّب الـ Quantization الأول لأنه أرخص وأبسط. لو مهمتك أو بياناتك بتتغيّر كل شوية، تكلفة إعادة التقطير المتكررة ممكن تاكل التوفير. ولو معندكش بيانات كافية في نطاقك (حتى غير مُعنونة) عشان تولّد عليها توزيعات المعلّم، النتيجة هتبقى ضعيفة.
الخطوة التالية
اختار نموذجك الكبير الشغّال في production كمعلّم، وجهّز مجموعة بيانات من نطاقك (حتى لو غير مُعنونة). مرّرها على المعلّم لتوليد الـ logits، بعدين درّب نموذج طالب أصغر بدالة الخسارة اللي فوق مع T=4. قِس الدقة وزمن الاستجابة قبل وبعد على نفس مجموعة التحقق. لو حافظت على أكتر من 95% من الدقة مقابل تنصيف الزمن، انشره؛ لو الدقة نزلت كتير، كبّر الطالب شوية أو نزّل T وأعد التجربة.
المصادر
- Hinton, Vinyals, Dean — «Distilling the Knowledge in a Neural Network», 2015، arXiv:1503.02531 (الورقة الأصلية لدرجة الحرارة وخسارة soft targets).
- Sanh et al. — «DistilBERT, a distilled version of BERT», 2019، arXiv:1910.01108 (أرقام 40% أصغر، 60% أسرع، 97% من أداء BERT).
- DeepSeek-AI — «DeepSeek-R1»، 2025، arXiv:2501.12948 (تقطير قدرات الاستدلال في نماذج Qwen و Llama أصغر).
- Hugging Face Transformers — توثيق التقطير وأمثلة الكود الرسمية على huggingface.co/docs.