Convolution
تُمرّر عملية الالتفاف نواة صغيرة من الأوزان عبر المدخلات لإنتاج خريطة سمات، وهي العملية الأساسية في الشبكات العصبية الالتفافية (CNNs). يتناول هذا الموضوع الخطوة والحشو والأنواع المختلفة.
الالتفاف هو عملية تمرير شبكة صغيرة من الأوزان، تُسمى نواة أو مرشحًا، عبر المُدخل وحساب مجموع موزون عند كل موضع. في الرؤية الحاسوبية (CV)، يكون المُدخل صورة أو مجموعة من خرائط الميزات، وتُنتج كل نواة خريطة خرج تكون قيمها مرتفعة حيثما يظهر نمطها: حافة عمودية أو رقعة نسيج أو، في طبقات أعمق من الشبكة، جزء من عجلة أو وجه. لطالما استُخدمت النوى المصممة يدويًا في معالجة الصور للتمويه والتوضيح واكتشاف الحواف. وفي الشبكة العصبية الالتفافية (CNN)، تكون قيم النواة أوزان النموذج التي يتعلمها أثناء التدريب، وبذلك تكتشف الشبكة بنفسها كواشف الميزات.
آلية عمل الالتفاف#
في كل موضع، توضع النواة فوق رقعة من المُدخل، ويُضرب كل وزن من أوزانها في قيمة المُدخل الواقعة تحته، ثم تُجمع النواتج مع انحياز لتكوين قيمة خرج واحدة. ويؤدي تحريك النواة على كامل الارتفاع والعرض إلى إنتاج خريطة خرج ثنائية الأبعاد. تتضمن المُدخلات الحقيقية قنوات عدة، مثل قنوات الأحمر والأخضر والأزرق في الصورة، لذا تمتد كل نواة على جميع قنوات المُدخل: فالنواة بحجم 3×3 على مُدخل ذي 64 قناة تحتوي على 3 × 3 × 64 = 576 وزنًا، ومع ذلك تنتج قناة خرج واحدة. وتطبّق طبقة الالتفاف نوى كثيرة من هذا النوع، ويحدد عدد النوى عدد قنوات الخرج؛ لذا فإن طبقة تحوّل 64 قناة إلى 128 قناة باستخدام نوى 3×3 تحتوي على 3 × 3 × 64 × 128 = 73,728 وزنًا.
تُعاد الاستعانة بالنواة نفسها في كل موضع، ولهذا تحتاج طبقات الالتفاف إلى معلمات أقل بكثير من الطبقات كاملة الاتصال، ولهذا أيضًا يُتعرّف على النمط الذي تعلّمته الشبكة في أحد أركان الصورة في كل موضع آخر. ويؤدي إزاحة المُدخل إلى إزاحة الخرج بالمقدار نفسه، وهي خاصية تُسمى التكافؤ الانتقالي. وتعتمد كل قيمة خرج على جوار صغير فقط من المُدخل، بينما يؤدي تكديس الطبقات إلى توسيع المجال الاستقبالي الذي تلخّصه قيمة الخرج العميقة، من بضعة بكسلات إلى معظم الصورة.
تحسب مكتبات التعلّم العميق في الواقع الترابط المتبادل: فالالتفاف الرياضي يقلب النواة قبل تمريرها، لكن Conv2d في PyTorch لا يفعل ذلك. ولأن النواة متعلَّمة، تتعلم الشبكة ببساطة الأوزان المقلوبة، ويمكن التبادل بين العمليتين عمليًا. وعادةً ما تعيد مكتبات GPU مثل cuDNN صياغة الالتفاف على هيئة ضرب مصفوفي كبير، أو تستخدم خوارزميات Winograd أو FFT التي تحسب النتيجة نفسها بسرعة أكبر من تمرير النواة حرفيًا.
الخطوة والحشو والتمدد والمجموعات#
تتحكم أربع معلمات فائقة في شكل خرج الالتفاف وكلفة حسابه:
- الخطوة: المسافة بين مواضع النواة. تتجاوز الخطوة 2 كل موضع ثانٍ وتخفض ارتفاع الخرج وعرضه إلى النصف، وهي الطريقة التي تستخدمها كثير من شبكات CNN الحديثة لتقليل الأبعاد.
- الحشو: قيم إضافية، تكون عادةً أصفارًا، تُضاف حول حدود المُدخل. ويحافظ الحشو بمقدار 1 على حجم خرج التفاف 3×3 مساويًا لحجم مُدخله عند الخطوة 1.
- التمدد: يباعد بين نقاط النواة، لذا تغطي نواة 3×3 ذات تمدد 2 مساحة 5×5 باستخدام الأوزان التسعة نفسها، ما يوسّع المجال الاستقبالي دون كلفة إضافية.
- المجموعات: تقسّم القنوات إلى مجموعات مستقلة. وعند تخصيص مجموعة لكل قناة، يرشّح الالتفاف العميق كل قناة على حدة، ثم يخلط التفاف نقطي تالٍ بحجم 1×1 القنوات؛ ويُسمى هذا الزوج التفافًا فاصلًا عميقًا، وقد أشاعت MobileNets استخدامه في العتاد المحمول.
لمُدخل حجمه n، وحجم نواة k، وحشو p، وخطوة s، وتمدد d، يكون حجم الخرج ⌊(n + 2p − d(k − 1) − 1) / s⌋ + 1. يطبّق المقتطف أدناه أربع طبقات، تحوّل كل منها خريطة ميزات ذات 64 قناة وحجم 80×80 إلى 128 قناة:
import torch
from torch import nn
x = torch.randn(1, 64, 80, 80) # a 64-channel, 80x80 feature map
# Four ways to map 64 input channels to 128 output channels
layers = {
"standard 3x3": nn.Conv2d(64, 128, kernel_size=3, padding=1, bias=False),
"stride 2": nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1, bias=False),
"dilation 2": nn.Conv2d(64, 128, kernel_size=3, padding=2, dilation=2, bias=False),
"depthwise separable": nn.Sequential(
nn.Conv2d(64, 64, kernel_size=3, padding=1, groups=64, bias=False), # one 3x3 filter per channel
nn.Conv2d(64, 128, kernel_size=1, bias=False), # 1x1 convolution mixes channels
),
}
for name, layer in layers.items():
params = sum(p.numel() for p in layer.parameters())
print(f"{name}: output {tuple(layer(x).shape)}, {params:,} weights")تُخرج الطبقة القياسية (1, 128, 80, 80) باستخدام 73,728 وزنًا. وتخفض الخطوة 2 الخرج إلى النصف ليصبح (1, 128, 40, 40) باستخدام الأوزان نفسها، بينما يحافظ التمدد 2 على الحجم 80×80 و73,728 وزنًا، مع رؤية كل خرج مساحة 5×5. وينتج زوج الالتفاف الفاصل العميق الخرج (1, 128, 80, 80) نفسه باستخدام 8,768 وزنًا فقط، أي أقل بنحو 8.4 مرات. ويستخدم YOLO26 الفكرتين: إذ تقلّص خمسة التفافات 3×3 بخطوة 2 صورة 640×640 إلى شبكة 20×20 لخريطة الميزات الأعمق في العمود الفقري، كما يزاوج فرع التصنيف في رأس الكشف بين التفاف عميق 3×3 والتفاف نقطي 1×1 لتقليل الحسابات.
الالتفاف في أبعاد أخرى#
- التفاف أحادي البعد: يتحرك على محور واحد، لمعالجة الموجات الصوتية وإشارات المستشعرات والسلاسل الزمنية.
- التفاف ثلاثي الأبعاد: يضيف محورًا للعمق أو الزمن، لمعالجة مقاطع الفيديو والتصوير الحجمي مثل التصوير المقطعي المحوسب والتصوير بالرنين المغناطيسي في تحليل الصور الطبية.
- الالتفاف المنقول: يوزّع كل قيمة مُدخل على خرج أكبر، لرفع دقة خرائط الميزات في نماذج التقسيم مثل U-Net. ويعيد الحجم المكاني الذي قلّصه الالتفاف ذو الخطوة، باستخدام أوزانه المتعلَّمة الخاصة.
الالتفاف والعمليات ذات الصلة#
- طبقة كاملة الاتصال: تربط كل مُدخل بكل خرج باستخدام وزن خاص به. والالتفاف طبقة كاملة الاتصال مقيّدة بأجوَار محلية، مع مشاركة الأوزان عبر المواضع.
- التجميع: يمرر نافذة كما يفعل الالتفاف، لكنه يطبّق قاعدة ثابتة، مثل أخذ القيمة العظمى، دون أوزان متعلَّمة.
- الانتباه الذاتي: يحسب أوزانًا تعتمد على البيانات بين كل زوج من المواضع، بحيث يربط الأجزاء المتباعدة من الصورة في طبقة واحدة. ويطبّق الالتفاف النواة الثابتة نفسها في كل موضع، ولا يرى سوى نافذة محلية، ما يجعل كلفته خطية في عدد البكسلات.
- ترشيح الصور: المرشحات التقليدية، مثل التمويه الغاوسي وكاشف الحواف Sobel، هي التفافات ذات نوى ثابتة مصممة يدويًا. كما تحسب
filter2Dفي OpenCV الترابط، بما يتوافق مع مكتبات التعلّم العميق، ويحوّل قلب النواة العملية إلى التفاف حقيقي.










