<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Ami Reza Mohammadi</title><link>https://virgool.ir/feed/@amirreza.m95</link><description>ارشد هوش مصنوعی ، دیباگر پایتون، شعبان ماهی فروتن :)</description><language>fa</language><pubDate>2026-11-11 14:22:19</pubDate><image><url>https://files.virgool.ir/upload/users/8184/avatar/avatar.png</url><title>Ami Reza Mohammadi</title><link>https://virgool.ir/@amirreza.m95</link></image><item><title>ابربازی، فراتر از یک رویداد شتابدهی عادی</title><link>https://virgool.ir/@amirreza.m95/ابربازی-فراتر-از-یک-رویداد-شتابدهی-عادی-ee9eicafhpaj</link><description>در این پست قصد دارم در رابطه با رویداد ابربازی که ابرآروان برگزار کرده بنویسم. با این هدف که تجربم در این رویداد رو به عنوان یک شرکت کننده به اشتراک بزارم با :شرکت کننده های سال های بعدی این رویداد  کسایی که در رویدادی مشابه شرکت کرده و یا اونرو برگزار کردن تا با استاندارد های این رویداد آشنا بشن برگزار کنندگان این رویداد لوس نیستم، چاپلوسم نیستم!این پست رو تقریبا در اوسط مهر 99 مینویسم و در 20 مهر و کمی قبل از اعلام نتایج برنده های رویداد به اشتراک میزارم که ی موقع این برداشت که این پست به خاطر لوس کردن خودم برای آروان :) یا احیانا بعد اعلام نتایج و تحت تاثیر اون نباشه. خوشحال میشم اگه بقیه دوستانی که تو این رویداد شرکت کردن هم بیان زیر این پست نظر بدن اگه قابل دیدن :)جوایز اصلیمقدمه و تعریف از خود!خب اولش یکم داستان بگم که اصلن من با این رویداد چجوری آشنا شدم و من کیم. دانشجوی سال دوم ارشد هوش مصنوعی در دانشگاه تحصیلات تکمیلی در علوم پایه زنجان، کار اصلیم هوش مصنوعی و یادگیری ماشین،  به صورت تخصصی تر در حوزه AutoML  و اگه خواستین بیشتر بدونین اینجا کلیک کنید. علاقه مند به استارتاپ و کارآفرینی و به صورت اکادمیک هم به کار های applied Machine learning علاقه دارم و سابقه دو شکست استارتاپی هم داشتم.آشنایی من با آروان و ابربازیش :)ی روزی از روز ها :) یکی از دوستام که الان اصن یادم نمیاد کی بود :) بهم گفت که ی شرکتی میشناسه به اسم ابرآروان که به نظرش خیلی کار درسته و  اگه بتونم برای پروژه سربازی براشون طرح پیشنهادی بنویسم و خلاصه قاطیشون شم خیلی میتون بهم کمک کنه.  پیگیر شدم و از طرفی ی ذهنیتی هم داشتم از آروان. دکوراسیون کاربردی و ساده غرفشون در الکامپ 98 و حضور وزیر جوان تو غرفشون همون لحظه کن من اونجا بودم و نشوندن وزیر روی بین بگ های غرفه :) خاص بود و فکر شده.  سایتشون رو چک کردم و حقیقتا حال کردم باهاشون. یکم که سرچ کردم چیزایی شنیدم که خیلی کنجکاوم کرد. آروان کار های خاصی میکنه که قبلا ندیده بودم.  یکم که سرچ کنین یا از مصاحبه های بنیان گذارانش که بشنوین خیلی در مورد این ویژگی های خاص سوال میشه. مثل اسم هایی که برای افراد گذاشتن به جای لفظ های CTO , CEO مثل ناخدا و مرشد و ... یا حقوق شفاف، نوشتن در مورد حملاتی که بهشون شده در بلاگ خودشون با جزییات در حالی که عموما این مسایل اعلام عمومی نمیشه که به اعتبار شرکت لطمه نزنه و از همه جالب تر برای من کلاس کاری و سواد و شخصیت بنیان گذاران آروان. اسم هم نمیبرم چون خود آروانی ها اصن اعتقادی به این ندارن که کسی صاحب و همه کاره آروانه و این اسم شرکته که باید همه جا بدرخشه و خب اون تعدادی که من میشناسم از تیم آروان همه اوکین. خیلی دوس دارم بنویسم براتون از چیزایی که خوندم و شنیدم در موردشون ولی میترسم از بحث دور بشم ولی امیدوارم کنجکاوتون کرده باشم حداقل، که خودتون پیگیر شین! من توی جا های مختلف در مورد رویداد سوار ابرها که هرسال آروانی ها به قصد ارایه گزارش عملکرد یکساله و برنامه های آیندشون برگزار میکنن شنیده بودم و می خواستم حتما سال 98 تو این رویداد شرکت کنم. پیج هاشون رو فالو کردم و از اینستا خبردار شدم که قراره اواخر بهمن برگزار بشه. ثبت نام کردم. رویدادی رایگان! در اسپیناس پالاس! اصن هنگ میکنه آدم که چطور رویداد 3000 نفری رایگان! ( ولی خب توجیه مسیله اینه که آروان باید اینجوری تبلیغات کنه و بیلبورد زدن به دردش نمیخوره و خب هزینه این رویداد هم با توجه به اینکه اسپانسر هم داشتن برای بخشی از هزینه ها، از زدن بیلبورد در اتوبان همت کم هزینه تره! بازم حاشیه ^_^ )من رفتم سوار ابرها که لینک بزنم با بچه های آروان و تاجایی هم موفق بودم ولی خب جزییاتش بماند. ^_^ خبر خوب برای من که کارم هوش مصنوعیه و آروانی که خدمات هوش مصنوعی نداره این بود که اولا آروان به دنبال تبدیل شدن به Google cloud, Microsoft Azure , Amazon AWS هستش پس بالاخره سمت هوش خواهد رفت و از اون مهم تر قراره یه رویداد ابربازی برگزار کنه و 999 توسعه دهنده رو زیر یک سقف جمع کنه! برای پیدا سازی ایده هایی با محوریت کلود. توصیه میکنم این رویداد رو فیلمش رو اینجا ببینین. واقعا کیفیت برگزاری در سطح جهانی بود و در مواردی حتی مثلا بهتر از رویداد مشابه Google IO.واکنش #وزیرجوان به خبر نخستین فروش آنلاین بین‌المللی #ابرآروان و اما ابربازی ... توی همون سوار ابرها توضیح داده شد که مراحل برگزاری رویداد ابربازی به چه شکله. ولی خب لزوما اون اتفاق ها نیوفتاد. چرا؟ دقیقا، کرونا!اولین مرحله: پیش ثبت نام ----&gt; ۲۷ بهمن تا ۳۰ فروردینخیلی ساده بود. در حد اسم و فامیل و ایمیل و والسلام!مرحله دوم: تکمیل اطلاعات ثبت نام تا 15 اردیبهشتاین مرحله اطلاعات دقیق تری گرفته شد، مثل تحصیلات و وضعیت اشتغال، به همراه اطلاعاتی از تخصص کاری با جزییات و مورد به مورد.  قرار بود بر اساس تخصص های یک روزی رو مشخص کنن که توی کویرا آزمون ورودی داده بشه. هوش مصنوعی خیلی به صورت مشخص در گزینه ها نبود و من گزینه سایر رو زدم و در مورد چیز هایی که بلد بودم توضیح نوشتم. ولی خب به صورت کلی بخش های مختلفی مثل حوزه‌های مختلف برنامه‌نویسی، دیجیتال مارکتینگ، طراحی  رابط کاربری و محصول و توسعه‌ی کسب‌وکار رو هم داشت و در کل، بنظرم با هر تخصصی در حوزه کامپیوتر شرکت کنین حتی اگر در عنوان ها نبود، چرا که ایده های مطرح شده در مسابقه ( ایده ها رو بعدا وقتی وارد مرحله تیم کشی شدیم اعلام کردن) بعضی هاشون تخصص های متنوع مثلا هوش مصنوعی رو لازم داشتن و خب در ثبت نام اصن عنوان هوش مصنوعی هم جزو موارد نبود! ( مثال بارزش AI writing assistant , Machine  learning software  ) من همون موقع ایده پیاده کردن Google Cloud AutoML رو برای آروان تو ذهنم داشتم و اصلن اول هدفم نوشتن همون ایده به صورت پروپوزال برای آروان بود. به همین خاطر امیدوار بودم که بتونم وارد رویداد بشم و بتونم اون ایده رو مطرح کنم. توی موعد مقرر ایمیل مربوط به آزمون برای من نیومد و من با یه حالت تیری در تاریکی توی اینستا یکی از استوری هاشون که مربوط به ابربازی بود رو ریپلای کردم که چرا ایمیل نگرفتم، که خوشبختانه :) جواب دادن که باید به فلان کس ایمیل بزنم و مشکلم رو بگم ک زدم و به موقع هم جواب گرفتم. برای تخصص های متفرقه توی کویرا آزمونی نداشتن ولی برام یه فرمی فرستادن که در مورد جزییات کارم و رزومه و دلیل شرکت کردنم پرسیده بودن که جزییات زیادی داشت. چیزی که بعدا از بقیه پرسیدم این بود که آزمون های کویرا هم خیلی سخت نبوده و به نظرم هدف این بوده که افرادی که خیلی شوتن رو غربال کنن، البته فقط حدسمه و امیدوارم به کسایی که کاردرست بودن و قبول نشدن بی احترامی نکرده باشم. تقریبا بعد 15 روز ایمیل زدن که قبول شدم.تیم سازی و انتخاب ایده ----&gt; 6 تا 13 اردیبهشتتیم سازی به صورت آنلاین و توی راکت چت انجام شد به اینصورت که لینک دعوت به همه شرکت کننده ها فرستاده شد و داخل راکت چت یه سری چنل تعریف کردن که شامل یه سری چنل عمومی و یه سری چنل ایده ها می شد. شرکت کننده ها باید توی چنل هایی که ایده هاشون رو دوست داشتن جوین میشدن و اونجا با بحث با سایر علاقمندان تیم تشکیل میدادن. منم سعی کردم ایده هایی رو که با محوریت هوش مصنوعی بودن رو جوین شم و ببینم چند چندیم :) یک سری آزمون های شناخت شخصیت کاری و اخلاقی هم توسط آروان معرفی شد که میتونستیم رایگان شرکت کنیم مثل تست دیسک و لنگرگاه مسیر شغلی و توی تیم سازی ازش استفاده کردیم و میتونستیم از فرادرس هم یک سری از آموزش های پولی رو به رایگان داشته باشیم. ما در نهایت ی تیم 8 نفره تشکیل دادیم با ایده content and digital analytics software که آخر پست بیشتر از ایدمون میگم واستون. تولید MVPخب بعد از تشکیل تیم ها، جلساتی گذاشتیم با همدیگه برای دقیق شدن روی ایده ها و در این مسیر منتور هایی هم توسط آروان معرفی شدن که بهمون کمک میکردن. بعد از مشخص شدن ایده ها تیم ها میتونستن منتور هاشون رو هم با مذاکره با منتور های معرفی شده انتخاب کنن که در مسیر تولید MVP به تیم ها کمک کنن. ما تونستیم چند جلسه با وحید اشرفیان داشته باشیم و وحید نهایتا ادوایسر تیم ما شد و فرزاد شفیعی منتور تیممون شد. هرکدوم از تیم ها به میزان 10 میلیون تومن اعتبار در اکانت آروان دریافت کردن به مدت شش ماه که خب خیلی خوب بود و در واقع نیاز زیرساختی رو کامل برطرف می کرد. تقریبا یک هفته وقت داشتیم که فیچر لیست ایده هامون رو مشخص کنیم و ی بوم کسب و کار اولیه رو ارایه بدیم که ایده مشخص تر بشه و بعدش تعریف definition of done فیچر هامون رو ارسال کردیم و شروع کردیم به توسعه. بعد یکی دو هفته آروان لیستی از ددلاین های مسابقه رو هم مشخص کرد.فایل سناریوی تست عملکرد صحیح محصول○ تاریخ تحویل: تا  15مرداد● فایل ارائه نهایی Pitch-Deck○ تاریخ تحویل: تا  1شهریور● فایل استراتژی توسعه کسب و کار و استراتژی بازاریابی○ تاریخ تحویل: تا  1شهریور● لینک ریپازیتوری کد قابل اجرای محصول○ تاریخ تحویل: تا  15شهریور● ویدیو یک تا سه دقیقه ای توضیح محصول○ تاریخ تحویل: تا  20شهریورو هیچ کدوم از ددلاین ها رو تمدید نکردن به جر فایل ارایه نهایی که اون هم به خاطر تغییر شرایط ارایه از حضوری به غیرحضوری بود. طی این دوران بر اساس نیاز و صلاح دید منتور میتونسیم با متخصصین آروان هم جلسه داشته باشیم که ما افتخار استفاده از نظرات حمید رستمی  معمار کسب و کار و ثمین زاهدانی معمار فرهنگ آروان و حسن سیدی تجارت پیشه آنلاین رو داشته باشیم.اول که صحبت کردیم با تیم برگزاری گفتن که قراره بعد یک ماه جلسه داشته باشیم و روند پیشرفت رو چک کنن که این داستان بعدا نمیدونم چی شد ولی برگزار نشد. برای خبر رسانی و هماهنگی با تیم ها هم هر تیمی ی نماینده داشت که توی یک گروه به همراه مسیولین برگزاری بودن و خبر هارو از طریق گروه تلگرامی اعلام میکردن. طی این دو ماه یک سری جلسات عمومی هم در رابطه با نحوه داوری، تجربه کاربری و کسب کار هم توسط آروانی ها برگزار شد که مفید بودند. یه سمینار عمومی هم توسط ناخدای اجرایی آروان برگزار شد که در رابطه با فضای استارتاپی و یه جورایی اخلاقیات جاری در فضای کسب و کار بود که من خیلی دوس داشتم و بنظرم با فضای مسابقه ای که بین بچه ها به وجود اومده بود بین تیم ها بسیار لازم بود. اینکه سعی نکنیم بازار رو مونوپولی کنیم به سود خودمون و سعی کنیم رقابتی سالم داشته باشیم با بقیه رقبا (نه فقط در ابربازی) جزو مهم ترین درس های این سمینار بود. ارایه تیم ها (pitch) تیم ها علاوه بر محصول و یه داکیومنت کامل مارکتینگ که شامل تمامی جزییات لازم بود، بایستی در روز های 3 و 4 مهر یه ارایه 14 دقیقه ای انجام میدادن که به صورت آنلاین و از طریق اسکایپ برگزار شد. خیلی ها شاکی بودن از این ارایه آنلاین که چرا حضوری برگزار نشد و ما نیز هم، ولی خب من به شخصه درک میکردم مسیولیتی که برای آروان داشت رو و به نظرم تصمیم درستی گرفته شد.جمع بندیارایه ها انجام شدن و روز اعلام نتایج هم مشخص شد. 20 مهر ماه .این بود تمام داستانی که من از ابربازی به یاد داشتم و احساس کردم به اشتراگ گذاشتنش ممکنه ارزشمند باشه. شاید زیاد نتونستم انتقاد کنم و بیشتر روایتگری کردم ولی خب واقعا با توجه به اولین دوره بودن و شرایط کرونا که همه چی رو غیرقابل پیش بینی می کرد، به نظرم این رویداد عالی برگزار شد. دم بچه های آروان گررررم!ما کاسبیم !ما توی این رویداد محصولی رو ارایه دادیم با نام کاسب که بهتون کمک میکنه نرخ تبدیل وبسایتتون رو افزایش بدین. با ساخت بنر، مودال، انیمیشن و المان های گرافیکی دیگه که قابلیت رهگیری رفتار کاربر و ارایه گزارش رو دارند. میتونین به سایت ما سر بزنین تا دمو رایگان بگیرین. حتی میتونین از کد تخفیف اشتراک ویژه ما هم استفاده کنین، برای دریافت کد به من در تلگرام پیام بدین { AmirRezaM95@ }  </description><category>Ami Reza Mohammadi</category><author>Ami Reza Mohammadi</author><pubDate>Sun, 11 Oct 2020 13:29:49 +0330</pubDate></item><item><title>پیاده سازی هوش مصنوعی که بهتر از شما بازی می کنه! (2)</title><link>https://virgool.ir/coderlife/پیاده-سازی-هوش-مصنوعی-که-بهتر-از-شما-بازی-می-کنه-2-wzs6lxazkqm2</link><description>این پست قسمت دوم یک موضوع دو قسمتیه، لطفا برای درک بهتر، قسمت قبلی رو حتما ی نگاهی بندازین ^_^پروتکل های یادگیریخب بریم سراغ جمع بندی قسمت یادگیری الگوریتم. در واقع جزییات و منطق روش یادگیری رو در عنوان های قبلی بحث کردیم که چطور قراره اتفاق بیفته و اینجا فقط میخایم جمع بندیش بکنیم. برای یادگیری مقادیر وکتورهای وزن شبکه خط مشی که W1 و W2 بودند رو با مقادیر اولیه رندم میسازیم و صد دور بازی رو انجام میدیم. اگر فرض کنیم که هر بازی به صورت متوسط در 200 فریم انجام بشه، در انجام 100 تا بازی در مجموع قراره 200*100 یعنی 20000 بار تصمیم بگیریم که پد بره بالا یا پایین. و برای هرکدوم از این پارامتر ها ما مقدار شیب پارامتر رو داریم که بهمون میگه چجوری باید مقدار پارامتر رو به روز رسانی کنیم اگر که مثلا بخواهیم اون تصمیم رو که گرفتیم رو تشویق کنیم. پس تنها کاری که مونده اینه که به تصمیماتی که گرفتیم در طول بازی برچسب مناسب رو بزنیم. برای این کار باید ببینیم که اون تصمیم آیا به برد منتهی شده یا باخت. مثلا فرض کنیم 12 تا بازی رو بردیم و 88 تا بازی رو باختیم. پس برای این کار تمامی 12*200 تصمیمی که منتهی به برد شده رو به روز رسانی تشویقی میکنیم که در پست قبلی در مورد جزییاتش بحث کردیم و تمامی 88*200 تصمیمی که به باخت منتهی شدن رو به روز رسانی تنبیهی میکنیم. با این به روز رسانی شبکه ما با کمی احتمال بیشتر تصمیماتی که به برد رسیدن رو انجام میده و کمی با احتمال کمتر تصمیماتی که به باخت رسیدن رو انجام خواهد داد. حالا شبکه و خط مشی که کمی بهتر شده رو دوباره اجازه میدیم 100 دور دیگه بازی کنه و این روند رو ادامه میدیم تا جایی که تبدیل به یک قهرمان پونگ بشه حتی بهتر از چینی ها! :)مخلص کلام شیب خط مشی یا policy gradient : یک خط مشی را برای مدتی استفاده می کنیم. چک می کنیم که کدوم تصمیمات به نتایج خوبی منتهی شدن. احتمال اون تصمیمات رو کمی بیشتر می کنیم.  https://www.youtube.com/watch?v=YOW8m2YGtRg شما هم به همونی فکر میکنین که من فکر میکنم !؟اگر دقیق به اتفاقاتی که ممکنه در این روند بیوفته فکر کنین به نکات جالب و عجیبی میرسین که ممکنه فکر کنین با یادگیری یجورایی متناقضن. مثلا فرض کنین که ما پد رو به شکلی تکون دادیم که به خوبی تونستیم توپ رو برگردونیم ولی در انتهای اون راند از بازی ما شکست خوردیم. پس با توجه به روندی که بحث کردیم ما باید اون حرکت خوبی که باعث شد به خوبی توپ رو برگردونیم رو تنبیه کنیم ! آره درسته شاید اینجا کمی counter intuitive به نظر برسه ولی حقیقت اینه که چون ما بازی رو میلیون ها بار انجام میدیم، در انتها تعداد دفعاتی که ما یک حرکت خوب رو تشویق میکنیم خیلی بیشتر از تنبیه ها میشه و این در نتیجه باعث میشه واقعا خط مشی ما آخر کار خوب عمل کنه چرا که به صورت میانگین حرکات خوب رو بیشتر تشویق کرده تا تنبیه ! توابع پاداشی که معروف ترند!تا به اینجا با تنها روش و تابعی که باهاش آشنا شدیم که به ما پاداش و به نوعی نشانه میداد که داریم خوب بازی میکنیم یا نه، خروجی بازی بود که اگر بردیم بهمون پاداش مثبت میداد و اگه می باختیم پاداش منفی! یک روش پاداش گرفتن که بیشتر در یادگیری تقویتی مرسومه، پاداشی هست که در هر قدم از محیط میگیریم و این پاداش به قدم های بعدی هم منتشر یا propagate میشه. این پاداش رو عموما به صورت r subscript t نشون میدیم که میزان انتشار به قدم های بعدی رو هم با یک ضریب γ که بهش عامل تخفیف یا discount factor گفته میشه و مقداری بین صفر و یک هستش رو اعمال میکنه. ایده این نوع از پاداش اینه که میزان تشویق یک عمل برابر با جمع وزن دار تمامی پاداش هایی که بعدا هم میگیره ولی تاثیر پاداش های بعدی به صورت نمایی کمتر خواهد بود. برای درک عمیق تر این بخش و نحوه عملکرد سیستم پاداش برای بهتر شدن شبکه خط مشی میتونین ویدیو لکچر جان! روببینین :)و اما کدخب حالا که بخش های مختلف و مفاهیم تئوری رو بررسی کردیم وقتشه که ببینیم این داستان چجوری پیاده سازی میشه. کد مربوط به پیاده سازی رو میتونین از ریپو من بردارین که در واقع ویرایش شده کدی هست که مرد بی بدلیل دنیای یادگیری ماشین یعنی اندری کارپسی به اشتراک گذاشته. (این بشر رو بیشتر بشناسین واقعا آدم کار درستیه). از جیستم هم میتونین برش دارین. فورک کردم و خب ی سری ادیت ها روش انجام دادم. سعی میکنم نکات مهمش رو اینجا بررسی کنم ولی خدایی کد جمع و جور 130 خطی خیلی ساده ایه و با توضیح دادنش شاید دارم وقتتون رو میگیرم ولی امیدوارم کمک کنه. کد پیاده سازی شبکه خط مشی دو لایه ای با 200 یونیت مخفی با RMSProp در دسته های 10 قسمتیه . دسته همون batch  و قسمت همون episode منظورمه. در مورد اجرا کردنش هم خیلی ساده انگار دارین یک کد عادی پایتون رو اجرا میکنین و تنها چیزی که لازمه نصب کنین GymAI هستش که هم میتونین از راهنمای نصب سایت خودش استفاده کنین و هم از این لینک که یکی از مشکلاتی که احتمال زیاد براتون پیش خواهد اومد رو هم ازش جلوگیری میکنه! که خلاصش اینه: Uninstall gym and atari-py (If already installed): pip uninstall atari-py pip uninstall gym[atari]Download VS build tools here: https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&amp;amp;amp;amp;amp;amp;rel=16Run the VS build setup and select &#34;C++ build tools&#34; and install it.Restart PC.Install cmake, atari-py and gym pip install cmake pip install atari-py pip install gym[atari]Now run the following code: import atari_py print(atari_py.list_games()) بعد در مورد خروجی و نتایج میشه گفت که با توجه به اینکه بهینه سازی پارامتر های روی این کد انجام نشده برای ساده موندن کد، میتونه با سه چهار شب اجرا روی یک سیستم معمولی بدون GPU خروجی قابل قبول بده و اگه بخاین اون ادعای نه خیلی سخت که انسان رو هم ببره رو پاس کنین لازمه از convNet ها برای اون قسمت شبکه خط مشی استفاده کنین و پارامتر ها رو هم بهینه کنین که کار سختی نیست ولی لازمه که از یکی از فریموورک های یادگیری عمیق مثل pyTorch یا Tensorflow استفاده کنید که من نکردم ولی امیدوارم ایده و روش رو خوب گرفته باشین که براتون سخت نباشه. کد اون رو هم انجام میدم و میزارم توی ریپو خودم به زودی. ازم بخاین حتما :) من یکم پیگیری لازم دارم ^_^به صورت کلی بخش هایی از کد رو که احساس کردم ممکنه گنگ باشه رو اینجا بحث میکنم در موردش. اگه بخشی نیاز به توضیح داشت لطفا در کامنت ها بپرسین. قول میدم جواب بدم. `def prepro(I)&#xA;    &#34;&#34;&#34; prepro 210x160x3 uint8 frame into 6400 (80x80) 1D float vector &#34;&#34;&#34;&#xA;    I = I[35:195] # crop&#xA;    I = I[::2,::2,0] # downsample by factor of 2&#xA;    I[I == 144] = 0 # erase background (background type 1)&#xA;    I[I == 109] = 0 # erase background (background type 2)&#xA;    I[I != 0] = 1 # everything else (paddles, ball) just set to 1&#xA;    return I.astype(np.float).ravel()این تابع وظیفه داره که تصویر ورودی رو کمی برای الگوریتم ساده تر کنه به این معنا که مثلا بخش های دور تصویر که تاثیری رو خود بازی کردن نداره رو برش میزنه در همون خط اول. بعد کلا نصف سمپل هارو پاک میکنه توی خط بعدی چرا که به احتمال زیاد نمونه هایی که پشت سر هم دارن میان زیاد تفاوتی با هم ندارن. بعد مقادیر مربوط به پس زمینه رو صفر میکنیم و فقط توپ و پد هارو یک میکنیم. و در آخر هم داده رو به یک وکتور یک بعدی تبدیل میکنیم. تصویری از بازی بعد از پیش پردازشحالا داخل ی حلقه فرایند های زیر رو انجام میدیم:`# preprocess the observation, set input to network to be difference image&#xA;cur_x = prepro(observation)&#xA;x = cur_x - prev_x if prev_x is not None else np.zeros(D)&#xA;prev_x = cur_xاینجا اول فریم گرفته شده از Gym  رو به تابع اماده سازمون که بالا در موردش بحث کردیم میدیم تا بهمون ی وکتور بده. بعد این وکتور رو اختلافش رو نسبت به فریم قبلی به دست میاریم و به شبکه میدیم.کد فقط دو بخش دیگه داره که توی توضیحات هم بهشون اشاره کردم، یعنی policy forward و policy backward که دو تا تابع هستن. تابع forward که دقیقا کارش اینه که مقادیر رو میگیره و بر اساس وزن هایی که احیانا تا الان یاد گرفته میگه که با چه احتمالی پد رو مثلا ببریم بالا. فقط یکی رو میگه چون میدونیم دیگری میشه یک منهای اون احتمالی که داده. و اما تابع backward. زمانی که یک episode یا قسمت از بازی تموم میشه، که در این حالت مقدار متغیر done که از Gym میگیریم برابر با یک میشه، و در واقع در بازی یکی باخته ،کاری که میکنیم اینه که خب تونستیم ی نتیجه ای از بازی بگیریم و میتونیم این پاداش رو در شبکه propagate کنیم که ببینیم باید کدوم تصمیم هارو تشویق کنیم. برای این کار میایم مقادیر آرایه های  xs و hs  که مربوط به observation و hidden state ها بودن رو روی هم استک میکنیم. سپس مقدار discounted reward رو محاسبه میکنیم در تابع discount_reward و سپس این مقدار رو با eph که مربوط به hidden state ها هستند رو به تابع میدیم که در شبکه به صورت از آخر به اول ضرب نقطه ای بشه و مقادیر وزن هارو به روز رسانی کنه. اگه تسلط کافی روی back propagation ندارین این پست از استاد کارپسی رو پیشنهاد میکنم. خب فهمیدم توضیح دادن کد واقعا کار سختیه!سخن پایانیتا حد امکان و تا جایی که فرصت داشتم سعی کردم توضیح بدم. اگه بخشی هست که بد نوشتم یا احیانا غلطی وجود داره و یا سوالی اگه بود حتما کامنت یا پیام بدین و مطرح کنین . مخلص 3&gt;</description><category>Ami Reza Mohammadi</category><author>Ami Reza Mohammadi</author><pubDate>Tue, 01 Sep 2020 23:40:34 +0430</pubDate></item><item><title>پیاده سازی هوش مصنوعی که بهتر از شما بازی می کنه! (1)</title><link>https://virgool.ir/@amirreza.m95/پیاده-سازی-هوش-مصنوعی-که-بهتر-از-شما-بازی-می-کنه-1-ecub9mejb4e2</link><description>معماری کلی از یادگیری تقویتی عمیقمن دانشجوی ارشد هوش مصنوعی هستم و میخام مرحله به مرحله از پیاده سازی پروژه یکی از درس هام با عنوان یادگیری تقویتی رو به همراه کد و تمام جزییاتش براتون بنویسم. اینجا یک مدل ساده میسازیم که تنها ورودیش اطلاعات صفحه بازی یعنی داده های پیکسلی هستش و میتونه بر اساس اون مدلی رو یاد بگیره و بر اساس اون بازی کنه. این کار در واقع پیاده سازی یکی از مقالات گروه دیپ مایند هستش که اگه تو کار هوش مصنوعی باشین حتما میشناسینش. عنوان مقاله مربوطه هست:  “Playing Atari with Deep Reinforcement Learning” که به فارسی میشه آتاری بازی با استفاده از یادگیری تقویتی عمیق :) ویژگی های این مقاله اصولا چیزی که در کلاس های یادگیری تقویتی مخصوصا در بحث های ابتداییش ارایه میشه مربوط به مدل هایی هستن که مثلا با value iteration یا policy iteration سعی میکنن یک تابع هزینه بسازن و عامل بتونه بار اساس اون در محیط رفتار کنه. این مدل ها در دنیای واقعی ارزشی ندارن حقیقت !!!مدل هایی که میان یک تابع ارزش مشخص رو یاد میگیرن در واقع میتونن هدفشون اینه در هر حالتی که قرار میگیرین بهتون بگن چه ارزشی رو میگیرین ولی مشکل از جایی شروع میشه که محیط ما لزوما تعداد محدودی حالت نداشته باشه مثل یک بازی که میتونه بر اساس رفتار کاربر میلیون ها حالت مختلف داشته باشه. اینجاست که لازم میشه کلا نوع نگاهمون رو عوض کنیم و بیایم به جای بدست آوردن مقادیر دقیق بریم سراغ function approximation یا تابع تقریب و مفاهیمی مثل شیب خط مشی یا policy gradient. الگوریتم و متدی که در این مقاله استفاده شده ویژگی هایی داره که قابل توجهه. نکته اول اینه که این کار اولین مدل یادگیری عمیق هستش که تونسته در یادگیری control policy با استفاده از داده های سنسور با ابعاد بالا خوب عمل کنه. یعنی مثلا نیومدیم داده هارو دسته بندی شده و تگ دار بهش بدیم که مثلا فلان چیزی که در صفحه بازیه، چیه و چه اکشن هایی داره و ... و به بیان علمی ویژگی یا feature های دستی یا hand crafted  بهش ندادیم. فقط ی صفحه بازی دادیم و بقیه چیزارو باید خودش یاد بگیره. دادن صفحه بازی هم به این معناس که مقادیر پیکسل به پیکسل رو به الگوریتم دادیم.به صورت خیلی کلی مدل ما شامل یک CNN میشه که به همراه یک مدلی تو مایه های رویکردی که Q learning داره train شده و داده های پیکسلی رو میگیره و خروجی ی value function میده که پاداش های آینده رو تقریب بزنه. بازی های آتاری 2600این مدل رو هفت تا بازی Atari 2600 از محیط یادگیری Arcade  امتحان شده و تونسته در 6تا از بازی ها از تمامی مدل های قبلی (به زمان چاپ مقاله توجه کنید) بهتر عمل کنه و در سه تا از بازی ها تونسته از شما (هوش انسانی) بهتر بازی کنه ! :)مثال هایی از استفاده یادگیری تقویتی. از چپ به راست شامل             deep Q learning network for learning ATARI, AlphaGo, Berkley robot stacking legos, physically simulated quadruped leaping over terrain در مورد پیاده سازی یکی از ویژگی های مهم  پیاده سازی این پروژه که قراره در موردش بحث کنیم اینه که از فریمورک های دیپ استفاده نکرده و به صورت تقریبا pure python پیاده شده با کتابخانه هایی مثل نامپای. تنها ایمپورت مهم این کد Gym هستش که از باز اگه یادگیری تقویتی باز! باشین باید حتما بشناسینش. این RL benchmarking toolkit که از پروژه های OpenAI هستش به شما کمک میکنه که درگیر پیاده سازی محیط و عامل و ... نشین و بتونین روی الگوریتم یادگیری که میخاین پیاده کنین تمرکز کنین. چالش های یادگیری عمیق در یادگیری تقویتیچالش اول اینه که الگوریتم های عمیق داده زیادی احتیاج دارن ولی چیزی که در یادگیری تقویتی داریم ی سیگنال پاداش هستش که عموما اسپارس، نویزی و با تاخیر یا delayed هستش. تاخیر بین عمل و پاداش میتونه تا هزاران استپ زمانی باشه. چالش دیگه اینه که در الگوریتم های عمیق عموما این فرض رو دارند که داده مستقل هستند ولی در RL وجود دنباله های حالت که highly correlated هستن اجتناب ناپذیره. و اما از همه مهم تر اینکه در RL ، توزیع داده میتونه در زمانی که الگوریتم در حال یادگیری هست تغییر کنه که میتونه برای الگوریتم های عمیق که فرضشون ثابت بودن distribution هست مشکل ساز باشه. عامل هوش مصنوعی در بازی دیگر پیاده سازی شده دیپ مایندپیشنهاد مقاله برای غلبه به چالش هاپیشنهاد مقاله استفاده از CNN هستش که میتونه با یکی از variant های Q-learning  یادگیری رو انجام بده و برای به روز رسانی وزن های شبکه عصبی هم از Stochastic Gradient descent استفاده کنه. و برای غلبه به چالش های non-stationary distribution و correlated data هم یک مکانیزمی رو پیشنهاد دادن به اسم experience relay که به صورت رندم داده های قبلی رو دوباره به شبکه میده و کمک میکنه به smooth شدن توزیع بر روی رفتار های گذشته. این نکته هم درمورد پیاده سازی حایز اهمیته که ما سعی میکنیم که تا حد ممکن فرضیات بازی پونگ رو در پیاده سازی در نظر نگیریم چرا که به دنبال این هستیم که مدلی بسازیم که بتونه کلا بازی رو با ورودی پیکسل انجام بده و بازی پونگ در حقیقت اهمیتی برامون نداره . در واقع این مدل یک رویکردی به سمت AGI یا Artificial General Intelligence داره که هدفش اینه که مدلی بسازه که نه فقط در یک بازی و مسیله خوب عمل میکنه بلکه به صورت عمومی بلده بازی های مختلف رو یاد بگیره! (ترمیناتور نشه صلوات)بازی پونگ شبکه خط مشی یا policy networkاین شبکه در واقع نقش عامل ما رو بازی خواهد کرد. این شبکه قراره حالت یا state بازی رو بگیره و به ما بگه که بریم بالا یا پایین. رویکرد ما برای پیاده سازی این شبکه این خواهد بود که یک شبکه دو لایه میسازیم مثل تصویر زیر که تصویر رو میگیره به صورت خام (210*160*3) و احتمال حرکت بالا رو بهمون میده. لازم به ذکره که در اینجا باید از stochastic policy استفاده کنیم به این معنا که با یک احتمالی فلان عمل یا action  رو انجام بدیم که دلیلش رو در قسمت یادگیری مدل بیشتر باز میکنیم.شبکه خط مشی که شامل دو لایه تمام متصل می باشد برای شفاف تر شدن شبکه خط مشی میتونین روش پیاده سازیش رو در کد زیر با numpy/python ببینین. در این کد وکتور X رو به عنوان داده ورودی پیکسلی در نظر بگیرین:h = np.dot(W1, x)      # compute hidden layer neuron activations&#xA;h[h&lt;0] = 0              # ReLU non linearity: threshold at zero&#xA;logp = np.dot(W2, h)    # compute log probability of going up&#xA;p = 1.0 / (1.0 + np.exp(-logp)) # sigmoid function (gives probability of going up)`در این کد W1 و W2 دو وکتور هستند که به صورت رندم ساخته ایم و در خط آخر هم از سیگموید غیرخطی استفاده کردیم که مقادیر خروجی احتمال رو تو بازه [0,1] قرار میده. کاری که در لایه پنهان یا hidden layer  این شبکه انجام میدیم اینه که میتونیم سناریو های مختلف بازی رو شناسایی کنیم مثل اینکه آیا توپ بالاس و پد ما در وسط قرار گرفته. وزن های مربوط به وکتور W2 هم میتونن به ما بگن که در هر حالت بوجود اومده آیا پد رو ببریم بالا یا پایین. ولی خب با توجه به اینکه مقادیر این دو وکتور رو ابتدا رندم قرار دادیم پس زیاد خوب بازی نخواهد کرد و کاری که ما باید انجام بدیم اینه که این مقادیر وزن ها رو به شکلی تنظیم کنیم که عامل ما بتونه مثل ی حرفه ای بازی کنه!نکته:  برای اینکه شبکه ما بتونه تغییرات و تحرک رو در بازی تشخیص بده ایده آله که دو تا فریم از بازی رو به شبکه بدیم ولی برای ساده سازی ی مقداری پیش پردازش انجام میدیم تا بتونیم تفاوت بین فریم های بازی رو به شبکه بدیم که میتونه خیلی ساده با تفریق کردن دو تا فریم به دست بیاد.اصلا همچین چیزی ممکنه !اینجا خوبه که یکم در مورد سختی و رویکرد به نظر غیرممکنی که بازی کردن و حل این مسیله با RL میتونه داشته باشه بحث کنیم. در واقع اگه یک نگاه سطح بالا بخایم داشته باشیم به این شکله که 100800 تا عدد رو می گیریم و forward میدیم به شبکه خط مشی که خودش در حد میلیونی پارامتر داره در W1  و W2. حالا فرض کنیم که این شبکه بگه ما ما پد رو ببریم بالا. در این حالت ممکنه پاداشی که از بازی بگیریم صفر باشه در این مرحله و دوباره بهمون 100800 تا عدد مربوط به فریم بعدی رو بگیریم و این روند ممکنه تا 100 بار تکرار بشه تا بتونیم یک مقدار غیرصفر بگیریم.  حالم گیرم که پاداش غیرصفر بگیریم،خیلی هم عالی ولی چطور می تونیم بفهمیم این پاداش برای کدوم رفتارمون بوده؟ آیا مربوط به کاری بوده که همین اخیرا انجام دادیم؟ یا کاری که 76 قدم قبل انجام دادیم؟ یا به خاطر دو تا از کار هایی که در قدم 10 و 90 داشتیم؟ و حالا کدوم یکی از اتصالات و مقادیر شبکه رو تغییر بدیم که در آینده بهتر عمل کنیم؟ این در واقع یکی از مشکلات مطرح در این حوزه به اسم Credit assignment problem هستش. در همین مثال بازی پونگ اگه بخایم در نظر بگیریم، ما میدونیم که زمانی پاداش +1 میگیریم که حریف نتونه توپ رو با پدش برگردونه و ازش رد بشه. دلیل اصلی این اتفاق اینه که ما توپ رو در جهتی فرستادیم که حریف نتونسته توپ رو برگردونه و این اتفاق برمیگرده شاید به چیزی حدود بیست فریم قبل از گرفتن پاداش و سایر حرکت هامون بعد از اون وارد کردن ضربه دیگه تاثیری در در پاداشی که گرفتیم نداشته. این نشون میده که با مسیله پیچیده ای طرف هستیم که به نظر غیرقابل حل به نظر میرسه! یادگیری نظارتیقبل از اینکه وارد رویکرد اصلی حل مسیله که استفاده از گرادیان خط مشی یا policy gradient  هست بشیم خوبه کمی در مورد یادگیری نظارتی بحث کنیم و یکم با یادگیری تقویتی مقایسش کنیم چرا که معتقدم بسیار به هم شباهت دارن. خوبه که ی نیم نگاهی هم به دیاگرام زیر داشته باشین که احتمالا کمک کننده باشه. در یادگیری نظارتی به سیستم یک عکس میدیم و ازش ی سری احتمالات میگیریم که مثلا در اینجا میتونه مربوط به دو تا کلاس بالا وپایین باشه برای تعیین وضعیت پد. حالا چیزی که در دیاگرام زیر آوردم مقدار لگاریتم احتمالات هستش که شده (0.36- , 1.2-) و به جای مقادیر 70 و 30 که خروجی های احتمال رخداد بالا و پایین بودن این مقادیر رو میخایم بهینه کنیم (و دلیل این لاگ گرفتن اینه که هم از نظر ریاضیاتی کار رو راحت میکنه برای ما به خاطر ویژگی هایی که لگاریتم داره و دوما اینکه تاثیری در خروجی هم نمیزاره چرا که لگاریتم ی تابع مونوتونیکه یعنی با لاگ گرفتن از یک تابع مقادیرش به یک میزان اسکیل میشن و تابع به هم نمیریزه ). حالا اتفاقی که در یادگیری نظارتی میوفته اینه که ما به label  یا برچسب ها دسترسی داریم. داشتن برچسب ها به این معناس که مثلا ما میدونیم در این مرحله کار درست اینه که پد رو ببریم بالا (برچسب صفر). در پیاده سازی کاری که میکنیم اینه که گرادیان 1.0 رو به مقدار لاگ احتمال بالا اضافه میکنیم و back propagation رو انجام میدیم تا وکتور gradient یا شیب   w logp ( y = UP ∣ x )∇  رو محاسبه کنیم. خروجی این شیب به ما می گوید که پارامتر هایمان را تعداد میلیونی دارند رو چگونه باید به روز رسانی کنیم تا  شبکه کمی دفعه بعد بتونه با احتمال بیشتری (more likely) بالا رو پیش بینی کنه. به عنوان مثال یکی از پارامتر های شبکه اگر مقدار گرادیانت منفی  1.2 داشته باشه به این معناست که اگر مقدار پارامتر را به اندازه بسیار کوچک مثبتی افزایش بدیم در حد  0.0001 ، در نتیجه مقدار لاگ احتمال به میزان 2.1 * 0.0001 کاهش خواهد یافت چرا که علامت منفی داره. حالا اگر براین اساس پارامتر ها را به روز رسانی کنیم ، به هدفمون رسیدیم و شبکه کمی بهتر آموزش دیده، به این معنا که اگه یک تصویر شبیه عکسی که بهش نشون دادیم رو بهش نشون بدیم با احتمال بیشتری خروجی بالا رو خواهد داد  :)شیب خط مشیخب حالا میخایم بررسی کنیم که در دنیای یادگیری تقویتی که برچسب رو نداریم باید چه کنیم؟ اینجا میخایم رویکردی به اسم policy gradient یا شیب خط مشی رو برسی کنیم که باز دیاگرام زیر در درک این مسیله کمک کنندست حتما ی نگاهی بهش بکنین. شبکه خط مشی ما برای بالا احتمال 30 درصد که لاگش میشه منفی 1.2 رو داد و برای پایین احتمال 70 درصد که لاگش میشه منفی 0.36 . حالا از این توزیع احتمال مقداری را نمونه برداری میکنیم که دراینجا فرض کنید پایین میشه نتیجه نمونه برداری و این تصمیم رو در بازی اعمال میکنیم. نکته ای که اینجا باید بهش توجه کنیم اینه که ما دراینجا میتونیم مقدار شیب 1.0 رو در شبکه اعمال کنیم مثل کاری که در یادگیری نظارتی کردیم و شبکه رو به شکلی تغییر بدیم که دفعه بعد هم با دیدن تصویری مشابه با کمی احتمال بیشتر همین تصمیم رو بهمون توصیه کنه ولی مشکل اینه که ما نمی دونیم آیا این تصمیم درسته یا نه! یعنی هنوز نمی دونیم، چرا که هنوز مشخص نیست نتیجه بازی چیه. ولی دقیقا نکته مهم همینجاست که مشکلی هم نداره که ندونیم، چرا که می تونیم صبر کنیم تا زمانی که بازی به نتیجه برسه و با توجه به اون پارامتر ها رو به روز رسانی کنیم. مثلا در اینجا نتیجه بازی شکست بوده که پاداش منفی یک گرفتیم. پس اگر مقدار منفی یک را به لاگ احتمال اضافه کنیم و در شبکه back propagate  کنیم خواهیم دید که مقدار شیبی خواهیم داشت که با گرفتن تصویری مشابه با احتمال کمتری نسبت به قبل پایین رو به ما پیشنهاد خواهد داد چرا که همونطور که دیدیم نیجه بازی شد شکست و این چیزی نیست که ما میخواهیم.به همین سادگی! ی خط مشی تصادفی یا stochastic policy  داریم که تصمیمات یا action هایی رو نمونه برداری میکنه و تصمیماتی رو که به نتایج خوب منتهی میشن رو تشویق میکنه و تصمیماتی که به شکست میرسه رو تنبیه! جالبی قضیه اینه که لزوما نباید مقادیر منفی یا مثبت یک رو به عنوان پاداش بدیم بلکه میتونیم مثلا زمانی که اتفاق خاصی افتاده که خیلی وفق مرادمونه مثلا پاداش مثبت 10 بدیم و همچنان داستان به خوبی کار میکنه و این است زیبایی شبکه های عصبی که فکر میکنی نتیجه چیز شر محضه ولی خوشبختانه در جهانی که ما زندگی میکنیم اینجوری نیست و چه بسا به خوبی با ما رقابت میکنه :)به علت طولانی شدن تصمیم گرفتم چند قسمتی کنم، قول میدم که آب نبندم بهش :)منابع:http://karpathy.github.io/2016/05/31/rl/ Andrej Karpathy blog is main source &lt;3Mnih, V., Kavukcuoglu, K., Silver, D.,  Graves, A., Antonoglou, I., Wierstra, D. and Riedmiller, M., 2013.  Playing atari with deep reinforcement learning. arXiv preprint arXiv:1312.5602.  </description><category>Ami Reza Mohammadi</category><author>Ami Reza Mohammadi</author><pubDate>Tue, 25 Aug 2020 01:39:45 +0430</pubDate></item></channel></rss>