پرسپترون: بلوک ساختمانی شبکه عصبی مصنوعی

گره منبع: 1216283

اگر از علاقه مندان به یادگیری ماشین و هوش مصنوعی هستید، حتما با کلمه پرسپترون برخورد کرده اید. Perceptron در فصل اول بسیاری از دوره های یادگیری عمیق تدریس می شود. پس دقیقاً چیست؟ الهام بخشی پشت آن چیست؟ دقیقاً چگونه مشکل طبقه بندی را حل می کند؟ در این مقاله قصد داریم با الهام بیولوژیکی پشت پرسپترون شروع کنیم و سپس به جزئیات فنی ریاضی آن بپردازیم و در نهایت با استفاده از واحد پرسپترون یک طبقه‌بندی باینری از ابتدا بسازیم.

الهام بیولوژیکی از شبکه های عصبی

یک نورون (سلول عصبی) بلوک اصلی ساختمان سیستم عصبی است. مغز انسان متشکل از میلیاردها نورون است که به یکدیگر متصل هستند. آنها مسئول دریافت و ارسال سیگنال از مغز هستند. همانطور که در نمودار زیر مشاهده می شود، یک نورون معمولی از سه بخش اصلی تشکیل شده است - دندریت، آکسون و جسم سلولی یا سوما. دندریت ها شاخه های درخت مانندی هستند که از بدن سلولی منشا می گیرند. آنها اطلاعات را از نورون های دیگر دریافت می کنند. سوما هسته یک نورون است. وظیفه پردازش اطلاعات دریافتی از دندریت ها را بر عهده دارد. آکسون مانند کابلی است که نورون ها اطلاعات را از طریق آن ارسال می کنند. در انتهای خود، آکسون به شاخه‌های زیادی تقسیم می‌شود که از طریق دندریت‌ها با نورون‌های دیگر ارتباط برقرار می‌کنند. این اتصال بین آکسون و سایر دندریت های نورون سیناپس نامیده می شود.

1: نورون بیولوژیکی در مقابل شبکه عصبی مصنوعی

منبع تصویر: ویلمز، کی (2017، 2 مه). آموزش Keras: یادگیری عمیق در پایتون.

همانطور که ANN از عملکرد مغز الهام گرفته شده است، اجازه دهید ببینیم مغز چگونه کار می کند. مغز از شبکه ای متشکل از میلیاردها نورون تشکیل شده است. آنها از طریق سیگنال های الکتریکی و شیمیایی از طریق یک سیناپس ارتباط برقرار می کنند، که در آن، اطلاعات یک نورون به نورون های دیگر منتقل می شود. فرآیند انتقال شامل یک تکانه الکتریکی به نام «پتانسیل عمل» است. برای اطلاعاتی که باید ارسال شود، سیگنال‌های ورودی (تکانه) باید به اندازه‌ای قوی باشند که از یک سد آستانه خاصی عبور کنند، سپس فقط یک نورون فعال شده و سیگنال را بیشتر (خروجی) ارسال می‌کند.

دانشمند آمریکایی فرانک روزنبلات با الهام از عملکرد بیولوژیکی یک نورون، در سال 1957 در آزمایشگاه هوانوردی کورنل مفهوم پرسپترون را مطرح کرد.

  • یک نورون اطلاعات را از نورون های دیگر به شکل تکانه های الکتریکی با قدرت متفاوت دریافت می کند.
  • نورون تمام تکانه هایی را که از سایر نورون ها دریافت می کند یکپارچه می کند.
  • اگر جمع حاصل بزرگتر از یک مقدار آستانه معین باشد، نورون «آتش» می‌شود و پتانسیل عملی را ایجاد می‌کند که به سایر نورون‌های متصل منتقل می‌شود.

اجزای اصلی پرسپترون

پرسپترون روزنبلات اساساً یک طبقه‌بندی باینری است. پرسپترون از 3 بخش اصلی تشکیل شده است:

  • گره های ورودی یا لایه ورودی: لایه ورودی داده های اولیه را برای پردازش بیشتر به سیستم می برد. هر گره ورودی با یک مقدار عددی مرتبط است. می تواند هر ارزش واقعی را بگیرد.
  • وزن و تعصب: پارامترهای وزن نشان دهنده قدرت اتصال بین واحدها هستند. هر چه وزن بالاتر باشد، تأثیر نورون ورودی مرتبط برای تصمیم گیری در مورد خروجی قوی تر است. بایاس همانند وقفه در یک معادله خطی عمل می کند.
  • تابع فعال سازی: تابع فعال سازی تعیین می کند که آیا نورون شلیک می کند یا نه. در ساده ترین حالت، تابع فعال سازی یک تابع مرحله ای است، اما بر اساس سناریو، می توان از توابع فعال سازی مختلف استفاده کرد.

در بخش بعدی بیشتر در مورد این موارد خواهیم دید.

کار پرسپترون

در مرحله اول تمام مقادیر ورودی با وزن مربوطه ضرب و با هم جمع می شوند. نتیجه به دست آمده را جمع وزنی می نامند ∑wi*xi, یا به شکل دیگری بیان شده است،  x1*w1 + x2*w2 +…wn*xn. این مجموع نمایش مناسبی از ورودی ها بر اساس اهمیت آنها ارائه می دهد. علاوه بر این، یک اصطلاح جانبداری b به این مجموع ∑wi*xi + اضافه می شود b. تعصب به عنوان پارامتر مدل دیگری (علاوه بر وزن ها) عمل می کند که می تواند برای بهبود عملکرد مدل تنظیم شود.

در مرحله دوم، یک تابع فعال سازی f بر مجموع فوق اعمال می شود ∑wi*xi + b برای به دست آوردن خروجی Y = f(∑wi*xi + b). بسته به سناریو و تابع فعال سازی مورد استفاده، تولید است یا دوتایی {1، 0} یا یک مقدار پیوسته. 

کار پرسپترون

(اغلب هر دو این مراحل به عنوان یک مرحله در پرسپترون های چند لایه نشان داده می شوند، در اینجا من آنها را به عنوان دو مرحله متفاوت برای درک بهتر نشان داده ام)

توابع فعال سازی

یک نورون بیولوژیکی تنها زمانی فعال می شود که از آستانه خاصی فراتر رود. به طور مشابه، نورون مصنوعی تنها زمانی فعال می شود که مجموع ورودی ها (مجموع وزنی) از مقدار آستانه معینی، مثلاً 0، فراتر رود.

اگر  ∑wi*xi + b > 0:
خروجی = 1
دیگر:
خروجی = 0

نمودار آن چیزی شبیه به این خواهد بود:

توابع فعال سازی

این در واقع تابع فعال‌سازی مرحله واحد (آستانه) است که در ابتدا توسط Rosenblatt استفاده می‌شد. اما همانطور که می بینید، این تابع در 0 ناپیوسته است، بنابراین در محاسبات ریاضی مشکل ایجاد می کند. یک نسخه هموارتر از تابع فوق تابع سیگموئید است. بین 0 و 1 خروجی می دهد. یکی دیگر مماس Hyperbolic(tanhتابع، که خروجی بین -1 و 1 را تولید می کند. هر دو تابع سیگموئید و tanh از مشکلات شیب ناپدید شدن رنج می برند. امروزه ReLU و Leaky ReLU پرکاربردترین توابع فعال سازی هستند. آنها نسبتاً در شبکه های عمیق پایدار هستند.

پرسپترون به عنوان یک طبقه بندی باینری

تا کنون، ما الهام بیولوژیکی و ریاضیات پرسپترون را دیده ایم. در این بخش، خواهیم دید که چگونه یک پرسپترون یک مسئله طبقه بندی خطی را حل می کند.

واردات برخی از کتابخانه ها –

از sklearn.datasets import make_blobs
matplotlib.pyplot را به صورت plt وارد کنید
numpy را به عنوان np وارد کنید
%matplotlib درون خطی

ایجاد یک مجموعه داده ساختگی با استفاده از make_blobs عملکرد ارائه شده توسط scikit Learn -

# ایجاد مجموعه داده
X, Y = make_blobs (n_features = 2, centers = 2, n_samples = 1000, random_state = 12)
# تجسم مجموعه داده
plt.figure(figsize = (6، 6))
plt.scatter(X[:، 0]، X[:، 1]، c = Y)
plt.title ("حقیقت پایه"، فونت = 18)
plt.show()
پرسپترون به عنوان یک طبقه بندی باینری

فرض کنید نقاط آبی 1 و نقاط سبز 0 هستند. با استفاده از منطق پرسپترون، می توانیم یک مرز تصمیم ایجاد کنیم(ابر هواپیما) برای طبقه بندی که نقاط داده های مختلف را در نمودار جدا می کند.

قبل از اینکه ادامه دهیم، بیایید یک عبارت بایاس (ones) به بردار ورودی اضافه کنیم -

# یک بایاس به بردار ورودی اضافه کنید
X_bias = np.ones ([X.shape[0], 3])
X_bias[:، 1:3] = X

مجموعه داده چیزی شبیه به این خواهد بود

مجموعه داده

در اینجا هر ردیف از مجموعه داده فوق نشان دهنده بردار ورودی (یک نقطه داده) است. برای ایجاد یک مرز تصمیم گیری، باید وزن های مناسب را پیدا کنیم. وزنه ها با استفاده از قانون زیر از تمرین «یادگرفته می شوند» -

w = w + (مورد انتظار - پیش بینی شده) * x

پرسپترون w

به این معنی که نتیجه تخمین زده شده را از حقیقت زمین کم کنید و سپس آن را در بردار ورودی فعلی ضرب کنید و وزن های قدیمی را به آن اضافه کنید تا مقدار جدید وزن ها به دست آید. اگر خروجی ما با کلاس واقعی یکسان باشد، وزن ها تغییر نمی کنند. اما اگر تخمین ما با حقیقت زمینی متفاوت باشد، وزن ها بر این اساس افزایش یا کاهش می یابد. به این ترتیب وزن ها به تدریج در هر تکرار تنظیم می شوند.

ما با اختصاص مقادیر دلخواه به بردار وزن شروع می کنیم، سپس به تدریج آنها را در هر تکرار با استفاده از خطا و داده های موجود تنظیم می کنیم -

# وزن ها را با مقادیر تصادفی مقداردهی اولیه کنید
w = np.random.rand(3، 1)
چاپ (w)

خروجی:

[[0.37547448]
[0.00239401] [0.18640939]]

تعریف تابع فعال سازی پرسپترون -

def activation_func(z): اگر z >= 1: برگردانید 1 else: 0 را برگردانید

بعد، قانون یادگیری پرسپترون را اعمال می کنیم -

برای _ در محدوده(100): برای i در محدوده(X_bias.shape[0]): y = activation_func(w.transpose().dot(X_bias[i, :])) # به‌روزرسانی وزن‌ها w = w + (( Y[i] - y) * X_bias[i، :]).reshape(w.shape[0]، 1)

تضمینی وجود ندارد که وزن ها در یک گذر همگرا شوند، بنابراین ما تمام داده های آموزشی را 100 بار به الگوریتم پرسپترون وارد می کنیم در حالی که به طور مداوم قانون یادگیری را اعمال می کنیم تا در نهایت موفق به بدست آوردن وزن های بهینه شویم.

اکنون که وزن های بهینه را به دست آورده ایم، ما کلاس را برای هر نقطه داده با استفاده از Y = پیش بینی کنید f(∑wi*xi + b) یا Y = wT.x به صورت برداری.

# پیش بینی کلاس نقاط داده
result_class = [activation_func(w.transpose().dot(x)) برای x در X_bias]

مرز تصمیم گیری و برچسب های کلاس پیش بینی شده را تجسم کنید -

# تبدیل به بردار واحد
w = w/np.sqrt(w.transpose().dot(w))
# نتایج را تجسم کنید
plt.figure(figsize = (6، 6))
plt.scatter(X[:، 0]، X[:، 1]، c = result_class)
plt.plot([-10، -1]، هایپرپلن([-10، -1]، w)، lw = 3، c = 'قرمز')
plt.title ("طبقه بندی پرسپترون با مرز تصمیم گیری")
plt.show()
طبقه بندی پرسپترون با مرز تصمیم گیری

می توانید تصویر حقیقت زمین را با تصویر نتیجه پیش بینی شده مقایسه کنید و نکاتی را ببینید که به اشتباه طبقه بندی شده اند. اگر دقت را محاسبه کنیم به حدود 98 درصد می رسد (این را به عنوان تمرین به خوانندگان می سپارم).

اگر می بینید، در اینجا داده های اصلی ما نسبتاً از هم جدا شده است، بنابراین ما می توانیم چنین دقت خوبی داشته باشیم. اما این در مورد داده های دنیای واقعی صدق نمی کند. با استفاده از یک پرسپترون، ما فقط می‌توانیم یک مرز تصمیم خطی بسازیم، بنابراین اگر داده‌ها در هم آمیخته شوند، الگوریتم پرسپترون ضعیف عمل می‌کند. این یکی از محدودیت های مدل تک پرسپترون است.

Endnotes

ما با درک الهام بیولوژیکی پشت پرسپترون روزنبلات شروع کردیم. سپس به سمت ریاضیات پرسپترون و توابع فعال سازی پیش رفتیم. در نهایت با استفاده از مجموعه داده اسباب بازی، دیدیم که چگونه پرسپترون می تواند با ایجاد یک مرز تصمیم گیری خطی که نقاط داده متعلق به کلاس های مختلف را جدا می کند، طبقه بندی اساسی را انجام دهد.

درباره نویسنده

پراتیک نبریا یک دانشمند داده ماهر است که در حال حاضر در یک شرکت تجزیه و تحلیل و هوش مصنوعی مستقر در نویدا مشغول به کار است. او در یادگیری ماشینی، یادگیری عمیق، NLP، تجزیه و تحلیل سری های زمانی، دستکاری داده ها، SQL، پایتون مهارت دارد و با کار در محیط ابری آشناست. او در اوقات فراغت خود عاشق رقابت در هکاتون ها و نوشتن مقالات فنی است.

رسانه نشان داده شده در این مقاله متعلق به Analytics Vidhya نیست و به صلاحدید نویسنده استفاده می شود.

منبع: https://www.analyticsvidhya.com/blog/2021/10/perceptron-building-block-of-artificial-neural-network/

تمبر زمان:

بیشتر از تجزیه و تحلیل Vidhya