ساخت شبکه های عصبی در نرم افزار R

۹۸۸ بازدید
آخرین به‌روزرسانی: ۰۹ آذر ۱۳۹۹
زمان مطالعه: ۸ دقیقه
ساخت شبکه های عصبی در نرم افزار R

شبکه های عصبی

 

مقدمه

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

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

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

مبانی شبکه عصبی

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

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

پرسپترون (perceptron) یا شبکه عصبی یک لایه‌ایی، شکل اولیه یک شبکه عصبی است. هر پرسپترون، یک ورودی‌ چندبعدی می‌گیرد که آن‌ را با یک جمع‌بندی وزنی و بااستفاده از یک تابع فعال‌سازی، پردازش می‌کند. این آموزش با استفاده از یک داده برچسب‌گذاری‌شده و یک الگوریتم آموزشی که وزن را در فرآیند جمع‌بندی، بهینه می‌کند؛ ارائه شده‌است.

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

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

  • حداقل میانگین مربع
  • شیب گرادیان
  • قانون نیوتن
  • گرادیان مزدوج و ...

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

پیاده‌سازی شبکه عصبی در نرم‌افزار R

حالا می‌خواهیم مدلی از یک شبکه عصبی را، در نرم‌افزار «R» پیاده‌سازی کنیم.  هدف این مدل، پیش بینی مقادیر مختلف حبوبات؛ مانند: کالری، پروتئین چربی و .... است. در کنار آن، اسکریپت R ارائه و برای درک بهتر کاربران، شرح داده شده است. لطفاً با استفاده از تابع setwd( )، راهنمای کار در نرم‌افزار R را تعیین و cereal.csv را در راهنمای کار نگه دارید. ما از مقادیری مانند کالری‌ها، پروتئین‌ها، چربی، سدیم و فیبر به عنوان متغیرهای مستقل استفاده می‌کنیم.

داده‌ها را به دو مجموعه «آموزش» و «آزمایش» تقسیم می‌کنیم. از مجموعه «آموزش»، برای پیدا کردن رابطه بین متغیرهای وابسته و مستقل استفاده می‌شود، درحالی‌که مجموعه «آزمایش»، کارایی مدل را ارزیابی می‌کند. 60% از کل مجموعه داده‌ها را به‌عنوان مجموعه آموزش، استفاده کرده‌ایم. تخصیص داده به مجموعه‌های «آموزش» و «آزمایش»، با استفاده از نمونه‌برداری تصادفی انجام می‌شود؛ و ما در نرم‌افزار «R»، نمونه‌برداری تصادفی را با استفاده از تابع sample () انجام می‌دهیم.

از تابع set.seed() برای تولید نمونه تصادفی یکسان در هر زمان و حفظ هماهنگی استفاده کرده‌ایم. هنگامی که شبکه های عصبی را برای ایجاد مجموعه‌های آموزش و آزمایش، پیاده‌سازی می‌کنیم، از متغیر شاخص استفاده خواهیم کرد. اسکریپت R به شرح زیر است:

1## Creating index variable 
2
3# Read the Data
4data = read.csv("cereals.csv", header=T)
5
6# Random sampling
7samplesize = 0.60 * nrow(data)
8set.seed(80)
9index = sample( seq_len ( nrow ( data ) ), size = samplesize )
10
11# Create training and test set
12datatrain = data[ index, ]
13datatest = data[ -index, ]

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

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

  • min‌max normalization
  • Z‌score normalization
  • median and MAD
  • tan‌h estimators

تکنیک «min‌max normalization»، داده‌ها را به یک محدوده رایج تبدیل می‌کند، بنابراین تأثیر مقیاس از تمام متغیرها حذف می‌شود. برخلاف روش‌های «Z‌score normalization» و «median and MAD»، روش «min‌max» توزیع اصلی متغیرها را حفظ می‌کند. ما از «min‌max normalization»، برای مقیاس دهی داده‌ها استفاده می‌کنیم. اسکریپت «R»٬ برای مقیاس‌دهی داده‌ها به صورت زیر است:

 

1## Scale data for neural network
2
3max = apply(data , 2 , max)
4min = apply(data, 2 , min)
5scaled = as.data.frame(scale(data, center = min, scale = max - min))

از داده‌های مقیاس‌دهی شده برای پیاده‌سازی شبکه های عصبی استفاده می‌شود و ما با استفاده از وزن هر متغیر، شبکه عصبی را مصورسازی می‌کنیم. اسکریپت R شبیه به زیر است:

1## Fit neural network 
2
3# install library
4install.packages("neuralnet ")
5
6# load library
7library(neuralnet)
8
9# creating training and test set
10trainNN = scaled[index , ]
11testNN = scaled[-index , ]
12
13# fit neural network
14set.seed(2)
15NN = neuralnet(rating ~ calories + protein + fat + sodium + fiber, trainNN, hidden = 3 , linear.output = T )
16
17# plot neural network
18plot(NN)

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

شبکه های عصبیمقادیر را با استفاده از مدل شبکه عصبی پیش‌بینی می‌کنیم. به‌یاد داشته باشید که مقادیر پیش‌بینی‌شده، مقیاس‌دهی می‌شوند و باید برای مقایسه با مقادیر واقعی، تغییر کنند. ما مقادیر پیش‌بینی‌شده را با استفاده از مصورسازی هم، با مقادیر واقعی مقایسه می‌کنیم. «RMSE» برای مدل شبکه عصبی، «۶/۰۵» است. اسکریپت «R»، به شرح زیر است:

1## Prediction using neural network
2
3predict_testNN = compute(NN, testNN[,c(1:5)])
4predict_testNN = (predict_testNN$net.result * (max(data$rating) - min(data$rating))) + min(data$rating)
5
6plot(datatest$rating, predict_testNN, col='blue', pch=16, ylab = "predicted rating NN", xlab = "real rating")
7
8abline(0,1)
9
10# Calculate Root Mean Square Error (RMSE)
11RMSE.NN = (sum((datatest$rating - predict_testNN)^2) / nrow(datatest)) ^ 0.5

شبکه های عصبی

شبکه های عصبی

اعتبارسنجی متقابل یک شبکه عصبی

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

تقسیم داده‌های آموزش از آزمایش، چیزی نیست جز: ساده‌ترین روش اعتبارسنجی متقابل شناخته‌شده به‌عنوان روش holdout (جدا نگهداری شده). محدودیت روش «holdout»، اختلاف معیارهای ارزیابی عملکرد درمورد «RMSE» ما است، که می‌تواند بنابر عناصر اختصاص داده‌شده به مجموعه‌های آموزشی و آزمایشی، افزایش یابد. دومین تکنیک رایج برای ارزیابی متقابل، تکنیک «k‌fold» است.

این روش (تکرار جداسازی)، می‌تواند به‌عنوان یک روش «recurring holdout» نمایش داده شود. داده کامل، به زیرمجموعه‌های برابر k تقسیم شده است و هر بار یک مجموعه، به‌ مجموعه آزمایشی اختصاص داده می‌شود. درحالی‌که دیگرمجموعه‌ها، برای مدل آموزشی استفاده می‌شوند. هر نقطه داده، فرصتی برای قرار گرفتن در مجموعه آزمایش و آموزش دارد.

پس این روش، وابستگی عملکرد به جداسازی آموزش از آزمایش و اختلاف عملکرد را کاهش می‌دهد. موارد فوق‌العاده ارزیابی متقابل «k‌fold»، وقتی «k» برابر با تعداد نقاط داده شود، اتفاق می‌افتد. این بدین معنا است که مدل پیش‌بینی‌شده، روی تمام نقاط داده به‌جز یک نقطه داده، که نقش یک مجموعه آزمایشی را برعهده دارد، آموزش داده می‌شود. روش ترک یک نقطه داده که نقش مجموعه آزمایشی را برعهده دارد، با عنوان ارزیابی متقابل «leave‌one‌out» شناخته می‌شود.

حالا ارزیابی متقابل «k‌fold» را در مدل شبکه های عصبی که در بخش قبل ساختیم، اجرا می‌کنیم. تعداد عناصر در مجموعه آموزشی (j)، بین 10 تا 65 متغیر خواهند بود و به ازای هر «j»، صد نمونه از مجموعه داده، ترسیم می‌شود. عناصر باقی‌مانده در هرکدام، به مجموعه آزمایشی اختصاص داده شده‌اند. مدل به همه 5600 مجموعه اموزشی، آموزش داده می‌شود و سپس روی مجموعه‌های آزمایشی متناظر آزمایش می‌شوند.

«RMSE» هر مجموعه آزمایشی را محاسبه می‌کنیم. مقادیر «RMSE»، برای هرمجموعه در یک ماتریس [100*56] ذخیره می‌شوند. این روش، تضمین می‌کند که نتایج ما از هر bias نمونه‌ایی عاری هستند و برای توانمندی مدل ما بررسی می‌شوند. ما از حلقه‌های for تو درتو استفاده می‌کنیم. اسکریپت R مانند زیر است:

1## Cross validation of neural network model
2
3# install relevant libraries
4install.packages("boot")
5install.packages("plyr")
6
7# Load libraries
8library(boot)
9library(plyr)
10
11# Initialize variables
12set.seed(50)
13k = 100
14RMSE.NN = NULL
15
16List = list( )
17
18# Fit neural network model within nested for loop
19for(j in 10:65){
20    for (i in 1:k) {
21        index = sample(1:nrow(data),j )
22
23        trainNN = scaled[index,]
24        testNN = scaled[-index,]
25        datatest = data[-index,]
26
27        NN = neuralnet(rating ~ calories + protein + fat + sodium + fiber, trainNN, hidden = 3, linear.output= T)
28        predict_testNN = compute(NN,testNN[,c(1:5)])
29        predict_testNN = (predict_testNN$net.result*(max(data$rating)-min(data$rating)))+min(data$rating)
30
31        RMSE.NN [i]<- (sum((datatest$rating - predict_testNN)^2)/nrow(datatest))^0.5
32    }
33    List[[j]] = RMSE.NN
34}
35
36Matrix.RMSE = do.call(cbind, List)

مقادیر «RMSE»، می‌توانند با استفاده از متغیر «Matrix» و «RMSE» در دسترس قرار بگیرند. اندازه ماتریس بزرگ است، بنابراین سعی می‌کنیم داده‌ها را از طریق مصورسازی حس کنیم. ابتدا برای یکی از ستون‌های «Matrix».«RMSE»، در جایی که طول مجموعه آموزشی برابر با ۶۵ است، یک boxplot آماده می‌کنیم. این box plots را می‌توان یکبار، برای همه طول‌های مجموعه آموزشی (10 تا 65) آماده کرد. اسکریپت R مانند زیر است:

1## Prepare boxplot
2boxplot(Matrix.RMSE[,56], ylab = "RMSE", main = "RMSE BoxPlot (length of traning set = 65)")

 

شبکه های عصبی

Boxplot شکل نشان می‌دهد که میانگین «RMSE» تمام 100 نمونه، زمانی که طول مجموعه آموزشی روی 65 ثابت می‌شود، 5.70 است. در مصورسازی بعد، تغییرات «RMSE» با طول مجموعه آموزشی را بررسی می‌کنیم. میانگین «RMSE» را برای هر طول مجموعه محاسبه و آن‌ها را با استفاده از اسکریپت «R» زیر، طراحی می‌کنیم:

1## Variation of median RMSE 
2install.packages("matrixStats")
3library(matrixStats)
4
5med = colMedians(Matrix.RMSE)
6
7X = seq(10,65)
8
9plot (med~X, type = "l", xlab = "length of training set", ylab = "median RMSE", main = "Variation of RMSE with length of training set")

 

شبکه های عصبی

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

نکات پایانی

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

در این مقاله، شبکه عصبی را با استفاده از یک مجموعه عمومی که توسط دانشگاه CMU منتشر شده‌است، در نرم‌افزار «R» اجرا کردیم. هدف این شبکه، پیش‌بینی مقادیر غلات با استفاده از اطلاعاتی مانند: کالری، چربی، پروتئین و .... بود. بعد از ایجاد شبکه عصبی، دقت و توانمندی مدل را ارزیابی کردیم. «RMSE» را محاسبه و تجزیه‌وتحلیل اعتبارسنجی متقابل را انجام دادیم.

در اعتبارسنجی متقابل، بررسی کردیم که تغییرات دقت مدل به‌اندازه طول مجموعه آموزشی تغییر کرده‌اند. ما مجموعه آموزشی با طول بین 10 تا 65 را ارائه کردیم. در این شبکه، به ازای هر طول، 100 نمونه به‌صورت تصادفی انتخاب و میانگین «RMSE» محاسبه می‌شود. ما نشان دادیم که وقتی مجموعه آموزشی بزرگ باشد، دقت مدل کاهش می‌یابد.

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

اگر به این مقاله علاقه‌مند بوده‌اید، شاید مقاله‌های زیر نیز برای شما جذاب و مفید باشد:

#

 

بر اساس رای ۱۱ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
analyticsvidhya
۷ دیدگاه برای «ساخت شبکه های عصبی در نرم افزار R»

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


با سلام و احترام؛

صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزاریم.

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

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

  • مجموعه آموزش شبکه‌ های عصبی مصنوعی
  • شبکه‌های عصبی مصنوعی – از صفر تا صد
  • شبکه عصبی چیست؟ — کامل و به زبان ساده
  • برای شما آرزوی سلامتی و موفقیت داریم.

    سلام سپاس بابت مطالب خوبتون. من چطور میتونم به دیتاهای این کد دسترسی پیدا کنم؟ سپاسگزارم

    سلام وقت شما بخیر؛

    دیتاست مرتبط به این پست از طریق این لینک در دسترس است.

    از اینکه با مجله فرادرس همراه هستید از شما بسیار سپاسگزاریم.

    سلام در نرم افزار متلب ما سه نوع داده داریم TEST, TRAIN و VALIDATION. چرا در R ما دو نوع داده تست و ترین داریم و ولیدیشن نداریم. اکثر جاه ها من دیدم که از دو نوع تست و ترین استفاده کردند؟ چرا؟

    سلام
    در متد kfold هر داده فقط یکبار در روند تست به کار میرود ولی چندین بار در روند آموزش استفاده میشود
    شما در متن نوشته اید در روند آموزش هم فقط یک بار استفاده میشود که اشتباه است
    متن بسیار مفید بود با تشکر

    با سلام؛

    از همراهی شما با مجله فرادرس سپاس‌گزارم. اصلاحات لازم در مطلب انجام شد. مطالعه مطلب «اعتبار سنجی متقابل (Cross Validation) — به زبان ساده» در این راستا به شما توصیه می‌شود.

    با احترام؛
    شاد و تندرست باشید.

    نظر شما چیست؟

    نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *