هوش مصنوعی ۴۰۱۹ بازدید

شبکه های عصبی

 

مقدمه

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

## Creating index variable 

# Read the Data
data = read.csv("cereals.csv", header=T)

# Random sampling
samplesize = 0.60 * nrow(data)
set.seed(80)
index = sample( seq_len ( nrow ( data ) ), size = samplesize )

# Create training and test set
datatrain = data[ index, ]
datatest = 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»٬ برای مقیاس‌دهی داده‌ها به صورت زیر است:

 

## Scale data for neural network

max = apply(data , 2 , max)
min = apply(data, 2 , min)
scaled = as.data.frame(scale(data, center = min, scale = max - min))

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

## Fit neural network 

# install library
install.packages("neuralnet ")

# load library
library(neuralnet)

# creating training and test set
trainNN = scaled[index , ]
testNN = scaled[-index , ]

# fit neural network
set.seed(2)
NN = neuralnet(rating ~ calories + protein + fat + sodium + fiber, trainNN, hidden = 3 , linear.output = T )

# plot neural network
plot(NN)

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

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

## Prediction using neural network

predict_testNN = compute(NN, testNN[,c(1:5)])
predict_testNN = (predict_testNN$net.result * (max(data$rating) - min(data$rating))) + min(data$rating)

plot(datatest$rating, predict_testNN, col='blue', pch=16, ylab = "predicted rating NN", xlab = "real rating")

abline(0,1)

# Calculate Root Mean Square Error (RMSE)
RMSE.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 مانند زیر است:

## Cross validation of neural network model

# install relevant libraries
install.packages("boot")
install.packages("plyr")

# Load libraries
library(boot)
library(plyr)

# Initialize variables
set.seed(50)
k = 100
RMSE.NN = NULL

List = list( )

# Fit neural network model within nested for loop
for(j in 10:65){
    for (i in 1:k) {
        index = sample(1:nrow(data),j )

        trainNN = scaled[index,]
        testNN = scaled[-index,]
        datatest = data[-index,]

        NN = neuralnet(rating ~ calories + protein + fat + sodium + fiber, trainNN, hidden = 3, linear.output= T)
        predict_testNN = compute(NN,testNN[,c(1:5)])
        predict_testNN = (predict_testNN$net.result*(max(data$rating)-min(data$rating)))+min(data$rating)

        RMSE.NN [i]<- (sum((datatest$rating - predict_testNN)^2)/nrow(datatest))^0.5
    }
    List[[j]] = RMSE.NN
}

Matrix.RMSE = do.call(cbind, List)

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

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

 

شبکه های عصبی

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

## Variation of median RMSE 
install.packages("matrixStats")
library(matrixStats)

med = colMedians(Matrix.RMSE)

X = seq(10,65)

plot (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 را تشریح کردیم که با یک تجربه عملی از شبکه عصبی، به درک بهتر این موضوع، کمک کرده باشیم. امیدواریم این مطلب مفید بوده باشد.

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

#

 

بر اساس رای ۵ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

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

نظر شما چیست؟

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

مشاهده بیشتر