الرؤية الحاسوبية2015متوسط8 دقيقة قراءة
التعلُّم المتبقّي العميق للتعرّف على الصور
Deep Residual Learning for Image Recognition
He, K. · Zhang, X. · Ren, S. · Sun, J. — CVPR
المشكلة
من المفترض أن الشبكات الأعمق أقوى — سعتها أكبر وقادرة على تمثيل دوال أعقد. لكن التجارب كشفت عن «مشكلة تدهور» محيّرة: إضافة مزيد من الطبقات إلى شبكة التفافية عادية رفع خطأ التدريب والاختبار معاً. المشكلة لم تكن فرط تخصيص (لأن خطأ التدريب نفسه ارتفع). هناك شيء في سطح التحسين لهذه الشبكات العميقة جداً يمنع النزول التدريجي من الوصول إلى حلول جيدة، بل حتى حلول بمستوى ما تجده شبكة أقل عمقاً.
الإسهام
التعلّم المتبقّي: بدلاً من أن نتوقع من كل مجموعة طبقات أن تتعلم التحويل المطلوب H(x) مباشرة، نجعلها تتعلم الفرق فقط F(x) = H(x) − x ثم نُعيد جمع x عبر وصلة تخطّي. إذا كان التحويل الأمثل قريباً من دالة الهوية، فتعلّم فرق قريب من الصفر أسهل بكثير من تعلّم دالة الهوية من الصفر. هذا التعديل الواحد أتاح تدريب شبكات بـ152 طبقة — أعمق من VGG بـ8 مرات — بخطأ أقل وتكلفة حوسبية أقل. كتل عنق الزجاجة (التفافات 1×1 ثم 3×3 ثم 1×1) جعلت هذا العمق الشديد ممكناً عملياً. فازت ResNet بجميع المسارات في ILSVRC وCOCO 2015.
الأثر
جعلت ResNet العمق محوراً موثوقاً للتوسعة — أضف طبقات ويتحسن الأداء بدل أن ينهار. تكاد كل بنية رؤية حاسوبية حديثة (وكثير من النماذج خارج مجال الرؤية) تستخدم الوصلات المتبقّية: DenseNet وEfficientNet ومحوِّلات الرؤية، بل حتى كتل المرمِّز وفاكّ الترميز في نفسه. أصبحت وصلة التخطّي ركيزة في لا تقل أهمية عن الالتفاف ذاته.
تخيّل أنك تصعد ناطحة سحاب عبر الدرج. عند الطابق العشرين الأمور على ما يرام. لكن عند الطابق 56 يصبح الدرج معقّداً لدرجة أنك تجد نفسك أخفض مما لو توقفت عند الطابق 20 — المزيد من الدرج جعلك تخسر ارتفاعاً بدل أن تكسبه.
الحل: عمود مصعد بجانب الدرج. في كل طابق، المصعد ينقلك للأعلى مجاناً ()، ولا يحتاج الدرج إلا لتعلّم الفرق الصغير بين طابق وآخر. الآن 152 طابقاً أمر سهل — كل طابق يستطيع الاعتماد على المصعد إن لم يكن للدرج ما يضيفه.
ذلك المصعد هو . والدرج هو المتبقّي F(x). معاً يعطيانك H(x) = F(x) + x.
المشكلة: الأعمق ليس دائماً الأفضل
بحلول 2015 كانت الوصفة السائدة في مجتمع التعلم العميق واضحة: زِد الطبقات تحصل على نتائج أفضل. شبكتا VGG-16 وVGG-19 تفوّقتا على AlexNet ذات الطبقات الثماني، وGoogLeNet بلغت 22 طبقة. الخطوة المنطقية التالية كانت 50 ثم 100 ثم 150 طبقة.
لكن حدث شيء غير متوقع. عادية من 56 طبقة دُرِّبت على CIFAR-10 سجّلت خطأ تدريب أعلى من نظيرتها ذات العشرين طبقة. ليس خطأ اختبار فقط — بل خطأ تدريب. هذا يعني أن المشكلة ليست ، بل إن الشبكة الأعمق عجزت عن التعلّم بنفس الفعالية.
هذه هي : بعد عمق معيّن، تصبح طبوغرافيا سطح التحسين صعبة لدرجة أن الشبكة لا تستطيع حتى نسخ حل الشبكة الأقل عمقاً — رغم أنها نظرياً قادرة على ذلك، لأن الطبقات الإضافية يمكنها ببساطة أن تتعلم تحويلات هوية لا تفعل شيئاً.
الفكرة: تعلَّم الفرق فقط، لا التحويل الكامل
الملاحظة المركزية التي قدّمها He وفريقه بسيطة لكنها عميقة الأثر: إذا كانت الدالة المثلى لكتلة ما قريبة من تحويل الهوية (أي أن المطلوب هو تمرير البيانات كما هي تقريباً)، فإن تعلّم H(x) = x من الصفر صعب على حزمة طبقات غير خطية. في المقابل، تعلّم F(x) = 0 أمر سهل — يكفي دفع الأوزان جميعها نحو الصفر.
تعيد صياغة المهمة بالكامل. بدلاً من تعلّم التحويل H(x) مباشرة، تتعلم الطبقات الفرقَ فقط F(x) = H(x) − x، ثم تأتي وصلة التخطّي لتعيد جمع المدخل الأصلي x:
المخرج = F(x) + x
إن لم يكن للكتلة ما تضيفه يصبح F(x) = 0 وتمر البيانات دون تغيير. وإن احتاجت الكتلة إلى تعديل البيانات، فإنها تتعلم الفرق عن الهوية فحسب. في كلتا الحالتين التحسين أسهل بكثير.
كيف تُصلح وصلات التخطّي تدفّق التدرّجات
عند حساب دالة الفقد بالنسبة لطبقة مبكرة x_l نحصل على:
ذلك الحد «1 +» هو مسار الهوية. حتى لو كانت تدرّجات الدوال المتبقّية ضئيلة، يظل التدرّج قادراً على الرجوع عبر وصلات التخطّي بلا أي نقصان. أما في الشبكات العادية فالتدرّجات مضطرّة للمرور عبر أوزان كل طبقة واحدة تلو الأخرى، وكل عملية ضرب قد تُقلّص الإشارة () أو تُضخّمها (). وصلة التخطّي تمنح التدرّجات طريقاً سريعاً يعود مباشرة إلى أي طبقة دون المرور بسلسلة الأوزان.
تصميم عنق الزجاجة: الوصول إلى أعماق حقيقية
حين يتجاوز عدد الطبقات 50، تصبح الكتلة المتبقّية الأساسية (التفافتان 3×3) مكلفة حوسبياً. هنا تأتي : الفكرة أن التفاف 1×1 يضغط الأبعاد أولاً (مثلاً من 256 إلى 64 قناة)، ثم التفاف 3×3 يؤدي العمل المكاني الثقيل على هذا التمثيل المصغّر، وأخيراً التفاف 1×1 يوسّع الأبعاد مجدداً (من 64 إلى 256).
بهذا التصميم يعمل الالتفاف 3×3 على 64 قناة بدل 256، فتنخفض التكلفة الحوسبية نحو 4 أضعاف. هذا ما جعل شبكات ResNet بـ101 و152 طبقة ممكنة عملياً بعمليات حسابية أقل حتى من VGG-16.
العائلة: من ResNet-18 إلى ResNet-152
ResNet ليست نموذجاً واحداً بل عائلة بنيات تتشارك نفس مبدأ التصميم المتبقّي. النسخ الضحلة — ResNet-18 (11.7 مليون ) وResNet-34 (21.8 مليون) — تستخدم كتلاً متبقّية أساسية بطبقتين. أما النسخ الأعمق — ResNet-50 (25.6 مليون) وResNet-101 (44.5 مليون) وResNet-152 (60.2 مليون) — فتستخدم كتل عنق الزجاجة. الرسم التفاعلي أدناه يعرض معدلات خطأ أعلى 5 على ImageNet: من %10.92 في ResNet-18 نزولاً إلى %5.71 في ResNet-152.
جميع النسخ تتبع النمط ذاته: التفاف 7×7 أولي + ، ثم أربع مراحل من الكتل المتبقّية مع مضاعفة القنوات (64 ثم 128 ثم 256 ثم 512)، وأخيراً يليه .
تسوية الدُفعة: الشريك الصامت
كل طبقة التفافية في ResNet تعقبها (BN)، وهي تقنية تُسوّي تنشيطات كل قناة إلى متوسط صفري وتباين واحدي ضمن كل دفعة صغيرة. تؤدي تسوية الدُفعة ثلاثة أدوار محورية:
- تثبيت التدريب عبر منع الانزياح التوزيعي الداخلي، بحيث تستقبل كل طبقة مدخلات ذات إحصاءات مستقرة.
- السماح بمعدلات تعلم أعلى لأن التنشيطات المسوّاة تبقى في النطاق الفعّال لـReLU، فلا تتشبّع ولا تصبح .
- تنظيم خفيف لأن الإحصاءات المحسوبة على كل دفعة تُدخل قدراً من الضوضاء، ما يحدّ من فرط التخصيص.
بدون تسوية الدُفعة يصبح تدريب 152 طبقة غير عملي حتى مع وصلات التخطّي. نجاح ResNet يعتمد على تكامل عنصرين: التعلّم المتبقّي (لحل مشكلة التحسين) وتسوية الدُفعة (لتثبيت التنشيطات) — كلاهما ضروري.
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import numpy as np
def batch_norm(x, eps=1e-5):
"""تسوية كل قناة إلى متوسط صفري وتباين واحدي."""
mean = x.mean(axis=(0, 2, 3), keepdims=True)
var = x.var(axis=(0, 2, 3), keepdims=True)
return (x - mean) / np.sqrt(var + eps)
def conv3x3(x, W):
"""بديل مبسّط لالتفاف 3×3."""
return x # مبسّط
def residual_block(x, W1, W2):
"""جوهر ResNet: F(x) + x."""
identity = x # احفظ المدخل
out = conv3x3(x, W1) # التفاف 3×3 أول
out = batch_norm(out) # تسوية
out = np.maximum(0, out) # ReLU
out = conv3x3(out, W2) # التفاف 3×3 ثانٍ
out = batch_norm(out) # تسوية
out = out + identity # وصلة التخطّي
out = np.maximum(0, out) # ReLU بعد الجمع
return out
# هذا كل شيء. `out + identity` هو الابتكار بأكمله. # بدونه: 56 طبقة أسوأ من 20 طبقة. # معه: 152 طبقة تحطّم أرقاماً قياسية.لماذا كانت هذه الورقة مفصلية
2015
ResNet — وصلات التخطّي تتغلّب على مشكلة العمق
درّب He وفريقه شبكات من 152 طبقة بخطأ وتكلفة حوسبية أقل من VGG-16/19 عبر إضافة مسارات هوية مختصرة. فازوا بجميع المسارات في ILSVRC وCOCO 2015.
2016
تحويلات الهوية في الشبكات المتبقّية العميقة
أظهر He وSun أن نقل تسوية الدُفعة وReLU إلى ما قبل الالتفاف (ما يُعرف بالتفعيل المسبق) يُحسّن تدفق التدرّجات أكثر، مما أتاح تدريب شبكات ResNet بـ1001 طبقة على CIFAR.
2016
ResNeXt — مسارات متبقّية أوسع
استبدل Xie وفريقه مسار عنق الزجاجة الواحد بالتفافات مجمّعة متوازية، وأظهروا أن العرض داخل الكتل المتبقّية لا يقل أهمية عن العمق.
2017
DenseNet — كل طبقة تتصل بجميع الطبقات
وسّع Huang وفريقه فكرة وصلات التخطّي بحيث تستقبل كل طبقة خرائط السمات من جميع الطبقات السابقة لها، مما يزيد إعادة استخدام السمات ويحسّن تدفق التدرّجات.
2017
Mask R-CNN — بنية ResNet الأساسية لتجزئة المثيلات
استخدم He وفريقه ResNet بنيةً أساسية لكشف الأجسام والتجزئة على مستوى البكسل، مرسين النموذج المعتمد في بنيات الكشف الحديثة.
2019
EfficientNet — توسعة العمق والعرض والدقة معاً
أثبت Tan وLe أن توسعة العمق (على طريقة ResNet) والعرض ودقة المدخلات بنسبة متوازنة يتفوق على توسعة أي بُعد بمعزل عن البقية.
2020
محوِّل الرؤية — وصلات متبقّية في كل كتلة
استبدل ViT الالتفافات بالانتباه الذاتي لمعالجة الصور، لكنه أبقى على الوصلات المتبقّية في كل كتلة مرمِّز — وصلة التخطّي تجاوزت البنية التي نشأت فيها.
وصلة التخطّي اليوم في كل مكان. كل كتلة محوِّل — في GPT وClaude وGemini وBERT — هي في جوهرها كتلة متبقّية. فكرة أن التدرّجات تحتاج دائماً إلى مسار حرّ للرجوع أصبحت بديهية من بديهيات تصميم البنيات العصبية.
المرجعHe, Zhang, Ren, Sun. Deep Residual Learning for Image Recognition. CVPR, 2016.
مصطلحات هذه الورقة
- الاتصال التجاوزيSkip Connection
- الكتلة المتبقّيةResidual Block
- تحويل الهويةIdentity Mapping
- مشكلة التدهورDegradation Problem
- كتلة عنق الزجاجةBottleneck Block
- التعلم المتبقّيResidual Learning
- التجميع المتوسط العامGlobal Average Pooling