در سال 2018، Google با شبکهٔ عصبی AlphaGo قهرمان GO را شکست داد و سروصدای زیادی به پا شد. کتابخانههای متنباز بسیار خوب یادگیری ماشین در دسترس قرار گرفتند که از GPUهای خانگی برای سرعت دادن به فرایند آموزش استفاده میکردند.
تصمیم گرفتم این کار را با Abak امتحان کنم، اما وقتی برای نخستین بار شروع کردم، بهسختی میدانستم شبکهٔ عصبی چیست. در دوران دانشگاه (1996) وسوسهای کوتاه داشتم، اما با نبود داده، GPU و هدف روشن، پرداختن به آن پیچیده بود. افزون بر این: از نظر ریاضی، شبکههای عصبی موضوعی سنگین هستند و به الهام زیادی نیاز دارید.
بعد از پژوهشهای شدید و وسواسگونهٔ فراوان، توانستم یک مدل بسازم و آن را وادار به یادگیری کنم.
روی شانههای غولها ایستاده بودم؛ نخستین قصد من این بود که از دکتر Gerald Tesauro، سازندهٔ TD-Gammon در دههٔ ۹۰، یاد بگیرم. اگر درست به خاطر بیاورم، این نخستین پیادهسازی عملی یک الگوریتم یادگیری تقویتی بود.
اما چون Abak یک بازی دوبعدی است، نتوانستم از مدل پیشنهادی استفاده کنم و مجبور شدم مدل خودم را توسعه دهم. تصمیم گرفتم خروجی بعضی از الگوریتمها را بهعنوان بخشی از مدل، بهصورت اطلاعات خبره، وارد کنم تا فرایند یادگیری برای NN آسانتر شود. با این کار احساس میکردم دارم تقلب میکنم.
در اینجا مقایسهای بین هر دو مدل، یعنی مدل Backgammon و Abak، آمده است.
مدل TD که در Backgammon بهطور گسترده استفاده میشود، ستونها را توصیف میکند. برای هر ستون صفحه، از ۴ ورودی برای توصیف آن استفاده میشود.
- بدون مهره: [0,0,0,0]
- یک مهره: [1,0,0,0]
- دو مهره: [1,1,0,0],
- سه مهره: [1,1,1,0]
- بیش از سه مهره: [1,1,1,1].
این مدل ۲۸ مجموعه از این نوع دارد (یکی برای هر ستون صفحه) برای اشاره به هر تیم، یعنی در مجموع 28*2*4 ورودی، بهعلاوهٔ چند ورودی برای شمارش مهرههای روی میله. متأسفانه این را از حافظه مینویسم و ممکن است دقیق نباشد.
مدل Abak بسیار متفاوت است. این مدل مهرهها را توصیف میکند و هر کدام از آنها مجموعهای از ویژگیها دارند. در نسخههای جدیدتر، برای تکمیل مدل یک توصیف سادهشده از صفحه هم اضافه کردم که نتایجش شگفتانگیز نبود، اما ویژگیها همچنان وجود دارند.
مدل توصیف بازی چهار بخش دارد [477 inputs]:
- توصیف مهرهها (14x30): این توصیف شامل آمار مهره، فاصله، ارتفاع و غیره است. کلاس را شامل نمیشود، چون آن از جایگاه مهره در مدل به ارث میرسد.
- وضعیت تیم (4x2): شمارش برخی ویژگیهای مهره یا وضعیت.
- نقشهٔ قدرت (24x2).
- وضعیت بازی: چه کسی تاس بعدی را میریزد! (1).
در ادامه میتوانید توصیف کامل مدل را ببینید.
نسخهها:
1.- Python Cumpy (TD-V1).
اولین نسخهٔ این AI با Python خالص و با استفاده از Cumpy آموزش داده شد؛ کتابخانهای شبیه Numpy که روی GPU اجرا میشود. میخواستم از پایه یاد بگیرم، بنابراین با اینکه مدتی با Tensorflow بازی کرده بودم، تصمیم گرفتم برهنه وارد میدان شوم (البته مجهز به ترکیب فوقالعادهٔ Python و Cumpy).
ویژگیها:
- یک شبکه که شانس برد تیم ۰ در بازی را تخمین میزند.
- از امتیازها آگاه نبود.
- پرچم «چه کسی بعدی تاس میریزد» را نداشت.
- نقشهٔ قدرت را نداشت
- یک لایهٔ پنهان با فعالسازهای sigmoid.
- ۴۵.۰۰۰ بازی زمان برد تا AI قبلی من که با اطلاعات خبره (GOAFI) نوشته شده بود را شکست دهد.
- برای ۴.۵۰۰.۰۰۰ بازی یاد گرفت. و در ۷۵٪ موارد مقابل GOFAI برنده شد.
- به مدت ۲ سال در محیط عملیاتی بود.
2.- Tensorflow (TD-V2).
مشکل من با نسخهٔ ۱ این بود که در محاسبهٔ شانس برد خوب عمل نمیکرد، چون بدون پرچم «چه کسی بعدی تاس میریزد» آموزش دیده بود. بهنحوی نتایج NN برای انتخاب یک حرکت خوب بسیار مناسب بودند، اما از نظر ریاضی سازگار نبودند. نسخهٔ ۲ آن مشکل را برطرف کرد و یک شبکهٔ تازه برای محاسبهٔ احتمال پایان بازی با ۱، ۲ یا ۳ امتیاز افزود.
این بار Tensorflow را برای آموزش مدل تازه انتخاب کردم چون میخواستم یک framework یاد بگیرم و برای آن نمونهٔ آغاز بسیار خوبی پیدا کرده بودم.
ویژگیها:
- یک شبکه برای محاسبهٔ شانس برد تیم ۰ در بازی.
- یک شبکه برای محاسبهٔ احتمال پایان یافتن بازی با ۱، ۲ یا ۳ امتیاز.
- نقشهٔ قدرت جدید را شامل میشود.
- دو لایهٔ پنهان با فعالسازهای متفاوت: Leaky RELU برای لایههای پنهان و sigmoid در لایهٔ خروجی.
- ۱۲.۰۰۰ بازی طول کشید تا ۵۰٪ مواقع بر TD-V1 پیروز شود.
- برای ۳۵۰.۰۰۰ بازی یاد گرفت و به نرخ برد ۸۰٪ در برابر TD-V1 رسید.
3.- نسخهٔ 3: متوقف شده.
در آخرین گام از تصمیمگیری برای انتخاب بهترین حرکت، یک الگوریتم ساده وجود دارد که بهترین Equity را جستوجو میکند [%W*%p1+%W*%p2+%W*%p3].
بسته به هدف مسابقه، تعداد امتیازهای لازم برای برد هر بازیکن و ارزش مکعب، خروجی شبکهها را بهصورت متفاوت وزندهی میکند.
دوست دارم یک NN بسازم که این کار را انجام دهد. آن خواهد شد V3. فعلاً در دست توسعه نیست.
مدل شبکهٔ عصبی Abak:
توصیف مهره (14 inputs x 30 checkers ) :
- فاصله تا خانه x/25
- تعداد مهرههای بالا x/4
- تعداد مهرههای پایین x/4
- روی میله است [0,1]
- در خانه است [0,1]
- امن است (در فاصله = 0). [0,1]
- با مهرهٔ دیگری در حال ساخت block است [0,1]
- قابل گرفتار شدن توسط دروئید است [0,1]
- توسط دروئید گرفتار شده است [0,1]
- در حال گرفتار کردن است (این ورودی فقط برای هر دروئید است) [0,1]
- ریسک خورده شدن در ناحیهٔ نزدیک (۶ موقعیت جلوتر) [0..1]
- ریسک خورده شدن در ناحیهٔ دور (۱۲ موقعیت جلوتر) [0..1]
- ریسک گرفتار شدن توسط دروئید [0..1]
- شانسهای حرکت [0..1]
ورودیهای مرتبط با بازی برای هر تیم (4x2):
- تعداد مهرههای روی میله. x/15
- تعداد مهرههای امن. x/15
- همهٔ مهرهها در خانه هستند. [0,1]
- تعداد مهرههای امن 0. [0,1]
نقشهٔ قدرت: (24*2):
در پایان، نقشهای از قدرت وجود دارد، مشابه چیزی که دکتر Tessauros برای Backgammon پیشنهاد کرده بود اما سادهتر. برای هر موقعیت و برای هر تیم، عددی بین ۰ و ۱ دارد که نشان میدهد آن block چقدر قدرتمند است:
- 0.0اگر خالی باشد.
- 0.1اگر یک مهره باشد.
- 0.5اگر آن مهره یک نگهبان باشد.
- 1.0اگر دو مهره یا بیشتر آنجا باشند.