بایگانی برچسب: s

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

پیش گفتار

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

مقدمه

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

ساختن این نوع روبات های پاسخگو خیلی پیچیده نیست، چون دامنه ی ورودی های آنها محدود است. به عنوان مثال یک عابربانک در مجموع ۱۲ دکمه برای وارد کردن عدد و تایید و انصراف دارد و نهایتاً ۸ دکمه ی کمکی دیگر که عملیات هر کدام در هر لحظه کاملاً مشخص است.
جهت مجزا کردن روبات هایی که تنها فعالیت نرم افزاری انجام می دهند از روبات هایی که فعالیت فیزیکی نیز دارند، دسته ی اول را بات (به انگلیسی Bot) نیز می نامند. پس برای منشی تلفنی واژه ی بات مناسب تر می باشد.
حال فرض کنید می خواهیم باتی بسازیم که قابلیت فهم و پاسخگویی به زبان انسان را داشته باشد! ساخت این نوع بات که اصطلاحاً به آن Chatterbot نیز گفته می شود کمی پیچیده تر از موارد قبل می باشد.
هدف این بات ها ارائه ی پاسخی است که هر چه بیشتر به پاسخ یک انسان شبیه باشد. در حالت ایده آل هدف این است که شخصی که با این بات ها گفتگو می کند، نتواند متوجه شود که در حال چت با یک بات می باشد. که متأسفانه تا کنون هیچ باتی به این حالت ایده آل نرسیده است.برای روشن نمودن بهتر این مسئله ذکر چند مثال شاید بد نباشد:

  • زبان انسان پویا می باشد و روز به روز تغییر می کند پس باتی که بخواهد با این زبان ارتباط برقرار کند نیز باید پویا باشد.
  • یک کلمه در زبان انسان (که مانند یک دکمه در عابربانک می ماند) در زمان ها و مکان های مختلف و همچنین برای موضوع های مختلف ممکن است معنای یکسانی نداشته باشد و در نتیجه جواب متفاوتی هم خواهد داشت. به عنوان مثال در صورتی که کلمه ی خیر بدون هیچ مقدمه ای گفته شود، معنی خاصی ندارد. حال آنکه اگر همین کلمه بعد از عبارت خوبی؟ بیاید به مفهوم خوب نیستم خواهد بود و اگر بعد از عبارت هستی؟بیاید به مفهوم نیستم خواهد بود.
  • در زبان انسان ممکن است جای کلمات تغییر کنند ولی مفهوم ثابت بماند. مثلا تو کجایی؟ با کجایی تو؟ یک مفهوم را دارد و فقط کلمه ای که روی آن تأکید شده است متفاوت است. همچنین چندین عبارت ممکن است یک جواب داشته باشند. به عنوان مثال خوبی؟ و حالت خوبه؟ و خوب هستی؟ همگی یک مفهوم را دارند.
  • در زبان انسان علامت ها می توانند مفهوم جمله و در نتیجه پاسخ جمله را عوض کنند. به عنوان مثال تو خوبی؟ و تو خوبی! دو مفهوم کاملاً متفاوت دارند.

و موارد بسیار بسیار زیاد دیگر که پردازش زبان انسان و پاسخگویی به آن را پیچیده و دشوار می کند.

راه های مختلف برای ساختن بات های پاسخگو

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

ساده ترین روش

ساده ترین روشی که حتی امروزه در خیلی از بات ها استفاده می شود مقایسه ی سوال با یک لیست از عبارت ها که جواب هر کدام از قبل تعیین شده است می باشد.
این روش بسیار ابتدایی می باشد و در صورتی که سوال عیناً برای بات تعریف نشده باشد پاسخی پیدا نخواهد شد!
به عنوان مثال حتی اگر جوابی برای عبارت khoobi? تعریف شده باشد در صورتی که از این بات بپرسید khoobi یا khooobi? یا khoubi جوابی نخواهید گرفت.
این روش در بسیاری از بات های یاهو! مسنجر استفاده شده. این بات ها معمولاً سویچی با نام /learn دارند و در صورتی که جواب عبارتی را ندارند از کاربر تقاضا می کنند که پاسخ آن عبارت را به او یاد بدهند.
این روش فاصله ی بسیار بسیار زیادی با هدف Chatterbot ها دارد، زیرا یک انسان هیچ گاه نمی گوید لطفا با سویچ /learn جواب این پاسخ را به من یاد بدهید!

استفاده از فیلتر ها

این روش کمی متود قبلی را کامل کرده است به این صورت که قبل از چک کردن سوال با لیست جواب ها پردازش ساده ای روی سوال انجام می شود. این پردازش می تواند شامل موارد زیر باشد:

  • حذف تکرار حروف: Salaaaaaam و Saalaaaaaam به Salam تبدیل خواهند شد.لازم به ذکر است بعضی از حروف مانند o در صورت تکرار بیش از ۲ مورد پشت سر هم حذف می شوند. به عنوان مثال khooooobi? به khoobi? تبدیل خواهد شد.
  • جایگزینی برخی حروف ترکیبی: مثلا حایگزینی ou با oo.
  • حذف کاراکتر های اضافه: به عنوان مثال تمام کاراکتر های غیر حروف الفبا را حذف می کنیم، در نتیجه khoobi?! :) به khoobi تبدیل خواهد شد.
  • جایگزینی برخی کلمات هم معنا: مثلا واژه ی bali و arehرا با واژه ی baleh جایگزین می کنیم.

این موارد به بات کمک می کند تا در صورت دانستن جواب عبارت salam به سوالات Salaaaam!? یا Salaaaaaammmm :) نیز پاسخ دهد.
این روش کمی به پاسخگویی مناسب تر بات کمک خواهد کرد اما همچنان نتیجه ی مورد قبولی نخواهیم داشت.

استفاده از کلید واژه ها

شاید این راهی باشد که به نظر خیلی از دوستان هم رسیده باشد! استفاده از کلیدواژه ها! در این روش به جای اینکه به دنبال یک عبارت کامل باشیم، به دنبال یک کلمه یا چند کلمه در یک عبارت خواهیم گشت. به عنوان مثال می گوییم در هر جمله ای کلمه ی Salam وجود داشت در جواب به آن شخص سلام کن. این روش باعث می شود با دادن مقدار خیلی کمتری اطلاعات به بات جواب های بیشتری را بپوشانیم.
اما چند مشکل عمده دارد! اولین مشکل این است که جواب های بی ربط بسیار زیاد خواهند شد. به عنوان مثال اگر کاربر بگوید Salamat bashi بات به او جواب غیر معقول سلام را خواهد داد.
مشکل دیگر این است دو کلید واژه با جواب های متفاوت در یک عبارت یافت شود. و در این حالت بات نمی داند کدام یک مناسب تر خواهد بود.
فرض کنید کاربر عبارت Salam, khoobi? را به بات ما بگوید و ما به این بات هر دو کلید واژه ی Salam و Khoobi را با دو جواب مختلف یاد داده باشیم. بات نمی داند کدام یک برای این عبارت جواب بهتری است و ممکن است در جواب فقط سلام کند.

استفاده از الگو ها

این روشی است که سایفر و بسیاری از بات های پیشرفته مانند آلیس از آن استفاده می کنند. من در ادامه سعی می کنم به معرفی نوع الگویی که در سایفر استفاده شده بپردازم. در صورتی که علاقه دارید با سیستم الگوی آلیس (که در خیلی از بات های تحت وب استفاده می شود) آشنا شوید به اینجا رجوع کنید.
در ابتدا منظور از الگو یا Pattern چیست؟
یک الگو شباهت هایی با روش کلیدواژه دارد. یعنی به صورت خیلی سختگیرانه عبارت را بررسی نمی کند بلکه دنبال یک سری کلمات در جمله می گردد، اما جای این کلید واژه ها در عبارت مهم خواهد بود. همچنین در ساختار سایفر به هر الگو یک اولویت داده می شود که در ادامه سیستم اولویت بندی را معرفی خواهیم کرد.
برای هر الگو یک Action یا پاسخ تعریف می شود. ابتدا به بررسی الگو ها می پردازیم و بعد به سراغ ساختار پاسخ ها می پردازیم.
در ابتدا به معرفی یک الگوی خیلی ساده می پردازیم:

salam*

خوب احتمالاً متوجه شدید مفهوم این الگو چیست. تمام عباراتی که با salam شروع شوند جزو این الگو قرار می گیرند.
به عنوان مثال Salam azizam یا Salam در این الگو قرار می گیرند.اما Azizam salam در این گروه قرار نخواهد گرفت. به عبارت دیگر * به مفهوم هر کاراکتری می باشد. از آنجایی که * در انتهای جمله قرار گرفته است یعنی هر عبارتی در ادامه ی salam بیاید در این الگو قرار خواهد گرفت.در صورتی که بخواهیم Azizam salam هم در این الگو قرار بگیرد باید از الگوی زیر استفاده کنیم:

*salam*

ممکن هست * در بین دو کلمه بیاید، به عنوان مثال:

esmam * hast

خوب فکر می کنم مشخص باشد. به عنوان مثال esmam Siavash hast در این الگو قرار خواهد گرفت.
در سیستم سایفر برای برخی حالت هایی که زیاد استفاده می شوند از علامت هایی استفاده شده. به عنوان مثال علامت # به مفهوم فاصله ستاره یا انتهای عبارت می باشد. برای مثال:

salam#

Salam khoobi و Salam در این الگو قرار می گیرند. امّا Salamati در این الگو قرار نخواهد گرفت.
علامت دیگری که برای سایفر تعریف کردم علامت $ هست. که در صورتی که بعد از هر * بیاید به این مفهوم خواهد بود که در آن * فاصله وجود نداشته باشد، مثلاً:

be*$

Bekhoon و Bepoosh و اکثر فعال های امری در این الگو قرار می گیرند اما Besiar ziad در این الگو قرار نمی گیرد چون در بخشی که بجای * آمده فاصله وجود دارد.
فکر می کنم تا حدودی با الگو ها آشنا شده باشید. حالا می خواهیم با Action یا پاسخ الگو ها آشنا شویم.ساده ترین الگو یک عبارت ساده می باشد، برای مثال برای الگوی salam* پاسخ زیر را می توانیم داشته باشیم:

Salam, khoobi?

اما همونطور که می دونیم یک انسان هیچ وقت به یک سوال همیشه یک جواب نمیده. برای اینکه رفتار بات ما کمی نزدیک تر به رفتار انسان باشد از یک ساختار ساده در سایفر استفاده شده:

<random>Salam<or>Bah bah, salam!<or>Salam azizam</random>

این ساختار یکی از جواب های Salam و Bah bah, salam! و Salam azizam را بصورت تصادفی انتخاب کرده و جواب را به کاربر تحویل خواهد داد.
تگ کاربردی دیگری که احتمالاً تا این لحظه به ضرورت وجودش پی برده اید تگ <like> می باشد.
همانطوری که می دانید مفهوم خیلی از سوال ها یکی می باشد و در نتیجه جواب مشابه خواهند داشت. به عنوان مثال مفهوم عبارت khoobi و khoob hasti یکی می باشد. در این مواقع از تگ <like> استفاده می کنیم.
مثلاً فرض کنید الگوی khoobi را برای بات با جواب مناسب تعریف کرده ایم. حال برای الگوی khoob hasti از ساختار زیر استفاده می کنیم:

<like>khoobi</like>

با استفاده از این تگ در صورتی که جواب الگوی khoobi عوض شود جواب تمام الگو های هم مفهوم نیز عوض می شود که از محاسن استفاده از تگ <like> می باشد.

این آموزش ادامه دارد

شناخت حروف توسط شبکه های عصبی

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

Question level 3 وااای مگه می شه؟؟؟ من فکر می کردم باید لااقل توی مثال هامون به کامپیوتر بگیم مثلا این A هست و این B هست!
Answer ” خوب اون هم نوعی یادگیری هست که بهش اصطلاحا Supervised می گن. اما توی این مثال حالت جالب تر یعنی Unsupervised رو می خوایم بررسی کنیم. به این صورت که فقط به کامپیوتر می گیم ۳ دسته وجود داره و براش چندین مثال می زنیم و خودش مثال ها رو توی ۳ دسته قرار می ده! در نهایت ما مثلا می تونیم بگیم همه ی مثال هایی که در دسته ی دوم قرار گرفتن A هستند.
شاید جالب باشه بدونید گوگل هم برای دسته بندی اطلاعات از همچین روشی استفاده می کنه! البته کمی پیشرفته تر. مثلا ۱۰۰ متن اقتصادی و ۱۰۰ متن ورزشی به کامپیوتر میده و از کامپیوتر می خواد اونها رو به ۲ بخش تقسیم بندی بکنه! ورودی لغت های اون متن ها هستند. “
Question level 3 وای، سیاوش باورم نمیشه!
Question level 2 من هم همینطور. مگه می شه کامپیوتر خودش دسته بندی کنه! لطفا ادامه بدید.
Answer ” اگه اجازه بدید می خوام همین کار رو انجام بدم! “

ابزار مورد نیاز

خوب! برای این که شروع کنیم به چند مورد نیاز داریم:
  1. در مورد هوش مصنوعی و شبکه های عصبی یکم اطلاعات داشته باشید. در صورتی که آشنایی ندارید می تونید مقدمه ای بر هوش مصنوعی و مقدمه ای بر شبکه های عصبی رو مطالعه کنید.
  2. برنامه ای برای تولید الگو که ورودی شبکه ی عصبی ما خواهد بود. این برنامرو میتونید از اینجا تهیه کنید.
  3. نرم افزار JOONE Editor. عبارت JOONE مخفف Java Object Oriented Neural Engine هست. که یک ابزار قدرت مند برای بوجود آوردن و آموزش انواع شبکه های عصبی در Java هست. توی این آموزش ما از ویرایشگر این ابزار استفاده می کنیم که محیطی گرافیکی برای تولید شبکه های عصبی داره و کار با اون بسیار ساده هست. این ابزار از اینجا قابل دریافت هست. بدیهیه که برای نصب این ابزار ابتدا باید جاوا روی کامپیوتر شما نصب باشه.
  4. کمی پشتکار و حوصله.
Question level 2 ای بابا! من جاوا رو کامپیوترم نصب نیست! یعنی باید برم سیدیشو بخرم؟؟؟
Answer ” فکر کنم شما علاوه بر جاوا مورد ۴ رو هم نداشته باشی… در صورتی که اینترنتت پر سرعته می تونی از اینترنت هم J2SE رو دانلود کنی. “
Question level 2 آره اینترنتم ADSL هست!.

ساخت الگوها

حالا می خوایم یک سری الگو تولید کنیم. الگو همون مثال هایی هست که گفتیم برای کامپیوتر می زنیم تا بتونه یاد بگیره.
برای این کار از برنامه ای که در شماره ی ۲ بخش قبل معرفی کردم استفاده می کنیم. این برنامه خیلی ساده کار می کنه و فقط الگو ها رو از حالت تصویری به ۰ و ۱ تبدیل می کنه.

Question level 4 سیاوش می تونی توضیح بدی چطور این کار انجام میشه؟
Answer ” بله حتما! اول تصویر رو به یک ماتریس ۸ در ۸ تقسیم می کنه. یعنی ۶۴ قسمت. وقتی دکمه ی سمت چپ ماوس پایینه در صورتی که ماوس از هر کدوم از اون ۶۴ بخش رد بشه اون بخش رو داخل ماتریس علامت گذاری می کنه (مقدار اون قسمت رو True می کنه). وقتی دکمه ی Learn زده می شه برنامه مقدار تمام قسمت ها رو از بالا به پایین داخل یک فایل ذخیره می کنه. مقدار هر قسمت می تونه ۰ یا False و ۱ یا True باشه. “

در صورتی که سورس این برنامرو خواستید کافیه توی بخش نظرات بگید تا براتون میل کنم.
کار با این برنامه خیلی آسون هست همونطور که توی شکل مشخصه.

کافیه الگویی که دوست دارید رو داخل فضای سفید بکشید و دکمه ی Learn رو بزنید. Textbox پایینی برای تغییر دادن آدرس فایلی هست که اطلاعات توی اون ذخیره میشه. و Textbox بالایی برای اینه که بگید این الگو چه حرفی هست که توی این مطلب نیازی به پر کردن اون نیست چون ما بحثمون یادگیری Unsupervised هست. توی مطالب بعدی برای یادگیری Supervised به این فیلد نیاز خواهیم داشت.
خوب من برای اینکه مثال پیچیده نشه ۳ حرف رو می خوام به کامپیوتر یاد بدم. A و C و Z!
برای این کار برای هر کدوم از حروف چهار مثال وارد می کنم و دکمه ی Learn رو می زنم. توی شکل زیر می تونید هر ۱۲ الگو رو ببینید.

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

تشکیل شبکه ی عصبی

خوب! حالا می خواهیم ساختار شبکه ی عصبی رو طراحی کنیم. برای این کار از JOONE Editor کمک می گیریم.
صفحه ی اول این نرم افزار به این شکل هست:

توی این مثال ما از یک لایه ی ورودی خطی ۶۴ نورونی استفاده می کنیم که هر نورون یک قسمت از ماتریسی که در بخش قبل گفتیم رو به عنوان ورودی می گیره. به عنوان خروجی هم از یک لایه ی ۳ نورونی WinnerTakeAll استفاده می کنیم. در این نوع خروجی یکی از نورون ها ۱ و بقیه ۰ خواهند بود که برای تقسیم بندی بسیار مناسب هست.

ایجاد لایه ی FileInput

برای شروع ابتدا یک لایه ی FileInput ایجاد می کنیم. توسط این ابزار می تونیم یک فایل رو به عنوان ورودی به شبکه بدیم.
روی FileInput کلیک راست کرده و در Properties اون فایل درست شده در مرحله ی قبلی رو به عنوان fileName انتخاب می کنیم و به عنوان Advanced Column Selector مقدار ۱-۶۴ رو وارد می کنیم تا برنامه متوجه بشه باید از ستون های ۱ تا ۶۴ به عنوان ورودی استفاده کنه.

ایجاد یک لایه ی خطی

مرحله ی بعدی ایجاد یک Linear Layer یا لایه ی خطی هست. بعد از ایجاد این لایه Properties اون باید به شکل زیر باشه:

همونطور که می بینید تعداد ردیف ها ۶۴ مقداردهی شده که دلیلش این هست که ۶۴ ورودی داریم.
حالا با انتخاب FileInput و کشیدن نقطه ی آبی رنگ سمت راست اون روی Linear Layer خروجی FileInput یعنی اطلاعات فایل رو به عنوان ورودی Linear Layer انتخاب می کنیم.
تا این لحظه ما یک لایه ی ۶۴ نورونه داریم که ورودی اون مقادیر مثال های تولید شده در مرحله ی قبل هست.

ایجاد لایه ی WinnerTakeAll

خوب توی این مرحله لایه ی خروجی که یک لایه ی WinnerTakeAll هست رو تولید می کنیم. Properties این لایه باید به شکل زیر تغییر پیدا کنه تا اطمینان پیدا کنیم الگوها به سه دسته تقسیم میشن:

حالا باید بین لایه ی خطی و لایه ی WinnerTakeAll ارتباط برقرار کنیم. برای این کار باید از Kohonen Synapse استفاده کنیم و Full Synapse جواب نخواهد داد. پس روی دکمه ی Kohonen Synapse کلیک کرده و بین لایه ی خطی و لایه ی WinnerTakeAll ارتباط ایجاد می کنیم.
در آموزش های بعدی فرق انواع سیناپس ها رو بررسی خواهیم کرد.

آموزش شبکه

تا این لحظه شبکه باید به این شکل باشه. حالا می تونیم آموزش شبکرو شروع کنیم. برای این کار در منوی Tools بخش Control Panel رو انتخاب می کنیم. و در صفحه ی جدید learningRating و epochs و training pattern و learning رو به شکل زیر تغییر می دیم.

epochs تعداد دفعاتی که مرحله ی آموزش تکرار میشرو تعیین می کنه.
learningRate ضریبی هست که در یادگیری از اون استفاده می شه. بزرگ بودن اون باعث میشه میزان تغییر وزن نورون ها در هر مرحله بیشتر بشه و سرعت رسیدن به حالت مطلوب رو زیاد می کنه اما اگر مقدار اون خیلی زیاد شه شبکه واگرا خواهد شد.
training patterns هم تعداد الگو هایی که برای آموزش استفاده می شن رو نشون می ده که در این مثال ۱۲ عدد بود.
بعد از اینکه تمام تغییرات رو ایجاد کردیم دکمه ی Run رو می زنیم و منتظر می شیم تا ۱۰۰۰۰ بار عملیات یادگیری انجام بشه.

تست کردن شبکه

تبریک می گم! شما الان به کامپیوتر سه حرف A و C و Z رو یاد دادید!
اما خوب حالا باید ببینید کامپیوتر واقعا یاد گرفته یا نه.
برای این کار از یک لایه ی FileOutput استفاده می کنیم تا خروجی شبکرو داخل یک فایل ذخیره کنیم.
Properties لایه ی FileOutput باید بصورت زیر باشه:

همونطور که می بینید به عنوان fileName مقدار c:\output.txt رو دادیم. یعنی خروجی شبکه در این فایل ذخیره میشه.
حالا کافیه لایه ی WinnerTakeAll رو به لایه ی FileOutput متصل کنیم.
بعد از متصل کردن این دو لایه شکل کلی باید بصورت زیر باشه:

برای اینکه فایل خروجی ساخته بشه باید یک بار این شبکرو اجرا کنیم. برای این کار مجددا در منوی Tools بخش Control Panel رو انتخاب می کنیم و در اون learning رو False و epochs رو ۱ می کنیم تا شبکه فقط یک بار اجرا شه. پس از تغییرات این صفحه باید به شکل زیر باشه:

حالا با توجه به اینکه من اول چهار مثال A رو وارد کردم و بعد به ترتیب چهار مثال C و چهار مثال Z رو ببینیم خروجی این شبکه به چه شکل شده.
باور کردنی نیست! خروجی به این شکل در اومده:

  1. ۱٫۰;۰٫۰;۰٫۰
  2. ۱٫۰;۰٫۰;۰٫۰
  3. ۱٫۰;۰٫۰;۰٫۰
  4. ۱٫۰;۰٫۰;۰٫۰
  5. ۰٫۰;۱٫۰;۰٫۰
  6. ۰٫۰;۱٫۰;۰٫۰
  7. ۰٫۰;۱٫۰;۰٫۰
  8. ۰٫۰;۱٫۰;۰٫۰
  9. ۰٫۰;۰٫۰;۱٫۰
  10. ۰٫۰;۰٫۰;۱٫۰
  11. ۰٫۰;۰٫۰;۱٫۰
  12. ۰٫۰;۰٫۰;۱٫۰

همونطور که می بینید ۴ خط اول که مربوط به A هستن ستون اولشون ۱ هست و در چهار خط دوم ستون دوم و در چهار خط سوم ستون سوم!
این یعنی کامپیوتر بدون اینکه کسی به اون بگه کدوم مثال ها کدوم حرف هست خودش فهمیده و اون ها رو دسته بندی کرده.

Question level 1 ببخشید. خوب چون پشت هم دادید مثال هر حرف رو اینطوری نشده؟
Answer ” نه! کامپیوتر که نمی دونسته من می خوام مثال های هر حرف رو پشت سر هم بدم! من برای راحتی خودم این کار رو کردم. شما می تونی ورودی هاتو غیر مرتب بدی! “
Question level 2 دلیل خاصی داره که در A ستون اول ۱ هست و …
Answer ” نه! ممکن بود برای A ستون دوم ۱ بشه و یا هر حالت دیگه. شما اگر امتحان کنید ممکنه تفاوت پیدا کنه. اما مهم اینه در تمام A ها یک ستون خاص مقدارش ۱ و بقیه ی ستون ها مقدارشون صفر می شه. پس یعنی کامپیوتر تونسته به خوبی تقسیم بندی کنه. “

امتحان با مثال های جدید

حالا می خوایم شبکرو با سه مثال جدید تست کنیم که در مثال های آموزشی نبوده! برای این کار من با استفاده از برنامه ی تولید الگو ۳ مثال جدید درست می کنم و به عنوان فایل ورودی در شبکه فایل جدید رو انتخاب می کنم.
توی شکل زیر سه مثال جدید رو می تونید ببینید:

برای جذابیت علاوه بر این سه مثال ۲ مثال دیگه هم که احتمالا برای یک موجود بد خط هست گذاشتم!

فایل خروجی این مثال ها از اینجا قابل دریافت هست.
به نظر شما این دو تا چه حرف هایی هستن؟

Question level 2 اییییووول این دو تا مثال آخریا که کپ خط علیههه!
Question level 4 علی؟؟؟
Question level 2 آره برادرمه!
Question level 4 چه خوب که برادرته.
Question level 2 آره. چپیه Zه و راستیه هم C هست.

خوب حالا بگذارید ببینیم کامپیوتر چه جوابی می ده. با توجه به اینکه اول مثال C بعد مثال Z و بعد مثال A رو وارد کردم. دو مثال بعدی هم به ترتیب مثال بد خط سمت چپ و مثال بد خط سمت راست هستند. و اما جواب:

  1. ۰٫۰;۱٫۰;۰٫۰
  2. ۰٫۰;۰٫۰;۱٫۰
  3. ۱٫۰;۰٫۰;۰٫۰
  4. ۰٫۰;۰٫۰;۱٫۰
  5. ۰٫۰;۱٫۰;۰٫۰

کامپیوتر سه مورد اول رو به خوبی C و Z و A تشخیص داده. و دو مورد بد خط هم به ترتیب از چپ به راست Z و C تشخیص داده!
حتی برای انسان هم سخته فهمیدن اینکه مورد های چهارم و پنجم چی هستند اما اگر خوب دقت کنید می بینید به مواردی که کامپیوتر خروجی داده نزدیک تر هستند.

Question level 2 کجاش سخته! من که گفتم کدوم چیه!
Answer ” خوب همه مثل شما یه برادر بد خط ندارن. “

نتیجه گیری

فکر کنم خودتون نتیجه بگیرید بهتر باشه…

Question level 1 به نظر من کامپیوتر خیلی با شعوره!
Answer ” کامپیوتر شعور نداره! اما ما سعی کردیم طریقه ی عملکرد مغز رو به صورت خیلی ابتدایی و به ساده ترین نحو توش شبیه سازی کنیم! “

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

لینک های داخلی

لینک های خارجی

References

مقدمه ای بر شبکه های عصبی

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

Question level 2 ببخشید؟
Answer ” آخه من که هنوز چیزی نگفتم که می خوای سوال کنی! سوالت چیه حالا؟ “
Question level 2 من یادم رفت اون سه بخش اساسی چی بودن. می شه یک بار دیگه بگید؟
Answer ” سه بخش عبارتند از:

  • شبکه های عصبی یا Neural Network
  • الگوریتم ژنتیک یا Genetic Algorithm
  • منطق فازی یا Fuzzy Logic

البته به این راحتی نمیشه هوش مصنوعی رو دسته بندی کرد. منظورمون از این دسته بندی این هست که این روز ها روی این ۳ مبحث بیشتر بحث می شه. “

خوب کسی یادش هست شبکه های عصبی هدف و خاصیت هاش چی بود؟

Question level 3 من تا جایی که یادمه در شبکه های عصبی مصنوعی یا Artificial Neural Networks محققان قصد داشتند که طریقه ی عملکرد مغز انسان در به خاطر سپردن اطلاعات و یادگیری رو شبیه سازی کنند.
محققان توی تحقیق هاشون دیدن که مغز انسان از تعداد خیلی زیادی عصب یا Neuron تشکیل شده که هر کدوم از این عصب ها به تعداد دیگه ای عصب متصل هستن و به همدیگه سیگنال هایی رو میفرستند. در بعضی شرایط عصب ها سیگنال رو از خودشون عبور میدن و اون رو تقویت می کنند و در بعضی شرایط هم از خودشون عبور نمیدن. با اینکه هر نورون ساختار خیلی پیچیده ای نداره مجموعه ی این نورون ها یک شبکه ی بسیار پیچیدرو تشکیل میده که قابلیت یادگیری و ذخیره کردن اطلاعات و تحلیل اون ها رو داره!
Answer ” بسیار عالی! خیلی خوشحالم که خوب حرف های جلسه ی قبل یادت مونده! همونطوری که دوستمون گفتن مغز انسان تعداد خیلی زیادی نورون داره که حدودا ۱۰ به توان ۱۲ تا می شه. ولی هر نورون حدودا فقط به ۱۰ به توان ۳ نورون دیگه وصل هست که این نشون می ده ارتباطات بین این نورون ها انتخاب شده هست!
خوب حالا کسی یادش هست که محققا به چه نحوی سعی کردند شبکه های عصبی رو شبیه سازی کنند؟ “
Question level 4 تا جایی که من یادم هست گفتید اول نورون های مصنوعی رو تعریف می کنند به این صورت که هر نورون یه تعداد ورودی و خروجی داره و یک بایاس و هر ورودی هم یک وزن (Weight) داره.
بعد این نورون ها رو توی چند لایه قرار می دن که به لایه ی اول لایه ی ورودی و به آخرین لایه لایه ی خروجی و به بقیه ی لایه ها لایه ی مخفی یا میانی میگن. تعداد نورون های لایه ی ورودی و خروجی بسته به تعداد ورودی و خروجی تعیین می شن اما تعداد لایه های میانی و نورون های هر لایه می تونه هر مقداری باشه که البته هر مقداری از اون نتیجه ی مطلوبی رو به ما نمیده و باید انتخاب شده باشه.

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

پرسپترون (Perceptron)

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

پرسپترون

پرسپترون یا Perceptron ساده ترین نوع مدلسازی نورون هست. از اونجایی که بررسی چند پرسپترون در لایه های مختلف کمی پیچیده هست برای شروع به بررسی یک عدد پرسپترون می پردازیم.
پرسپترون دارای یک سری ورودی خارجی. یک ورودی داخلی به نام بایاس (bias). یک threshold و یک خروجی هست. که در شکل سمت چپ می تونید اون رو ببینید!

هر پرسپترون نشاندهنده و معرف یک نورون هست. ورودی پرسپترون ها معمولا از جنس boolean هست اما در کل می تونه هر عددی باشه ولی خروجی همیشه یک boolean هست!

Question level 1 ببخشید! منظورتون از boolean چی هست دقیقا؟
Answer ” مثلا وقتی می گیم خروجی یک پرسپترون همیشه boolean یا بولین هست یعنی خروجی می تونه دو مقدار ۱ و ۰ داشته باشه! که ۱ معرف درست یا true و ۰ معرف غلط یا false هست. “
Question level 2 پس یعنی ورودی پرسپترون می تونه هر مقداری باشه اما معمولا یا ۰ یا ۱ هست و خروجی اون ۱۰۰٪ ۰ یا ۱ هست. درسته؟
Answer ” بله! کاملا درسته… “

در صورتی که خروجی یک پرسپترون یک باشه به اون پرسپترون می گیم پرسپترون فعال یا activated.
تمام ورودی ها از جمله بایاس دارای یک وزن هستند که این وزن ضرب در مقدار ورودی می شه. معمولا وزن بایاس برابر ۱ هست.
یکی از مهمترین عوامل هر نورون تابع فعال کننده یا Activation function اون نورون هست. تابع فعال کننده تعیین می کنه که با توجه به ورودی های نورون خروجی اون به چه شکل باشه. در پرسپترون ها ما یکی از ساده ترین توابع فعال کنندرو داریم. این تابع تمام ورودی های پرسپترون رو بعد از ضرب کردن اون ها در وزنشون با هم جمع می کنه. در صورتی که جمع اونا از threshold بیشتر یا مساوی بود خروجی ۱ خواهد بود یعنی پرسپترون فعال خواهد شد و در غیر این صورت پرسپترون غیر فعال خواهد شد. پس در صورتی که شرط زیر برقرار باشه یک پرسپترون فعال خواهیم داشت:

در اصل threshold مثل یک دیوار می مونه. اگر سیگنال انرژی کافی برای رد شدن از دیوار رو داشته باشه از روی اون عبور می کنه. در غیر این صورت پشت دیوار می مونه.

یادگیری در پرسپترون

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

  1. یک خروجی تولید می کنند.
  2. خروجی رو با خروجی که باد می بوده مقایسه می کنند.
  3. خودشون رو کمی تنظیم می کنند تا به خروجی نزدیک تر بشن.

بعد از تکرار شدن این مراحل به تعداد کافی پرسپترون اصتلاحا به رفتار صحیح همگرا یا converge میشه!
به این روش یادگیری delta rule یا قانون دلتا می گن. در این روش یادگیری تغییر وزن در هر مرحله به صورت زیر محاسبه می شه:

که دلتا در اون تفاوت خروجی مورد نظر و خروجی نورون بوده و xi مقدار ورودی هست.

Question level 3 پس یعنی مقدار جدید وزن هر نورون می شه تفاوت خروجی مورد نظر و خروجی نورون ضرب در مقدار ورودی اون نورون؟
Answer ” به جز قسمت اول بقیه ی حرفت درسته. این مقدار وزن جدید نیست بلکه به وزن قبلی اضافه میشه! “
Question level 3 پس یعنی مقداری که بدست میاد میزان تغییرات در وزن قبلی هست! الآن متوجه شدم.
Answer ” بسیار عالی. “

مثال تابع OR

یک پرسپترون قابلیت جدا کردن فضا به دو بخش رو داره. پس ما با یک پرسپترون فقط می تونیم توابعی رو به درستی بدست بیاریم که در فضا بتونیم قسمت های مثبت خروجی و منفی اون رو به دو قسمت تقسیم کنیم.
در شکل زیر تونستیم به یک پرسپترون تابع OR رو یاد بدیم.

دو محور دو ورودی پرسپترون هستند. همونطور که می بینید پرسپترون فضا رو به دو قسمت مجزا کرده به این صورت که فضای بالای خط سبز رنگ خروجی + یا ۱ خواهند داشت و فضای پایین خط خروجی – یا ۰. پس در صورتی که ورودی ها ۱ و ۱ یا ۰ و ۱ یا ۱ و ۰ باشند خروجی ما + یا ۱ خواهد بود و در صورتی که ورودی ها ۰ و ۰ باشند خروجی – یا – خواهد بود! پس تونستیم با یک پرسپترون ساده تابع OR رو بخوبی در بیاریم.

Question level 1 ببخشید معادله ی این خط رو ما بهش دادیم؟
Answer ” نه! اگر معادله ی خط رو ما می دادیم که دیگه یادگیری در کار نبود! ما برای پرسپترون چندین بار مثال زدیم و پروسه ی یادگیری که بالا توضیح دادم به همون تعداد دفعه اجرا شده. یعنی مثلا دو ورودی رو ۱ دادیم و گفتیم خروجی باید ۱ باشه. بعد یک ورودی ۱ و یک ورودی ۰ دادیم و گفتیم خروجی باید ۱ باشه و بعد دو ورودی ۰ دادیم و گفتیم خروجی باید – باشه! و همین کار رو چندین بار تکرار کردیم. و پرسپترون با استفاده از تابع یادگیری فضا رو به دو قسمت مثبت و منفی تقسیم کرده. “
Question level 3 خوب کل حالات OR ۴ حالت بیشتر نمیشن! اینطور که شما میگید ما بیشتر از ۴ مثال برای پرسپترون می زنیم. یعنی ممکنه چندین بار یک مثال رو برای پرسپترون بزنیم؟
Answer ” بله! برای اینکه پرسپترون بهتر یاد بگیره ممکن هست مثلا ورودی ۱ و ۱ با جواب ۱ رو چندین بار برای اون مثال بزنیم تا این ورودی ها به همراه خروجی چندین بار داخل تابع یادگیری برن و اطمینان پیدا کنیم پرسپترون همگرا شده! “
Question level 2 من نمی فهمم! خوب این چه کاریه. می تونستیم جای اینکه ۱۰۰ تا مثال بزنیم از اول ۴ تا حالت رو تعریف کنیم! اونطوری نیازی به همگرایی و این جور چیزا هم نبود!
Answer ” در مورد این مثال که ۴ حالت بیشتر نیست درست میگید! اما این فقط یک مثال ساده هست برای اینکه مطلب جا بیفته! برای کار های سخت تر مثل شناسایی دست خط تعداد حالات ۴ عدد نیست! نکته ی اصلی این هست که در شبکه های عصبی ما یادگیری داریم! مثلا می تونیم با چند بار نوشتن حرف ب و چند بار نوشتن حرف ج به کامپیوتر یاد بدیم این دو حرف با هم فرق دارند و اولی ب و دومی ج هست! در جلسات بعدی احتمالا همچین مثالی رو نشونتون خواهم داد. “
Question level 3 یک سوال دیگه! پس با یک پرسپترون ما می تونیم تابع AND رو هم در بیاریم! درسته؟
Answer ” کاملا درسته! چون تابع AND هم قابل تقسیم به دو بخش در فضا هست. “
Question level 2 XOR چطور؟
Answer ” نه! XOR رو نمیشه با یک پرسپترون در آورد! چون XOR با تقسیم فضا به دو بخش مثبت و منفی در نمیاد.
در XOR ورودی و خروجی به این صورته:

  • به ازای ۰ و ۰ خروجی ۰ داریم.
  • به ازای ۰ و ۱ خروجی ۱ داریم.
  • به ازای ۱ و ۰ خروجی ۱ داریم.
  • به ازای ۱ و ۱ خروجی ۰ داریم.

یعنی با توجه به شکل آخر بالا سمت راست و پایین سمت چپ خروجی باید + بشه و در بالا سمت چپ و پایین سمت راست باید منفی بشه! ما نمی تونیم هیچ خط راستی رسم کنیم که فضا رو به این صورت تقسیم کنه پس هیچ وقت پرسپترون همگرا نخواهد شد! “

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

لینک های داخلی

لینک های خارجی

References

هوش مصنوعی در رباتیک

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

روبات ۴ پا

توی این قطعه یک روبات ۴ پا رو می بینید. توی ربات های ۴ پا و ۲ پا حفظ تعادل و تولید الگوی حرکت بسیار سخته. شاید در ابتدا زیاد ملموس نباشه.
برای همین مثال می زنم:
توی بازار عروسک های بسیار زیادی وجود داره. به عنوان مثال فرض کنید یک عروسک اسب گرفتید. حالا سعی کنید اون رو روی ۴ تا پاش ایستاده نگه دارید. بعد می بینید با یک ضربه ی کوچک عروسک می افته.
حالا فرض کنید بجای یک عروسک اسب یک عروسک دو پا مثل باربی می گرفتید. حالا بعد از کلی تلاش برای ایستاده نگه داشتن عروسک می بینید با یک تکان خیلی کوچک تعادل عروسک بهم می خوره!
خوب این ها در مقیاس کوچیک بودند! توی مقیاس های بزرگ تر حفظ تعادل بسیار سخت تره!
علاوه بر اون تولید الگوی حرکتی هم سخته. یک روبات تعدادی موتور داره! برای راه رفتن باید دقیقا بدونیم در چه زمانی هر کدام از موتور ها چه سرعت زاویه ای داشته باشند. شاید هنوز به سختی و پیچیدگی موضوع پی نبرده باشید! اگر بخواهیم یک آدم رو ساده سازی کنیم حدود ۲۰ درجه ی آزادی داره. یعنی ۲۰ موتور. حالا برای راه رفتن ما باید تعیین کنیم در هر لحظه هر کدوم از این موتور ها چه سرعت زاویه ای داشته باشند. این ساده ترین حالت هست که زمین صاف باشه. اگر کمی زمین شیب داشته باشه تمام اون سرعت ها عوض می شوند! یا مثلا اگر جنس زمین و اصطکاکش فرق کنه یا یه نیروی خارجی به هر نقطه از بدنه ی ربات وارد بشه! ما نمی تونیم همه ی این حالت ها رو دونه دونه محاسبه کنیم! اینجاست که هوش مصنوعی به کمک ما می آید!
همونطوری که یک بچه ی تازه به دنیا رسیده کم کم راه رفتن رو یاد می گیره کامپیوتر هم میتونه همین کار رو بکنه که در پست های بعدی در این رابطه و راه های مختلف تولید الگو های راه رفتن بیشتر توضیح میدم.
در حال حاضر مسابقاتی به نام Soccer3D چندین بار در سال بصورت اپن و یک بار بصورت جهانی برگزار میشه که موضوع اون دقیقا همین مسئله ، یعنی راه رفتن ربات های دو پا هست که در این مورد هم در پست های آینده بیشتر توضیح میدم.
فعلا برای مشاهده ی قدرت هوش مصنوعی و علاقه مند تر شدن به اون قطعه ی تصویری زیر رو ببینید!

RHex

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

لینک های خارجی

مقدمه ای بر هوش مصنوعی

هوش مصنوعی چیست؟
فکر کنم جواب دادن به این سوال یه مقدار سخت باشه. چون در حال حاضر ما حتی تعریف دقیقی برای هوش نداریم!
واژه ی هوش مصنوعی (Artificial Intelligence) اولین بار توسط شخصی به نام John McCarthy استفاده شد با این تعریف: “علم و مهندسی ساخت ماشین های هوشمند”.
اینم یه تعریف دیگه از هوش مصنوعی که تو خیلی از منابع بکار رفته:
” هوش مصنوعی عبارت است از مطالعه ی این که چگونه کامپیوترها را میی توان وادار به کارهایی کرد که در حال حاضر انسان‌ها آنها رابهتر انجام می‌دهند ”
خوب من کلا زیاد از تعریف خوشم نمی یاد، در نتیجه این قسمت رو همینجا خاتمه میدم، با مثال فکر کنم بهتر بشه مفاهیم رو نشون داد! در آخر اگر دوست داشتین تعریفی که خودتون از هوش مصنوعی پیدا کردینو بگید!

تاریخ هوش مصنوعی

میشه گفت مبحث هوش مصنوعی و پیشرفتش از سال ۱۹۵۰ شروع شد! توی این سال شخصی بنام آلن تورینگ (Alen Turing) تستی بنام تورینگ تست رو معرفی کرد و گفت که هر ماشینی که بتونه از این تست سربلند بیرون بیاد رو میشه یه ماشین هوشمند شمرد. تا الان هیچ ماشینی نتونسته این تست رو با موفقیت پشت سر بگذاره، که خیلی هم عجیب نیست چون برای یه ماشین تست خیلی سختیه! جالب اینه که تقریبا هر انسان سالمی می تونه به راحتی تو این تست قبول بشه حتی یه بچه ی ۵-۶ ساله!

Question level 3 بابا کشتی مارو! حالا بگو اصلا موضوع تسته چیه!
Answer ” خوب اگه اجازه بدی الان میگم! “
Question level 2 من اجازه نمیدم!
Answer ” مهم نیس! “

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

Question level 2 من یه ماشین بی ام و دارم، فکر کنی اون بتونه این تست رو پشت سر بگذاره؟
Answer ” وااای!!! منظور از ماشین یه پاسخ گو هست! می تونه یه برنامه کامپیوتری باشه مثلا! “
Question level 4 Question level 2 ببخشید شماره تلفن شمارو می تونم داشته باشم!
Answer ” لطفا فاصله رو رعایت کنین آقا! اسلام رو زیر سوال نبرین… “
Question level 4 ای بابا، من دیدم ایشونم مثل من بی ام و دارن گفتم با هم تفاهم داریم خواستم یکم بیشتر آشتا شیم!
Answer ” لطفا بعدا آشنا شین! “

بعد از تستی که جناب آقای تورینگ (روحشون شاد) معرفی کردند هوش مصنوعی خیلی پیشرفتای دیگری داشت. مثلا اولین برنامه ی هوش مصنوعی توی دانشگاه منچستر نوشته شد که شطرنج بازی میکرد!
تو سال ۱۹۵۸ آقای John McCarthy زبان برنامه نویسی Lisp رو اختراع کردند! که احتمال داره خیلی از شما اسمشو شنیده باشید!
زبان برنامه نویسی Prolog هم تو همین دوره در سال ۱۹۷۲ بوجود اومد که الان هم یه زبون قوی در زمینه ی منطق حساب میشه!
تو سال ۱۹۹۷ دیپ بلو (Deep Blue) که یه ماشین شطرنج باز بود، تونست قهرمان جهان “گری کاسپارف” رو شکست بده! که این یه موفقیت بزرگ بود توی جهان هوش مصنوعی! می تونید بازی ششم رو که کاسپارف می بازه تو اینجا ببینید!

گری کاسپارف در مقابل دیپ بلو

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

موارد استفاده ی هوش مصنوعی

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

Question level 2 تو نید فور اسپیدم بکار رفته؟
Answer ” تو هر بازی، که کامپیوتر به خودی خودش بازی می کنه هوش مصنوعی بکار رفته! “
Question level 2 من نمیدونم توی نید فور اسپید کامپیوتر هم بازی می کنه یا نه! فقط تا یه جاییش رسیدم که وقتی رو پلی می زدم یه صدا میومد بد می گف سیدی نید فور اسپید رو بگذاربد تو کامپیوتر! جالب اینه سیدی تو کامپیوتر بود! احتمالا هوش مصنوعیش ضعیف بوده که نمی فهمیده، یا شاید اینم جزو بازیش بوده.
Question level 4 بابا باید کرکشو نصب می کردی، بیا من شمارمو میدم بزنگ بهت میگم چیکارش کنی!
Answer ” بابا این کارارو بگذارین برا بعد!!! بسه! ادامه میدیم! “

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

Question level 5 میشه یه مثال دیگه در این مورد بزنید؟
Answer ” البته! یه مثال جالب! همین اینترنتی که شما الان تو خونه استفاده می کنی اولش برای ایجاد شبکه های هماهنگی برای ارتش بوده! که بعد ها گسترش یافته تا به اینجا رسیده!
یا مثلا GPS! نگاه نکنید الان هر کسی می تونه یه GPS تهیه کنه! این سیستم در ابتدا توی ارتش آمریکای جهان خوار استفاده می شده برای پیدا کردن موقعیت و مختصات جغرافیایی سرباز ها! “

چند مبحث از هوش مصنوعی

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

Question level 1 اگه همش حرف بزنه کی غذا بخوره؟ کی بخوابه؟
Answer ” … “

من تو این نوشته فقط درباره سه تا از مباحثی که به نظرم خیلی جالب هستن صحبت می کنم! بازم می گم من زیاد با سواد نیستم، پس لطفا اگه جایی ایرادی دیدین یا بنظرتون اومد حرفی که زدم غلطه لطفا بگید! البته سعی کردم بدون منبع معتبر حرفی نزنم!
سه مبحثی که در ادامه ی این نوشته میگم این ها هستند:

  1. شبکه ی عصبی (Neural Network)
  2. الگوریتم ژنتیک (Genetic Algorithm)
  3. منطق فازی (Fuzzy Logic)

شبکه ی عصبی

شبکه ی عصبی یا Neural Network یکی از مباحثیه که تو هوش مصنوعی این روزا خیلی خوب داره پیشرفت میکنه و خیلیم روش کار میشه!
حالا اصلا چی هست؟
با چند تا سوال شروع می کنم.
تا حالا به این فکر کردی که مثلا تو یه آدمیو ۱۰ سال قبل دیدی، بعد اتفاقا امروز دوباره اونو بعد از ۱۰ سال می بینی! همه چی کلی تغییر کرده، صورتش، مقدار موش، صداش، قدش و خیلی چیزای دیگه. اما تو باز میشناسیش! خیلی جالبه ها! آخه از کجا؟؟؟ چطوری؟؟؟ مغز آدم خیلی انعطاف پذیری داره توی تغییرات یا خطا ها، همین مغز آدم رو خیلی جالب و پیچیده می کنه!

Question level 2 من یه مثال دیگه الان در این باره به ذهنم رسید، بگم؟
Answer ” بله حتما، خیلی خوبه که فعال باشی! “
Question level 2 مثلا من دوستامو امروز می بینم! بعد فردا میبینم بازم میشناسمشون!
Question level 3 خوب این که هنر نیس!
Question level 2 هنر نیس؟؟؟ تو که دوستای منو ندیدی هر روز میرن آرایشگاه، یه روز موهاشون آبیه یه روز زرد یه روز نارنجی! تازه صورتشونو که نگوووو.
Question level 3 آهان از اون لحاظ!
Question level 4 منم یه مثال بزنم؟
Answer ” بله، چه خوب که انقدر فعال شدین! “
Question level 4 امممم، آهان، مثلا من میام به این خانوم با شخصیتی می گم شماره موبایلم ۰۹۱۲…
Answer ” عزیز من! بابا چند بار بگم این کارارو بگذارید بعدا! آخه کلاس که جای شماره دادن نیس! “

خوب یه مثال دیگه می زنم بعد یکم بیشتر وارد میشیم!
شما نوشتن و خوندن رو یاد گرفتین! تا حالا به این فکر کردید که دست خط هر کسی با اون یکی فرق داره اما شما همه ی اونا رو می تونید بخونید؟ این دوباره منعطف بودن مغز آدم رو می رسونه! یا یه نکته ی دیگه، شما هر چقدر بیشتر تمرین کنید دست خطتون بهتر میشه! اینم نشون میده مغز آدم خودشو در طی تمرین به یه معیاری که به نظرش بهتره نزدیک تر می کنه!
اما چطوری؟ مغز آدم چجوری کار میکنه؟ تا حالا از خودتون پرسیدید چجوری یه چیز جدید یاد می گیرید یا چطوری فکر می کنید؟ هر آدمی باید اینو بدونه بنظر من! لا اقل باید یکم خودمونو بشناسیم.
مغز آدم از یه سری سلول عصبی (Neuron) تشکیل شده که هر کدوم سیگنال هایی برای هم میفرستند! جالبه بدونید این سلول های عصبی کاری که می کنن خیلییی سادست مثلا مثل حمع دو تا عدده اما چیزی که باعث میشه بتونن این کارای پیچیدرو انجام بدن اینه که تعداد این سلول ها خیلییی زیاده! مغز آدم حدود ۱۰ به توان ۱۱ تا از این سلول ها داره! تصور این عدد خیلی آسون نیست!
هر نورون تعدادی axom داره که مثل خروجی عمل می کنن و تعداد خیلی زیادی هم dendrite که به عنوان ورودی عمل می کنن. نورون ها یه مقدار مشخصی قدرت سیگنال نیاز دارن تا فعال شن، وقتی فعال شدن یه سیگنال الکتریکی برای سایر نورون ها میفرستن! هر چقدر نورون ها بیشتر استفاده بشن ارتباط بینشون (axonها و dendriteها) قوی تر میشه.
حالا ما همین سیستم رو سعی می کنیم کوچیکترش رو توی کامپیوتر شبیه سازی کنیم. کامپیوتر هایی که الان به اونا دسترسی داریم حتی قدرت پردازش ۲۰ بیلیون نورون رو هم ندارن، ولی با تعداد کمی نورون هم می شه پاسخ های مناسبی از شبکه ی عصبی گرفت.
خوب حالا تو کامپیوتر چطوری نورون ها رو سازمان می دیم؟
نورون ها همونطوری که تو عکس می بینین توی لایه های مختلف قرار می گیرن، لایه ی اول رو لایه ی ورودی (Input Layer) می گن که ورودی ها رو میگیره و بر حسب قدرت ارتباطش با هر نورون توی لایه ی بعدی سیگنال ورودی رو به لایه ی بعد میفرسته! از این به بعد به قدرت ارتباط هر نورون با نورون دیگه وزن (Weight) اون نورون می گیم. مقدار هر نورون توی هر لایه به وزن و مقدار نورون های لایه ی قبلش بستگی داره. در نهایت ما یه لایه ی خروجی داریم که توی این شکل دو تا نورون توشه! لایه های میانی تعدادشون می تونه هر اندازه ای باشه، و تعداد نورون هاشم مثل بقیه ی لایه ها می تونه هر چقدر که بخوایم باشه. بعدا اشاره می کنیم که چطوری انتخاب کنیم تعداد لایه ها و نورون های هر لایه رو.

یک شبکه ی عصبی ساده

حالا اینو ما درست کردیم، به چه دردی می خوره؟
یه شبکه ی عصبی مثل یه تابع عمل می کنه که به تعداد نورون های ورودی، ورودی می گیره و به تعداد نورون های خروجی هم خروجی میده! مثلا این شبکه عصبی که تو شکل می بینید به این صورته:

f(x1, x2, x3, x4, x5) = y1 , y2

حالا این تابع چه تابعیه؟ اینجاس که قدرت شبکه ی عصبی معلوم میشه!
ما میایم و به این تابع ۱۰۰ تا مثال که جوابشو می دونیم میگیم و هر بار عملیات بازپخشانی (Back propagating) رو انجام میدیم! بازپخشانی یه عملیاتیه که طی اون وزن نورون ها رو طوری تغییر میدیم که جواب های شبکه به جواب هایی که انتظار داشتیم نزدیک تر بشن! یعنی ما در اصل یه تابع می سازیم که خودمون نمیدونیم اون تابع چی هست و فقط چند تا مثال از اون رو داریم!
بگذارید یه مثال بزنم. مثلا شما چطوری جمع کردن رو یاد گرفتین؟ بهتون گفتن ۲+۲ میشه ۴، ۲+۳ میشه ۵ و … انقدر مثال دیدید تا فهمیدید آهان پس جمع یعنی این!
دقیقا میتونیم همین رو به کامپیوتر یاد بدیم! یعنی یه شبکه عصبی با دو نورون ورودی طراحی می کنیم و یه لایه ی میانی با ۳ تا نورون و در نهایت یه لایه ی خروجی با یه نورون (چون تابع جمع دو تا ورودی داره و یک خروجی)
بعد برای کامپیوتر چند تا جواب معلوم رو میگیم! مثلا میگیم ۲ و ۲ باید بده ۴، ۲ و ۳ باید بده ۵ و براش ۱۰۰۰ تا مثال میزنیم! در نهایت ازش میپرسیم حالا بگو ۱۰۰ و ۲۳ چی میشه؟ (اعدادی که تا بحال برای شبکه عصبیمون مثال نزدیم). و جواب میگیریم مثلا ۱۲۳٫۰۲۲۳! تعجب نکنید شبکه عصبی همیشه قرار نیست جواب قطعی بده، در نهایت می تونیم به یه روشی اونو به جواب قطعی تبدیل کنیم، مثلا توی این مثال روند کردن جواب میده!

Question level 5 ببخشید، چرا تعداد نورون های لایه ی میانی رو گفتین ۳ تا؟
Answer ” سوال خوبیه! تعداد نورون های لایه های میانی می تونه هر چیزی باشه به جای ۳، اما باید توجه داشته باشین هر نورونی که اضافه می کنیم از یه طرف گپ خطا رو کمتر می کنی اما از طرف دیگه زمان بیشتری برای پردازش می گیره و چون تعداد نورون ها زیاد شده تعداد خطا های کوچک هم زیاد تر می شن و یه خطای بزرگ رو ایجاد می کنن! پس باید با روش های مختلف بهترین حالت رو انتخاب کنیم. توی این مثال با آزمایش و خطا به این نتیجه رسیدیم که ۳ تا بهترین نتیجرو به ما میده! “

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

الگوریتم ژنتیک

الگوریتم ژنتیک یا Genetic Algorithm (GA) در واقع شبیه سازی بقای انسان هست! تا حالا پیش خودتون فکر کردین این همه سال گذشته چطوری انسان ها از بین نرفتن و نسلشون پا برجاس؟ فکر می کنید رمز موفقیتشون چیه؟

Question level 1 فکر کنم ۱۸۳۴۶۲۱۳۰۹۷۳٫۳۴۷۹۲۸۳۷۴۲۶۱۰۱۰۰۰۰۰۰۱ باشه!
Answer ” … “

انسان ها بقا دارن چون با یه قانون خاصی پیش میرن که واضحه که موفق بوده!
حالا همین قانون رو توی کامپیوتر میشه شبیه سازی کرد! اما چجوری؟
فکر کنید میخوایم جواب این تابع رو بدست بیاریم:

X^2 + e^X + 3*sin(X) + int(-X^X) / X = 12

بنظر خیلی پیچیده میاد! شاید با روش های تحلیلی حل نشه و نیاز به محاسبات عددی باشه! یکی از راه ها الگوریتم ژنتیک هست که بعضی اوقات به شکل باور نکردنی سریع به جواب میرسه.
خوب پس من با یه مقدمه ازش شروع می کنم:

چرخه ی الگوریتم ژنتیک

اولین مرحله اینه که ما یک سری کرومزوم به عنوان جمعیت اولیه بصورت تصادف انتخاب می کنیم. هر کرومزوم یه عدد هست در مبنای دو.
مثلا این کرومزوم هارو به عنوان جمعیت اولیه در نظر می گیریم:

00001011
00100010
01000000
11100001
01101100
00000111
11001010
11110000
00010101
10000000
11100100

بعد از اینکه جمعیت اولیه معلوم شد این کرومزوم ها توی تابع Fitness امتحان میشن و بر حسب اینکه به جواب مورد نظر نزدیکن یا نه یه عدد بین صفر تا یک بهشون اختصاص داده میشه که صفر یعنی اصلا بدرد نمی خوره و یک یعنی عالیه!
بر حسب سلامتی کرومزوم ها چند تا از اون ها به عنوان والدین نسل بعدی انتخاب میشن! مرحله ی بعدی مرحله ی Breed هست که طبق فرایند Crossover کرومزوم ها با هم ازدواج می کنن و بچه دار میشن!

Question level 2 وااای مگه یه مشت صفرو یکم می تونن با هم ازدواج کنن!
Answer ” یکم صبر کنی میبینی که می تونن! “

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

  1. First pair:
  2. 00001|011
  3. 00100|010
  4. After crossover:
  5. 00001010
  6. 00100011

در بالا فرآیند Crossover رو برای زوج اول می بینید! همونطور که مشخصه اول هر کزومزوم از بیت ۵ام به دو قسمت تقسیم شدن و ۵ بیت اول کرومزوم اول با ۳ بیت دوم کرومزوم دوم ترکیب شده و برعکس. به این ترتیب دو فرزند جدید بوجود اومد.
همین کار برای بقیه ی کرومزوم ها هم انجام میشه، ممکنه یک کرومزوم دو یا چند بار در فرآیند Crossover بکار برده شه، احتمال شرکت کرومزوم هایی که سلامت بهتری دارند توی فرآیند Crossover بیشتره!
بعد از فرآیند Crossover یک مرحله داریم که احتمال وقوعش خیلی کم هست به نام جهش یا Mutation. توی این فرآیند یک بیت تصادفی از یه کرومزوم تصادفی رو عوض می کنند. مثلا اگر بیت چهارم یک کرومزوم انتخاب بشه در صورتی که صفر باشه اونو یک می کنند یا بلعکس.

  1. First chromosome:
  2. 00001011
  3. After mutation:
  4. 00011011

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

منطق فازی

منطق فازی یا Fuzzy Logic در سال ۱۹۶۵ توسط دکتر لطفی زاده معرفی شد.
منطق فازی در واقع میگه که یه گزاره لزومی نداری یا درست باشه یا غلط (صفر باشه یا یک) ممکنه مثلا یه گزاره ۰٫۷ درست باشه!
درکش یه مقدار در ابتدا سخته! بگذارید یه مثال بزنم، شما از دوستتون می پرسید بنظرت حسین بلنده یا نه؟ دوستتون جواب میده ایییی، بلند نیست اما کوتاه هم نمیشه بهش گفت! اما در منطق باینری (یا منطقی که اکثر ما باهاش تو کامپیوتر آشنا هستیم) هیچ وقت برای یه گزاره همچین جوابی نمیده.
توی منطق باینری ما میگیم اگه قد مساوی یا بلند تر از ۱۷۵ بود بگو بلند اگه کوتاه تر بود بگو کوتاه! اما آدم اینطوری نیست منطقش مثل مثال قبلی که زدم.
حالا این سوال پیش میاد که ما در حال حاضر از همین منطق باینری جواب های خیلی خوبی میگیریم، فازی به چه دردی میخوره؟
برای جواب به این سوال یه مثال دیگه میزنم! مثلا یه شرکت می خواد یه کارخونه بزنه در فاصله ی ماکزیمم ۲۰۰ کیلومتری تهران، که به تولید کننده ی یه مدل مواد اولیه نزدیک تر از ۱۰ کیلومتر باشه و قیمت زمین هم اونجا هر چی کمتر باشه بهتر.اول یه بار با منطق باینری میریم پیش، اولین نمونه فاصلش با تهران ۱۹۰ هست و با مواد اولیه هم ۹ کیلومتر فاصله داره و قیمت زمین هم اونجا ۲۰۰۰ واحد هست، چندین تا نمونه دیگه هم برسی میشن که دو شرط اول رو ندارن، در آخر هم یه نمونه پیدا میشه که فاصلش تا تهران ۲۰۱ کیلومتر هست و فاصلش با مواد اولیه ۳ کیلومتره و قیمتش هم ۱۰۰۰ واحده! طبق منطق باینری این نمونه رد میشه چون فاصلش ۲۰۱ هست و بیشتر از ۲۰۰! اما حالا فرض کنید خود شما دارین تصمییم میگیرین، می یاین می بینید دو شرط آخر این مورد خیلی بهتر از اولین نمونس و تنها مشکل شرط اوله که ۱ کیلومتر بیشتر از اون چیزیه که میخواین، با خودتون میگید خوب ۱ کیلومتر در مقابل اون شرایط خوب که چیزی نیس و این مورد آخر رو انتخاب می کنید!
منطق فازی دقیقا همینو میگه! یعنی مثل منطق باینری که کاملا سخت گیرانه شرایط رو چک میکنه عمل نمی کنه بلکه مثل مغز آدم انعطاف پذیره.
این روزا تو خیلی چیزها از منطق فازی استفاده میشه، مثلا چند تاشون که شاید جالب باشن اینان:

  • ترمز های ABS و سیستم کروز.
  • دوربین ها
  • ماشین ظرف شویی
  • آسانسور ها
  • ماشین لباس شویی
  • بازی های رایانه ای
  • شناخت الگو ها
  • سیستم های تهویه

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

IF x AND y THEN z
IF a OR b THEN c

همونطور که می دونید if در زبان برنامه نویسی چیز جدیدی نیست! اما با یه مثال ساده شاید بشه فرقش رو نشون داد.
در نظر بگیرید دارید یه سیستم تهویه طراحی می کنید، توی سیستم های فازی بجای استفاده از شرط هایی مثل temprature>60C یا ۳۰C<temprature<60C از اصطلاحات زیر استفاده می کنیم:

IF temperature IS very cold THEN stop fan
IF temperature IS cold THEN turn down fan
IF temperature IS normal THEN maintain level
IF temperature IS hot THEN speed up fan

دقیقا مثل وقتی که شما توی ماشین نشستین، می بینید هوا خیلی گرمه بدون اینکه دمای دقیق توی ماشین رو بدونید کولر ماشین رو روشن می کنید و روی دمای کم میگذارید!
اگر دقت کنید هیچ ELSEای وجود نداره، چون دما می تونه هم سرد باشه هم متوسط با درجه های مختلف!
اپراتور های AND، OR و NOT که باهاشون توی منطق باینری آشنا هستیم توی منطق فازی هم وجود دارن.
قبل از تعریف این عملگر ها باید بدونیم مجموعه های فازی یا Fuzzy sets به چه معنی هستند. همونطور که گفتیم توی منطق فازی درجه ی درستی لزوما نباید ۰ یا ۱ باشه و یه گزاره می تونه مثلا ۰٫۳ درست باشه.
بعد گفتیم که تو منطق فازی می تونیم از هوای گرم یا قد بلند صحبت کنیم، اما باید اول اونارو برای سیستم فازیمون تعریف کنیم! هر کدوم از این دسته ها یه مجموعه ی فازی رو تشکیل میدن.
در واقع یه مجموعه ی فازی یه جفت (A, m) هست که A یه مجموعه هست و m یه تابع با دامنه ی A و برد [۰,۱]. به ازای هر x عضو A، m(x) درجه ی عضویت یا درستی x رو نشون میده!
می دونم یه کلمه از چند تا جمله ی قبل نفهمیدین الان بصورت نمودار میبینیدشون و می فهمید که چیز خیلی پیچیده ای نیست!

Question level 1 اتفاقا من می خواستم همین الان بگم که هیچی نفهمیدم
Answer ” اون که ۱۰۰ البته. اما عجیبه فقط شما می خواستید اینو بگید. “
Question level 2 Question level 4
Answer ” عزیزان من، بابا اگه با هم کاری دارید برید بیرون حرفاتونو بزنید، انقدم به هم نچسبین… “
Question level 4 ببخشید، مربوط به درس بود حرفمون!
Answer ” میشه بگین چی بوده بقیه هم استفاده کنن؟ “
Question level 4 امممم… بله، ازم پرسیدن عینکمو چن خریدم، منم با توجه به منطق فازی گفتم زیاااااد!
Answer ” باز جوابت کمی امیدوار کننده بود. “

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

به عنوان مثال این شکل مجموعه ی فازی جوان رو نشون میده، شما وقتی از دوستتون می پرسین بنظرت علی جوونه؟
دوستتون اگه علی ۱۷ سالش باشه میگه آره، اگه ۲۵ سالش باشه میگه اییی، آره هنوز میشه بهش گفت جوونه، اگه ۲۸ سالش باشه میگه خیلی جوون نیس و اگه ۵۰ سالش باشه میگه نه!
این مجموعه ی فازی هم در واقع همین رو میگه! همونطور که میبینید قبل از ۲۰ سال m(B) یک هست، یعنی ۰ تا ۲۰ کاملا عضو مجموعه ی جوان هست، هر چی که میریم جلوتر عضویت توی مجموعه ی جوانی کمتر شده، توی ۲۵ سالگی درجه ی عضویت یا درستی ۰٫۵ هست و توی ۲۸ سالگی ۰٫۲ و بعد از ۳۰ سالگی ۰ که یعنی از این سن به بعد اصلا جوان نیست!
بنظرم الان یکم بهتر مطلب جا افتاده باشه! حالا فرض کنید دو تا مجموعه ی فازی زیر رو داشته باشیم:

مجموعه ی اول رو در ابتدا در نظر میگیریم. تعریف NOT توی شکل بصورت زیره:

یا به عبارتی:

NOT A = (1 - m(A))

خوب حالا دو مجموعرو که بالاتر نمودارشون هست رو در نظر بگیرین، تعریف AND روی اون دو مجموعه بصورت زیره:

یا به عبارتی:

A AND B = minimum(m(A), m(B))

OR هم قاعدتا تا الان حدس زدید به چه صورت خواهد بود:

A OR B = maximum(m(A), m(B))

خوووووب! اینم مقدماتی بود از منطق فازی. البته اینا مفاهیم خیلی اولیه ی منطق فازی بودن، اما توی کار از همین مفاهیم خیلی ساده و ترکیبشون میشه نتایج خیلی عاقلانه ای گرفت.
ما تا اینجا فقط به پروسه ی Fuzzification پرداختیم! بعد از اینکه عملیات فازی روی سیستم انجام شد در نهایت یه جواب قطعی می خوایم. برای رسیدن به یه جواب قطعی از پروسه ی Defuzzification استفاده میشه.
برای اینکه این فرایند ها رو قشنگ متوجه شید باید حتما یه مثال عملی ببینید! در آینده ی خیلی نزدیک یه مثال از منطق فازی رو با هم می بینیم.

خلاصه

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

خسته نباشید

میدونم این متن خیلی طولانی شد، ببخشید دیگه. در هر صورت اگه تحمل و صبر اینو داشتین که کلشو بخونید خسته نباشید! اگر سوال یا نظری هم دارید می تونید همین پایین بپرسید.برای بحث در رابطه با هوش مصنوعی می تونید به انجمن هوش مصنوعی ایران مراجعه کنید!

لینک های داخلی

لینک های خارجی