Batch Normalization
توحّد تسوية الدفعات كل قناة عبر دفعة مصغّرة، ثم تعيد تحجيمها باستخدام معلمات متعلّمة. الرياضيات وسلوك الاستدلال والحدود.
تطبيع الدفعات، أو BatchNorm، طبقة في شبكة عصبية، وتطبّع الطبقة كل قناة من قنوات مُدخلها استنادًا إلى متوسط الدفعة المصغّرة الحالية وتباينها، ثم تعيد تحجيم النتيجة باستخدام معلمتين قابلتين للتعلّم. وقد قدّمه عام 2015 سيرغي إيوفي وكريستيان سيغيدي، ومكّن BatchNorm مصنّف الصور Inception الخاص بهما من بلوغ الدقة نفسها باستخدام عدد من خطوات التدريب أقل بـ14 مرة. يتيح BatchNorm استخدام معدلات تعلّم أعلى، ويجعل التدريب أقل حساسية لتهيئة الأوزان، وأصبح مكوّنًا قياسيًا في الشبكات العصبية الالتفافية (CNNs) مثل ResNet.
آلية عمل تطبيع الدُفعات#
في الطبقة الالتفافية، يحسب BatchNorm متوسطًا واحدًا μ وتباينًا واحدًا σ² لكل قناة، مع التجميع على كل صورة في الدفعة وكل موضع مكاني. ثم يمر كل تنشيط x بخطوتين:
- التطبيع: x̂ = (x − μ) / √(σ² + ε)، حيث تمنع ε الصغيرة، وقيمتها الافتراضية 1e-5 في PyTorch، القسمة على صفر.
- التحجيم والإزاحة: y = γ·x̂ + β، حيث تُتعلّم γ وβ لكل قناة. وتتيحان للشبكة استعادة أي متوسط وانتشار يناسبان الطبقة التالية، بما في ذلك إلغاء التطبيع بالكامل.
يوضع BatchNorm عادةً بين طبقة التفاف ودالة التنشيط الخاصة بها. وبما أن β تضيف بالفعل إزاحة لكل قناة، فإن انحياز طبقة الالتفاف السابقة زائد عن الحاجة ويُعطّل عادةً.
التدريب مقابل الاستدلال#
أثناء التدريب، يحدّث كل تمرير أمامي أيضًا متوسطًا متحركًا وتباينًا متحركًا باستخدام المتوسطات المتحركة الأسية لإحصاءات الدفعة. وتحرّك BatchNorm2d في PyTorch هذه القيم افتراضيًا بنسبة 10% نحو كل دفعة جديدة (momentum=0.1). وفي الاستدلال، تطبّع الطبقة باستخدام هذه المتوسطات المتحركة بدلًا من ذلك، لذا لا يعود التنبؤ لصورة واحدة معتمدًا على الصور الأخرى التي تشاركها الدفعة. يبدّل model.train() وmodel.eval() بين السلوكين:
import torch
torch.manual_seed(0)
bn = torch.nn.BatchNorm2d(num_features=3)
# A batch of 8 three-channel feature maps with mean 5 and standard deviation 2
x = 5 + 2 * torch.randn(8, 3, 16, 16)
# Training mode normalizes with this batch's per-channel mean and variance
out = bn(x)
print(f"train mode: output mean {out.mean():.3f}, std {out.std():.3f}")
# The same call nudges the running averages 10% of the way toward the batch statistics
print(f"running mean {bn.running_mean[0]:.3f}, running var {bn.running_var[0]:.3f}")
# Eval mode normalizes with the running averages instead of the batch statistics
bn.eval()
out = bn(x)
print(f"eval mode: output mean {out.mean():.3f}, std {out.std():.3f}")في وضع التدريب، يكون متوسط الخرج 0.000 وانحرافه المعياري 1.000، رغم أن متوسط الإدخال 5. وبعد دفعة واحدة، لا يتحرك المتوسط المتحرك إلا من 0 إلى 0.496، والتباين المتحرك من 1 إلى 1.294، لذا ينتج وضع التقييم مخرجات بمتوسط 3.920. تحتاج المتوسطات المتحركة إلى بضع عشرات من الدفعات حتى تتقارب، ويحقق النموذج الذي يُقيّم في الوضع الخطأ، أو قبل استقرار إحصاءاته، نتيجة تقل كثيرًا عن دقته الحقيقية.
في الاستدلال، يكون BatchNorm تحويلًا خطيًا ثابتًا لكل قناة، لذا يمكن دمجه في طبقة الالتفاف السابقة: تُضرب أوزان الالتفاف في γ/√(σ² + ε)، ويصبح الانحياز β − γμ/√(σ² + ε). وتتألف كتلة الالتفاف القياسية في YOLO26 من طبقة التفاف بلا انحياز تليها BatchNorm ودالة تنشيط SiLU، وتدمج Ultralytics كل طبقات BatchNorm هذه في طبقة الالتفاف الخاصة بها قبل التنبؤ والتصدير، ما يزيل الطبقة مع الحفاظ على المخرجات نفسها.
لماذا يفيد تطبيع الدفعات#
عزت الورقة البحثية الأصلية فائدة BatchNorm إلى الحد من تحول التغاير الداخلي، أي تغير توزيع مدخلات كل طبقة مع تحديث الطبقات السابقة. ووجدت تجارب لاحقة أضافت تحولات توزيع عشوائية بعد طبقات BatchNorm أن التدريب لم يتأثر إلا قليلًا، وأرجعت الفائدة إلى سطح خسارة أكثر سلاسة بتدرجات يمكن التنبؤ بها، ما يتيح لـالمحسّن اتخاذ خطوات أكبر وأكثر استقرارًا. كما أن إبقاء التنشيطات السابقة للتنشيط قرب متوسط صفري وتباين وحدوي يمنع دوال التنشيط المشبعة من دخول مناطقها المسطحة، ما يساعد على الحد من تلاشي التدرجات.
ولأن كل مثال يُطبّع بإحصاءات دفعة مسحوبة عشوائيًا، يضيف BatchNorm أيضًا ضوضاء تعمل بمثابة منظّم خفيف، وأفادت الورقة البحثية الأصلية بأنه قد يلغي الحاجة إلى الإسقاط في بعض الحالات.
القيود#
- الدفعات الصغيرة: تصبح إحصاءات الدفعة مشوشة عندما يحتوي كل جهاز على عدد قليل من الصور. وعند استخدام صورتين لكل GPU، حقق تطبيع المجموعات، الذي يحسب الإحصاءات عبر مجموعات القنوات داخل كل صورة، خطأً أقل بنسبة 10.6% على ImageNet مقارنةً بـBatchNorm في ResNet-50.
- التدريب باستخدام وحدات GPU متعددة: تطبّع كل وحدة GPU باستخدام حصتها من الدفعة ما لم تُحوّل الطبقات إلى SyncBatchNorm، الذي يجمع الإحصاءات عبر الأجهزة مقابل تكلفة اتصال إضافي.
- نماذج التسلسل: لا تلائم التسلسلات ذات الأطوال المتغيرة والإحصاءات المعتمدة على الدفعة هذا الاستخدام جيدًا، لذا تستخدم المحوّلات تطبيع الطبقات بدلًا من ذلك.
تطبيع الدفعات ومصطلحات ذات صلة#
- تطبيع البيانات: يعيد تحجيم المدخلات الخام مرة واحدة أثناء المعالجة المسبقة، مثل قسمة قيم البكسل على 255. أما BatchNorm فيطبّع التنشيطات الوسيطة في كل طبقة وفي كل خطوة تدريب.
- تطبيع الطبقات: يطبّع كل مثال عبر سماته الخاصة، لذا يتصرف بالطريقة نفسها في التدريب والاستدلال ولا يعتمد على حجم الدفعة. ويشيع RMSNorm، وهو شكل أبسط لا يطرح المتوسط، في نماذج اللغة الكبيرة.
- تطبيع المجموعات: يقسم قنوات كل صورة إلى مجموعات ويطبّع داخل كل مجموعة، وهو ما يناسب نماذج الكشف والتقسيم المُدرّبة باستخدام دفعات صغيرة.
- تطبيع المثيلات: يطبّع كل قناة من كل صورة على حدة، فيزيل التباين الخاص بكل صورة. وقد أدى استبدال BatchNorm بتطبيع المثيلات، أثناء التدريب والاختبار، إلى تحسين ملحوظ لجودة نقل الأسلوب العصبي السريع.










