تصور کنید به کودک آموزش می دهید که انواع مختلف میوه ها را تشخیص دهد. شما به آنها یک سیب نشان می دهید و می گویید: “این یک سیب است.” کودک به رنگ، شکل و اندازه آن نگاه می کند تا به یاد بیاورد که سیب چه شکلی است. دفعه بعد که میوه مشابهی را می بینند، از آنچه یاد گرفته اند استفاده می کنند تا آن را به عنوان یک سیب شناسایی کنند. در اصل، این نحوه یادگیری یک شبکه عصبی است.
شبکه عصبی چیست؟
یک شبکه عصبی مجموعه ای از الگوریتم ها است که سعی می کند روابط اساسی را در مجموعه ای از داده ها از طریق فرآیندی که عملکرد مغز انسان را تقلید می کند، تشخیص دهد. به این ترتیب، شبکه های عصبی به سیستمهای نورونها، چه ارگانیک و چه مصنوعی در طبیعت اشاره میکنند.
لایه ها
بلوک های ساختمان یک شبکه عصبی از لایه ها تشکیل شده است:
1. لایه ورودی: این جایی است که شبکه ورودی خود را از دنیای خارجی دریافت می کند، شبیه به کودکی که به میوه نگاه می کند.
2. لایه های پنهان: اینها لایه هایی از توابع ریاضی هستند که هر کدام برای تولید یک خروجی خاص برای یک نتیجه در نظر گرفته شده طراحی شده اند. مثل این است که مغز کودک ویژگی های میوه را پردازش می کند.
3. لایه خروجی: این جایی است که تصمیم یا پیش بینی نهایی انجام می شود، مانند کودک که می گوید: “این یک سیب است.
نورون ها: واحدهای پردازش
هر لایه از واحدهای اساسی به نام نورون یا گره تشکیل شده است، شبیه به نورون های مغز انسان. هر نورون در یک لایه به نورونهای لایه بعدی متصل میشود. قدرت اتصال بین نورونها با وزنها تعریف میشود.
پرسپترون
در مقابل نورون اصطلاحات «پسرون» و «نورون» در زمینه یادگیری ماشین و شبکه های عصبی مصنوعی اغلب باعث سردرگمی میشوند، اما به مفاهیم مرتبط و در عین حال متمایز اشاره میکنند. درک تفاوت بین یک پرسپترون و یک نورون (یا دقیق تر، یک نورون مصنوعی) در درک اصول شبکه های عصبی و تکامل آنها ضروری است.
پرسپترون
- زمینه تاریخی: پرسپترون یکی از اولین و ساده ترین انواع مدل های شبکه عصبی مصنوعی است. این توسط فرانک روزنبلات در دهه 1950 به عنوان مدلی برای وظایف طبقه بندی باینری توسعه یافت.
- ساختار: پرسپترون یک شبکه عصبی تک لایه است. این شامل مقادیر ورودی، وزن ها، یک سوگیری (یا آستانه) و یک تابع فعال سازی است. ورودی ها در وزن مربوطه ضرب می شوند، با هم جمع می شوند و سپس بایاس اضافه می شود. نتیجه از طریق یک تابع فعال سازی منتقل می شود، که در مورد Perceptron معمولاً یک تابع مرحله ای است. این تابع خروجی 1 می دهد اگر مجموع بالاتر از یک آستانه خاص باشد و 0 در غیر این صورت.
- یادگیری: Perceptron از طریق فرآیندی یاد می گیرد که در آن وزن ها را بر اساس خطای خروجی در مقایسه با نتیجه مورد انتظار تنظیم می کند. این فرآیند به طور مکرر در مجموعه داده آموزشی تکرار می شود تا زمانی که پارامترهای مدل (وزن ها) بهینه شوند.
- محدودیت ها: Perceptron فقط می تواند مسائل قابل جداسازی خطی را حل کند (که در آن یک خط می تواند کلاس ها را از هم جدا کند). نمی تواند مسائل غیر خطی را حل کند (مانند مسئله XOR)، که یک محدودیت قابل توجه است.
نورون (نرون مصنوعی)
- مبانی مفهومی: یک نورون مصنوعی یک تابع ریاضی است که به عنوان مدلی از نورون های بیولوژیکی تصور می شود. نورون های مصنوعی واحدهای اساسی در یک شبکه عصبی مصنوعی هستند.
- ساختار: مشابه پرسپترون، یک نورون مصنوعی ورودی ها را دریافت می کند، دارای وزن، سوگیری است و از یک تابع فعال سازی استفاده می کند. با این حال، انتخاب توابع فعال سازی متنوع تر است (به عنوان مثال، سیگموئید، tanh، ReLU) و به نورون اجازه می دهد تا روابط غیر خطی را مدل کند.
- بخشی از شبکه های بزرگتر: برخلاف پرسپترون، که معمولاً به یک شبکه تک لایه اشاره می کند، نورون های مصنوعی به عنوان بلوک های ساختمانی برای شبکه های چند لایه (همچنین به عنوان پرسپترون های چند لایه نیز شناخته می شوند، علیرغم اینکه از نورون ساخته شده اند، نه پرسپترون در شبکه) استفاده می شود. حس اصلی). این شبکهها میتوانند لایههای پنهانی بین لایههای ورودی و خروجی داشته باشند که به آنها اجازه میدهد الگوهای پیچیده را ثبت کنند و مسائل غیر خطی را حل کنند.
- یادگیری و پیچیدگی: در شبکههایی که از نورونهای مصنوعی تشکیل شدهاند، الگوریتمهای یادگیری (مانند انتشار پسباز همراه با نزول گرادیان) وزنها و بایاسهای نورونها را در همه لایهها تنظیم میکنند، نه فقط لایه خروجی، مانند مورد Perceptron. این مدل را قادر می سازد تا از مجموعه داده های بسیار پیچیده تری بیاموزد.
به طور خلاصه، پرسپترون یک شبکه عصبی تک لایه است و می تواند به عنوان یک نوع خاص از نورون مصنوعی با یک تابع مرحله به عنوان تابع فعال سازی آن دیده شود. در مقابل، یک نورون مصنوعی یک مفهوم کلی تر است و می تواند بخشی از شبکه های عصبی پیچیده تر و چند لایه ای باشد که قادر به حل مسائل غیر خطی هستند. تکامل از ایده Perceptron به شبکه های عصبی مصنوعی نشان دهنده پیشرفت قابل توجهی در زمینه شبکه های عصبی و یادگیری ماشین است.
وزن: استحکام اتصالات
وزن ها در یک شبکه عصبی اجزای اصلی یادگیری هستند. آنها تأثیر یک نورون بر دیگری را تعیین می کنند. در مثال میوه ما، وزن می تواند این باشد که کودک برای تصمیم گیری در مورد سیب بودن یا نبودن یک شی چقدر رنگ یا شکل یک شی را در نظر می گیرد.
در ابتدا این وزن ها به صورت تصادفی تنظیم می شوند. از طریق فرآیند یادگیری، شبکه این وزن ها را بر اساس نتیجه پیش بینی های خود تنظیم می کند.
تعصب: تصمیم گیرنده
سوگیری مانند نظر شخصی یک نورون است. این به نورون اجازه می دهد تا با تنظیم سطحی که در آن فعال می شود تصمیم بگیرد. این مانند ترجیح شخصی کودک برای ویژگی های خاص یک میوه است (مثلا ترجیح دادن قرمز به سیب سبز).
توابع فعال سازی: تصمیم گیری
توابع فعال سازی در یک نورون تعیین می کند که آیا باید فعال شود یا خیر، تصمیم گیری را بر اساس مجموع وزنی ورودی ها و بایاس انجام می دهد. این مانند فرآیند فکری کودک است که نتیجه می گیرد: “اگر این میوه قرمز، گرد و دارای ساقه است، پس احتمالا یک سیب است.”
آموزش: فرآیند یادگیری
در طول فرآیند آموزش، شبکه پیشبینی میکند، آنها را با پاسخهای صحیح مقایسه میکند و وزنها و سوگیریهای خود را تنظیم میکند تا پیشبینیهایش دقیقتر شود. این کار از طریق فرآیندی به نام پس انتشار انجام می شود .
- انتشار رو به جلو : داده ها از ورودی به لایه خروجی جریان می یابد و شبکه پیش بینی می کند.
- پس انتشار : شبکه پیشبینی خود را با نتیجه واقعی مقایسه میکند و وزنها و سوگیریها را تنظیم میکند تا پیشبینی دقیقتر شود.
توابع هزینه: سنجش موفقیت
تابع هزینه روشی برای اندازهگیری عملکرد شبکه عصبی در پیشبینی است. مثل این است که کودک فهمید، “من اسمش را گذاشتم موز، اما سیب بود، بنابراین خیلی دور بودم.” سپس شبکه از این اطلاعات برای تنظیم وزنها و سوگیریهای خود استفاده میکند و هدف آن کاهش هزینه (یا خطا در پیشبینیهایش) تا حد امکان است.
یادگیری عمیق: عمیق تر رفتن
یادگیری عمیق شامل شبکه های عصبی با لایه های پنهان بسیاری است که به آنها امکان می دهد الگوها و نمایش های بسیار پیچیده ای را بیاموزند. مثل این است که کودک در حال بزرگ شدن به یک متخصص میوه تبدیل شود که می تواند صدها میوه مختلف را تشخیص دهد، نه فقط سیب و موز.
یک مثال واقعی دیگر
قبل از رفتن به پایتون، بیایید این مفهوم را با مقایسه یک شبکه عصبی با سرآشپزی که دستور پخت عالی لیموناد را میآموزد، ساده کنیم.
عناصر:
- ورودی ها : مانند مواد تشکیل دهنده (لیمو، شکر، آب) هستند.
- وزن ها : این ها را به عنوان نسبت هر عنصر تصور کنید. در ابتدا، سرآشپز بهترین نسبت را نمیداند، بنابراین با یک حدس شروع میکند (این مقدار اولیهسازی تصادفی وزنها است).
- سوگیری ها : اینها تنظیمات یا ترفندهایی هستند که ممکن است سرآشپز ترجیح دهد، مانند افزودن مقداری شکر بیشتر زیرا شیرین تر آن را دوست دارد (این سوگیری در یک نورون است).
فرآیند دستور غذا:
- نورون : هر مرحله از دستور العمل مانند یک نورون است که ورودی ها را پردازش می کند. به عنوان مثال، لیمو را فشار دهید، سپس شکر و سپس آب اضافه کنید.
- عملکرد فعال سازی : این تابع تصمیم می گیرد که آیا سرآشپز باید به مرحله بعدی دستور غذا برود یا خیر. اگر لیمو به اندازه کافی فشرده نشود (ورودی به اندازه کافی قوی نباشد)، نورون “فعال” نمی شود و سرآشپز به افزودن شکر ادامه نمی دهد.
جلسه چشایی (فرآیند یادگیری):
- انتشار به جلو : سرآشپز با حدس اولیه خود یک دسته لیموناد درست می کند و آن را می چشد.
- تابع هزینه : این مانند جوانه های چشایی سرآشپز است که به او می گویند لیموناد چقدر با کامل فاصله دارد (این نشان دهنده اشتباه در پیش بینی ها است).
- تکثیر پشت سر : بر اساس ذائقه، سرآشپز به عقب برمی گردد و نسبت ها (وزن ها) و ترفندهای شخصی خود (سوگیری ها) را تنظیم می کند. شاید آب کمتر یا شکر بیشتری اضافه کند.
آموزش:
- دوره ها : هر دسته از لیموناد مانند یک “دوران” است. سرآشپز یک دسته درست می کند، آن را می چشد (هزینه را محاسبه می کند)، و دستور غذا را تنظیم می کند. با هر دسته جدید، او بیشتر می آموزد که چه چیزی کار می کند و چه چیزی کار نمی کند.
- میزان یادگیری : تصور کنید سرآشپز مراقب است که دستور غذا را به شدت بین دسته ها تغییر ندهد. او هر بار مقدار مواد تشکیل دهنده را تغییر می دهد. این میزان یادگیری است – میزان تنظیم وزن ها/سوگیری ها در طول تمرین را کنترل می کند.
کامل کردن لیموناد (همگرایی):
- پس از چند دوره (دوران)، تنظیمات کوچکتر و کوچکتر می شوند زیرا لیموناد شروع به طعم بهتر و بهتر می کند. در نهایت، سرآشپز دستور پخت کامل را پیدا می کند و وزن ها و سوگیری ها دیگر نیازی به تغییر ندارند. شبکه عصبی ” همگرا ” شده است.
به طور خلاصه، همانطور که سرآشپز ما دستور العمل خود را برای یافتن طعم عالی تنظیم می کند، یک شبکه عصبی وزن و سوگیری های خود را تنظیم می کند تا خطا در پیش بینی های خود را به حداقل برساند. تابع فعال سازی داده ها را از طریق شبکه جابه جا می کند و تابع هزینه به آن می گوید که “دستور العمل” فعلی آن چقدر خوب است. از طریق تکرارهای زیاد، بهترین “دستور العمل” را برای پیش بینی ها پیدا می کند.
مثال ساده شبکه عصبی
در آموزش زیر، یک شبکه عصبی ساده با یک لایه ورودی، یک لایه پنهان و یک لایه خروجی را مرور خواهیم کرد. ما از تابع فعال سازی ReLU برای لایه پنهان استفاده می کنیم و هر مرحله را با اعداد و محاسبات نشان می دهیم.
مثال پایتون
TensorFlow و Keras ایجاد و آموزش شبکه های عصبی را کاملاً ساده می کنند. در زیر یک مثال ساده پایتون با استفاده از TensorFlow 2 و Keras برای ایجاد یک شبکه عصبی است که یاد می گیرد نقاط را به عنوان داخل یا خارج از یک دایره طبقه بندی کند – یک مشکل طبقه بندی باینری.
فرض کنید نقاطی در یک صفحه دوبعدی داریم، و میخواهیم شبکهمان یاد بگیرد که اگر نقطهای در داخل دایره واحد با مرکز مبدأ (0,0) و 0
اگر بیرون باشد، بازگردد.
ابتدا باید TensorFlow را نصب کنیم. شما می توانید این کار را با استفاده از pip
:
pip install tensorflow
حالا، بیایید شبکه عصبی خود را ایجاد کنیم:
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import SGD
# Generate random data points
np.random.seed(0)
points = np.random.normal(0, 1, (5000, 2))
labels = np.where(np.linalg.norm(points, axis=1) < 1, 1, 0) # 1 inside the circle, 0 outside
# Define a simple Sequential model
model = Sequential([
Dense(4, input_dim=2, activation='relu'), # Input layer with 2 inputs, hidden layer with 4 neurons
Dense(1, activation='sigmoid') # Output layer with 1 neuron
])
# Compile the model - binary crossentropy is used since it's a binary classification problem
model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.1), metrics=['accuracy'])
# Train the model
model.fit(points, labels, epochs=10, batch_size=10)
# Evaluate the model
loss, accuracy = model.evaluate(points, labels)
print(f'Loss: {loss}, Accuracy: {accuracy}')
در این مثال: ما یک مجموعه داده از نقاط تصادفی ایجاد می کنیم و آنها را بر اساس اینکه آیا آنها در داخل یا خارج از دایره واحد هستند، برچسب گذاری می کنیم.
# Generate random data points
np.random.seed(0)
points = np.random.normal(0, 1, (5000, 2))
labels = np.where(np.linalg.norm(points, axis=1) < 1, 1, 0) # 1 inside the circle, 0 outside
- ما یک مدل متوالی با یک لایه پنهان حاوی 4 نورون و یک لایه خروجی با 1 نورون تعریف می کنیم.
# Define a simple Sequential model
model = Sequential([
Dense(4, input_dim=2, activation='relu'), # Input layer with 2 inputs, hidden layer with 4 neurons
Dense(1, activation='sigmoid') # Output layer with 1 neuron
])
- تابع فعال سازی relu برای لایه پنهان استفاده می شود و سیگموئید برای لایه خروجی از زمانی که ما طبقه بندی باینری را انجام می دهیم استفاده می شود.
- ما مدل را با یک تابع از دست دادن binary_crossentropy (مناسب برای طبقه بندی باینری) کامپایل می کنیم و از Stochastic Gradient Descent (SGD) به عنوان بهینه ساز ما استفاده می کنیم.
- سپس مدل عادت شده بر روی داده های ما برای 10 دوره آموزش داده می شود.
- در نهایت، مدل را ارزیابی می کنیم تا از دست دادن و دقت را ببینیم.
تصویر بالا یک نمایش شماتیک از معماری شبکه عصبی است که توسط تابع plut_model از Keras تولید شده است. ساختار و جریان لایه به لایه مدل را ترسیم میکند. در اینجا چیزی است که هر بخش از شماتیک نشان می دهد:
dense_input (InputLayer):
- ورودی: این شکل ورودی مورد انتظار برای مدل را نشان می دهد، به استثنای اندازه دسته ای. ([None، 2]) به این معنی است که مدل انتظار دارد داده های ورودی با 2 ویژگی (مانند مختصات x و y یک نقطه).
- خروجی: شکل خروجی لایه ورودی همان ورودی است زیرا این لایه دادهها را تغییر نمیدهد. فقط ورودی را به لایه بعدی منتقل میکند.
dense (Dense):
- ورودی: شکل ورودی دریافت شده از لایه قبلی، که 2 ویژگی است که توسط لایه ورودی مشخص شده است.
- خروجی: این لایه دارای 4 نورون است، همانطور که توسط out نشان داده شده است. The None یک نگهدارنده برای اندازه دسته ای است که می تواند هر تعداد نمونه باشد. هر نورون یک مقدار را خروجی می دهد، بنابراین با 4 نورون، ما یک شکل (None، 4).
dense_1 (Dense):
- ورودی: شکل ورودی در اینجا از خروجی لایه متراکم قبلی است که 4 (خروجی از 4 نورون) است.
- خروجی: این لایه خروجی شبکه با یک نورون واحد است، بنابراین شکل خروجی (None، 1). از آنجا که این یک مدل طبقه بندی باینری است، این نورون تنها یک مقدار بین 0 و 1 را خروجی می دهد، که نشان دهنده احتمال وجود یک نقطه داده در داخل دایره واحد است.
In summary, the model consists of:
- یک لایه ورودی است که ورودی 2 بعدی را می گیرد.
- یک لایه پنهان با 4 نورون (به طور کامل به لایه ورودی متصل می شود).
- یک لایه خروجی با 1 نورون (به طور کامل به لایه پنهان متصل می شود) که برای پیش بینی نتیجه باینری استفاده می شود.
بیایید مراحل را با اعداد مثال خاص برای وزنها، بایاسها و توابع فعالسازی طی کنیم. توجه داشته باشید که در یک سناریوی واقعی، این مقادیر در طول آموزش آموخته می شوند، اما ما فقط برخی از اعداد را برای نشان دادن روند تشکیل می دهیم.
راه اندازی یک نمونه مثال:
- Inputs: The point (0.5, 0.5).
- Weights: Let’s assume the four neurons in the hidden layer have the following weights:
- Neuron 1 weights: [0.2, -0.4] with a bias of 0.1
- Neuron 2 weights: [0.7, 0.3] with a bias of -0.1
- Neuron 3 weights: [-0.6, 0.6] with a bias of 0.2
- Neuron 4 weights: [-0.3, 0.8] with a bias of 0.05
- Output Neuron Weight and Bias: Let’s assume the output neuron has weights [0.5, -0.5, 0.3, -0.2] with a bias of -0.4
محاسبه گام به گام:
اولین محاسبات لایه پنهان:
- Neuron 1 calculates: (0.5×0.2)+(0.5×−0.4)+0.1=−0.1(0.5×0.2)+(0.5×−0.4)+0.1=−0.1
- Neuron 2 calculates: (0.5×0.7)+(0.5×0.3)−0.1=0.45(0.5×0.7)+(0.5×0.3)−0.1=0.45
- Neuron 3 calculates: (0.5×−0.6)+(0.5×0.6)+0.2=0.2(0.5×−0.6)+(0.5×0.6)+0.2=0.2
- Neuron 4 calculates: (0.5×−0.3)+(0.5×0.8)+0.05=0.35(0.5×−0.3)+(0.5×0.8)+0.05=0.35
تابع فعال سازی RELU:
- Neuron 1’s output after ReLU:
max(0,−0.1)=0
max(0,−0.1)=0 (since ReLU outputs zero for negative inputs)
- Neuron 2’s output after ReLU: max(0,0.45)=0.45max(0,0.45)=0.45
- Neuron 3’s output after ReLU: max(0,0.2)=0.2max(0,0.2)=0.2
- Neuron 4’s output after ReLU: max(0,0.35)=0.35max(0,0.35)=0.35
محاسبه لایه خروجی:
The inputs to the output neuron are the outputs from the hidden layer after applying the ReLU activation function.
- The output neuron calculates: (0×0.5)+(0.45×−0.5)+(0.2×0.3)+(0.35×−0.2)−0.4(0×0.5)+(0.45×−0.5)+(0.2×0.3)+(0.35×−0.2)−0.4
تابع فعال سازی Sigmoid:
بیایید ابتدا مقدار وزنی برای نورون خروجی را محاسبه کنیم:
- Weighted sum = 0−0.225+0.06−0.07−0.4=−0.6350−0.225+0.06−0.07−0.4=−0.635
- The sigmoid function is applied to this sum:
اکنون، ما فعال سازی سیگموئید را برای دریافت خروجی نهایی محاسبه می کنیم:
import numpy as np
# Calculating the sigmoid activation for the output neuron
weighted_sum = -0.635
output = 1 / (1 + np.exp(-weighted_sum))
output
بیایید این کد را اجرا کنیم تا مقدار خروجی نهایی را پیدا کنیم.