الوحدة 4 — LeNet وAlexNet: النجاحات الأولى
اجتزنا حتى الآن القِطع الأساسية للشبكات التلافيفية: التفاف، حشو، خطوة، تجميع. لم يبقَ سوى تجميعها في معمارية، أي في ترتيب مُنسَّق ينتج شبكةً تعمل. تعرض هذه الوحدة أوّل معماريتين علامتين في التاريخ: LeNet-5 من 1998، التي أثبتت أنّ الفكرة تعمل، وAlexNet من 2012، التي أطلقت الموجة الحديثة. الأمر ليس تاريخيًا فحسب: فقواعدهما الرئيسية لا تزال تحكم الشبكات المعاصرة.
LeNet-5: أوّل شبكة تلافيفية تعمل فعلًا
اقترح Yann LeCun عام 1998 معمارية LeNet-5 لقراءة رموز الشيكات البنكية. كانت مهمّة MNIST الحقيقية آنذاك، وقد أثبتت أنّ الشبكة التلافيفية تتفوّق على كلّ مقار بة يدوية سابقة.
تكوين LeNet-5 كما نُشِر:
| # | العملية | الشكل الداخل | حجم المرشّح | الشكل الخارج |
|---|---|---|---|---|
| 1 | Conv (6 مرشّحات) | 32×32×1 | 5×5 | 28×28×6 |
| 2 | AvgPool 2×2 s=2 | 28×28×6 | — | 14×14×6 |
| 3 | Conv (16 مرشّحًا) | 14×14×6 | 5×5 | 10×10×16 |
| 4 | AvgPool 2×2 s=2 | 10×10×16 | — | 5×5×16 |
| 5 | Conv/FC (120) | 5×5×16 | 5×5 | 1×1×120 |
| 6 | FC (84) | 120 | — | 84 |
| 7 | FC (10) | 84 | — | 10 |
قراءة الجدول تلخّص كلّ ما رأيناه: التلافيف تُبني الميزات، والتجميع يُقلّص الأبعاد، وطبقتان كثيفتان في النهاية للتصنيف. عدد المعاملات الإجمالي: نحو 60000. عدد صغير جدًّا بمقاييس اليوم، وهو ما جعل التدريب ممكنًا على معالجات 1998.
import tensorflow as tf
from tensorflow.keras import layers, models
def lenet5():
modele = models.Sequential([
layers.Input(shape=(32, 32, 1)),
layers.Conv2D(6, 5, activation="tanh"),
layers.AveragePooling2D(2),
layers.Conv2D(16, 5, activation="tanh"),
layers.AveragePooling2D(2),
layers.Conv2D(120, 5, activation="tanh"),
layers.Flatten(),
layers.Dense(84, activation="tanh"),
layers.Dense(10, activation="softmax"),
])
return modele
لاحظ اختيار tanh بدل ReLU: لم تكن ReLU قد اقتُرِحت بعد. لاحظ أيضًا متوسّط التجميع بدل الأقصى. هاتان التغييرتان الصغيرتان تُقلّصان دقّة LeNet على مهمّات أكبر بضع نقاط، وهو أوّل درس تاريخي عن أهمّية الاختيارات الصغيرة.
المرحلة المظلمة: 2000-2010
قبل AlexNet، سيطرت أدوات هندسة المتغيّرات اليدوية على الرؤية الحاسوبية: SIFT وHOG وBag of Visual Words وSVM. اعتُبِرت الشبكات التلافيفية أفكارًا واعدة لكنّها محدودة، وذلك لثلاثة أسباب مركّبة:
- قِلّة البيانات: لم يكن لدينا مجموعة صور موسومة ذات ملايين العيّنات. بيانات MNIST كانت 60000 صورة رمادية 28×28، لعبة أطفال بالمقارنة.
- قِلّة الحساب: تدريب شبكة ذات مئة مليون معامل على معالج قياسي كان يستغرق شهورًا.
- مشاكل الاستمثال: التنشيط
tanhيُدخل الشبكة في التشبّع بسرعة، فتموت التدرّجات وتتوقّف الشبكة عن التعلّم.
حلّ ثلاث عقبات دفعة واحدة يستحقّ ثورة. وقد وقعت الثورة في مسابقة ImageNet لعام 2012.
AlexNet: الانفجار الكبير في 2012
قدّم Alex Krizhevsky وIlya Sutskever وGeoffrey Hinton في 2012 شبكةً بلغت دقّتها 84.7 % في اختبار top-5 على ImageNet، مقابل 74.3 % لأفضل مقاربة تقليدية. هذه القفزة بعشر نقاط لا تحدث في مجال ناضج، وقد قلبت السنة التالية اتّجاه البحث كلّه نحو التعلّم العميق.
تكوين AlexNet:
| # | العملية | الشكل الداخل | حجم المرشّح | الشكل الخارج |
|---|---|---|---|---|
| 1 | Conv (96 مرشّحًا) s=4 | 227×227×3 | 11×11 | 55×55×96 |
| 2 | MaxPool 3×3 s=2 | 55×55×96 | — | 27×27×96 |
| 3 | Conv (256) | 27×27×96 | 5×5 | 27×27×256 |
| 4 | MaxPool 3×3 s=2 | 27×27×256 | — | 13×13×256 |
| 5 | Conv (384) | 13×13×256 | 3×3 | 13×13×384 |
| 6 | Conv (384) | 13×13×384 | 3×3 | 13×13×384 |
| 7 | Conv (256) | 13×13×384 | 3×3 | 13×13×256 |
| 8 | MaxPool 3×3 s=2 | 13×13×256 | — | 6×6×256 |
| 9 | FC (4096) | 9216 | — | 4096 |
| 10 | FC (4096) | 4096 | — | 4096 |
| 11 | FC (1000) | 4096 | — | 1000 |
عدد المعاملات: 60 مليون. أكثر من ألف ضعف LeNet.
ما غيّرته AlexNet: أربعة إسهامات دائمة
1. ReLU بدل tanh. أدخل التنشيط الشبكة إلى عصر الاستمثال المتقدّم. تحسّنت سرعة التقارب بست مرّات مقارنة بـtanh، واختفت مشكلة تلاشي التدرّج في الطبقات الأولى. هذا التنشيط لم يكن جديدًا (اقترحه Fukushima منذ 1969)، لكنّ نجاح AlexNet جعله معيارًا لا يُنقاش. تعمل به اليوم كلّ شبكة تلافيفية تقريبًا.
2. الإسقاط (Dropout). أثناء التدريب، تُلغى بشكل عشوائي 50 % من عصبونات طبقتَي الاتّصال الكامل. رأينا هذه الطريقة في دورة أساسيات التعلّم العميق (الوحدة 7): إنّها تكافئ تعلّم مجموعة كبيرة من الشبكات الفرعية. أعطى الإسقاط للأبعاد الكثيفة الضخمة (2×4096 عصبونًا) فرصة للتعلّم بدون فرط في التخصيص.
x = layers.Dense(4096, activation="relu")(x)
x = layers.Dropout(0.5)(x) # الطبقة السرّية في نجاح AlexNet
x = layers.Dense(4096, activation="relu")(x)
x = layers.Dropout(0.5)(x)
3. المعالجات الرسومية (GPU). كان AlexNet أوّل شبكة تُدرَّب على GPU (اثنين في الواقع، بسبب قيود الذاكرة آنذاك). خفّض ذلك التدريب من شهور إلى أيّام. من ذلك اللحظة، ارتبطت أبحاث التعلّم العميق ارتباطًا وثيقًا بتطوّر عتاد الحوسبة.
4. تكثير البيانات (Data augmentation). اقتصاصات عشوائية، وانعكاسات أفقية، وتغيّرات في الإضاءة. تحوّلت 1.2 مليون صورة أصلية إلى ما يعادل عشرات الملايين. سنتعمّق في هذه التقنية في الوحدة 8.
من الأربعة أعلاه، بقيت ReLU وGPU وتكثير البيانات معايير إلى اليوم. الإسقاط تراجع في الشبكات التلافيفية المعاصرة (يستبدله التطبيع بالحزم في معظم المواضع)، لكنّه لا يزال أساسيًا في المحوّلات (Transformers). المرشّحات الكبيرة (11×11 و5×5) في الطبقة الأولى اختفت لصالح تراكم مرشّحات 3×3 (الوحدة التالية). حجم الاختراع لا يعني حجم البقاء.
كيف تُقرأ معمارية
اقرأ جدول الطبقات كأنّه حساب مصرفي:
- العمود الحسّاس: حجم الخرج. تحقّق أنّ التقلّص المكاني (2 مثلًا) والنموّ في العمق (2 أيضًا) متوازنان، حتى يبقى الحجم الإجمالي للتنسورات مستقرًّا نسبيًا.
- العدد الإجمالي للمعاملات: يقع أغلبه عادةً في الطبقات الكثيفة الأخيرة (85 % في AlexNet). هذا نقطة سيّئة يعالجها
GlobalAveragePooling2Dفي المعماريات الحديثة. - الحجم الأقصى للتنسور الوسيط: يقع عادة بعد الطبقة الأولى (على 55×55×96 هنا). هذا يحدّد الذاكرة المطلوبة على GPU، وليس عدد المعاملات كما يُظنّ.
عملية على CIFAR-10 بتصميم شبيه
لا تصلح AlexNet لصور 32×32 بسبب الخطوة 4 في طبقتها الأولى. لكن نتّبع نفس الفلسفة:
def alexnet_style_cifar():
modele = models.Sequential([
layers.Input(shape=(32, 32, 3)),
layers.Conv2D(64, 3, padding="same", activation="relu"),
layers.Conv2D(64, 3, padding="same", activation="relu"),
layers.MaxPooling2D(2),
layers.Conv2D(128, 3, padding="same", activation="relu"),
layers.Conv2D(128, 3, padding="same", activation="relu"),
layers.MaxPooling2D(2),
layers.Conv2D(256, 3, padding="same", activation="relu"),
layers.Conv2D(256, 3, padding="same", activation="relu"),
layers.MaxPooling2D(2),
layers.Flatten(),
layers.Dense(512, activation="relu"),
layers.Dropout(0.5),
layers.Dense(10, activation="softmax"),
])
return modele
هذه الشبكة تصل إلى 85 % على CIFAR-10 خلال 40 حقبة، لكنّها تحمل 1.5 مليون معامل بسبب الطبقة الكثيفة. سنقلّل ذلك جذريًا في الوحدة التالية بمعمارية VGG، ثم أكثر بـResNet.
شبكة بـ60 مليون معامل ليست بالضرورة أذكى من شبكة بـمليون معامل. AlexNet ذات 60 مليون معامل تخسر أمام EfficientNet-B0 ذات 5 ملايين معامل على ImageNet. الكفاءة المعمارية أهمّ بكثير من الحجم الخام، وهذا درس الوحدات القادمة.
في الخلاصة
- LeNet-5 أثبتت أنّ تكديس التلافيف والتجميع ثم الطبقات الكثيفة يعمل على قراءة الأرقام، وأرسَت النمط الأساسي للشبكات التلافيفية.
- AlexNet فتحت المجال في 2012 بأربعة إسهامات: ReLU لسرعة التقارب، الإسقاط ضدّ فرط التخصيص، GPU لتقليص وقت التدريب، تكثير البيانات لمضاعفة العيّنات.
- قراءة جدول طبقات تعني تتبّع حجم الخرج وتوزيع المعاملات، مع الانتباه إلى أنّ الطبقات الكثيفة تحمل أغلب المعاملات بينما الطبقات التلافيفية تحمل أغلب الحساب.
- من إسهامات AlexNet بقيت ReLU وGPU وتكثير البيانات معايير، بينما استُبدل الإسقاط في التلافيفيات بالتطبيع بالحزم، واستُبدلت المرشّحات الكبيرة بتراكم مرشّحات 3×3.
الوحدة التالية: VGG، حيث نرى كيف يمكن استبدال مرشّح 5×5 بطبقتَي 3×3 مع معاملات أقلّ وقدرة أكبر.