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

تغییرات پروژه از تاریخ 1396/11/11 تا حالا
شبکه‌های عصبی مصنوعی  یک نوع ارتباط گرایی برای سیستم‌­های محاسباتی هستند که از شبکه‌های عصبی طبیعی الهام گرفته شده‌اند. در چند سال اخیر حوزه‌های هوش مصنوعی به سمت یادگیری عمیق(Deep Learning) و زنده ماندن یک هوش غیر واقعی در شرایط مختلف حرکت کرده‌اند، با توجه به این مهم بازی شطرنج خود یک محیط آزمایشی برای زنده ماندن آن است. در این پروژه قصد داریم که یک مأمور(Agent) برای بازی Minecraft طراحی کنیم.
![توضیح تصویر](بازی Minecraft](https://boute.s3.amazonaws.com/306-unnamed2.jpg)
# چکیده
مجموعه ای از آزمایش ها با استفاده از عوامل مختلف برای حل مسئله ی پروژه مالمو مایکروسافت در محیط مایکروسافت با هدف شناسایی و ارزیابی
مجموعه ای از تکنیک های هوش مصنوعی انجام شد. سه عامل از پیچیدگی های متغیر اجرا شد. اولین عامل، یک عامل تصادفی برای فراهم کردن به عنوان اندازه گیری عملکرد پایه بود. عامل دوم، استفاده از جستجوی آفلاین را با دانشی جامع و همه جانبه نگر از محیط، که توسط جستجوی اکتشافی *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

# 3- عامل غیرحساس
اولین عامل آزمایش شده یک عامل غیرحساس یا (nave) بود تا سطح مبنای عملکرد را فراهم کند. این عامل از هیچ حسگر ورودی استفاده نکرد و هیچ دانش پیشینی نه از فضای حالت، و نه هیچ پاداشی یا هدفی نداشت (بدین جهت به عنوان غیر حساس نامیده می شود)، و یک مبنای قابل اطمینان را در مقابل عوامل پیچیده تر فراهم میکرد که میتوانستند ارزیابی شوند.

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

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


# 4- عامل ساده

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

1.4 جستجوی A*
با توجه به این که وضعیت شروع و هدف از محیط قابل مشاهده است، عامل می تواند از روش جستجوی آگاهانه استفاده کند. برای مشکلات با یک حالت شروع و هدف، جستجو A* نشان داده است که، هم در نیازهای زمان محاسباتی و هم نیازهای حافظه یک الگوریتم بسیار موثر است[3]. جستجو های A* همچنین نشان داده اند که بسیار موثرتر از سایر روش های جستجوی اطلاعات مانند الگوریتم Dijkstra هستند. همچنین می توان نشان داد که با توجه به یک تابع ثابت H(n) اکتشافی، جستجو گراف A*  بهینه است [4]. 
![خواص محیط برای هر عامل](https://boute.s3.amazonaws.com/306-Untitled.jpg)
مهم است که توجه داشته باشیم که این راه حل تنها به صورت جزئی کار می کند، زیرا اقدامات قطعی تعیّنی است. در محیطی که این مورد لحاظ نمی شد، A*   یا هر راه حل مشابه دیگری اجرایی نبود. بدون جبرگرایی، تضمین نمی شود که عامل به درستی مسیر محاسبه شده را پیروی کند.

4.2 پیاده سازی 
عامل ساده به دو قسمت اصلی تقسیم می شود. در بخش اول، مرحله "برنامه ریزی"، عامل بازنمایی های محیطی را از اوراکل بازیابی می کند و سپس جستجو آفلاین را، در این مورد، جستجو A \* انجام می دهد. این بخش یک مسیر بهینه را ایجاد می کند که بعد به عامل Malmo بازگردانده می شود. این عامل سپس مسیر ساخته شده را در محیط مالمو اجرا می کند. با استفاده از کلاس "agent helper" در کد داده شده، عامل ابتدا چهار از عنصر اطلاعات دامنه را بازیابی می کند. اولین نمایش، شامل نمایش شبکه ای، به عنوان یک شیء فرهنگ لغت، حاوی تمام حالت های ممکن است که یک عامل ممکن است در هر زمان داشته باشد. هر ورودی برای این فرهنگ لغت یک شناسه حالت به عنوان کلید و هماهنگی(x، y) به عنوان مقدار است. دومین آنها، لیست انتقال است. این به سادگی نقشه تبدیل حالات را به حالت های دیگر ارایه می دهد که در آن عمل ممکن است عامل را از یکی به دیگری ببرد.  دو حالت نهایی، شامل حالت اولیه عامل و حالتی است که حاوی هدف است. سپس عامل می تواند از این اطلاعات برای ساختن مسیر بهینه استفاده کند. توابع اکتشافی که در این پیاده سازی استفاده می شود، فاصله منهتن است. این توابع اکتشافی با جستجوهای مبتنی بر حرکت افقی و عمودی سازگار است، زیرا نشان دهنده کوتاهترین مسیر ممکن بین دو نقطه در یک شبکه است. با توجه به دو اظهارنظر فوق، این باید منجر به مسیر مطلوب شود. این مرحله برنامه ریزی لیستی از حالت هایی را نشان می دهد که مسیر مطلوب به هدف را نشان می دهند. به محض این که مسیر بهینه بازگردانده می شود، عامل سپس هر حالت را از مسیر باز می کند و حالت به یک عمل تبدیل می شود که آن را به این حالت منتقل می کند تا زمانی که هدف به دست می آید. ترجمه حالت-عمل توسط یک تابع مفید انجام می شود، که جهت حرکت را براساس هر دو مختصات(x،y) انجام می دهد. این کار با یک ماز با استایل شبکه ساده تر شده است. با توجه به اینکه محیط اطمینان قطعی (با نویز صفر و یا خطا در اقدامات خود)، تضمین شده است که عامل دقیقا به این مسیر را دنبال کنید.

4.3. نتایج
به طور مشابه با عامل تصادفی، عامل ساده فقط برای تعداد کمی از موارد (دوباره 10 در مجموع) برای ارزیابی عملکرد آن اجرا شد. از آنجا که این رویکرد یک روش جستجوی آفلاین است، اکثر محاسبات قبل از عامل انجام مسیر در مالمو انجام می شود، به این معنی است که پس از اجرا، یک مسیر بهینه در حال حاضر پیدا شده است. این به محیط کار برای این عامل مربوط می شود، چون این امر اپیزودیک نیست، یادگیری از یک قسمت به بعد منتقل نمی شود. بنابراین مدت زمان لازم برای پایان دادن به پیچ و خم و تعداد اقدامات از اولین نمونه اجرا به طور مداوم پایین است. عامل با موفقیت ماز را در هر تکرار تکمیل کرد . برای تکمیل یک پیچ و خم کوچک، به طور متوسط 6 ثانیه طول کشید. با این حال، عملا، این به سادگی (Nm Tm X) بود که Nm تعداد حرکت است، و Tm وقت گرفته شده برای اجرای حرکت، با توجه به این که برنامه ریزی  خارج از خط انجام شد. 

# 5. عامل واقعی
در این بخش، مسئله یک محیط ناشناخته با حسگر ورودی "واقعی" حل می شود. عامل هیچ اطلاعات قبلی در مورد فضای حالت ندارد و تنها ورودی ها برای عامل سنسورهایی هستند که مکان فعلی عامل را ارائه می دهند. علاوه بر این، محیط تصادفی (با سطح سر و صدای 10٪) است که هر بار که عمل توسط عامل انجام می شود، اقدام واقعی با احتمال 0.1 متفاوت است، که عامل را مجبور میکند در یک وضعیت غیر منتظره کار را به پایان برساند. به همین علت، نتیجه گیری می شود که این مشکل تا حدی قابل مشاهده و تصادفی است. علاوه بر این، از زمانی که یادگیری از یک قسمت به بعد انجام می شود و یادگیری بر روی تعدادی از قسمت ها انجام می شود، آن را به عنوان یک مسئله اپیزودیک گروه بندی می کنیم.

5.1 روش
این کار با استفاده از رویکرد تقریبی تابع خطاب می شود. بر اساس تقریب عملکرد، نیازی نیست که یک جدول برای مقادیر Q بدست آوریم. در عوض، NN ها
برای یادگیری برای پیش بینی مقادیر Q مطابق با حالت عامل عامل استفاده می شوند. برای حل این بخش با استفاده از Q-learning، ابتدا تعریف می کنیم که چه حالت هایی هستند. سپس، معماری NN، بهینه ساز آن، تعداد نورون ها در یک لایه و روش حافظه پخش را توضیح می دهد. از طریق ترکیبی از یادآوری عمل و تقریب q-value، این روش نشان داده که در زمینه های متنوع  کار می کند.
بخش مهمی از Q-learning تعریف چیزی است که «حالت ها» قلمداد می شود. انتخاب مشخصه های مناسب محیط برای تعریف حالت ها تأثیر زیادی بر نتیجه نهایی دارد. برای این مشکل خاص، موقعیت عامل در شبکه قابل دسترسی است و به عنوان تعریف عامل ما از حالت آن استفاده می شود. این برای مساله موجود در این گزارش صدق می کند، اما این ممکن است در همه مسایل وجود نداشته باشد، جایی که محل عامل ممکن است برای بازیابی در دسترس یا عملی نباشد.
با توجه به این که این گزارش بر روی یک اندازه نقشه کوچک تمرکز دارد، معماری NN لازم نیست که لایه های زیادی داشته باشد. به همین دلیل ما آزمایش های خود را با یک لایه آغاز کردیم و آن را به دو لایه گسترش دادیم. یک دید کلی از شبکه در شکل 1 نشان داده شده است. تعداد نورونها در هر لایه NN به 30 تنظیم شده و هر واحد عصبی به صورت جداگانه از یک واحد خطی مجزا (ReLU) برای ضبط نتایج غیر خطی از داده استفاده می کند. با توجه به الگوریتم بهینه ساز، بهینه ساز Adam مورد استفاده قرار می گیرد. دلیل این انتخاب این است که بهینه ساز Adam از نرخ یادگیری تطبیقی مشتق شده از ممان های  اول و دوم شیب استفاده می کند [7].
برای ایجاد فرآیند یادگیری کارآمدتر، یک روش به نام حافظه بازپخش اعمال می شود. به روز رسانی وزن NN با یک تجربه تاثیر بسیار کمی بر وزن  داشته و به همین ترتیب روند یادگیری را طولانی تر می کند. با استفاده از حافظه بازپخش، به جای به روز رسانی NN تنها با یک تجربه، می توان آن را با تعدادی از تجارب
گذشته که باعث می شود یادگیری کارآمد تر به روز رسانی شود. علاوه بر این، اگر عامل در برخی از اپتیما های محلی گیر داشته باشد، می تواند از تجربیات دیگر که قبل از خروج به دست آمده استفاده کند. این کمک می کند تا وزن NN را به گونه ای به روز کنید تا عامل را از اپتیک های محلی نجات دهید و از اینکه شبکه  با تجارب کنونی بیش از حد پر شود، جلوگیری کنید.
در نهایت، مقادیر Q از یک لایه Softmax عبور داده می شود تا توزیع احتمالی بیش از مقادیر Q را دریافت کند. برای ایجاد تأثیر مقادیر Q، قبل
از انتقال آنها به لایه Softmax، از مقدار مقیاس، به نام دما، که مقادیر Q را 100 برابر افزایش می دهد، استفاده می شود. به این ترتیب، خروجی هایی که اساسا دارای احتمال وقوع اقدامات در یک حالت مشخص هستند، در تعداد بیشتری وجود داشته و عدم اطمینان بیشتری در فعالیت ها نشان می دهد.

5.2 ارزیابی
برای پیدا کردن بهترین پارامترهای فوق برای NNs، تعدادی از آزمایشات با تنظیمات مختلف مورد آزمایش قرار گرفتند. در ابتدا، معماری NN برای پیدا کردن بهترین نرخ یادگیری و ارزش مطلوب برای زیر رده حریص، قبل از گسترش شبکه به لایه های دیگر، ساده نگه داشته شد.
یکی از پارامترهای بالا که نیاز به تنظیم دارد حداکثر تعداد خاطرات (MNM) است. در ابتدای آزمایشات، به 100000 حافظه تنظیم شد. با این حال،بر اساس مشاهدات ما، به طور متوسط، یک عامل در هر قسمت حدود 2000 عملیات انجام می دهد که در آن نمی تواند به هدف برسد. به همین دلیل وقتی MNM به 100000 تنظیم می شود، خاطرات از تجربیات قبلی به روز می شود و هر 
![شکل1: معماری NN](https://boute.s3.amazonaws.com/306-unnamed23.jpg)
50 قسمت را جایگزین می کند.علاوه بر این، مشاهده شد که احتمال استفاده از تجربیات قسمت از قسمت هایی که عامل به هدف می رسد، در میان آنهایی
که به قسمت های ناموفق مربوط می شود، بسیار پایین بود. با توجه به این واقعیت که وقتی یک عامل به هدف برسد، تعداد اقدامات انجام شده حدود 200 است، احتمال استفاده از تجربیات موفقیت آمیز حدود .0.002٪ است. این مشاهدات ما در عوض به سمت 5000 تا سوق می دهد. به این ترتیب تنها تجربیات دو قسمت آخر حفظ می شود و اگر عامل به هدف برسد و موفقیت های آن را تکرار کند، فرصت بیشتری برای یادگیری و به روز رسانی وزن NN با استفاده از آن تجربیات دارد. در آزمایشات زیر، MNM به 5000 تنظیم شده است. برای پیدا کردن بهترین معماری NN، ما به طور پیوسته مقادیر مشخصی را تغییر دادیم. در ابتدا، میزان یادگیری متفاوت مورد آزمایش قرار گرفت و تعدادی از لایه های پنهان و یک زیر مجموعه حفظ شد. یعنی تعدادی از لایه های پنهان برای NN و یک زیر رده از حریص به ترتیب به 1 و 0: 9 تنظیم شده است. نتایج به دست آمده برای میزان یادگیری متفاوت در شکل 2 نشان داده شده است. با وجود اینکه بهینه سازی Adam برای NN و میزان یادگیری توصیه شده برای آن 0: 001 است، نتایج نشان می دهد که میزان یادگیری 0: 0001 نتایج بهتر را دریافت می کند. بررسی نتایج نشان می دهد که میزان یادگیری 0:01 با یادگیری از طریق هر مسیر خاص در رقابت بود. بعضی از پیشرفتها هر چند بعد از هر بار، بدون استفاده از تجربیات خود از این قسمت قبلی موفق ناگهان افت می کند . این مشکل به طور مستقیم به دلیل نرخ یادگیری بالا ایجاد می شود. نرخ های یادگیری بالا باعث می شود که وزن شبکه با مقدار زیادی از ورودی های فعلی به روز شود. به این ترتیب، اگر وزن شبکه تا به حال خوب تنظیم شده باشد، یک تجربه ناموفق ممکن است برخی از این تنظیم ها را لغو کند. همان روند را می توان از میزان یادگیری 0: 001 مشاهده کرد. در ابتدا، عامل گیر کرده بود و چیزی از تجارب آموخت. با این حال، پس از رسیدن به هدف نهایی در قسمت 15 و تکرار موفقیت، افت سرعت ناگهانی در موفقیت عامل رخ داد. نتایج نشان می دهد که با یک میزان یادگیری 0: 001، عامل حداقل برای دریافت حداقل پاداش یاد گرفته است، اما این نتیجه هنوز قطعی نیست. این باعث می شود میزان یادگیری به 0: 0001 کاهش یابد که بهترین نتیجه را به دست آورد. این میزان یادگیری شبکه به طور قابل توجهی بهبود یافته است. می توان از شکل 2 مشاهده کرد که پس از 12 قسمت آزمایش اولیه و خطا، عامل  رسیدن به هدف نهایی و موفقیت آمیز بودن آن در قسمت های بعدی را یاد می گیرد. کاهش در پاداش را می توان در قسمت 38 دید که می تواند به محیط تصادفی نسبت داده می شود، اما عامل بطور موفقیت آمیز از این کاهش احیا شده و به همان سطح قبل رسیده است. بهترین پاداش با نرخ یادگیری 0: 0001  به عدد 
957به دست آمده است.
![شکل2. عملکرد در حال تغییر نرخ یادگیری در
معماری NN: حریص-اپسیلون = 0.9 با یک لایه](https://boute.s3.amazonaws.com/306-unnamed234.jpg)
با در نظر گرفتن بهترین میزان یادگیری، 0: 0001، مقادیر دیگری از مقادیر حریص مورد بررسی قرار گرفت. انگیزه برای این آزمایش این بود که ببینیم آیا پایین زیرمجموعه از حریص به عامل در یافتن مسیر سریع تربه سمت هدف نهایی کمک کرده است یا نه . با کاهش اپسیلون به 8: 0، عامل قادر به پیدا کردن مسیر سریعتر نشد و اولین تلاش موفقیت آمیز در قسمت 11 رخ داد که بسیار مشابه با اپسیلون 0: 9 است. یک رده زیر نیز تا 0: 7 کاهش یافت. عامل موفق شد مسیر را سریعتر در قسمت 6 پیدا کند، با این حال، کاهش شدید در قسمت 44 وجود دارد که عامل آن نمیتواند بهبود یابد. این به دلیل استفاده از مقیاس کم ارزش زیرمجموعه حریص رخ داد که باعث شد اکتشاف بیشتری نسبت به مقدار مورد نیاز انجام شود. به این ترتیب می توان نتیجه گرفت که پایین رده زیر حریص  برای یافتن هدف سریعترمی تواند مفید باشد، با این حال، با داشتن وزن شبکه های تنظیم شده، ممکن است به علت درجه بالایی از اکتشاف، عامل گمراه شود. بهترین پاداش با اپسیلون 8: 0، 957 است. با این حال، به طور کلی، عوامل با اپسیلون 0: 9 بهتر عمل می کنند. در آینده کار بر روی این موضوع ممکن است به این نتیجه برسد که طی کاهش زیرمجموعه ی  پویا که در حین اجرا بعنوان دیگر پارامترهای بالاتر تنظیم شود، ممکن است نتایج بهتر به دست آید. در نهایت، تعداد لایه های پنهان در NN به 2 افزایش یافت. برای مشاهده اثر این لایه اضافه شده، آزمایشات بالا برای دو لایه تکرار شد. نتایج در ضمیمه ب نشان داده شده است. با این حال، پیشرفت مورد انتظار به دست نیامد. بهترین میزان یادگیری 0:01 بود، که روند ثابت داشت، تنها موفق به پیدا کردن الماس در نقشه شد و در نتیجه آن حدود 12000 پاداش را حفظ کرد. نرخ یادگیری 0: 001 نقشه 10 قسمت اول را بهتر از سایر نرخ های یادگیری بررسی کرد، اما بعد از قسمت 10، عملکرد کاهش یافت و عامل در 50 قسمت موفق نشد. به همین علت، هر دو نرخ یادگیری، 0: 001 و 0:01، با امید به دست آوردن پاداش بهتر برای دو لایه، با مقادیر مختلف اپسیلون مورد آزمایش قرار گرفتند. همانطور که در شکل 5b و شکل 5c نشان داده شده است، بهترین نتایج برای یادگیری 0:01 و 0: 001 به ترتیب با اپسیلون 9: 0 و 7: 7 بدست آمد. با این حال، هیچ نتیجه ای بهتر از یک لایه به دست نمی آید.
![شکل3.عملکرد در حال تغییر متغیرهای اپسیلون حریصانه در معماری NN: نرخ یادگیری
= 0.0001 با یک لایه](https://boute.s3.amazonaws.com/306-unnamed2345.jpg)

برای مقایسه NN های مختلف، سه مدل نهایی با بهترین نتایج در شکل 4 ترسیم شده اند. برای این مشکل، نتیجه مطلوب با استفاده از یک NN با یک لایه، میزان یادگیری 0: 0001 و پارامتر اپسیلون برای 0: 9. این عاملی را ایجاد کرد که ماموریت را به طور مرتب با دقت بالا انجام می داد،  تا کمتر از 10 ثانیه پس از آموزش درست وظیفه راتکمیل می کرد، و به نمره مثبت در معیارهای استفاده شده ، و روند تدریجی در جهت همگرایی مطلوب دست میافت. 
![شکل 4: مقایسه مدلهای نهایی](https://boute.s3.amazonaws.com/306-unnamed23456.jpg)

# 6- نتیجه گیری و بحث
نتایج نشان می دهد که با توجه به مجموعه ای از پارامترهای تنظیم شده، یک شبکه عصبی می تواند به طور موفقیت آمیز برای ایجاد یک سیاست مطلوب برای تکمیل ماموریت های تعریف شده برای به حداکثر رساندن پاداش در یک محیط ناشناخته اجرا شود. همانطور که از عوامل مؤثر که از ورودی حسی استفاده می کنند، انتظار می رود، عامل ساده و عامل واقع گرایانه هردو عامل خارج از کنترل تصادفی در تعدادی از موارد می باشند. عامل واقع گرایانه و
ساده به نتایج مشابهی قوی دست یافت، با این حال، هر عامل نیاز به تفاوت در محیط برای موفقیت دارد، و شاید بهتر باشد به چالش های خاصی برسد. A * نماد عامل با دانش کامل و بدون تصادفی است، که البته نماینده یک سناریو از جهان واقعی است، اما این روش مناسب برای محیط هایی است که به شدت کنترل می شود. عامل واقع گرایانه نماینده یک دنیای واقعی است، با این حال، برای مقابله با این، عامل نیاز به یک روند آموزش بالقوه طولانی دارد و همچنین قادر به مقابله با یک محیط اتفاقی یا سر و صدای خارجی است. 
با وجود نتایج، باید اشاره کرد که محدودیت های ذاتی خاصی بر عامل واقعی وجود دارد، بخصوص به دلیل ماهیت شبکه های عصبی. در مرحله اول، در حالی که نتایج تا حد زیادی قابل تکرار بود، برخی از واریانس ها است با با تست های آینده قابل انتظار هستند، حتی در یک پیکربندی یکسان، به عنوان عناصر تصادفی در محیط ممکن است ماهیت یادگیری شبکه را تحت تاثیر قرار دهند. یک شبکه عصبی ماهیتا در عمل و کارکرد نسبتا مبهم است و بنابراین تجزیه و تحلیل و یا بازخوانی چگونگی دستیابی به الگوی اکتشافی مطلوب، دشوار است. علاوه بر این، حتی با کارایی یک عامل مبتنی بر شبکه عصبی، محدودیت های خاصی بر سودمندی آن وجود دارد که در حالی که مانع تست های ما نمی شود، ممکن است قابلیت استفاده و مناسب بودن آن را برای برخی از سناریوهای دنیای واقعی تحت تاثیر قرار دهد. در مرحله اول، شبکه و عصب های آن یکبار به یک کار تخصصی تبدیل می شوند و به همین ترتیب به راحتی قابل تنظیم و قابل انتقال به موارد دیگر نیستند. این را می توان به پارامترهای بیش از حد گسترش داد، به عنوان یک مجموعه داده شده از پارامترهای تنظیم شده ممکن است برای یک محیط متفاوت مطلوب نباشد. این یک مشکل مشابه است که به طور ذاتی با Q-learning مواجه است. با توجه به اینکه مقادیر q برای یک ماز داده شده فقط برای همان ماز خاص استفاده می شود، با استفاده از شبکه ساده یا عصبی، q-learning از این فقدان قابلیت انتقال قابل رؤیت است. 
ثانیا، ما مراقب بودیم که تعداد موارد انجام شده در هر آزمون را محدود کنیم تا از چنین مسائلی بیش از حد جلوگیری کنیم (در حالی که تقریبا تمام روشهای یادگیری امکان پذیر است)که خطر خاصی برای استفاده از شبکه های عصبی است. این حتی می تواند منجر به عقب نشینی روند همگانی در موارد جدی شود. پیکربندی بهینه ما نشان دهنده  همگرایی تدریجی به سمت مسیر بهینه و امتیازی برای هر ماموریت در زمانی بود که پارامترها تنظیم شده بودند، اما این ممکن است همیشه در جایی که  خود با صفت یادگیری مداوم برای صدها اجرا انجام شود، صحیح نباشد.
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

#منابع
[1] Matthew Johnson, Katja Hofmann, Tim Hutton, and
David Bignell, “The Malmo Platform for Artificial Intelligence
Experimentation,” in Proceedings of the Twenty-
Fifth International Joint Conference on Artificial Intelligence.
2016, IJCAI’16, pp. 4246–4247, AAAI Press.
[2] Adam Paszke, Sam Gross, Soumith Chintala, and Gregory
Chanan, “PyTorch: Tensors and Dynamic neural
networks in Python with strong GPU acceleration,” 2017.
[3] S. M. Masudur Rahman Al-Arif, A. H. M. Iftekharul Ferdous,
and Sohrab Hassan Nijami, “Article: Comparative
Study of Different Path Planning Algorithms: A Water
based Rescue System,” International Journal of Computer
Applications, vol. 39, no. 5, pp. 25–29, February
2012, Full text available.
[4] Stuart Russell and Peter Norvig, Artificial Intelligence:
A Modern Approach, Prentice Hall Press, Upper Saddle
River, NJ, USA, 3rd edition, 2009.
[5] Volodymyr Mnih, Koray Kavukcuoglu, David Silver,
Alex Graves, Ioannis Antonoglou, Daan Wierstra, and
Martin A. Riedmiller, “Playing Atari with Deep Reinforcement
Learning,” CoRR, vol. abs/1312.5602, 2013.
[6] Bing-Qiang Huang, Guang-Yi Cao, and Min Guo, “Reinforcement
Learning Neural Network to the Problem
of Autonomous Mobile Robot Obstacle Avoidance,” in
2005 International Conference on Machine Learning and
Cybernetics, Aug 2005, vol. 1, pp. 85–89.
[7] Diederik Kingma and Jimmy Ba, “Adam: A
Method for Stochastic Optimization,” arXiv preprint
arXiv:1412.6980, 2014.
[8] Jason Yosinski, Jeff Clune, Yoshua Bengio, and Hod Lipson,
“How Transferable are Features in Deep Neural Networks?,”
in Advances in neural information processing
systems, 2014, pp. 3320–3328.