تبلیغات
برق. قدرت. کنترل. الکترونیک. مخابرات. تاسیسات. - 105-چگونه یك شبكه عصبی‌ هوشمند بسازیم؟ - مثالی از برنامه‌نویسی شیء‌گرا در شبكه‌های عصبی و هوش مصنوعی

برق. قدرت. کنترل. الکترونیک. مخابرات. تاسیسات.

دایره المعارف تاسیسات برق (اطلاعات عمومی برق)

قدرت و سرعت كامپیوترهای امروزی به راستی شگفت انگیز است؛ زیرا كامپیوترهای قدرتمند می‌توانند میلیون‌ها عملیات را در كمتر از یك ثانیه انجام دهند. شاید آرزوی بسیاری از ما انسان‌ها این باشد كه ای كاش می‌شد ما نیز مانند این دستگاه‌ها كارهای خود را با آن سرعت انجام می‌دادیم، ولی این نكته را نباید نادیده بگیریم كه كارهایی هستند كه ما می‌توانیم آن‌ها را به آسانی و در كمترین زمان ممكن انجام دهیم، ولی قوی‌ترین كامپیوترهای امروزی نیز نمی‌توانند آن‌ها را انجام دهند و آن قدرت تفكری است كه مغز ما انسان‌ها دارد. حال تصور كنید كه دستگاهی وجود داشته باشد كه علا‌وه بر قدرت محاسبه و انجام كارهای فراوان در مدت زمان كوتاه، قدرت تفكر نیز داشته باشد یا به قول معروف هوشمند باشد!این تصور در حقیقت هدف فناوری هوش مصنوعی یا 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
lss/NNIntro/InvSlides.htmlدwww.cs.stir.ac.uk/
www.nd.com/neurosolutions/products/ns/whatisNN.html


http://www.ml.blogfa.com/post-224.aspx

صفحات جانبی

نظرسنجی

    لطفاً نظرات خود را درمورد وبلاگ با اینجانب در میان بگذارید.(iman.sariri@yahoo.com)نتایج تاکنون15000مفید و 125غیرمفید. با سپاس


  • آخرین پستها

آمار وبلاگ

  • کل بازدید :
  • تعداد نویسندگان :
  • تعداد کل پست ها :
  • آخرین بازدید :
  • آخرین بروز رسانی :