الشبكة العصبية الأساسية — التعلم العميق
الشبكة العصبية الأساسية
العصبون الواحد
z = w₁x₁ + w₂x₂ + ... + wₙxₙ + b (مجموع موزون + انحياز)
a = f(z) (دالة تنشيط)- الأوزان w: أهمية كل مدخل (موجبة تدفع للأعلى، سالبة للأسفل).
- الانحياز b: يزيح النتيجة؛ بدونه يضطر العصبون للمرور بنقطة الصفر.
- التنشيط f: دالة غير خطية (الدرس التالي).
التدريب كله = إيجاد قيم جيدة للأوزان والانحيازات.
import numpy as np
x = np.array([0.5, 0.8, 0.2]) # ثلاث ميزات
w = np.array([0.4, -0.6, 0.9])
b = 0.1
z = x @ w + b # @ = الضرب النقطي
a = max(0.0, z) # ReLU
print(round(float(z), 3), round(float(a), 3))الطبقة = عصبونات كثيرة بالتوازي
طبقة كثيفة (Dense) من 4 عصبونات على 3 مدخلات = مصفوفة أوزان 3×4 ومتجه انحيازات بطول 4. ولدفعة من العينات دفعة واحدة:
A = f(X · W + b)
X: (عينات × مدخلات) W: (مدخلات × عصبونات) A: (عينات × عصبونات)import numpy as np
rng = np.random.default_rng(0)
X = rng.normal(size=(5, 3)) # 5 عينات، 3 ميزات
W1, b1 = rng.normal(size=(3, 4)) * 0.5, np.zeros(4)
W2, b2 = rng.normal(size=(4, 2)) * 0.5, np.zeros(2)
H = np.maximum(0, X @ W1 + b1) # طبقة مخفية + ReLU
out = H @ W2 + b2 # طبقة المخرج
print(H.shape, out.shape) # (5, 4) (5, 2)هذا هو التمرير الأمامي (forward pass) كاملاً: ضرب مصفوفات ودوال تنشيط، طبقة بعد طبقة. Keras يفعل الشيء نفسه، أسرع وعلى GPU.
أنواع الطبقات حسب الموقع
| الطبقة | الدور |
|---|---|
| المدخلات | شكل البيانات (784 بكسلاً لصورة 28×28 مسطحة) — بلا أوزان |
| المخفية | تتعلم التمثيلات الوسيطة |
| المخرج | حجمها وتنشيطها حسب المهمة: 1 + sigmoid للثنائي، N + softmax لـ N فئات، 1 بلا تنشيط للانحدار |
عدّ المعاملات
طبقة Dense: (عدد المدخلات × عدد العصبونات) + عدد العصبونات
- 784 ← 128: 784×128 + 128 = 100,480
- 128 ← 64: 128×64 + 64 = 8,256
- 64 ← 10: 64×10 + 10 = 650
المجموع 109,386 معاملاً — يطابق model.summary() في المثال الكامل. المعاملات الكثيرة مع بيانات قليلة = خطر الحفظ.
العمق مقابل العرض
- أعرض (عصبونات أكثر في الطبقة): قدرة أكبر في نفس المستوى.
- أعمق (طبقات أكثر): تمثيلات متدرجة أكثر تجريداً، وغالباً أكفأ بنفس عدد المعاملات.
ابدأ صغيراً ووسّع فقط إذا كان النموذج يعاني Underfitting.
تمرين
احسب يدوياً عدد معاملات شبكة 20 ← 32 ← 16 ← 3، ثم تحقق بإنشاء مصفوفات NumPy بالأشكال المناسبة وجمع أحجامها.
import tensorflow as tf
from tensorflow import keras
# ===== بناء شبكة بسيطة =====
model = keras.Sequential([
# Input layer: 784 ميزة (صورة 28×28)
keras.layers.Input(shape=(784,)),
# Hidden layer 1: 128 عصبون
keras.layers.Dense(128, activation='relu'),
# Hidden layer 2: 64 عصبون
keras.layers.Dense(64, activation='relu'),
# Output layer: 10 أصناف
keras.layers.Dense(10, activation='softmax')
])
# ملخص الشبكة
model.summary()
# ===== فهم المعاملات =====
# Dense(128) مع input 784:
# Weights: 784 × 128 = 100,352
# Biases: 128
# Total: 100,480 معامل
# Dense(64) مع input 128:
# Weights: 128 × 64 = 8,192
# Biases: 64
# Total: 8,256 معامل
print(f"إجمالي المعاملات: {model.count_params():,}")اختبر فهمك