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 التي لا تحتفظ إلا بالقيم غير الصفرية ومواضعها.

wij={wijif wij>τ0otherwisew_{ij} = \begin{cases} w_{ij} & \text{if } |w_{ij}| > \tau \\ 0 & \text{otherwise} \end{cases}
قاعدة تقليم الأوزان: أبقِ فقط الأوزان التي تتجاوز العتبة τكل وزن يُقارَن بالعتبة τ. إن كانت قيمته المطلقة أصغر من τ يُصفَّر ويُحذف، وإلا يبقى. بعد ذلك تُعاد تدريب الأوزان الناجية حتى تُعوِّض ما فُقد.
افتح في المختبر
اسحب مؤشر العتبة لتقليم الأوزان. راقب الشبكة وهي تصبح مُتفرِّقة بينما تبقى الدقة ثابتة.
تستيقظ التجربة عند وصولك…

المرحلة الثانية: التكميم المُدرَّب — مشاركة الأوزان

بعد التقليم، كل وزن ناجٍ لا يزال عدداً عشرياً بدقة 32 بتاً. لكن هل نحتاج فعلاً إلى كل هذه الدقة؟ التكميم يُجيب بلا.

الفكرة أن نُجمّع الأوزان في عناقيد باستخدام k-means: بدل آلاف القيم الفريدة في كل ، نكتفي بـkk مركز تمثيلي. كل وزن يُستبدل بفهرس يُشير إلى أقرب مركز. لو اخترنا k=16k = 16 مثلاً، يكفي 4 بتات لتمثيل كل وزن بدل 32 — أي تقليص 8 مرات في عدد البتات وحدها.

لكن ما يجعل هذا التكميم «مُدرَّباً» هو الخطوة التالية: بعد التجميع، لا تبقى المراكز ثابتة، بل تُعامَل كمعاملات قابلة للتعلّم. أثناء تُجمع المتدفقة إلى الأوزان التي تشترك في المركز نفسه، وتُستخدم لتحديث قيمته. بعبارة أخرى، الشبكة لا تكتفي بتقريب أوزانها مرة واحدة — بل تتعلّم بنشاط أفضل قيم مشتركة تُقلِّل الخسارة.

CkCkηi,j:idx(wij)=kLwijC_k \leftarrow C_k - \eta \sum_{i,j : \text{idx}(w_{ij})=k} \frac{\partial \mathcal{L}}{\partial w_{ij}}
تحديث تدرّج المراكز — ضبط دقيق للأوزان المشتركةكل التدرّجات المتدفقة إلى الأوزان المرتبطة بالمركز CkC_k تُجمع معاً، ثم يُحدَّث المركز بناءً على هذا التدرّج الإجمالي. هذا ما يُميّز التكميم المُدرَّب: جدول الرموز لا يبقى ثابتاً بل يتكيّف ليُقلِّل دالة الخسارة.
افتح في المختبر
شاهد كيف تجمّع k-means الأوزان في عناقيد وكيف تُضبط المراكز بدقة. بدّل عدد العناقيد لترى المقايضة بين الدقة ومستوى الضغط.
تستيقظ التجربة عند وصولك…

المرحلة الثالثة: ترميز هوفمان — العصرة الأخيرة

بعد التقليم والتكميم، تُخزَّن الأوزان كأعداد صحيحة صغيرة (فهارس العناقيد)، والبنية المُتفرِّقة تُرمَّز كفروق بين الفهارس. كلا التوزيعين غير متساوٍ — بعض القيم تتكرر كثيراً وبعضها يكاد لا يظهر. هنا يأتي دور ترميز هوفمان: تقنية ضغط بلا خسارة تبني شجرة ثنائية تُعطي القيم الشائعة رموزاً قصيرة والنادرة رموزاً طويلة. المتوسط المتوقّع لطول الرمز يقترب من — أي الحد الأدنى النظري.

الفكرة مماثلة لشيفرة مورس: الحرف «E» هو الأكثر شيوعاً بالإنجليزية فيُمثَّل بنقطة واحدة، بينما «Q» النادر يحتاج أربع نبضات. ترميز هوفمان يُطبّق المبدأ نفسه تلقائياً على قيم الأوزان. هذه المرحلة الأخيرة وحدها توفّر 20–30% إضافية فوق ما حقّقته المرحلتان السابقتان.

افتح في المختبر
شاهد كيف تُعطي شجرة هوفمان أكواداً أقصر للقيم الأكثر تكراراً. انقر على أي ورقة لتتبّع مسار كودها.
تستيقظ التجربة عند وصولك…

المراحل الثلاث بالشيفرة

مسار الضغط العميق — التقليم والتكميم وترميز هوفمانpython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

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 ميغابايت.

افتح في المختبر
مخطط شريطي تراكمي يوضّح مساهمة كل مرحلة في نسبة الضغط الإجمالية لشبكتي AlexNet وVGG-16.
تستيقظ التجربة عند وصولك…

لماذا كان هذا البحث مفصلياً

هناك أيضاً درس منهجي مهم: تقنيات الضغط الثلاث يُكمل بعضها بعضاً لأن كلاً منها يعالج نوعاً مختلفاً من التكرار. التقليم يزيل التكرار البنيوي (اتصالات لا لزوم لها)، والتكميم يزيل التكرار في الدقة الرقمية (بتات لا حاجة إليها)، وترميز هوفمان يزيل التكرار الإحصائي (توزيع غير متساوٍ للقيم). لهذا السبب يتجاوز عامل الضغط المُجمَّع (35–49 مرة) بكثير ما يُحققه أي أسلوب بمفرده.

  1. 1990

    الإتلاف الأمثل للدماغ

    أثبت LeCun وآخرون أن كثيراً من أوزان الشبكة المُدرَّبة يمكن حذفها دون تأثير يُذكر على الأداء. كان هذا أول دليل عملي على جدوى التقليم.

  2. 2015

    تعلّم الأوزان والاتصالات معاً

    عمل سابق لسونغ هان قدّم منهجية متكاملة للتقليم حسب حجم الأوزان مع إعادة التدريب بعد كل جولة. هذا البحث هو الأساس المباشر الذي بنى عليه الضغط العميق.

  3. 2016

    الضغط العميق (هذه الورقة)

    دمج التقليم والتكميم المُدرَّب وترميز هوفمان في مسار واحد متكامل. حقّق ضغطاً بمقدار 35–49 مرة دون خسارة في الدقة. حاز جائزة أفضل ورقة في ICLR 2016.

  4. 2017

    MobileNet

    بدلاً من ضغط الشبكات الكبيرة بعد التدريب، صمّم MobileNet بنيات فعّالة من البداية باستخدام الالتفافات القابلة للفصل حسب العمق.

  5. 2019

    فرضية تذكرة اليانصيب

    أثبت Frankle وCarlin أن داخل كل شبكة كثيفة توجد شبكة فرعية مُتفرِّقة («تذكرة رابحة») قادرة على بلوغ الدقة الكاملة إذا دُرِّبت من أوزانها الابتدائية — امتداد طبيعي لفكرة أن أغلب الأوزان فائضة عن الحاجة.

  6. 2022

    LLM.int8()

    طبّق Dettmers وآخرون تكميماً بدقة 8 بتات على نماذج لغوية بمليارات المعاملات، فأصبح الاستدلال ممكناً على بطاقات رسوميات عادية. بهذا انتقلت أفكار التكميم التي أرساها الضغط العميق إلى عصر النماذج اللغوية الكبيرة.

  7. 2023

    GPTQ

    تكميم بعد التدريب إلى 3–4 بتات لنماذج بحجم GPT. أتاح تشغيل نماذج بـ175 مليار معامل على بطاقة رسوميات واحدة — وهو الامتداد الطبيعي لمسار الضغط الذي أسّسه هذا البحث.

المرجعHan, Mao, Dally. Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding. ICLR, 2016.

مصطلحات هذه الورقة