الوحدة 1 — الالتفاف والمرشّحات وخرائط الميزات
انتهت دورة أساسيات التعلّم العميق إلى شبكة كثيفة تربط كلّ عصبون بجميع عصبونات الطبقة التالية. تعمل هذه الشبكة على متّجه من الأرقام، لكنّها تعجز عن الصورة لسبب بسيط: فصورة CIFAR-10 الصغيرة بحجم 32×32 وثلاث قنوات تحوي 3072 بكسلًا، وربطها بطبقة كثيفة من 512 عصبونًا يستهلك 1573376 معاملًا لطبقةٍ واحدة. تتضخّم الأرقام أسرع مع صور 224×224، ويختفي المعنى المكاني: فبكسلان متجاوران ليسا أقرب من بكسلين متباعدَين في نظر الطبقة الكثيفة. تُقدّم هذه الوحدة العملية التي تعالج المشكلتين معًا وتُسمّى الالتفاف.
ما يفعله الالتفاف فعلًا
مرشّح الالتفاف نافذة صغيرة من الأوزان، مصفوفة 3×3 مثلًا، تنزلق فوق الصورة. عند كلّ موضع، تُضرَب أوزان النافذة في قيم البكسلات المقابلة، ثم تُجمَع النواتج ويُكتَب مجموعها في خلية واحدة من خريطة الميزات الخارجة. الحركة كلّها ليست إلّا سلسلة من جداءات النقطة الصغيرة.
خُذ صورة رمادية بحجم 5×5، ومرشّحًا بحجم 3×3 يكشف الحواف الرأسية:
image = [[ 10, 10, 10, 80, 80],
[ 10, 10, 10, 80, 80],
[ 10, 10, 10, 80, 80],
[ 10, 10, 10, 80, 80],
[ 10, 10, 10, 80, 80]]
filtre = [[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1]]
عند الموضع الأعلى الأيسر، تُغطّي النافذة كتلة قيمها 10 بأكملها، فيكون المجموع الموزون صفرًا: لا حافّة هناك. عند الموضع الذي تلتقي فيه الكتلة الداكنة بالفاتحة، يجمع المرشّح ثلاث قيم موجبة (80) وثلاث قيم سالبة (10)، فيُنتج ذروة قدرها 210: هذا هو التوقيع الرقمي للحافّة. الالتفاف مقياس تشابه محلّي بين المرشّح والصورة، لا شيء آخر.
مرشّحات Sobel والنية وراء الأوزان
قبل أن نتعلّم الأوزان، اقترح مهندسو الرؤية الحاسوبية مرشّحات مصمَّمة يدويًا. مرشّحات Sobel هي الأشهر:
Sobel_x = [[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]]
Sobel_y = [[-1, -2, -1],
[ 0, 0, 0],
[ 1, 2, 1]]
يبرز Sobel_x التغيّرات الأفقية للسطوع، أي الحواف الرأسية، ويبرز Sobel_y عكس ذلك. ما يجعل من هذه الأوزان أوزانًا خاصّة هو رصيدها من العقود: عرفنا أنّها تكشف الحواف قبل أن نُعلَم آلة كيفية تعلّمها. ما تكتشفه شبكة تلافيفية بتدريبها على CIFAR-10 يشبه ذلك كثيرًا في طبقتها الأولى — كواشف للحواف بأوجهها المختلفة — لكنّها تكتشفها من البيانات بدل أن تُملى عليها. وهذا هو التقدّم الحقيقي: الانتقال من مرشّحات مصمَّمة يدويًا إلى مرشّحات متعلَّمة.
قنوات متعدّدة وخرائط متعدّدة
الصورة الملوّنة تحوي ثلاث قنوات (أحمر، أخضر، أزرق). لذلك تكون الطبقة التلافيفية الحقيقية ذات ثلاث قنوات دخلًا: يصبح شكل المرشّح 3×3×3، وتُطبَّق النافذة على القنوات الثلاث معًا وتُجمَع نتائجها في قيمة واحدة. وإن أردنا كشف عدّة أنواع من الحواف والقوامات، طبّقنا عدّة مرشّحات مستقلّة في الطبقة نفسها: ينتج كلّ مرشّح خريطة ميزات خاصّة به، فتتراكب الخرائط لتكوّن الخرج ذا القنوات المتعدّدة الذي تستقبله الطبقة التالية.
import tensorflow as tf
from tensorflow.keras import layers
# دخل CIFAR-10: صور بحجم 32×32 وثلاث قنوات
entree = tf.keras.Input(shape=(32, 32, 3))
x = layers.Conv2D(filters=16, kernel_size=3, activation="relu")(entree)
# 16 مرشّحًا لكلّ منها شكل 3×3×3، فيُنتج الخرج 16 خريطة ميزات
عدد المعام لات في هذه الطبقة يساوي حاصل ضرب حجم المرشّح في عدد القنوات الداخلة، مضروبًا في عدد المرشّحات، مضافًا إليه انحياز واحد لكلّ مرشّح: أي معاملًا. تذكّر هذا الرقم؛ فسنعقد له مقارنة بعد قليل.
مشاركة الأوزان: القاعدة الرئيسية
الفكرة التي تجعل الالتفاف يعمل على الصور هي أنّ المرشّح نفسه ينزلق فوق الصورة كلّها. الأوزان الـتسع الخاصّة بمرشّح 3×3 مشتركة بين جميع المواضع. لهذا نتائج جوهرية:
- ثبات الانزياح تقريبيًا: قطّة في الأعلى الأيسر تُطلق الاستجابة نفسها التي تُطلقها القطّة نفسها في الأسفل الأيمن. لا تحتاج الطبقة الأولى إلى تعلّم القطّة في كلّ موضع محتمل بشكل منفصل.
- قِلّة المعاملات: عدد الأوزان مستقلّ عن حجم الصورة. طبقة الالتفاف نفسها تعمل على 32×32 وعلى 224×224 بالكمية ذاتها من المعاملات.
- الأولوية المحلّية: كلّ خلية خارجة تعتمد على جيرانها المباشرين فقط. تنسج الطبقات التالية بنية عالمية تدريجيًا من هذه القرارات المحلّية.
هذه الافتراضات الثلاثة صحيحة في الصور الطبيعية، وباطلة على البيانات الجدولية حيث لا يعني تجاور عمود ين شيئًا. لذلك تُفضَّل الأشجار المعزَّزة على الجدولية، وتُفضَّل الالتفافيات على البكسلات.
عدد المعاملات مقابل طبقة كثيفة
هذه المقارنة هي التي تُحسم بها المسألة. على دخل CIFAR-10 (32×32×3 = 3072 قيمة)، أنشئ طبقة كثيفة من 16 عصبونًا: عدد معاملاتها . طبقة الالتفاف السابقة بستّة عشر مرشّحًا لم تستهلك سوى 448 معاملًا، أي أقل بأكثر من مئة مرّة. وتُنتج مع ذلك خرجًا أغنى: خريطة ميزات لكلّ مرشّح، لا رقمًا واحدًا لكلّ عصبون.
الوفرة في المعاملات ليست ميزة رخصٍ فحسب، بل ميزة تعميم. فكلّ معامل زائد فرصة للحفظ بدلًا من التعلّم. طبقة الالتفاف تحصر السعة على ما يهمّ، وهو التحسّس المحلّي، فتتعلّم من صور أقلّ بكثير ممّا تحتاجه الطبقة الكثيفة. وهذا سرّ نجاح CNN على CIFAR-10 قبل أن يصير المجال هوسًا بالحجم.
أوّل شبكة على CIFAR-10
نجمع القِطع في نموذج تجريبي، مُدخِلًا التنشيط ReLU الذي رأيناه في الدورة 07:
import tensorflow as tf
from tensorflow.keras import layers, models
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
modele = models.Sequential([
layers.Input(shape=(32, 32, 3)),
layers.Conv2D(16, 3, activation="relu"),
layers.Conv2D(32, 3, activation="relu"),
layers.Flatten(),
layers.Dense(10, activation="softmax"),
])
modele.compile(
optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"],
)
modele.summary()
هذه شبكة صغيرة عن قصد؛ فهي تفتقر إلى التجميع (الوحدة 3) وإلى معمارية معقولة (الوحدات 4 و5 و6). لكنّها كافية للحصول على 65 % من الدقّة على CIFAR-10، أي أعلى بكثير من طبقة كثيفة بحجم مماثل. سنبني بقيّة هذه الدورة على هذا الأساس، ونُلاحق كلّ نقطة مئوية على حدة.
تتوقّع Keras الشكل (N, H, W, C): أي رقم الدفعة، ثم الارتفاع، ثم العرض، ثم القنوات في الأخير. PyTorch يعكس ذلك ويستخدم (N, C, H, W). أخطاء الأبعاد الأولى في نقل شيفرة بين الإطارَين نابعة من هذا الاختلاف. تحقّق دائمًا من الشكل عبر x.shape قبل تمرير أوّل دفعة.
في الخلاصة
- الالتفاف ليس إلّا جداء نقطي متكرّر بين نافذة صغيرة من الأوزان والصورة، ويقيس تشابهًا محلّيًا يُنتج خريطة ميزات.
- مرشّحات Sobel المصمَّمة يدويًا تُظهر أنّ أوزانًا قليلة قادرة على استخراج معلومة قيّمة كالحواف؛ والشبكة تكتشف مرشّحات مماثلة تلقائيًا في طبقتها الأولى.
- مشاركة الأوزان تُنتج ثباتًا تقريبيًا للانزياح وتُبقي عدد المعاملات ثابتًا مع حجم الصورة، وهي أساس نجاح CNN.
- عدد معاملات طبقة التفاف بستّة عشر مرشّحًا 3×3 يبلغ 448 معاملًا على CIFAR-10 ، مقابل 49168 لطبقة كثيفة بستّة عشر عصبونًا: أقلّ بمئة مرّة وأكثر ملاءمة للصور.
الوحدة التالية: الخطوة والحشو والمجال الاستقبالي، حيث نتعلّم كيف نتحكّم بحجم الخرج وحدود الرؤية العالمية للشبكة.