ساخت شبکه عصبی ساده با پایتون: گامی به سوی علم داده و یادگیری ماشین
شبکههای عصبی، هسته اصلی بسیاری از پیشرفتهای اخیر در حوزه هوش مصنوعی و یادگیری ماشین هستند. درک اصول اولیه این شبکهها برای هر کسی که به علم داده علاقهمند است، ضروری است. این مقاله به شما کمک میکند تا با استفاده از پایتون، یک شبکه عصبی ساده را از ابتدا بسازید و نحوه عملکرد آن را درک کنید. هدف این آموزش، ارائه یک درک شهودی از مفاهیم کلیدی است، نه ارائه یک کتابخانه پیچیده.
مقدمه ای بر شبکه های عصبی
شبکههای عصبی از ساختار مغز انسان الهام گرفته شدهاند. آنها از مجموعهای از گرههای متصل به هم (نورونها) تشکیل شدهاند که اطلاعات را پردازش و منتقل میکنند. هر اتصال بین نورونها دارای یک وزن است که قدرت آن اتصال را تعیین میکند. شبکههای عصبی با تنظیم این وزنها، یاد میگیرند تا وظایف مختلفی را انجام دهند، مانند تشخیص الگو، طبقهبندی دادهها و پیشبینی مقادیر.
اجزای اصلی یک شبکه عصبی
- نورون (Node): واحد پایه پردازش اطلاعات در شبکه عصبی.
- وزن (Weight): پارامتری که قدرت اتصال بین نورونها را تعیین میکند.
- بایاس (Bias): یک مقدار ثابت که به خروجی نورون اضافه میشود و به شبکه اجازه میدهد تا الگوها را بهتر یاد بگیرد.
- تابع فعالسازی (Activation Function): تابعی که خروجی نورون را تعیین میکند.
- لایه (Layer): مجموعهای از نورونها که به صورت موازی عمل میکنند.
ساخت شبکه عصبی با پایتون
در این بخش، یک شبکه عصبی ساده با یک لایه ورودی، یک لایه پنهان و یک لایه خروجی را با استفاده از پایتون پیادهسازی خواهیم کرد. این شبکه برای حل یک مسئله ساده، یعنی XOR (Exclusive OR) استفاده خواهد شد.
مراحل ساخت
- تعریف ساختار شبکه: تعداد نورونها در هر لایه و تابع فعالسازی را مشخص میکنیم.
- مقداردهی اولیه وزنها و بایاسها: وزنها و بایاسها را با مقادیر تصادفی مقداردهی اولیه میکنیم.
- انتشار رو به جلو (Forward Propagation): دادهها را از لایه ورودی به لایه خروجی منتقل میکنیم و خروجی شبکه را محاسبه میکنیم.
- محاسبه خطا (Error Calculation): تفاوت بین خروجی پیشبینی شده و خروجی واقعی را محاسبه میکنیم.
- انتشار به عقب (Backpropagation): خطا را از لایه خروجی به لایه ورودی منتشر میکنیم و وزنها و بایاسها را بر اساس خطا تنظیم میکنیم.
- تکرار مراحل 3 تا 5: این مراحل را برای چندین دوره تکرار میکنیم تا شبکه به دقت مورد نظر برسد.
کد پایتون
import numpy as np
# تابع فعالسازی سیگموئید
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# مشتق تابع سیگموئید
def sigmoid_derivative(x):
return x * (1 - x)
# ورودیها
inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
# خروجیهای مورد انتظار
outputs = np.array([[0], [1], [1], [0]])
# وزنهای اولیه
weights = np.random.rand(2, 1)
# بایاس اولیه
bias = np.random.rand(1)
# نرخ یادگیری
learning_rate = 0.1
# تعداد دورهها
epochs = 10000
# آموزش شبکه
for epoch in range(epochs):
# انتشار رو به جلو
layer0 = inputs
layer1 = sigmoid(np.dot(layer0, weights) + bias)
# محاسبه خطا
error = outputs - layer1
# انتشار به عقب
d_layer1 = error * sigmoid_derivative(layer1)
d_weights = np.dot(layer0.T, d_layer1)
d_bias = np.sum(d_layer1)
# بهروزرسانی وزنها و بایاس
weights += learning_rate * d_weights
bias += learning_rate * d_bias
# تست شبکه
print("خروجیها پس از آموزش:")
print(layer1)
توضیح کد
- `sigmoid(x)`: تابع فعالسازی سیگموئید را پیادهسازی میکند. این تابع مقادیر ورودی را به بازه [0, 1] نگاشت میکند.
- `sigmoid_derivative(x)`: مشتق تابع سیگموئید را محاسبه میکند. این مشتق در الگوریتم انتشار به عقب استفاده میشود.
- `inputs` و `outputs`: دادههای ورودی و خروجی مورد انتظار برای مسئله XOR را تعریف میکنند.
- `weights` و `bias`: وزنها و بایاسهای شبکه را با مقادیر تصادفی مقداردهی اولیه میکنند.
- `learning_rate`: نرخ یادگیری را تعیین میکند. این پارامتر تعیین میکند که وزنها و بایاسها در هر دوره چقدر بهروزرسانی شوند.
- `epochs`: تعداد دورههای آموزش را تعیین میکند.
- حلقه `for epoch in range(epochs)`: حلقه اصلی آموزش شبکه است. در هر دوره، دادهها از لایه ورودی به لایه خروجی منتقل میشوند، خطا محاسبه میشود و وزنها و بایاسها بهروزرسانی میشوند.
- `layer0 = inputs`: لایه ورودی را به `layer0` اختصاص میدهد.
- `layer1 = sigmoid(np.dot(layer0, weights) + bias)`: خروجی لایه پنهان را با استفاده از تابع سیگموئید محاسبه میکند.
- `error = outputs – layer1`: خطا را با تفریق خروجی پیشبینی شده (`layer1`) از خروجی واقعی (`outputs`) محاسبه میکند.
- `d_layer1 = error * sigmoid_derivative(layer1)`: گرادیان خطا را برای لایه پنهان محاسبه میکند.
- `d_weights = np.dot(layer0.T, d_layer1)`: تغییرات وزنها را محاسبه میکند.
- `d_bias = np.sum(d_layer1)`: تغییرات بایاس را محاسبه میکند.
- `weights += learning_rate * d_weights` و `bias += learning_rate * d_bias`: وزنها و بایاسها را بر اساس تغییرات محاسبه شده بهروزرسانی میکنند.
- `print(layer1)`: خروجی شبکه پس از آموزش را چاپ میکند.
نکات مهم
- مقیاسبندی دادهها: مقیاسبندی دادهها (مانند نرمالسازی) میتواند به بهبود عملکرد شبکه کمک کند.
- انتخاب تابع فعالسازی: انتخاب تابع فعالسازی مناسب برای مسئله مورد نظر مهم است.
- تنظیم نرخ یادگیری: نرخ یادگیری باید به دقت تنظیم شود. نرخ یادگیری خیلی بزرگ میتواند باعث ناپایداری آموزش شود، در حالی که نرخ یادگیری خیلی کوچک میتواند باعث کندی آموزش شود.
- بیشبرازش (Overfitting): بیشبرازش زمانی رخ میدهد که شبکه به دادههای آموزشی بیش از حد متناسب شود و نتواند به خوبی به دادههای جدید تعمیم یابد. برای جلوگیری از بیشبرازش، میتوان از تکنیکهایی مانند تنظیمسازی (Regularization) و حذف (Dropout) استفاده کرد.
گامهای بعدی
این مقاله یک معرفی ساده به شبکههای عصبی بود. برای یادگیری بیشتر، میتوانید به موضوعات زیر بپردازید:
- شبکههای عصبی عمیق (Deep Neural Networks): شبکههای عصبی با چندین لایه پنهان.
- الگوریتمهای بهینهسازی: الگوریتمهای پیشرفتهتر برای بهروزرسانی وزنها و بایاسها، مانند Adam و RMSprop.
- کتابخانههای یادگیری ماشین: استفاده از کتابخانههایی مانند TensorFlow و PyTorch برای ساخت و آموزش شبکههای عصبی پیچیدهتر.
- انواع مختلف شبکههای عصبی: شبکههای عصبی کانولوشنال (CNN) برای پردازش تصاویر و شبکههای عصبی بازگشتی (RNN) برای پردازش دادههای ترتیبی.
با تمرین و مطالعه بیشتر، میتوانید به یک متخصص در حوزه علم داده و یادگیری ماشین تبدیل شوید.

بدون دیدگاه