بازی Minecraft به کمک یادگیری عمیق

تغییرات پروژه از تاریخ 1396/08/29 تا تاریخ 1396/11/11
شبکه‌های عصبی مصنوعی  یک نوع ارتباط گرایی برای سیستم‌­های محاسباتی هستند که از شبکه‌های عصبی طبیعی الهام گرفته شده‌اند. در چند سال اخیر حوزه‌های هوش مصنوعی به سمت یادگیری عمیق(Deep Learning) و زنده ماندن یک هوش غیر واقعی در شرایط مختلف حرکت کرده‌اند، با توجه به این مهم بازی شطرنج خود یک محیط آزمایشی برای زنده ماندن آن است. در این پروژه قصد داریم که یک مأمور(Agent) برای یکی ازنقشه­‌های بازی Doom طراحی کنیم.
![تصویری از یکی از نسخه‌های بازی Doom](https://boute.s3.amazonaws.com/306-header.jpg)
# مقدمه
بگذارید با این سؤال شروع کنم چرا به هوش مصنوعی نیاز داریم؟ از گذشته تا به امروز همواره آدمی بدنبال راحتی بیشتر در کارهایش بوده است. انسان در تلاش بوده که با سپردن کار خود به دیگران همواره باری را از روی دوش خود خالی بنماید، اما مشکل اساسی اینجا بوده و می‌باشد که انسان‌های دیگر بدون چشم داشت کاری را برای یکدیگر انجام نمی‌دهند. کارگران بازای کارشان دستمزد دریافت می‌کردند و یا یک راهب و شاه با ساختن تصاویر دروغین و باورهای ناسالم آنها را متقاعد به انجام کاری می‌کردند. با این حال دو مشکل اساسی همواره در مقابل کنترل‌گر بوده است یکی ایجاد اطاعت صد در صد که موجب شود کنترل شونده نظرات شخصی خود را وارد کار ننماید و دیگری کیفیت انجام کار. ماشین‌ها تا حد بسیار خوبی این مشکل را رفع کرده‌اند. یک ماشین در مقابل سازنده‌اش به هیچ عنوان قیام نخواهد کرد(حداقل با دانش امروز) و اگر قیامی هم باشد ریشه آن در نوع ساخت ماشین توسط سازنده است و قیام بخواست خود ماشین صورت نمی‌گیرد بلکه ناشی از ضعف وارده به سیستم توسط سازنده می‌باشد پس اگر قیامی هم صورت گیرد ناشی از اقدامات خود کنترل‌گر است، پس در مطیع بودن ماشین نسبت به انسان هیچ شکی موجود نیست و در مورد کیفیت انجام کار نیز ماشین‌ها  **_اگر_** دقیق ساخته شوند درصد خطای بسیار کمتری نسبت به رقیب انسانی خود دارند
اما سؤال دیگر اینجاست چرا از واژه "هوش" استفاده می‌نماییم؟ پاسخ این سؤال از پاراگراف فوق قابل استنتاج است با این حال، سؤال کاملاً بجایی است زیرا ممکن است کسی باشد که بگوید چرا از واژه ید مصنوعی (Intelligence Hand)  استفاده نمی‌نماییم؟ در بازه زمانی که ما در آن قرار داریم به طبع به دنبال طراحی ابتدایی ترین بخش این ماشین هوشمند قرار داریم و طبیعتاً ابتدایی ترین بخش همان قسمتی است که به سایر بخش‌ها فرمان صادر می‌کند والا یک ید بدون فرمان بی دلیل به انجام حرکاتی دست می‌زند که ممکن است خرابی نیز داشته باشد.
با این حال سؤال دیگری مطرح می‌شود که چه چیزی به حرکات این ید جهت می‌دهد؟ هدف! هدف خواسته ایست که توسط سازنده ماشین برای آن تعریف می‌شود. اگر بخواهیم هدف تمام انسان‌ها فراق از آنچه در blind(آنچه دیگران می دانند و خود نمی‌داند)، secret(آنچه خود می‌داند و دیگران نمی‌داند)، unconscious(آنچه نه خود می‌داند و نه دیگران-ناخودآگاه) را مورد مطالعه قرار دهیم و معیار را همان public(آنچه خود می‌داند و دیگران هم می‌دانند) قرار دهیم در ابتدا با چند دستگی بسیاری در اهداف مواجه خواهیم بود اما با کمی دقت به یکسانی و اشتراکاتی می‌رسیم که در قالب‌های به ظاهر متفاوت جلوه پیدا کرده‌اند. شاید بتوان گفت اهداف سازندگان امروز ماشین‌ها بیشتر بر روی اجرایی شدن همین نیازهای ابتدایی شکل گرفته باشد و بعید نیست در آینده تفاوت‌ها و سلیقه‌ها در مسیر رسیدن به اهداف برای کاربران ماشین‌ها نیز نیاز شود.
سؤال دیگری که شاید مطرح شود این است که چرا برای ساخت ماشین انسان را معیار قرار می‌دهیم؟ این سؤالی است که خیلی وقت پیش به گونه‌ای دیگر به پاسخ آن رسیدم. سال‌هاست که در روش‌های هوش مصنوعی کلاسیک ملاک را بر الگوریتم‌های ریاضی برای رسیدن به اهداف قرار داده بودند، اما آیا ما به اندازه کافی زمان و نیرو برای پیاده سازی تمام حالاتی که ممکن است برای یک انسان پدید بیآید را داریم و نکته دیگر اینکه برای انتقال تمام صفات انسان به یک کامپیوتر ما نمی‌توانیم محدود به دانش ریاضی و برنامه نویسی گروهی از انسان‌ها باشیم و شاید اگر قادر بودیم از روح القدسی(و یا هر آنچه انسان کامل خوانده می‌شود) کمک بگیریم مسیر ساده‌تر می‌شود و اینجاست که به کمک گرفتن از خود انسان برای برای ساخت هوش مصنوعی می‌رسیم و موضوع داغ Cognitive Learning می‌رسیم.
سؤال آخر اینکه چطور ماشین ما می‌تواند به هدف نائل شود؟ اینجاست  باید به انسان باز گردیم، یک انسان باید برای رسیدن به هدف ابزارهایی را در اختیار بگیرد و برای استفاده از ابزارها باید نحوه استفاده از آنها را بیاموزد. پس ریشه استفاده از ابزارها در یادگیری آنهاست و از طرفی یادگیری بدون سعی و خطا محقق نمی‌شود. اینجاست که وارد مبحث Deep-Q-learning می‌شویم.
با در نظر گرفتن تمام مقدمات فوق قصد داریم در این پروژه از تمام فرضیات بالا استفاده کنیم. می‌خواهیم یک فضای حالت را در نظر بگیریم که در اینجا یکی نقشه‌های بازی Doom است و یک agent تعریف کنیم که باید همچون یک انسان شروع به یادگیری نماید. یادگیری باید با سعی و خطا صورت گیرد زیرا اگر ما از قبل روش‌هایی را برای او تعریف کنیم به نوعی cheat انجام داده‌ایم و agent ما خود باید با انجام حرکاتی که برای او تعریف شده(حرکت به طرفین و شلیک و ...) را بصورت تصادفی انجام دهد تا بازی کردن را یاد بگیرد. خب موضوع دیگر که مطرح است این است که از کجا باید یاد بگیرد چگونه این حرکات منجر به پیروزی او می‌شود. ما این کار را از طریق تعیین prize انجام می‌دهیم،به این ترتیب که ما رسیدن به یک تعدادی از نتایج که مشخص‌ترین آن در این بازی زنده ماندن است به او یاد می‌دهیم که چگونه به هدف قائل گردد. agent با قرار گرفتن در شرایط شکست فراوان و محاسبه اینکه در هر کدام از شرایط به هدف نهایی نزدیک‌تر می‌شود بازی را یاد می‌گیرد. تیر اندازی دقیق و بالا نگه داشتن جان هم می‌توانند یک جایزه باشند اما باید توجه کرد که اینها خود منجر به cheat نشود چون اگر ما سر مهاجم را تعریف نماییم و بگوییم شلیک به آن منجر به مرگ می‌شود ماهیت کاری را که می‌خواهیم انجام دهیم زیر سؤال برده‌ایم.بازی Minecraft طراحی کنیم.
![توضیح تصویر]()
# چکیده
مجموعه ای از آزمایش ها با استفاده از عوامل مختلف برای حل مسئله ی پروژه مالمو مایکروسافت در محیط مایکروسافت با هدف شناسایی و ارزیابی
مجموعه ای از تکنیک های هوش مصنوعی انجام شد. سه عامل از پیچیدگی های متغیر اجرا شد. اولین عامل، یک عامل تصادفی برای فراهم کردن به عنوان اندازه گیری عملکرد پایه بود. عامل دوم، استفاده از جستجوی آفلاین را با دانشی جامع و همه جانبه نگر از محیط، که توسط جستجوی اکتشافی *A مدل سازی شده، مورد بررسی قرار داد. عامل نهایی یک شبکه ی عصبی را به عنوان ابزاری از Q-learning با رویکرد تقریبی تابع به منظور حل مسئله از طریق فرایندهای یادگیری که شامل تکرارهای مختلف (یا قسمتهای مختلف) از مسئله است، اجرا کرد. این عامل ساده مسیر بهینه ای را در تمام قسمت ها پیدا کرد، اگرچه،
به وجود یک محیط کاملا قابل مشاهده وابسته است. عامل واقع گرایانه نیازمند چندین قسمت یادگیری برای دستیابی به یک سیاست مطلوب بود و می توانست هدف ماموریت را به طور پیوسته با تنظیم پارامترهای فوق العاده خاص از جمله میزان یادگیری و مقادیر E greedy تکمیل کند. با تطبیق این پارامترهای
فوق العاده، اثربخشی آن افزایش پیدا کرد و مدل نهایی را فراهم کرد که مجموعه ای از نتایج همگرا به یک عملکرد واحد و کامل موفق از ماموریت پیوسته را به دست آورد. 

# مقدمه
پروژه مایکروسافت مالمو [1]، محققان را قادر ساخت تا با یک محیط  Minecraft  از طریق یک API ارتباط برقرار کنند. این موضوع به محققین این هوش
مصنوعی اجازه می دهد تا محیط ها را شبیه سازی کنند و تکنیک های مختلف را اعمال کنند و ارتباط و عملکرد آنها را مشاهده کنند. انتخاب خاصی از یک الگوریتم هوش مصنوعی برای استفاده، به شدت بستگی دارد به ویژگی های محیطی که یک عامل در آن عمل خواهد کرد. Malmo جهت  شبیه
سازی  گستره ای از رده هایی از این دامنه های مشخص شده متفاوت به محیط اجازه می دهد که اصلاح شود. در این گزارش دو محیط کلیدی و تکنیک های متناظر هوش مصنوعی به خوبی یک عامل پایه برای مقایسه اجرا می شود. عامل مبنا عاملی است که به طور تصادفی عمل می کند و هیچ تکنیک هوش مصنوعی را به کار نمی گیرد. عامل دوم محیطی کاملا قابل مشاهده دارد و از یک روش جستجوی گرافیکی آفلاین بهره  می برد. عامل نهایی دارای یک محیط واقعی است که شامل عناصر خطای تصادفی است، و  از q-learning به منظور حل مسئله استفاده می کند.
به منظور درک کامل دامنه و چگونگی اثرگذاری تکنیک ها، ابتدا شبیه سازی Minecraft باید به شاخصه های اصلی خود با استفاده از آنالیز PEAS تجزیه شود/ ساده شود/ برگردانده شود. هر چند، نحوه ای که هر عامل میتواند با دامنه ارتباط برقرار کند، کمی متفاوت است و بنابراین محیط های کار مخصوص برای هر عامل نیز ساده/ شکسته می شود.
#   1.1     آنالیز  PEAS
اندازه گیری عملکرد برای هر یک از عامل ها شامل ترکیبی از سه مقدار است: زمان انجام شده برای تکمیل هدف، تعداد اقدامات انجام شده در رسیدن به هدف و پاداش انباشته ناشی از اتمام مسئله. بنابر این یک عامل "منطقی" در این مورد به به گونه ای رفتار می کند تا اقداماتی را اتخاذ نماید که هم زمان و هم شمار عملیات را به حداقل برساند، در حالی که پاداش انباشته را ، به واسطه ی تکمیل مسئله به حداکثر برساند. 
 محیط ماموریت برای سه عامل شامل یک نقشه تولید شده در Minecraft است. سه اندازه مجزای نقشه تعریف شده اند؛ کوچک، متوسط و بزرگ. در این گزارش راه حل ها بر روی اندازه نقشه ی کوچک تمرکز دارند، اگرچه اعمال همان پیاده سازی ها/ روندها به انواع اندازه های نقشه چندان حائز اهمیت نیست. نقشه ها استاتیک هستند و به صورت گسسته در نظر گرفته می شوند، که در اینجا به این معنی است که جایگاه عامل در هر لحظه باید یک نقطه شبکه ای گسسته باشد. در حالی که محیط یکسان است، روش هایی که عامل ها ممکن است با محیط تعامل داشته باشند، متفاوت است . هر نقشه همچنین شامل یک هدف مشخص و مشهود و یک گزینش از الماس هایی که به طور تصادفی واقع شده اند، می باشد.
برای همه ی عامل ها، عملگرها یکسان هستند. عامل ممکن است فقط بر اساس یک مجموعه گسسته از عمل های ممکن (حرکت-شمال، حرکت-جنوب، حرکت-شرق و حرکت-غرب)، با یک مربع شبکه در هر لحظه حرکت کند. این به ماهیت گسسته محیط مرتبط است، به این معنی که نقشه به عنوان یک مجموعه محدود از حالتهای ممکن وجود دارد. عامل ها ممکن است الماس ها را در صورتی که با آن ها در نقشه مواجه شوند، بردارند، اگرچه این امر به عنوان یک مکانیک پیش فرض Minecraft انجام می شود و هدف اصلی این است که به هدف نهایی برسیم، زیرا پاداش الماس ها به طور کلی پایین تر است. عامل ها مفهوم محیط و موقعیت آنها را یا به طور مستقیم از Malmo از طریق یک شیء oracle و یا با استفاده از کلاس ارائه شده عامل کمک کننده، که ممکن است پیشتر بر روی عامل، برای سهولت پیدا کردن مسیر آفلاین، اجرا شده باشد؛ می فهمند. مجددا سنسورها یکسان هستند، اما روندی که آن ها به خدمت گرفته می شوند، درهر عامل نسبت به عامل دیگر، بسته به مسئله، متفاوت است 
#    1.2    محیط وظیفه

محیط وظیفه ویژه برای هر عامل متفاوت است و بنابراین انواع تکنیکهای مسیریابی قابل اجرا گزارش شده است. یک خلاصه از این تفاوتها در جدول 1 نشان داده شده است.
عمال ساده و عامل تصادفی در محیط وظیفه خودهمانند هستند. هر دوی انها می توانند تمام گستره نقشه (که البته برای عامل تصادفی معنایی ندارد) مشاهده کنند. عامل واقعی تنها می تواند محیط اطراف(!) خود، محل عامل و  نقشه اطراف با شعاع یک بلوک را مشاهده کند. علاوه بر این  عامل واقعی همچنین به صورت نامعین (تصادفی) با احتمال خیلی کم (در موارد ارائه شده توسط ما 10%) می باشد که  خروجی واقعی یک عمل همیشه خروجی مورد انتظار نیست. سرانجام عامل واقعی به صورت قسمتی است که به منظور پیدا کردن مسیر بهینه، چندین قسمت نیاز دارد با بعضی یادگیری ها از یک قسمت به قسمت بعدی انجام شده است.
# 2 روش
به منظور ارزیابی عملکرد و محدودیتهای تکنیکهای متنوع هوش مصنوعی، مجموعه ای از تستها در محیط مالمو اجرا شد. به طور مشخص، توانایی های هر عامل جهت حل مسئله ای که به صورت تصادفی تولید شده است؛ به منظور رسیدن به هدف نهایی با بیشترین مقدار جایزه مورد ارزیابی قرار گرفته است. مقدار جایزه بر اساس سه فاکتور اصلی که در بالا به آن اشاره شده است می باشد: زمان اتمام مسئله، تعداد حرکتها تا رسیدن به هدف، و مجموعه اختیاری الماسها در مسیر رسیدن به هدف.
هر سه عامل با استفاده از کتابخانه پایتون (Python) و مدول استاندارد برای تکرارپذیری و مشارکت پذیری همراه با مدول پای تورچ (PyTorch) به کار گرفته شد. این عاملها معمولا به عنوان یک قالب (فریم ورک)  یادگیری عمیق برای به کارگیری هوش مصنوعی و شبکه عصبی مورد استفاده قرار می گیرد. عملکرد پایتون به منظور افزودن تکنیکهای یادگیری عمیق افزوده و پشتیبانی بومی برای اشیاء تنسور در پایتون توسعه داده شد . تمام تستها نمونه هایی از عاملها بودند که بر روی یک ماشین که کنترل بیشتری بر روی متغیر محیطی عملکرد و همچنین مقایسه مستقیم بین عملکرد هرکدام داشته است اجرا شدند.
ماموریت ها به قسمتهای 60 ثانیه ای تقسیم شدند که اندازه کوچک داده شده آنها، جهت اطمینان از این موضوع است که آ) اتمام مسئله با درگیر شدن واقعی از طرف عامل باشد و ب) مجموعه ای بزرگ از آزمایشها می تواند در یک چارچوب زمانی و بهره‌وری معقول انجام گیرد. نتایج جمع آوری شده در تمام قسمتهای اجراشده برای هر عامل جهت مشاهده روندها مناسب بودند. این نتایج در بخش های بعدی ارائه شده اند. نتایج جامع بیشتر به دست آمده نیز در پیوست C ارائه شده است.
https://github.com/MohammadEhsanMirzaaee/Minecraft.git

# کارهای مرتبط

https://keon.io/deep-q-learning/
https://www.practicalai.io/teaching-ai-play-simple-game-using-q-learning/
https://medium.com/@pavelkordik/reinforcement-learning-the-hardest-part-of-machine-learning-b667a22995ca

#مطالب مرتبط
https://deepmind.com/research/alphago/
https://www.intelnervana.com/demystifying-deep-reinforcement-learning/
https://www.doc.ic.ac.uk/~nd/surprise_96/journal/vol4/cs11/report.html