وبلاگ تخصصی آموزش کامپیوترودانلود نرم افزار (خداجون دوستت دارم)

آموزش و راه کارهای کامپیوتر -مقاله کامپیوتر-قالب -ویندوز XP- ویستا -رمز

وبلاگ تخصصی آموزش کامپیوترودانلود نرم افزار (خداجون دوستت دارم)

آموزش و راه کارهای کامپیوتر -مقاله کامپیوتر-قالب -ویندوز XP- ویستا -رمز

چگونه یک شبکه عصبی‌ هوشمند بسازیم؟

مثالی از برنامه‌نویسی شیء‌گرا در شبکه‌های عصبی و هوش مصنوعی

 
اشاره :

قدرت و سرعت کامپیوترهای امروزی به راستی شگفت انگیز است؛ زیرا کامپیوترهای قدرتمند می‌توانند میلیون‌ها عملیات را در کمتر از یک ثانیه انجام دهند. شاید آرزوی بسیاری از ما انسان‌ها این باشد که ای کاش می‌شد ما نیز مانند این دستگاه‌ها کارهای خود را با آن سرعت انجام می‌دادیم، ولی این نکته را نباید نادیده بگیریم که کارهایی هستند که ما می‌توانیم آن‌ها را به آسانی و در کمترین زمان ممکن انجام دهیم، ولی قوی‌ترین کامپیوترهای امروزی نیز نمی‌توانند آن‌ها را انجام دهند و آن قدرت تفکری است که مغز ما انسان‌ها دارد. حال تصور کنید که دستگاهی وجود داشته باشد که علا‌وه بر قدرت محاسبه و انجام کارهای فراوان در مدت زمان کوتاه، قدرت تفکر نیز داشته باشد یا به قول معروف هوشمند باشد!این تصور در حقیقت هدف فناوری هوش مصنوعی یا Artificial Intelligence) AI) است. یکی از راه‌حل‌های تحقق این هدف، شبکه‌های عصبی است. شبکه‌های عصبی در واقع از شبکه‌های عصبی و سیستم عصبی انسان الگوبرداری می‌کنند. برخی از محققان براین باورند که هوش مصنوعی و شبکه‌های عصبی دو راه‌حل متفاوت و در دو جهت مختلف هستند، ولی این باور را نمی‌توان کاملاً صحیح دانست؛ چرا که در حقیقت علم شبکه‌های عصبی و هوش‌مصنوعی وابسته به هم هستند. بدین‌معنا که قبل از این‌که Symbolها بتوانند توسط هوش مصنوعی شناسایی شوند، باید مراحلی طی شود. مثلاً تصور کنید که Symbolهایی مانند خانه، انسان یا میز وجود دارند. قبل از این که AI بتواند هر کدام از این Symbolها را شناسایی کند، باید از توانایی‌ها و صفات هر کدام از این‌ها اطلاع کامل حاصل کند. مثلاً تصور کنید که یک روبات که هوش مصنوعی دارد، یک انسان را می‌بیند، ولی از کجا می‌فهمد که این جسم یک انسان است؟ مثلاً بر اساس مشخصاتی مثل داشتن دو پا، دست، صورت، دهان و قدرت تکلم. اما شما وقتی یک انسان دیگر را می‌بینید، نیازی ندارید که اول تعداد پاهای او را بشمارید و بعد بگویید که این جسم، انسان است. مغز انسان‌ها می‌تواند با دیدن یک جسم فقط برای یک بار یاد بگیرد و اگر مجدداً آن جسم را مشاهده کرد، می‌تواند سریع تشخیص دهد و قسمت‌های مختلف مغز می‌توانند به صورت همزمان فعالیت کنند و از اطلاعات درون مغز استفاده نمایند. شبکه‌های عصبی در بسیاری از پروژه‌های هوش مصنوعی به کار گرفته می‌شود. مثلاً برای برنامه‌های تشخیص و الگوبرداری، شناسایی تصویر و کاراکتر، روبات‌ها و برنامه‌های فیلترینگ اطلاعات. این شبکه‌ها امروزه حتی در اتومبیل‌های بی‌سرنشین نیز کاربرد دارد. به طوری‌که با دیدن و بررسی رانندگی انسان‌ها، می‌توانند رانندگی کنند. در این مقاله اصول شبکه‌های عصبی در برنامه‌نویسی شیء‌گرا مورد بررسی قرار می‌گیرد. با استفاده از زبان #C و انجام دادن عملیات X-OR ساده می‌توانید اولین برنامه ساده هوش مصنوعی خود را بنویسید. لازم به ذکر است که مثالی که در این مقاله از آن استفاده شده، از مقاله Matthew Cochran (سی شارپ کورنر) اقتباس شده است.


شکل 1

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


 

شکل 2

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

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


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

شکل 3


‌ حال قسمت اصلی کار شبکه فرا می‌رسد؛ یعنی آموختن به شبکه عصبی. ب

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

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

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

شکل 4

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

شکل 5

حال نوبت به نوشتن کدهای کلاس اصلی برنامه می‌رسد. نام این کلاس را NeuralFactor می‌نامیم (کدهای شکل 6).
 

شکل6


در کدهای این کلاس می‌بینید که  دو مقدار Private به نام‌های Mywight و MyDelta نوع double و جود دارد. کار اصلی این کلاس، دادن و گرفتن مقادیر نورون است و در واقع تغییرات در ورودی نورون‌ها و وزن آن‌ها را  نگهداری می‌کند. حال می‌توانیم یک اینترفیس برای خود نورون درست کنیم. از آن جایی که هر نورون هم مشخصات سیگنال و هم Receptor را دارد، باید از دو اینترفیسی که قبلاً در شکل های 5 و 4 توضیح داده شد، استفاده کند. همچنین هر نورون چیزی مانند یک ورودی دیگر نیز دارد که به آن Bias می‌گوییم.

اضافه براین، باید دو متد برای انجام کار در شبکه درست کنیم: یکی برای انجام Pulse و دیگری برای یادگیری نورون. کدهای شکل 7 تمامی این اینترفیس را مشخص کرده است.

شکل7

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

اکنون که با اینترفیس‌های این شبکه ساده آشنا شدید، نوبت به ساختن اجزای اصلی برنامه می‌رسد. اولین کاری که باید در این قسمت انجام دهیم، ساختن کلاس اصلی نورون است که باید آن را بر اساس اینترفیس‌هایی که ساخته‌ایم، درست کنیم. شکل 8 ساختار اصلی این کلاس را نشان می‌دهد.

شکل8

همان‌طور که در این شکل مشاهده می‌نمایید، این کلاس تعدادی متغیر و چندین متد دارد. در این کلاس دو متد اصلی  وجود دارد: متد Sigmoid و متد Pulse کدهای شکل 9 این دو متد را نشان می‌دهد.

شکل 9


اگر کمی به کدهای شکل 9 و متد Pulse دقت کنید، متوجه می‌شوید که این متد جمع هر ورودی یا هر خروجی که به نورون داده می‌شود را دریافت می‌کند و در Weight مربوطه که در دایرکتوری است ضرب می‌کند و آخرین خروجی آخرین را به متد Sigmoid انتقال می‌دهد و در نتیجه خروجی آخر ما عددی بین 0 و 1 خواهد بود.

حال دو کلاس مهم از این شبکه باقی‌مانده است: اولین کلاس، کلاس اصلی شبکه یا NeuralNet است و دیگریNeuralLayer، کلاس لایه‌های شبکه ما است. این دو کلاس در شکل 10 به صورت مشخص نشان داده شده است، اما نکته بسیار مهم این است که کلاس NuralLayer در حقیقت مسئول نگهداری نورون‌های انتقال‌دهنده یا فراخوان‌کننده متد Pulse است.
 

کلاس اصلی شبکه

کلاس لایه‌های شبکه

شکل 10


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

شکل 11

کلاس NeuralNet (شکل 12) همان‌طور که قبلاً توضیح داده شد، یکی از مهم‌ترین کلاس‌های برنامه ما است. در این کلاس سه متد بسیار مهم وجود دارد: Initialize ،Train و BackProgation متد Initialize در واقع شبکه ما و کامپوننت‌های آن را آماده می‌کند. این متد در واقع متد Factory ما است. در این متد مقادیر عددی نورون‌های ورودی، نورون‌های مخفی و نورون‌های خارجی مشخص می‌گردند.  

شکل 12

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

شکل 13

وقتی این متد توسط برنامه انجام شد، برنامه با استفاده از متد، ()‌Train و با استفاده از خروجی‌های قبلی می‌تواند توانایی یادگیری داشته باشد.

اگر بخواهیم شبکه خود را آموزش دهیم که عملیات X-OR را انجام دهد، باید ابتدا یک شبکه بسازیم که دو نورون ورودی، دو نورون پنهان و یک  نورون خروجی داشته باشد. مثلاً می‌توانیم شبکه خود را طوری آموزش دهیم که بتواند عملیات مشخص‌شده در جدول 1 را انجام دهد:

خروجی   

ورودی دوم

ورودی اول

1

0

1

0

1

1

0

0

0

1

1

0

 جدول 1

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

منابع:
http://en.wikipedia.org/wiki/Neural_network
www.c-sharpcorner.com
www.nd.com/neurosolutions/products/ns/whatisNN.html

نظرات 3 + ارسال نظر
مسافر چهارشنبه 2 خرداد‌ماه سال 1386 ساعت 11:57 http://mosafer02.mihanblog.com

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

دیاکو چهارشنبه 2 خرداد‌ماه سال 1386 ساعت 12:21 http://diako-kurd.blogsky.com

سلام
وبلاگ عالی داری و مطالب خوبی توش هست
اما یه مشکل داره خیلی دیر لود میشه به نظر من از تعداد پست هاش یه خورده کم کن
امید وارم موفق باشی به من سر بزن خوشحال می شم

neO دوشنبه 21 بهمن‌ماه سال 1387 ساعت 02:30

مقاله عالی بود مرسی
وبلاگ خوب و مفیدی داری موفق باشی

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد