من العمليات للـ architecture
الدرس اللي فات عرض الحتت الأساسية: الـ convolution والـ pooling والـ stride والـ padding. دلوقتي هنجمّع الحتت دي في architectures كاملة. والـ CNN architecture (بنية الشبكة التلافيفية) هي الترتيب المحدّد وإعداد الـ layers — كام convolutional layer، وكام filter في كل واحدة، والـ pooling بيحصل فين، وإزاي الـ feature maps المكانية بتتوصّل في الآخر بـ predictions الـ output.
وتصميم الـ architecture بيحدّد تقريبًا كل حاجة: عدد الـ parameters، وحجم الـ receptive field، والـ gradients بتعدّي بسرعة قد إيه أثناء التدريب، والشبكة هتعمّم قد إيه في الآخر. وتاريخ الـ CNNs في الأساس هو تاريخ architectures أحسن — كل اختراق بيحل مشكلة معيّنة في الجيل اللي قبله.
الـ convolutional layer بالتفصيل
الـ convolutional layer الواحدة بتتعرّف بأربع hyperparameters: عدد الـ filters F، وحجم الـ filter k×k، والـ stride s، والـ padding p. كل filter بيطلّع feature map (خريطة مزايا) واحدة — خريطة في بُعدين لاستجابات الـ filter ده على كل أماكن الـ input. ومع F filter، الـ layer بتطلّع F feature map متراصّين في tensor في تلات أبعاد.
ولصورة ملوّنة، كل filter عمقه بيساوي عدد channels الـ input C. filter 3×3 متطبّق على صورة RGB هو في الحقيقة tensor 3×3×3 = 27 parameter. الـ filter بيتزحلق على الأبعاد المكانية (الارتفاع والعرض) وبيغطّي عمق الـ channels كله في كل مكان. والـ feature map الخارجة خريطة واحدة في بُعدين لكل filter — بُعد الـ channels بيتطوي بالجمع جوه الـ convolution.
وبعد كل convolutional layer، activation function مش خطية بتتطبّق عنصر بعنصر على الـ feature maps. والاختيار المسيطر هو الـ ReLU (Rectified Linear Unit): f(x) = max(0, x). الـ ReLU بتصفّر الـ activations السالبة وبتسيب الموجبة. رخيصة في الحساب وبتتجنّب مشكلة الـ vanishing gradient (اختفاء التدرج) اللي بتعطّل الـ sigmoid والـ tanh في الشبكات العميقة، وبتشتغل هايل عمليًا.
الـ sigmoid بيضغط الـ inputs لـ (0, 1) وبيتشبّع مع القيم الموجبة أو السالبة الكبيرة — فالـ gradients بتبقى تقريبًا صفر وده بيبطّأ التعلّم. والـ gradient بتاع الـ ReLU هو 1 بالظبط للـ inputs الموجبة، فالـ gradients بتعدّي بحرية على layers كتير. وتمن ده هو "الـ dead neurons": وحدات بتطلّع 0 دايمًا ومبترجعش. والـ Leaky ReLU والـ ELU بيعالجوا ده بإنهم يسمحوا بـ gradients صغيرة مش صفر للـ inputs السالبة.
النمط الكلاسيكي: convolution وبعدين pooling
المخطط المعتاد، اللي LeNet وبعدين AlexNet ثبّتوه، بيبدّل بين مراحل convolution ومراحل pooling: convolution ← ReLU ← pooling ← convolution ← ReLU ← pooling ← … ← flatten ← fully connected ← softmax. كل مرحلة convolution بتكتشف مزايا بمقياس أكبر تدريجيًا. وكل خطوة pooling بتنصّ الدقة المكانية فبتوسّع الـ receptive field الفعلي.
ومع ما الأبعاد المكانية بتصغر، عدد الـ filters عادةً بيتضاعف. تدرّج مشهور: 32 filter في أول layer، و64 في التانية، و128 في التالتة. وده بيخلّي إجمالي الـ activations تقريبًا ثابت على الـ layers (المساحة المكانية اللي اتنصّت بتعوّض عدد الـ channels اللي اتضاعف) وبيغني تمثيل المزايا تدريجيًا.
وبعد آخر pooling layer، tensor المزايا اللي في تلات أبعاد بيتعمله flatten لـ vector في بُعد واحد ويدخل على layer أو أكتر من الـ fully connected layers. والـ fully connected layer الأخيرة بتطلّع logit (قيمة خام) واحد لكل فئة؛ والـ softmax بتحوّل الـ logits دي لتوزيع احتمالي. ولعدد C من الفئات، output الـ softmax هو: p_i = exp(z_i) / Σ_j exp(z_j)، وz_i هو الـ logit رقم i.
من LeNet لـ AlexNet: إثبات الفكرة
LeNet-5 (LeCun وزمايله، 1998) كانت من أوائل الـ CNNs الناجحة، اتصمّمت عشان تتعرّف على الأرقام المكتوبة بخط الإيد في MNIST. كان فيها convolutional layerين (filters 5×5، و6 و16 feature map)، وaverage pooling، وتلات fully connected layers — حوالي 60,000 parameter. LeNet أثبتت إن الـ CNNs تقدر تتعلّم مزايا هرمية من الـ pixels الخام، بس فضلت محدودة بالـ inputs الصغيرة اللي دقتها قليلة.
AlexNet (Krizhevsky وSutskever وHinton، 2012) كانت الـ architecture اللي رجّعت المجال للحياة. كسبت مسابقة ImageNet LSVRC بفرق كبير (15.3% top-5 error قصاد 26.2% للي بعدها)، وأثبتت إن الـ deep CNNs تقدر تسيطر على التعرّف على الصور على نطاق واسع. كان فيها خمس convolutional layers وتلات fully connected layers وحوالي 60 مليون parameter، والأهم إنها استخدمت ReLU بدل الـ sigmoid، وDropout للـ regularization، وGPUs للتدريب.
مسابقة ImageNet 2012 كانت لحظة فاصلة في تاريخ الـ AI. تحسين AlexNet بفرق 10.8 نقطة مئوية عن أحسن نتيجة قبلها صدم المجال كله. وخلال سنتين، كل فريق في المقدمة اتحوّل للـ CNNs. وطريقة التدريب بتسريع الـ GPU اللي AlexNet ثبّتتها بقت المعيار الشامل للـ deep learning.
VGGNet (Simonyan وZisserman، 2014) استكشفت تأثير العمق بوصفة بسيطة جدًا: استخدم filters 3×3 بس (أصغر filter يقدر يمسك العلاقات المكانية شمال ويمين وفوق وتحت)، مع same padding دايمًا، وضاعف عدد الـ filters بعد كل max pooling. VGG-16 فيها 16 weight layer وحوالي 138 مليون parameter. وانتظامها خلّاها سهل تتفهم وتتكيّف، ومزايا VGG بقت الـ representations المرجعية الجاهزة سنين.
الفكرة الأساسية في VGG: convolutional layerين 3×3 فوق بعض ليهم نفس الـ receptive field الفعلي بتاع layer واحدة 5×5، بس بـ parameters أقل (2×9 = 18 قصاد 25 لكل channel) ولاخطية زيادة بينهم بتزوّد قدرة التمييز. وتلات layers 3×3 فوق بعض بيساووا layer 7×7 بكفاءة أعلى. والمبدأ ده — تفضيل filters صغيرة كتير على filters كبيرة قليلة — بقى قاعدة تصميم ثابتة.
الـ ResNet: حل مشكلة العمق
رص layers أكتر مش دايمًا بيفيد. في بداية الألفينات، الباحثين لاحظوا إن الشبكات العميقة جدًا (أكتر من 20 layer) أداؤها أوحش من الأقل عمقًا على بيانات التدريب — مش بسبب الـ overfitting بس، لكن بسبب فشل في الـ optimization. الـ gradients كانت بتختفي أو بتنفجر وهي راجعة لورا على عشرات الـ layers، والشبكة كانت بتعاني تتعلّم حتى الـ identity mapping.
الـ ResNet (He وزمايله، 2015) حل ده بـ الـ skip connections (الوصلات المتخطية) (واسمها كمان shortcut connections). بدل ما تتعلّم الـ mapping H(x) على طول، كل residual block بيتعلّم الـ residual F(x) = H(x) − x، وبعدين يزوّد الـ input x: output = F(x) + x. والتغيير اللي شكله بسيط ده تأثيره عميق: الـ gradients تقدر تعدّي على طول من الـ shortcut وتتخطّى الـ layers اللي مش خطية خالص، وده بيخلّي تدريب شبكات بمئات بل آلاف الـ layers ممكن.
الـ ResNet-50 وصلت لـ top-5 error 3.6% على ImageNet — وعدّت الأداء على مستوى البني آدم لأول مرة. وعيلتها من ResNet-18 (11M parameter) لـ ResNet-152 (60M parameter). وتصميمات الـ bottleneck في النسخ الأعمق بتستخدم 1×1 ← 3×3 ← 1×1 عشان تقلّص عمق الـ channels وبعدين ترجّعه، فبتخلّي الحساب معقول.
الـ Inception والـ EfficientNet: العرض والـ scaling
GoogLeNet / Inception (Szegedy وزمايله، 2014) مشيت بطريقة تانية: بدل ما تختار حجم filter واحد، استخدمت أحجام كتير بالتوازي. الـ Inception module بيطبّق convolutions 1×1 و3×3 و5×5 في نفس الوقت زائد فرع max pooling، وبعدين يدمج الـ outputs بتاعتهم على طول الـ channels. وده بيخلّي الشبكة تحدّد المقياس الأنسب لكل feature. والـ convolutions 1×1 قبل الـ filters الأكبر بتشتغل كـ bottleneck بيقلّص الحساب جامد.
EfficientNet (Tan وLe، 2019) قدّمت طريقة مدروسة للـ scaling بتاع الـ CNNs. الـ scaling قبل كده كان بيلمس بُعد واحد: VGG بتعمّق، وWideResNet بتعرّض، وmodels تانية بتكبّر الدقة. وEfficientNet أثبتت إن الـ compound scaling (التحجيم المركّب) — إنك توسّع العمق والعرض والدقة مع بعض بنسبة ثابتة — دايمًا بيجيب دقة أعلى لنفس الميزانية الحسابية. ومعامل scaling واحد φ بيتحكم الأبعاد التلاتة هتتوسّع قد إيه مع بعض.
LeNet ≈ 99% على أرقام MNIST (1998) • AlexNet ≈ 63% على ImageNet (2012) • VGG-16 ≈ 74% (2014) • ResNet-50 ≈ 76% (2015) • EfficientNet-B7 ≈ 84% (2019). كل جيل نزّل معدل الغلط تقريبًا للنص مقارنةً باللي قبله، وكتير مع تقليل عدد الـ parameters كمان.
الـ transfer learning: اطلع على كتاف العمالقة
تدريب CNN من الصفر على ImageNet محتاج ملايين الصور اللي ليها labels وأسابيع من وقت الـ GPU وظبط دقيق للـ hyperparameters. ولأغلب المشاكل العملية، ده مش ضروري: الشبكة اللي اتدرّبت على ImageNet اتعلّمت فعلًا مزايا بصرية غنية وعامة — حواف وملامس وأشكال وأجزاء أجسام — بتنتقل بشكل ملفت لمجالات جديدة.
الـ feature extraction (استخراج المزايا) هو أبسط استراتيجية نقل: خد شبكة pretrained، شيل layer الـ classification الأخيرة، جمّد كل الـ weights، واستخدم الشبكة الباقية كـ feature extractor ثابت. عدّي صورك على الشبكة المجمّدة، اجمع feature vectors من الـ layer اللي قبل الأخيرة، ودرّب classifier بسيط (logistic regression، SVM) على المزايا دي. وده بيشتغل بشكل مدهش حتى لما المجال المستهدف يختلف جامد عن ImageNet.
الـ fine-tuning (الضبط الدقيق) بيروح أبعد: بعد ما تركّب classification head جديد على الـ backbone الـ pretrained، كمّل تدريب بعض الـ layers أو كلها على الـ dataset المستهدفة بـ learning rate صغير. عادةً الـ layers الأخيرة بتتظبط الأول (هي الأكتر تخصّصًا للـ dataset)، وبعدين التدريب بيمتد للـ layers الأبدر لو فيه بيانات كفاية. والـ fine-tuning عادةً بيغلب الـ feature extraction لما يبقى فيه بيانات ليها labels كفاية.
قاعدة عملية مفيدة: لو الـ dataset المستهدفة صغيرة وشبه ImageNet، جمّد كل حاجة ودرّب الـ head بس — parameters أكتر من البيانات بتوصّل للـ overfitting. لو كبيرة وشبهه، اعمل fine-tuning للشبكة كلها. لو صغيرة بس مختلفة جدًا (زي صور الأشعة الطبية)، اعمل fine-tuning للـ layers العليا بس بـ regularization قوي. ولو كبيرة ومختلفة، الـ fine-tuning الكامل آمن وعادةً الأحسن.
الـ transfer learning خلّى الـ computer vision في إيد الكل. باحثين معاهم مئات الصور اللي ليها labels ولابتوب بـ GPU يقدروا يوصلوا لدقة بتنافس في مهام كتير بإنهم يعملوا fine-tuning لـ ResNet أو EfficientNet pretrained. ومستودعات زي PyTorch Image Models (timm) وTensorFlow Hub بتوفّر مئات الـ checkpoints الجاهزة للتكييف.
- convolutional layer فيها F filter مقاسه k×k×C فيها F×(k²×C + 1) parameter. وactivation الـ ReLU بتيجي بعد كل convolutional layer؛ بتتجنّب الـ vanishing gradients وحسابها رخيص.
- النمط الكلاسيكي: convolution ← ReLU ← pooling، بيتكرّر، وبعدين flatten ← fully connected ← softmax. الـ filters بتتضاعف مع ما الأبعاد المكانية بتصغر، فحجم الـ activations بيفضل تقريبًا ثابت.
- LeNet أثبتت الفكرة على الصور الصغيرة. وAlexNet كبّرتها لـ ImageNet باستخدام GPUs وReLU وDropout. وVGG بيّنت إن العمق مع filters 3×3 موحّدة فعّال جدًا؛ وlayerين 3×3 بيساووا layer 5×5 بتكلفة أقل.
- الـ ResNet حلّت مشكلة التدهور بالـ residual (shortcut) connections: y = F(x) + x. والـ gradients بتعدّي من مسار الـ shortcut فبيبقى ممكن تدرّب مئات الـ layers باستقرار.
- الـ Inception بتستخدم filters متعددة المقياس بالتوازي وبتدمج الـ outputs بتاعتها. والـ EfficientNet بتطبّق الـ compound scaling عشان توسّع العمق والعرض والدقة مع بعض بأقصى كفاءة.
- الـ transfer learning: استخدم شبكة متدرّبة على ImageNet كـ feature extractor أو اعملها fine-tuning على الـ dataset بتاعتك. الـ feature extraction مناسب للـ datasets الصغيرة؛ والـ fine-tuning بيكسب لما يبقى فيه بيانات أكتر. جمّد الـ layers الأولى؛ وافتح الـ layers اللي بعدها تدريجيًا.