ML Learning Hub
التعلم العميقمتوسط

الشبكات العصبية — الانتشار الأمامي والخلفي

مقربات عالمية مبنية على منطق العتبة، محسّنة بالحساب التفاضلي

من المدرك الحسي الواحد إلى الشبكات متعددة الطبقات: المرور الأمامي ودوال التنشيط والانتشار العكسي والتدرجات المتلاشية واستراتيجيات تهيئة الأوزان.

60 min
10 مخططات
6 المفاهيم المغطاة

المتطلبات الأساسية

Linear Algebra
Calculus & Optimization
Logistic Regression

المفاهيم المغطاة

PerceptronBackpropagationReLUVanishing GradientWeight InitializationChain Rule

الصيغ الرئيسية

المرور الأمامي

التحويل الخطي في الطبقة l — z = Wa + b

التنشيط

تنشيط غير خطي مُطبَّق عنصراً بعنصر — يمنح الشبكة قدرتها التعبيرية

دلتا الانتشار الخلفي

إشارة الخطأ المنتشرة للخلف عبر الطبقة l — ضرب هادامار مع مشتقة التنشيط

تدرج الوزن

تدرج الخسارة بالنسبة لأوزان الطبقة l — يُستخدم لتحديث SGD/Adam

محاكاة تفاعلية

Loading visualization…
Loading visualization…

هندسة النموذج

Loading visualization…
🎯

نظرية التقريب الشامل

motivation

أثبت سيبينكو (1989) أن طبقة خفية واحدة بعدد كافٍ من الخلايا العصبية يمكنها تقريب أي دالة مستمرة بأي دقة. لكن 'كافٍ' قد يعني مليارات الخلايا للدوال المعقدة. الشبكات العميقة (طبقات عديدة، خلايا أقل لكل طبقة) تحقق نفس التقريب بمعاملات أقل أسياً — إنها تتعلم تمثيلات هرمية.

شبكة عميقة بـL طبقة وn خلية لكل طبقة يمكنها تمثيل دوال تتطلب O(2ⁿ) خلية في شبكة أحادية الطبقة. العمق هو ضغط.

💡

ما تحسبه الخلايا العصبية فعلاً

intuition

كل خلية عصبية تحسب مجموعاً موزوناً لمدخلاتها (مستوٍ فائق)، ثم تُطبّق عدم الخطية. خلية واحدة بسيغمويد تُنشئ حداً للقرار ناعماً. خلايا متعددة في طبقة تُنشئ مستويات فائقة متعددة. الطبقات العميقة تُركّب هذه المستويات، مُنشِئةً حدوداً للقرار أكثر تعقيداً — منحنيات، ثم منحنيات للمنحنيات، ثم متعددات.

الانتشار الخلفي: قاعدة السلسلة على نطاق واسع

math

التدريب يتطلب حساب ∂L/∂W لكل وزن. الحساب المباشر غير ممكن — شبكة بـ100M معامل ستحتاج 100M تمرير أمامي منفصل. الانتشار الخلفي يستغل قاعدة السلسلة لحساب جميع التدرجات في تمرير خلفي واحد، بنفس تكلفة التمرير الأمامي. هذه الخوارزمية هي التي جعلت التعلم العميق ممكناً.

قاعدة السلسلة مُطبَّقة على وزن واحد
🔬

مشكلة اختفاء التدرج

deepdive

أثناء الانتشار الخلفي، تُضرب التدرجات في كل طبقة. للسيغمويد، σ'(z) ≤ 0.25 في كل مكان. بعد 10 طبقات، التدرج مضروب بـ0.25¹⁰ ≈ 0.000001. يختفي التدرج أساساً — الطبقات الأولى تتوقف عن التعلم. ReLU يُصلح هذا: مشتقته 1 لـz > 0، فالتدرجات لا تتقلص.

ReLU ومشتقها (تحل مشكلة اختفاء التدرج)
⚙️

حلقة تدريب SGD بالدُفعات الصغيرة

algorithm
1

تهيئة الأوزان: He init لـReLU (W ~ N(0, √(2/fan_in)))

2

لكل حقبة، خلط بيانات التدريب

3

لكل دُفعة صغيرة من الحجم B:

التمرير الأمامي: حساب التنشيطات a[1]...a[L] والخسارة L

التمرير الخلفي: حساب δ[L] ثم الانتشار للخلف

التحديث: W[l] ← W[l] - α · ∂L/∂W[l]

التحديث: b[l] ← b[l] - α · ∂L/∂b[l]

8

تطبيق جدول معدل التعلم

</>

PyTorch: البناء والتدريب

code
python41 lines
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()
⚠️

المزالق الحرجة

pitfall
1

خلايا ReLU الميتة: إذا كانت أوزان الخلية تدفع z < 0 لجميع المدخلات، فلن تنشط أبداً. استخدم LeakyReLU أو التهيئة الصحيحة لـHe.

2

الانفجار التدرجي: clip_grad_norm_(model.parameters(), 1.0) يجب أن يكون دائماً في حلقة التدريب.

3

بدون BatchNorm: يجعل التحول في التباين الشبكات العميقة غير مستقرة. دائماً BatchNorm بين الطبقات الخطية وطبقات التنشيط.

4

معدل التعلم: مرتفع جداً → تتباعد الخسارة؛ منخفض جداً → يستغرق التدريب وقتاً أطول 100×. استخدم lr_find أو ابدأ بـ1e-3 مع AdamW.

?اختبار المعرفة

يتم حفظ التقدم في متصفحك — لا حاجة لحساب.

تحتاج مهندس ذكاء اصطناعي أو عالم بيانات؟

أبني نماذج تعلم آلي مخصصة، ووكلاء ذكاء اصطناعي، ورؤية حاسوب، وأتمتة — من الفكرة إلى الإنتاج.