الشبكات العصبية — الانتشار الأمامي والخلفي
“مقربات عالمية مبنية على منطق العتبة، محسّنة بالحساب التفاضلي”
من المدرك الحسي الواحد إلى الشبكات متعددة الطبقات: المرور الأمامي ودوال التنشيط والانتشار العكسي والتدرجات المتلاشية واستراتيجيات تهيئة الأوزان.
المتطلبات الأساسية
المفاهيم المغطاة
∑الصيغ الرئيسية
المرور الأمامي
التحويل الخطي في الطبقة l — z = Wa + b
التنشيط
تنشيط غير خطي مُطبَّق عنصراً بعنصر — يمنح الشبكة قدرتها التعبيرية
دلتا الانتشار الخلفي
إشارة الخطأ المنتشرة للخلف عبر الطبقة l — ضرب هادامار مع مشتقة التنشيط
تدرج الوزن
تدرج الخسارة بالنسبة لأوزان الطبقة l — يُستخدم لتحديث SGD/Adam
▶محاكاة تفاعلية
⬡هندسة النموذج
نظرية التقريب الشامل
أثبت سيبينكو (1989) أن طبقة خفية واحدة بعدد كافٍ من الخلايا العصبية يمكنها تقريب أي دالة مستمرة بأي دقة. لكن 'كافٍ' قد يعني مليارات الخلايا للدوال المعقدة. الشبكات العميقة (طبقات عديدة، خلايا أقل لكل طبقة) تحقق نفس التقريب بمعاملات أقل أسياً — إنها تتعلم تمثيلات هرمية.
شبكة عميقة بـL طبقة وn خلية لكل طبقة يمكنها تمثيل دوال تتطلب O(2ⁿ) خلية في شبكة أحادية الطبقة. العمق هو ضغط.
ما تحسبه الخلايا العصبية فعلاً
كل خلية عصبية تحسب مجموعاً موزوناً لمدخلاتها (مستوٍ فائق)، ثم تُطبّق عدم الخطية. خلية واحدة بسيغمويد تُنشئ حداً للقرار ناعماً. خلايا متعددة في طبقة تُنشئ مستويات فائقة متعددة. الطبقات العميقة تُركّب هذه المستويات، مُنشِئةً حدوداً للقرار أكثر تعقيداً — منحنيات، ثم منحنيات للمنحنيات، ثم متعددات.
الانتشار الخلفي: قاعدة السلسلة على نطاق واسع
التدريب يتطلب حساب ∂L/∂W لكل وزن. الحساب المباشر غير ممكن — شبكة بـ100M معامل ستحتاج 100M تمرير أمامي منفصل. الانتشار الخلفي يستغل قاعدة السلسلة لحساب جميع التدرجات في تمرير خلفي واحد، بنفس تكلفة التمرير الأمامي. هذه الخوارزمية هي التي جعلت التعلم العميق ممكناً.
مشكلة اختفاء التدرج
أثناء الانتشار الخلفي، تُضرب التدرجات في كل طبقة. للسيغمويد، σ'(z) ≤ 0.25 في كل مكان. بعد 10 طبقات، التدرج مضروب بـ0.25¹⁰ ≈ 0.000001. يختفي التدرج أساساً — الطبقات الأولى تتوقف عن التعلم. ReLU يُصلح هذا: مشتقته 1 لـz > 0، فالتدرجات لا تتقلص.
حلقة تدريب SGD بالدُفعات الصغيرة
تهيئة الأوزان: He init لـReLU (W ~ N(0, √(2/fan_in)))
لكل حقبة، خلط بيانات التدريب
لكل دُفعة صغيرة من الحجم B:
التمرير الأمامي: حساب التنشيطات a[1]...a[L] والخسارة L
التمرير الخلفي: حساب δ[L] ثم الانتشار للخلف
التحديث: W[l] ← W[l] - α · ∂L/∂W[l]
التحديث: b[l] ← b[l] - α · ∂L/∂b[l]
تطبيق جدول معدل التعلم
PyTorch: البناء والتدريب
import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import TensorDataset, DataLoader class="tok-comment"># ── Sample dataloader ────────────────────────────────────────────────── X_data = torch.randn(class="tok-num">1000, class="tok-num">128) y_data = torch.randint(class="tok-num">0, class="tok-num">2, (class="tok-num">1000,)).float() dataloader = DataLoader(TensorDataset(X_data, y_data), batch_size=class="tok-num">64, shuffle=True) class MLP(nn.Module): def __init__(self, input_dim, hidden_dims, output_dim, dropout=class="tok-num">0.3): super().__init__() layers = [] dims = [input_dim] + hidden_dims for i in range(len(hidden_dims)): layers += [ nn.Linear(dims[i], dims[i+class="tok-num">1]), nn.BatchNorm1d(dims[i+class="tok-num">1]), nn.ReLU(), nn.Dropout(dropout) ] layers.append(nn.Linear(hidden_dims[-class="tok-num">1], output_dim)) self.net = nn.Sequential(*layers) def forward(self, x): return self.net(x) model = MLP(input_dim=class="tok-num">128, hidden_dims=[class="tok-num">256, class="tok-num">128, class="tok-num">64], output_dim=class="tok-num">1) optimizer = optim.AdamW(model.parameters(), lr=class="tok-num">1e-3, weight_decay=class="tok-num">1e-4) scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=class="tok-num">100) class="tok-comment"># Training step for x_batch, y_batch in dataloader: optimizer.zero_grad() logits = model(x_batch).squeeze() loss = nn.BCEWithLogitsLoss()(logits, y_batch.float()) loss.backward() nn.utils.clip_grad_norm_(model.parameters(), class="tok-num">1.0) optimizer.step() scheduler.step()
المزالق الحرجة
خلايا ReLU الميتة: إذا كانت أوزان الخلية تدفع z < 0 لجميع المدخلات، فلن تنشط أبداً. استخدم LeakyReLU أو التهيئة الصحيحة لـHe.
الانفجار التدرجي: clip_grad_norm_(model.parameters(), 1.0) يجب أن يكون دائماً في حلقة التدريب.
بدون BatchNorm: يجعل التحول في التباين الشبكات العميقة غير مستقرة. دائماً BatchNorm بين الطبقات الخطية وطبقات التنشيط.
معدل التعلم: مرتفع جداً → تتباعد الخسارة؛ منخفض جداً → يستغرق التدريب وقتاً أطول 100×. استخدم lr_find أو ابدأ بـ1e-3 مع AdamW.
?اختبار المعرفة
يتم حفظ التقدم في متصفحك — لا حاجة لحساب.