ABK-GOFAI: یک هوش مصنوعی Good Old-Fashion برای بازی کردن Abak Evolution Backgammon.
بدون کمک یک شبکهٔ عصبی، توسعهٔ یک هوش مصنوعی (AI) برای Abak کاری چالشبرانگیز بود و در طول زمان ظاهراً به یک حد رسید. با این حال، توسعهٔ آن فرایندی سرگرمکننده بود و هنوز هم در سطحهای «easy»، «normal» و «advanced» مشغول خدمت است. این مطلب دربارهٔ این است که چگونه کار میکند و چطور ساخته شد.
فاز 1، GOFAI PHP
اولین نسخهٔ AI برای Abak با PHP نوشته شد و بهخاطر خطاهای «out of memory» مشهور بود که سیستم را از کار میانداخت، اما راه را برای یک نسخهٔ C++ باز کرد. این زمین بازی نمونهسازی من بود تا بفهمم اصلاً چگونه باید یک AI ساخت. اولین باری که آن را به وبسرور وصل کردم (پس عملاً داشتم علیه آن بازی میکردم)، ۱۵ ثانیهٔ بسیار طولانی لازم داشت تا یک حرکت انتخاب کند، و وقتی دیدم سرور خودش حرکت میکند، از خوشحالی دیوانه شدم و شاید هم یک رقص کوچولو کردم. مطمئن نیستم.
فاز 2، GOFAI C
پس نسخهٔ C/C++ هوش مصنوعی، اولین نسخهای که به محیط عملیاتی رسید، موتور محبوب GOFAI من، از خاکسترهای PHP متولد شد. این موتور ۲۹ الگوریتم تحلیلی را روی هزاران موقعیت در چند نانوثانیه اجرا میکند و روندش اینگونه است:
- با یک موقعیت صفحه و مجموعهای از تاسها شروع کنید.
- یک state محاسبه کنید
- تمام حرکتهای ممکن را بهدست آورید.
- هر حرکت را تحلیل کنید و به آن امتیاز بدهید.
- «بهترین» امتیاز را انتخاب کنید.
در اینجا یک نمودار از این فرایند آمده است.
این سیستم از چهار تابع اصلی تشکیل شده است:
- Get Actions (محاسبهٔ حرکتهای معتبر):
با داشتن یک موقعیت صفحه و یک پرتاب تاس، تمام حرکتهای معتبر را محاسبه میکند.
حرکتهای معتبر میتوانند از ۰ تا دهها هزار مورد باشند.
در هر زبانی که این را نوشتهام، یک رویکرد بازگشتیِ غیرضروری به کار بردهام که کد را بهطرز وحشتناکی سخت برای اشکالزدایی میکند، اما آنقدر زیباست. چند صد خط کد دارد اما هفتهها طول کشید تا آن را بنویسم و بعد هم هفتههای بیشتری تا به C ترجمهاش کنم.
- Get state (محاسبهٔ state صفحه):
با داشتن یک موقعیت صفحه، یک state معنایی محاسبه میکند که تا حد زیادی خودش گویاست:
- شروع
- بازی میانی
- دویدن بدون امید
- دویدن با امید
- پایان بازی
- ورود به خانه
-
Analyse Movement (محاسبهٔ امتیازها برای یک موقعیت صفحه):
این، با اختلاف، گستردهترین الگوریتم از همه است. ویژگیهای صفحه را تحلیل میکند، هرکدام امتیازی برمیگردانند، و سپس بر اساس stateای که پیشتر محاسبه شده، ضرایبی روی آنها اعمال میکند تا بتوانید بسته به state بازی، به جنبههای مختلف تحلیل وزن متفاوتی بدهید.
AI کارش را با ۸ الگوریتم شروع کرد و در نهایت به ۲۹ رسید، از جمله:
- ارتفاع ستونها
- ریسک خورده شدن
- ریسک گرفتار شدن
- قدرت خانه
- محورهای فرار
- مهرههای روی میله
- مهرههای امن
بسیاری از این الگوریتمها در ابتدا بسیار ابتدایی بودند یا اصلاً وجود نداشتند.
با گذر زمان روی آنها کار کردم، ویژگیهای تازه اضافه کردم و ضرایب را ریزتنظیم کردم.
-
Select Action (انتخاب «بهترین» حرکت):
اگر فقط بالاترین امتیاز را بخواهید، این الگوریتم نسبتاً ساده است (همان کاری که سطح Advanced انجام میدهد).
برای سطحهای Normal و Easy، از میان فهرستی از بهترین حرکتها بهصورت تصادفی یک حرکت انتخاب میشود؛ اندازهٔ این فهرست (یا میزان تحملش نسبت به حرکتهای ضعیفتر) با سطح مشخص میشود.
بهخاطر C، این موتور بهطرز خیرهکنندهای سریع است، بنابراین همیشه از آن بهعنوان تابع اصلی get-actions استفاده خواهم کرد.
فاز 3، تنظیم GOFAI C
برای اشکالزدایی، عیبیابی و ریزتنظیم این موتور، مجبور شدم ابزارهای زیادی بسازم تا فرایند تصمیمگیری آن را زیر نظر بگیرم. برخلاف شبکهٔ عصبی، هر تصمیم در اینجا قابل ممیزی بود، پس دستکم آن مزیت را داشتید.
این فرایند سرگرمکننده بود اما بهشدت کند. خیلی زیاد علیه CPU بازی کردم، و هر زمان یک حرکت ضعیف میدیدم، به این ابزارها برمیگشتم تا بفهمم چه چیزی اشتباه پیش رفته است. گاهی این مرا به مسیر اصلاح یک الگوریتم، تنظیم یک ضریب، یا حتی ساخت یک مدل تحلیلی تازه میبرد. گاهی هم، و این زیبا بود، مرا وادار میکرد در راهبردهای Abak Evolution خودم تجدیدنظر کنم.
با گذشت زمان، AI نسبتاً محکمی داشتم، اما کاملتر کردن آن هر روز سختتر میشد. خطوط کد بسیار زیاد بودند، سناریوها بسیار متنوع، عملیات بسیار سنگین؛ اشکالزدایی در سطح کد به کاری دشوار تبدیل شده بود و ریزتنظیم دستی ضرایب دیگر نتیجهای نمیداد.
فاز 4، استیصال
اما من بیشتر میخواستم، چون خودم Abak بازی میکنم و به یک بازیکن قدرتمند نیاز داشتم تا از بازی لذت ببرم، و آن زمان (و حتی هنگام نوشتن این متن) انسانهای زیادی نبودند که آن را بازی کنند.
و این رویکرد معایب زیادی دارد:
- state صفحه را بر اساس موقعیت فعلی آن محاسبه میکند و از آن state برای تغییر ضرایب الگوریتمهای تحلیل برای هر حرکت معتبر استفاده میشود. اما همان حرکت میتوانست خود state را تغییر داده باشد و موتور این نکته را در نظر نمیگیرد.
- ریزشتنظیم دستی ضرایب به زمان بسیار زیادی نیاز داشت. هرچند اوقات خوشی بود، اما واقعاً زیاد.
- محاسبهٔ state بهخاطر تعداد سناریوهای ممکن، بهشدت دشوار است. این الگوریتم همیشه معیوب بوده است.
- محاسبهٔ Game Equity با دقت غیرممکن است، چون این موتور برای هر الگوریتم تحلیلی یک سیستم امتیازدهی دلبخواهی دارد و امتیاز نهایی بازتابدهندهٔ احتمال برد نیست؛ فقط بهعنوان امتیازی برای مقایسهٔ موقعیتهای مختلف صفحه عمل میکند. میتوان گفت ارزش آن نسبی است نه مطلق.
فاز 5، بیداری
و بعد، یک روز در سال 2018، Google با شبکهٔ عصبی AlphaGo قهرمان GO را شکست داد، غوغای زیادی به پا شد، و کتابخانههای متنباز شگفتانگیز یادگیری ماشین در دسترس قرار گرفتند که از GPUهای خانگی برای سرعت دادن به فرایند آموزش استفاده میکردند.
البته من از قبل کمی دربارهٔ شبکههای عصبی میدانستم، اما هرگز یکی نساخته بودم و راستش آنها را کاری فراتر از تواناییهایم میدیدم.
بنابراین نتوانستم مقاومت کنم، و سطح expert دیگر روی موتور GOFAI اجرا نمیشود، جز برای بخش get-actions.
اما این داستان همینجا تمام میشود.
اگر تا اینجا همهاش را خواندهاید، شگفتزدهام.
این متن برای اهداف SEO توسط تیم صادق Abak Evolution نوشته شده است،
ملقب به Samy Garib.