چند نورون برای یک شبکه عصبی؟

شکل ۱. لایه ورودی-لایه پنهان-لایه خروجی
شکل ۱. لایه ورودی-لایه پنهان-لایه خروجی
منتشر‌شده در : towardsdatascience به تاریخ ۱۰ می ۲۰۲۱
لینک منبع: How many neurons for a neural network?

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

شبکه عصبی چیست؟

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

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

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

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

چگونه تعداد نورون‌ها را بهینه کنیم؟

این روش بسیار ساده است و از اعتبارسنجی متقابل استفاده می‌کند:

  • تنظیم تعدادی از نورون‌ها
  • مقدار متوسط برخی شاخص‌های عملکرد را در اعتبارسنجی متقابل k-fold محاسبه کنید.
  • این روند را با تعداد مختلفی از نورون‌ها تکرار کنید.
  • تعداد نورون‌هایی که مقدار میانگین را در اعتبارسنجی متقابل k-fold به حداکثر می‌رسانند را انتخاب کنید.

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

حال بیایید ببینیم که چگونه این روش را در پایتون اعمال کنیم.

مثال در پایتون

در این مثال، قصد دارم نشان دهم که چگونه تعداد نورون‌ها در پایتون را با استفاده از کتابخانه علم-یادگیری بهینه کنم. در مثال‌های واقعی، شما احتمالا از Keras برای ساخت شبکه عصبی خود استفاده می‌کنید، اما مفهوم دقیقا یک‌سان است. شما می‌توانید کد را در مخزن Github من پیدا کنید.

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

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.metrics import roc_auc_score

مطالعۀ مقاله کد پایتون خود را با سرعت C اجرا کنید! توصیه می‌شود.

سپس می‌توانیم مجموعه داده خود را بارگذاری کرده و آن را به مجموعه‌های آموزش و تست تقسیم کنیم.

X,y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

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

فراموش نکنید که ویژگی‌های خود را قبل از دادن یک مجموعه داده به یک شبکه عصبی، مقیاس‌بندی کنید. برای سادگی، من قصد دارم از Pipeline object در علم-یادگیری و سپس اعمال استانداردسازی استفاده کنم.

model = Pipeline([
('scaler',StandardScaler()),
('model',MLPClassifier(random_state=0))
])

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

برای انجام این کار، می‌توانیم از ابجکت GridrochCV استفاده کنیم. از آنجا که ما با یک مسئله طبقه‌بندی دودویی کار می‌کنیم، معیاری که می‌خواهیم حداکثر کنیم، AUROC است. ما از ۵ تا ۱۰۰ نورون با یک گام ۲ عبور خواهیم کرد.

search = GridSearchCV(model,
{'model__hidden_layer_sizes':[(x,) for x in np.arange(5,100,2)]},
cv = 5, scoring = "roc_auc", verbose=3, n_jobs = -1

)

در نهایت، می‌توانیم به دنبال بهترین تعداد نورون باشیم.

search.fit(X_train, y_train)

بعد از اینکه جستجو تمام شد، ما بهترین نمره میانگین را گرفتیم، که این است:

search.best_score_# 0.9947175348495965

و بهترین تعداد نورون‌ها که عبارتند از:

search.best_params_# {'model__hidden_layer_sizes': (75,)}

در نهایت، ما می‌توانیمAUROC چنین مدلی را روی مجموعه داده آزمون محاسبه کنیم تا مطمئن شویم که مجموعه داده خود را بیش از حد برازش نکرده‌ایم.

roc_auc_score(y_test,search.predict_proba(X_test)[:,1])# 0.9982730973233008

مقداری که ما به دست می‌آوریم هنوز هم بالا است، بنابراین ما کاملا مطمئن هستیم که مدل بهینه‌شده مجموعه داده‌های آموزشی را تعمیم داده و از اطلاعاتی که حمل می‌کند یاد می‌گیرد.

نتیجه‌گیری

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

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