كفاءة النماذج وتوسيعها1989متوسط11 دقيقة قراءة
الضرر الدماغي الأمثل
Optimal Brain Damage
LeCun, Y. · Denker, J. S. · Solla, S. A. — NeurIPS
المشكلة
في أواخر الثمانينيات كانت الشبكات العصبية تتضخم باستمرار، وكل معامل إضافي كان يزيد خطر حفظ بيانات على حساب الأداء على بيانات جديدة، ويُبطئ عملية التصنيف. الحل البديهي — حذف الأوزان الأصغر قيمةً — كان يُزيل أحياناً معاملات صغيرة لكنها جوهرية لعمل الشبكة. لم تكن هناك طريقة منهجية تستند إلى أسس رياضية لتحديد أيّ الأوزان يمكن الاستغناء عنها دون الدخول في دورات مكلفة من التجربة والخطأ وإعادة التدريب.
الإسهام
بدلاً من أن نسأل «ما حجم هذا الوزن؟»، يطرح OBD سؤالاً أدق: «كم سترتفع الخسارة لو حذفنا هذا الوزن؟» للإجابة، يستعين بالمشتقات الثانية لدالة الخسارة — أي قُطر مصفوفة هسيان — ليبني مقياس أهمية (بروز) لكل وزن. الصيغة s_k = h_kk · w_k² / 2 تدمج معلومتين: انحناء سطح الخسارة عند ذلك الوزن (h_kk) وقيمة الوزن نفسه (w_k). الأوزان ذات المنخفض تُحذف، ثم تُعاد تدريب الشبكة، وتتكرر الدورة. في تجربة على شبكة لتمييز الأرقام المكتوبة يدوياً، نجح OBD في إزالة أكثر من 50% من المعاملات دون أي تراجع في الدقة — بل تحسّن أداء في بعض الحالات.
الأثر
يُعدّ OBD أول أسلوب تقليم يستند إلى أسس رياضية صلبة، وهو الجدّ الفكري لكل تقنيات ضغط الشبكات العصبية التي جاءت بعده. فكرته المحورية — قياس أهمية كل معامل عبر انحناء سطح الخسارة — ألهمت مباشرةً «الجرّاح الدماغي الأمثل»، وتتردد أصداؤها بوضوح في الضغط العميق وفرضية تذكرة اليانصيب وGPTQ وSparseGPT. اليوم، مع نماذج تضمّ تريليونات المعاملات، أصبح التقليم أكثر إلحاحاً من أي وقت مضى — وكل أسلوب حديث في هذا المجال يحمل بصمة هذه الورقة من عام 1989.
تخيّل أنك صنعت لوحة دارات معقّدة فيها آلاف الأسلاك. بعض هذه الأسلاك يحمل إشارات حيوية، وبعضها لا يكاد ينقل شيئاً يُذكر. هدفك تبسيط اللوحة: أسلاك أقل تعني تكلفة أقل وحرارة أقل واحتمالات أقل لتداخل .
الطريقة الساذجة: اقطع الأسلاك الأرفع — أي احذف الأصغر حجماً. لكن سلكاً رفيعاً يحمل إشارة توقيت حرجة أهمّ بكثير من سلك سميك يحمل مساراً أرضياً مُكرَّراً لا فائدة منه.
المنهج الذي تقترحه هذه الورقة مختلف: قبل أن تقطع أي سلك، قِس مقدار التدهور الذي سيصيب مخرجات الدارة لو أزلته. هذا القياس يعتمد على انحناء سطح الخطأ — أي: ما مدى حساسية المخرجات للتغيّرات في كل سلك؟ الأسلاك التي لا يتأثر المخرج بإزالتها تُقطع أولاً.
المعضلة: شبكة كبيرة تحفظ، وشبكة صغيرة تعجز
بحلول أواخر الثمانينيات كانت تحقق نتائج قوية في مهام واقعية مثل تمييز الأرقام المكتوبة يدوياً. لكن الباحثين وجدوا أنفسهم أمام معضلة حقيقية: شبكة فيها كثيرة تحفظ بيانات التدريب عن ظهر قلب وتفشل أمام بيانات جديدة — وهذا ما نسميه . وبالمقابل، شبكة بمعاملات قليلة لا تملك القدرة على التقاط الأنماط الحقيقية في البيانات — وهذا هو .
الحل المثالي هو إيجاد شبكة بالحجم المناسب تماماً — تحوي ما يكفي من المعاملات لنمذجة البيانات ولا شيء أكثر. لكن كيف نجد هذا الحجم؟ تدريب عشرات الشبكات بأحجام مختلفة ومقارنتها أمر مكلف جداً. الفكرة التي اقترحها لوكان ودنكر وسولّا أبسط وأذكى: ابدأ بشبكة أكبر مما تحتاج، ثم أزل جراحياً المعاملات التي لا تُسهم إسهاماً يُذكر.
لماذا «وزن صغير» لا تعني «وزن غير مهم»
أبسط إستراتيجية لـ هي ترتيب جميع حسب قيمها المطلقة ثم حذف الأصغر. المنطق يبدو واضحاً: وزن قريب من الصفر لا يكاد يؤثر في المخرجات، فلماذا نُبقي عليه؟
المشكلة أن هذا المنطق ناقص وخطير. تخيّل وزناً صغير القيمة لكنه يقع على منحدر حاد من سطح : حذفه يُسبب قفزة كبيرة في الخسارة — تماماً كبرغي صغير لو نزعته من جسر قد ينهار الجسر كله. وبالمقابل، وزن كبير القيمة لكنه يقع في منطقة مسطحة من سطح الخسارة يمكنك إزالته دون أن يتأثر شيء — كدعامة ثقيلة لكنها زائدة عن الحاجة.
هنا تكمن البصيرة الجوهرية في OBD: المهم ليس حجم الوزن، بل مدى حساسية الخسارة لحذفه. وهذه الحساسية يكشفها الثاني — أي انحناء سطح الخسارة عند ذلك الوزن.
البروز: قياس الأهمية الحقيقية للمعامل
الفكرة بسيطة: بروز أي معامل هو مقدار الزيادة المتوقعة في دالة الخسارة لو ضبطنا ذلك المعامل على صفر. لكن لا نريد فعلاً حذف كل وزن ثم إعادة التدريب لنرى ماذا يحدث — ذلك مستحيل عملياً. بدلاً من ذلك، يستخدم OBD تقريب تايلور من الرتبة الثانية لـدالة الخسارة حول الأوزان المُدرَّبة ليُقدِّر هذا الأثر رياضياً.
تقريب تايلور للتغيّر في الخسارة عند إزاحة متّجه المعاملات بمقدار يأخذ الشكل:
حيث هو و هي عناصر .
فكّر في كل وزن ككرة موضوعة على سطح منحنٍ. معادلة البروز تسأل سؤالين: كم تبعد الكرة عن قاع الوادي؟ — وهذا يعكس قيمة الوزن . وما مدى حدّة جدران الوادي؟ — وهذا يعكس الانحناء . كرة بعيدة عن القاع في وادٍ شديد الانحدار ستُحدث هبوطاً كبيراً لو أزلتها — بروز عالٍ، لا تمسّها. أما كرة بالكاد فوق القاع، أو موضوعة على سهل مسطّح، فلا يكاد يتغيّر شيء لو اختفت — بروز منخفض، يمكنك حذفها بأمان.
حساب المشتقات الثانية بكفاءة
مصفوفة هسيان لشبكة بها معامل تحتوي عنصراً — في شبكة بها 2600 معامل مثلاً يعني ذلك أكثر من 6.5 مليون رقم. حساب المصفوفة كاملةً غير عملي. لكن OBD لا يحتاج إلا إلى العناصر القُطرية فقط، وهذه يمكن حسابها بإجراء يشبه المعتاد إلى حدٍّ كبير.
الملاحظة المفتاحية هنا أن المشتقات الثانية تنتشر عكسياً عبر الشبكة بالآلية ذاتها التي تنتشر بها المشتقات الأولى. نبدأ من — حيث لـدالة الخسارة بالنسبة لمدخل التنشيط معروف — ثم نحسب المشتق الثاني في كل تراجعياً بقاعدة السلسلة نفسها المُستخدمة في حساب المُتَّجه المَيلي، لكن مُطبَّقة بمستوى إضافي واحد من الاشتقاق.
التكلفة الحسابية لقُطر هسيان تقارب تكلفة حساب المُتَّجه المَيلي — تمريرة عكسية إضافية واحدة فقط. هذا ما جعل OBD قابلاً للتطبيق حتى على العتاد المتاح في عام 1989.
وصفة OBD: درِّب، قِس، قلِّم، كرِّر
يعمل OBD بدورة تتناوب بين التدريب والتقليم:
الخطوة 1 — درِّب الشبكة حتى التقارب باستخدام الانتشار العكسي المعتاد.
الخطوة 2 — احسب المشتقات الثانية القُطرية لكل معامل عبر التمريرة العكسية.
الخطوة 3 — احسب بروز كل معامل: .
الخطوة 4 — رتّب المعاملات حسب بروزها واحذف الأقل بروزاً — أي اضبطها على صفر وجمِّدها نهائياً.
الخطوة 5 — أعِد تدريب الشبكة المُقلَّمة ثم عُد إلى الخطوة 2.
حين نقول «حذف» معامل فالمقصود ضبط قيمته على صفر وتجميده بحيث لا يعود أبداً. كل دورة تُزيل دفعة من المعاملات منخفضة البروز، وتستمر العملية حتى يبدأ التقليم في إلحاق ضرر ملموس بالأداء.
التجارب: تقليم شبكة حقيقية لتمييز الأرقام
اختبر لوكان وزملاؤه OBD على شبكة لتمييز الأرقام المكتوبة يدوياً — بنية مقيَّدة ذات اتصالات متفرقة تحوي نحو 105,000 وصلة يتحكم فيها 2,578 معاملاً حراً، مُدرَّبة على قرابة 9,300 مثال من أرقام الرموز البريدية.
النتائج كانت لافتة. نجح OBD في إزالة أكثر من 60% من المعاملات (من 2,578 إلى نحو 1,000) دون تدهور يُذكر في دقة الاختبار — بل في بعض الحالات كانت الشبكة المُقلَّمة تُعمّم أفضل من الأصلية، لأن حذف المعاملات الزائدة يعمل كنوع من . وحين استُخدم OBD كأداة تحليل تفاعلية، كشف أن طبقة كاملة من الشبكة كانت شبه زائدة، فأعاد المؤلفون تصميم البنية وقلّصوا عدد المعاملات إلى النصف.
النقطة الأهم: عند نسبة الضغط نفسها، سبّب التقليم بالقيمة المطلقة زيادات أكبر بكثير في . أما الحذف العشوائي فكان كارثياً لدرجة أن نتائجه لم يمكن رسمها على المقياس نفسه.
الافتراضات والقيود
قوة OBD تأتي من تبسيطاته الثلاثة، لكن كل تبسيط يحمل ثمناً:
الافتراض القُطري يتجاهل التفاعلات بين الأوزان. في الواقع، حين تحذف وزناً واحداً تتغيّر القيم المثلى لبقية الأوزان. هذا بالضبط ما عالجته ورقة الجرّاح الدماغي الأمثل (هاسيبي وستورك، 1992) باستخدام معكوس مصفوفة هسيان الكاملة، بحيث تُعدَّل الأوزان المتبقية لتعويض أثر الوزن المحذوف.
افتراض التقارب يفترض أن التدريب وصل فعلاً إلى نقطة استقرار. عملياً، قد لا يكون المُتَّجه المَيلي صفراً تماماً، خصوصاً مع أو البيانات المُشوَّشة.
الافتراض التربيعي ينهار حين تُحذف أوزان كبيرة القيمة — سطح الخسارة ليس قطعاً مكافئاً بعيداً عن النهاية الصغرى. تجارب الورقة نفسها أظهرت أن التنبؤ ينحرف عن الواقع بعد إزالة نحو 30% من المعاملات في تمريرة واحدة.
ومع ذلك، أثبت OBD نقطة جوهرية: حتى أسلوب تقريبي يستخدم معلومات الرتبة الثانية يتفوّق بفارق كبير على حدسيات القيمة المطلقة.
الإرث: من 2,600 معامل إلى تريليونات
السؤال الذي طرحه OBD — أيّ المعاملات يمكن حذفها بأمان؟ — أصبح اليوم أكثر إلحاحاً مما كان عليه في 1989. الحديثة تضمّ مليارات أو تريليونات المعاملات، والقدرة على ضغطها ضرورة عملية لنشرها على الأجهزة الطرفية وتقليل تكاليف وخفض استهلاك الطاقة.
الخط الفكري من OBD إلى الأساليب الحديثة واضح ومباشر. الضغط العميق (هان وآخرون، 2015) دمج التقليم مع وترميز هوفمان فضغط الشبكات بنسبة 35 إلى 49 ضعفاً. فرضية تذكرة اليانصيب (فرانكل وكارلين، 2019) كشفت أن الشبكات الكثيفة تحوي بداخلها شبكات فرعية متفرقة قادرة على مجاراة دقة الشبكة الكاملة حين تُدرَّب بمعزل — وهذا صدى مباشر لاكتشاف OBD بأن معظم المعاملات زائدة عن الحاجة. GPTQ (فرانتار وآخرون، 2022) استخدم معلومات الرتبة الثانية — بالروح ذاتها التي اقترحها OBD — لتكميم النماذج اللغوية الكبيرة بأدنى خسارة في الجودة. وSparseGPT وسّع الفكرة لتقليم هذه النماذج إلى بنسبة 50–60% في تمريرة واحدة دون إعادة تدريب.
1989
الضرر الدماغي الأمثل (هذه الورقة)
قدّم لوكان ودنكر وسولّا التقليم القائم على البروز مستخدمين المعلومات القُطرية من مصفوفة هسيان. أول أسلوب تقليم منهجي مبنيّ على أسس نظرية.
1992
الجرّاح الدماغي الأمثل
أزال هاسيبي وستورك افتراض القُطرية واستخدما معكوس هسيان الكاملة. الأوزان المتبقية تُحدَّث لتعويض المحذوفة، فلا حاجة لإعادة التدريب التكرارية.
2015
الضغط العميق (هان وآخرون)
جمع بين التقليم والتكميم وترميز هوفمان. ضغط AlexNet بنسبة 35 ضعفاً وVGG-16 بنسبة 49 ضعفاً دون خسارة في الدقة. جعل نشر الشبكات العصبية على الأجهزة المحمولة ممكناً.
2019
فرضية تذكرة اليانصيب
أظهر فرانكل وكارلين أن الشبكات الكثيفة تحتوي شبكات فرعية متفرقة (التذاكر الرابحة) تُضاهي الدقة الكاملة حين تُدرَّب من أوزانها الابتدائية. صدى لاكتشاف OBD الجوهري بأن معظم المعاملات مكررة.
2022
GPTQ
طبّق معلومات الرتبة الثانية (بأسلوب الجرّاح الدماغي الأمثل) لتكميم النماذج اللغوية الكبيرة كـ GPT-175B إلى 3–4 بتات لكل وزن مع أدنى خسارة في الجودة.
2023
SparseGPT
وسّع التقليم من الرتبة الثانية ليشمل النماذج اللغوية الكبيرة، محققاً تفرّقاً بنسبة 50–60% في تمريرة واحدة دون إعادة تدريب — توسيع رؤية OBD لنماذج بمليارات المعاملات.
المبدأ الذي أرساه OBD — قِس أهمية المعامل بانحناء سطح الخسارة، لا بقيمته المطلقة — لا يزال الأساس الفكري لكل أساليب الحديثة. في كل مرة يُكمَّم نموذج لغوي كبير أو يُقلَّم للنشر، فإنه يحمل بصمة هذه الورقة التي كُتبت عام 1989.
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import torch
def compute_saliency(model, loss_fn, data_loader):
"""حساب بروز OBD لكل معامل."""
# الخطوة 1: تجميع هسيان القُطرية على مجموعة البيانات
diag_hessian = {n: torch.zeros_like(p) for n, p in model.named_parameters()}
for x, y in data_loader:
loss = loss_fn(model(x), y)
grads = torch.autograd.grad(loss, model.parameters(), create_graph=True)
for (name, param), g in zip(model.named_parameters(), grads):
# تقريب هسيان القُطرية عبر مربع المتجه الميلي
diag_hessian[name] += g.detach() ** 2
# الخطوة 2: البروز = 0.5 * h_kk * w_k^2
saliency = {}
for name, param in model.named_parameters():
h_kk = diag_hessian[name] / len(data_loader)
saliency[name] = 0.5 * h_kk * param.data ** 2
return saliency
def prune_by_saliency(model, saliency, fraction=0.5):
"""حذف الأوزان الأقل بروزاً بضبطها على صفر."""
all_scores = torch.cat([s.flatten() for s in saliency.values()])
threshold = torch.quantile(all_scores, fraction)
with torch.no_grad():
for name, param in model.named_parameters():
mask = saliency[name] >= threshold
param.data *= mask.float() # حذف الأوزان منخفضة البروزالمرجعLeCun, Y., Denker, J. S., & Solla, S. A.. Optimal Brain Damage. NeurIPS, 1989.
مصطلحات هذه الورقة
- تشذيب الشبكات العصبيةPruning
- البروزSaliency
- مصفوفة هيسيHessian
- المشتق الثانيSecond Derivative
- اضمحلال الأوزانWeight Decay
- ضغط النماذجModel Compression
- التناثر البنيوي للمصفوفاتSparsity
- فرط التخصيصOverfitting
- التعميمGeneralization
- الضبط الهيكليRegularization