Model Efficiency2016متوسط9 دقيقة قراءة
الضغط العميق: تقليص الشبكات العصبية العميقة عبر التقليم والتكميم المُدرَّب وترميز هوفمان
Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding
Han, S. · Mao, H. · Dally, W. J. — ICLR
المشكلة
في عام 2015 كانت الشبكات العصبية تلتهم مئات الميغابايتات: AlexNet وحدها 240 ميغابايت، وVGG-16 وصلت إلى 552 ميغابايت. بهذا الحجم يستحيل تشغيل هذه النماذج على هاتف محمول أو حسّاس مدمج أو أي جهاز طرفي — لأن لا يتسع في ذاكرة SRAM على الشريحة، فيضطر الجهاز للقراءة من ذاكرة DRAM الخارجية التي تستهلك طاقة أكبر بمئة ضعف من عملية حسابية واحدة. حتى تحديث النموذج لاسلكياً كان مرهقاً بسبب محدودية النطاق الترددي. المجتمع البحثي كان بحاجة إلى طريقة منهجية تُقلّص النماذج تقليصاً جذرياً دون أن تُضحّي بالدقة.
الإسهام
مسار ضغط من ثلاث مراحل متتالية — التقليم، ثم المُدرَّب، ثم — تتضافر لتقليص حجم النموذج بمقدار 35 إلى 49 مرة دون أي خسارة في الدقة. التقليم يحذف الاتصالات التي لا تُسهم في النتيجة (تقليص 9–13 مرة). التكميم المُدرَّب يجمع الأوزان المتبقية في مراكز مشتركة ويُعيد ضبطها عبر الانتشار العكسي (من 32 بتاً إلى نحو 5 بتّات لكل وزن). ترميز هوفمان يستغل أن بعض القيم تتكرر أكثر من غيرها ليحقق ضغطاً إضافياً بلا خسارة. الجوهر هنا أن الشبكة تُعاد تدريبها بعد كل مرحلة قبل الانتقال إلى التالية، فتبقى الدقة محفوظة على امتداد المسار كاملاً.
الأثر
حصل البحث على جائزة أفضل ورقة في ICLR 2016 وصار المرجع الأساسي في مجال ضغط الشبكات العصبية. أثبت أن النماذج الكبيرة تحتوي على قدر هائل من التكرار، وأن الجمع بين التقليم والتكميم والترميز كفيل باستغلال هذا التكرار دون البدء من الصفر. امتدّ أثره المباشر إلى فرضية تذكرة اليانصيب، وبنيات MobileNet المُصمَّمة للكفاءة، وتكميم LLM.int8() للنماذج اللغوية الكبيرة، وتكميم GPTQ بعد — وهي الأعمال التي مكّنت تشغيل نماذج بمليارات المعاملات على بطاقات رسوميات عادية.
تخيّل أن بعد التدريب مباشرةً أشبه بـمستودع أثاث ضخم: آلاف القطع، كثير منها متكرّر، وجزء كبير لن يستعمله أحد. هو جولة تنظيف صارمة — كل قطعة لا يجلس عليها أحد تخرج فوراً. التكميم يأتي بعد ذلك ليستبدل الكراسي الفريدة المتبقية بعدد محدود من الطرازات القياسية — مريحة بما يكفي، لكن تخزينها أرخص بكثير. وأخيراً ترميز هوفمان يختصر قائمة الجرد نفسها، فيُعطي القطع المتكررة رموزاً أقصر. النتيجة: المستودع بأكمله يتحوّل إلى حاوية شحن واحدة، ومع ذلك تستطيع تأثيث كل غرفة في المنزل كما كنت تفعل.
المشكلة: الشبكات العصبية أكبر من أن تعمل على الأجهزة الطرفية
بحلول عام 2015 كانت قد تصدّرت مسابقات تصنيف الصور، لكن حجمها وقف عائقاً أمام نشرها فعلياً. شبكة AlexNet وحدها تحتاج 240 ميغابايت، وVGG-16 تصل إلى 552 ميغابايت. الهواتف والأجهزة المدمجة لا تملك هذا القدر من الذاكرة ولا من الطاقة. والمشكلة ليست في الحجم فحسب: قراءة من ذاكرة DRAM الخارجية تستهلك طاقة تفوق العملية الحسابية نفسها بمئة ضعف — أي أن عنق الزجاجة في الذاكرة هو في الوقت ذاته عنق زجاجة في استهلاك الطاقة.
السؤال المحوري كان: كم من هذه البيانات ضروري فعلاً؟ هل نستطيع تقليص النموذج تقليصاً جذرياً دون أن نُفقده ما تعلّمه؟
الفكرة: مسار ضغط من ثلاث مراحل متتالية
فكرة الضغط العميق تقوم على ثلاث تقنيات تُطبَّق بالتتابع، كل واحدة تبني على مخرجات سابقتها. والأهم أن الشبكة تُعاد تدريبها بعد كل مرحلة لاستعادة أي دقة ضاعت:
المرحلة الأولى — التقليم: احذف كل اتصال وزنه قريب من الصفر. الشبكة بطبيعتها تتعلّم أيّ الاتصالات مهمة والباقي يصبح شبه عديم الأثر، فنتخلّص منه. النتيجة: عدد الأوزان ينخفض 9–13 مرة.
المرحلة الثانية — التكميم المُدرَّب: بدل أن يحتفظ كل وزن بقيمة عشرية فريدة (32 بتاً)، نُجمّع الأوزان المتبقية في عناقيد باستخدام k-means ونستبدل كل وزن بفهرس يُشير إلى مركز العنقود. إذا استخدمنا 16 مركزاً مثلاً، يكفي 4 بتات لكل وزن بدل 32.
المرحلة الثالثة — ترميز هوفمان: الأوزان بعد التكميم لا تتوزّع بالتساوي — بعض القيم تظهر كثيراً وبعضها نادراً. ترميز هوفمان يستغل ذلك بإعطاء القيم الشائعة رموزاً قصيرة والنادرة رموزاً طويلة. هذه الخطوة تعصر 20–30% إضافية بلا أي خسارة.
المرحلة الأولى: التقليم — إزالة الأوزان الميتة
المنطلق بسيط: الشبكات العصبية المُدرَّبة تحتوي على أكثر بكثير مما تحتاجه فعلاً. كثير من الأوزان ينتهي بها المطاف قرب الصفر ولا تكاد تؤثر في المخرجات. هذه الملاحظة ليست جديدة — بحث الإتلاف الأمثل للدماغ (LeCun وآخرون، 1990) أثبت منذ عقود أن حذف الأوزان الصغيرة لا يُلحق ضرراً يُذكر بدقة الشبكة.
آلية التقليم هنا تمر بثلاث خطوات: أولاً ندرّب الشبكة بالطريقة المعتادة، ثم نصفّر كل وزن قيمته المطلقة أقل من عتبة محددة، وأخيراً نُعيد تدريب الاتصالات التي نجت. العتبة هي يتطلب ضبطاً: عتبة منخفضة جداً لا تُحقق ضغطاً يُذكر، وعتبة مرتفعة جداً تُ الشبكة دقتها. ما وجده الباحثون أن تتحمّل حذف 60–70% من اتصالاتها، في حين أن تتحمّل خسارة 90–95% دون تدهور ملحوظ.
بعد التقليم تصبح مصفوفة الأوزان — أغلبها أصفار. بدل تخزينها كمصفوفة كاملة، تُستخدم صيَغ مثل CSR أو CSC التي لا تحتفظ إلا بالقيم غير الصفرية ومواضعها.
المرحلة الثانية: التكميم المُدرَّب — مشاركة الأوزان
بعد التقليم، كل وزن ناجٍ لا يزال عدداً عشرياً بدقة 32 بتاً. لكن هل نحتاج فعلاً إلى كل هذه الدقة؟ التكميم يُجيب بلا.
الفكرة أن نُجمّع الأوزان في عناقيد باستخدام k-means: بدل آلاف القيم الفريدة في كل ، نكتفي بـ مركز تمثيلي. كل وزن يُستبدل بفهرس يُشير إلى أقرب مركز. لو اخترنا مثلاً، يكفي 4 بتات لتمثيل كل وزن بدل 32 — أي تقليص 8 مرات في عدد البتات وحدها.
لكن ما يجعل هذا التكميم «مُدرَّباً» هو الخطوة التالية: بعد التجميع، لا تبقى المراكز ثابتة، بل تُعامَل كمعاملات قابلة للتعلّم. أثناء تُجمع المتدفقة إلى الأوزان التي تشترك في المركز نفسه، وتُستخدم لتحديث قيمته. بعبارة أخرى، الشبكة لا تكتفي بتقريب أوزانها مرة واحدة — بل تتعلّم بنشاط أفضل قيم مشتركة تُقلِّل الخسارة.
المرحلة الثالثة: ترميز هوفمان — العصرة الأخيرة
بعد التقليم والتكميم، تُخزَّن الأوزان كأعداد صحيحة صغيرة (فهارس العناقيد)، والبنية المُتفرِّقة تُرمَّز كفروق بين الفهارس. كلا التوزيعين غير متساوٍ — بعض القيم تتكرر كثيراً وبعضها يكاد لا يظهر. هنا يأتي دور ترميز هوفمان: تقنية ضغط بلا خسارة تبني شجرة ثنائية تُعطي القيم الشائعة رموزاً قصيرة والنادرة رموزاً طويلة. المتوسط المتوقّع لطول الرمز يقترب من — أي الحد الأدنى النظري.
الفكرة مماثلة لشيفرة مورس: الحرف «E» هو الأكثر شيوعاً بالإنجليزية فيُمثَّل بنقطة واحدة، بينما «Q» النادر يحتاج أربع نبضات. ترميز هوفمان يُطبّق المبدأ نفسه تلقائياً على قيم الأوزان. هذه المرحلة الأخيرة وحدها توفّر 20–30% إضافية فوق ما حقّقته المرحلتان السابقتان.
المراحل الثلاث بالشيفرة
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import numpy as np
from collections import Counter
# ── المرحلة 1: التقليم ──────────────────────────────────────────
def prune(weights, threshold):
"""صفّر الأوزان الأقل من العتبة، أعد الأوزان المقلَّمة + القناع."""
mask = np.abs(weights) > threshold
return weights * mask, mask
# ── المرحلة 2: التكميم المُدرَّب ─────────────────────────────────
def quantize(weights, mask, n_clusters=16):
"""اجمع الأوزان غير الصفرية في n_clusters مركز."""
nonzero = weights[mask] # الأوزان الناجية فقط
# k-means بسيط: تجميع في n_clusters عنقود
from sklearn.cluster import KMeans
km = KMeans(n_clusters=n_clusters, n_init=10)
km.fit(nonzero.reshape(-1, 1))
centroids = km.cluster_centers_.flatten() # جدول الرموز
labels = km.labels_ # فهرس لكل وزن
return centroids, labels
# ── المرحلة 3: ترميز هوفمان ───────────────────────────────────
def huffman_savings(labels):
"""قدّر البتات الموفَّرة بهوفمان مقابل الترميز الثابت."""
counts = Counter(labels)
total = len(labels)
# إنتروبيا شانون = أفضل متوسط بتات نظرياً
entropy = -sum((c/total) * np.log2(c/total) for c in counts.values())
fixed_bits = np.ceil(np.log2(len(counts))) # طول كود منتظم
return fixed_bits - entropy # بتات موفَّرة لكل وزن
# ── تشغيل خط الأنابيب ──────────────────────────────────────────
W = np.random.randn(1000, 1000).astype(np.float32)
W_pruned, mask = prune(W, threshold=0.5) # ~62% قُلِّمت
centroids, labels = quantize(W_pruned, mask, 16) # 32→4 بت
saving = huffman_savings(labels) # ~0.7 بت/وزن إضافية
# المحصلة: 240 ميغابايت → ~7 ميغابايت لشبكات بحجم AlexNetالنتائج — أصغر بـ35 إلى 49 ضعفاً دون أي فقدان في الدقة
الأرقام تتحدث عن نفسها. شبكة AlexNet انخفضت من 240 ميغابايت إلى 6.9 ميغابايت (35 مرة) دون أي خسارة في دقة top-1 أو top-5 على ImageNet. وVGG-16 هبطت من 552 ميغابايت إلى 11.3 ميغابايت (49 مرة). بهذا الحجم يتسع النموذج بالكامل في ذاكرة SRAM على الشريحة، فلا حاجة بعد ذلك للقراءة من ذاكرة DRAM الخارجية المُكلفة طاقوياً.
اللافت أن المراحل الثلاث تتضافر بشكل مُضاعَف: التقليم يُقلّص 9–13 مرة بحذف الاتصالات، والتكميم يُضيف 4–8 مرات بتقليل البتات لكل اتصال، وترميز هوفمان يعصر 20–30% أخرى. تأثير المراحل مجتمعة يفوق بكثير مجموع تأثيراتها منفردة.
اختبارات الأداء على المعالجات المركزية و والأجهزة المحمولة أظهرت تسريعاً بمقدار 3–4 مرات لكل طبقة وكفاءة طاقة أعلى 3–7 مرات. شبكة VGG-16 المضغوطة بحجم 11.3 ميغابايت تعمل بسلاسة على هاتف كان سيعجز عن تحميل النسخة الأصلية البالغة 552 ميغابايت.
لماذا كان هذا البحث مفصلياً
هناك أيضاً درس منهجي مهم: تقنيات الضغط الثلاث يُكمل بعضها بعضاً لأن كلاً منها يعالج نوعاً مختلفاً من التكرار. التقليم يزيل التكرار البنيوي (اتصالات لا لزوم لها)، والتكميم يزيل التكرار في الدقة الرقمية (بتات لا حاجة إليها)، وترميز هوفمان يزيل التكرار الإحصائي (توزيع غير متساوٍ للقيم). لهذا السبب يتجاوز عامل الضغط المُجمَّع (35–49 مرة) بكثير ما يُحققه أي أسلوب بمفرده.
1990
الإتلاف الأمثل للدماغ
أثبت LeCun وآخرون أن كثيراً من أوزان الشبكة المُدرَّبة يمكن حذفها دون تأثير يُذكر على الأداء. كان هذا أول دليل عملي على جدوى التقليم.
2015
تعلّم الأوزان والاتصالات معاً
عمل سابق لسونغ هان قدّم منهجية متكاملة للتقليم حسب حجم الأوزان مع إعادة التدريب بعد كل جولة. هذا البحث هو الأساس المباشر الذي بنى عليه الضغط العميق.
2016
الضغط العميق (هذه الورقة)
دمج التقليم والتكميم المُدرَّب وترميز هوفمان في مسار واحد متكامل. حقّق ضغطاً بمقدار 35–49 مرة دون خسارة في الدقة. حاز جائزة أفضل ورقة في ICLR 2016.
2017
MobileNet
بدلاً من ضغط الشبكات الكبيرة بعد التدريب، صمّم MobileNet بنيات فعّالة من البداية باستخدام الالتفافات القابلة للفصل حسب العمق.
2019
فرضية تذكرة اليانصيب
أثبت Frankle وCarlin أن داخل كل شبكة كثيفة توجد شبكة فرعية مُتفرِّقة («تذكرة رابحة») قادرة على بلوغ الدقة الكاملة إذا دُرِّبت من أوزانها الابتدائية — امتداد طبيعي لفكرة أن أغلب الأوزان فائضة عن الحاجة.
2022
LLM.int8()
طبّق Dettmers وآخرون تكميماً بدقة 8 بتات على نماذج لغوية بمليارات المعاملات، فأصبح الاستدلال ممكناً على بطاقات رسوميات عادية. بهذا انتقلت أفكار التكميم التي أرساها الضغط العميق إلى عصر النماذج اللغوية الكبيرة.
2023
GPTQ
تكميم بعد التدريب إلى 3–4 بتات لنماذج بحجم GPT. أتاح تشغيل نماذج بـ175 مليار معامل على بطاقة رسوميات واحدة — وهو الامتداد الطبيعي لمسار الضغط الذي أسّسه هذا البحث.
المرجعHan, Mao, Dally. Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding. ICLR, 2016.
مصطلحات هذه الورقة
- تشذيب الشبكات العصبيةPruning
- التكميمQuantization
- ضغط النماذجModel Compression
- ترميز هوفمانHuffman Coding
- مشاركة الأوزانweight sharing
- التناثر البنيوي للمصفوفاتSparsity
- تقطير المعرفةKnowledge Distillation
- الضبط الدقيقFine-Tuning