آلفازیرو خود را بسازید
در این مقاله به موارد زیر خواهیم پرداخت:
- دو دلیلی که آلفازیرو AlphaZero را به یک پیشرفت بزرگ در دنیای هوش مصنوعی تبدیل میکند.
- چگونه میتوان رونوشتی از متدولوژی آلفازیرو تهیه کرد که بازی Connect4 را انجام دهد.
- و چگونه میتوان با تغییر کدها، الگوریتم را در سایر بازیها نیز بهکار گرفت.
آلفاگو —> آلفاگو زیرو —> آلفازیرو
در ماه مارس سال 2016، الگوریتم آلفاگوی AlphaGo شرکت دیپمایند Deepmind توانست، لی سِدول، قهرمان جهانی بازی گو Go را در 18 بازی با نتیجه 4-1 شکست دهد. بیش از 200 میلیون نفر بیننده این بازیها بودند. بازیهایی که در آن یک ماشین استراتژی فرابشری برای غلبه بر حریف در بازی گو را یاد گرفته بود؛ چیزی که پیش از آن غیرممکن یا بسیار دور از تصور بود.
شکست قهرمان بازی گو در این بازیها به خودی خود دستآورد قابلتوجهی بود، اما در اکتبر سال 2017، شرکت دیپمایند قدم بزرگ دیگری برداشت.
الگوریتم آلفاگو زیرو
در این سال نسخه جدیدی از الگوریتم آلفاگو به نام «آلفاگو زیرو» در مقالهای باعنوان « Mastering the Game of Go without Human Knowledge » معرفی شد. این الگوریتم جدید توانست الگوریتم آلفاگو را 100-0 شکست دهد. آلفاگو زیرو استراتژیهای این بازی را تنها از بازی کردن با خودش آموخت. آلفاگو زیرو از استراتژی «لوح سپید » (به معنای خالی گذاشتن خانههای بازی) آغاز کرد و به تدریج استراتژیهای را پیدا کرد که به کمک آنها توانست جد خود را در این بازی شکست دهد. از آن پس متخصصان متوجه شدند که برای طراحی الگوریتم هوش مصنوعی که عملکرد فرابشری داشته باشد، نیازی به دیتابیس حاوی نمونههای واقعی از بازیهای حرفهای بین انسانها نیست.
دیپماید حدود 48 روز بعد در ماه دسامبر 2017، مقالهای با عنوان «Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm» منتشر کرد و در آن اثبات کرد که آلفاگو زیرو قادر است قدرتمندترین برنامههای جهان از جمله StockFish و Elmo را نیز در بازی شطرنج معمولی و حتی شطرج ژاپنی شکست دهد. تمام فرآیند یادگیری آلفاگو زیرو، یعنی از زمانی که اولین تصویر بازی را دید تا زمانی که قهرمانان دنیا را شکست داد، تنها 24 ساعت بهطول انجامید.
بدین ترتیب، الگوریتم آلفازیرو که میتواند بدون نیاز به دانش قبلی و استراتژیهای انسانی در هر حوزهای مهارت کسب کند، متولد شد.
این دستآورد دو نکته حائز اهمیت دارد:
- برای آموزش آلفازیرو به تجربیات انسانها و متخصصان هیچ نیازی نیست.
متدولوژی زیربنایی آلفاگو زیرو میتواند روی هر بازی که دارای اطلاعات کامل باشد (یعنی بازی که وضعیت بازی در هر لحظه برای هر دو بازیکن کاملاً روشن و واضح باشد) اجرا شود، زیرا در چنین بازی هیچ تخصص خاصی به جز دانستن قوانین بازی نیاز نیست.
به همین دلیل بود که دیپمایند توانست تنها پس از 48 ساعت از انتشار نسخه اصلی آلفاگو زیرو، این الگوریتم را برای بازیهای شطرنج معمولی و شطرنج ژاپنی نیز آماده کند. درواقع تنها چیزی که باید تغییر میکرد، فایل ورودی بود که سازوکار اصلی بازی را تغییر میداد و پارامترهای مربوط به شبکه عصبی و درخت جستوجوی مونت کارلو Monte Carlo tree search را تنظیم میکرد.
[irp posts=”24284″]- این الگوریتم بهطرز عجیبی شیک و جذاب است!
اگر آلفازیرو از یک الگوریتم بهشدت پیچیده استفاده میکرد که تنها افراد انگشتشماری در دنیا میتوانستند آن را درک کنند، باز هم دستآورد بزرگی به شمار میآمد؛ اما آنچه آلفازیرو را به الگوریتمی فوقالعاده تبدیل کرد، سادگی آن بود. آلفازیرو از نسخههای پیشین خود نیز پیچیدگیهای کمتری دارد. فرآیند یادگیری این الگوریتم به سادگی زیر است:
ابتدا براساس سناریوهای محتمل آینده و بهصورت ذهنی بازی را انجام میدهد، مسیرهای قابل اعتماد را در اولویت قرار میدهد، در همین حین واکنشی که ممکن است دیگران نشان دهند را درنظر میگیرد و به بررسی وضعیتهای ناشناخته ادامه میدهد. اگر بازی در شرایطی قرار بگیرد که برای الگوریتم ناآشنا باشد، الگوریتم میزان مطلوبیت وضعیت را میسنجد و در ذهن خود به عقب برمیگردد تا ببیند چه مسیری تا رسیدن به این امتیاز طی شده است.
پس از آنکه بررسی احتمالات آتی به اتمام برسد، اقدامی که بیشتر از سایرین جستوجو شده اجرا میشود. الگوریتم در پایان بازی نیز مجدداً به عقب بازمیگردد و زمانهایی که درخصوص برآورد ارزش آتی وضعیتها دچار قضاوت اشتباه شده را ارزیابی کرده و سپس براساس آن، درک و فهم خود از بازی را بهروزرسانی میکند.
بهنظر شما این فرآیند، مشابه فرآیند یادگیری در خود شما نیست؟ علت انجام یک حرکت نامناسب در بازی ممکن است قضاوت اشتباه درباره ارزش آتی موقعیت بعدی باشد یا برآورد اشتباه حرکت بعدی رقیب و به همین دلیل گاهاً برخی از احتمالات را درنظر نمیگیریم. این موارد دقیقاً همان جنبههایی از عمل بازی کردن هستند که آلفازیرو باید بیاموزد.
چگونه آلفازیرو خود را بسازیم؟
ابتدا برای درک بهتر سازوکار آلفاگو زیرو، خلاصه ارائه شده در این مقاله را مطالعه نمایید. در دست داشتن این خلاصه برای نوشتن بخشهای مختلف کد به شما کمک میکند. همچنین مقاله « AlphaGo Zero – How and Why it Works» سازوکار آلفاگو زیرو را با جزئیات بیشتری توضیح داده است که میتوانید از آن نیز کمک بگیرید.
نوشتن کد
برای شروع فرآیند یادگیری باید دو قطعه کد ابتدایی در فایل run.ipynb را در Jupyter notebook اجرا کنید. زمانی که تعداد موقعیتهای تولید شده در بازی به مقداری که برای پرکردن حافظه کافی است، برسد؛ شبکه عصبی فرآیند آموزش را آغاز میکند. الگوریتم با انجام بازیهای بیشتر با خود و یاد گرفتن نکات مختلف از این بازیها، به تدریج در پیشبینی ارزش بازی و حرکت بعدی در هر موقعیت بهتر میشود و درنتیجه، تصمیمات بهتری نیز میگیرد و بازی هوشمندانهتری از خود به نمایش خواهد گذاشت.
در ادامه نگاهی جزئیتر به کدهای این الگوریتم میاندازیم و نتایج حاصله را میبینیم که اثبات میکند الگوریتم هوش مصنوعی طی زمان قدرتمندتر شده است.
پینوشت: در ادامه تنها درک خود از آنچه در مقاله معرفی آلفازیرو گفته شده را با شما به اشتراک میگذارم. بنابراین، ممکن است برخی از آنها کاملاً درست نباشند و من پیشاپیش از این بابت از شما عذرخواهی میکنم.
بازی Connect4
بازی که الگوریتم آلفازیرو ما میخواهد یاد بگیرد، بازی Connect4 (بازی دوز چهارتایی) است. این بازی به پیچیدگی بازی گو نیست، اما در آن 4.531.985.219.092 موقعیت مختلف وجود دارد.
قوانین بازی کاملاً واضح هستند. بازیکنان باید به نوبت یک مهره از رنگ انتخابی خود را در یکی از خانههای خالی بگذارند. اولین بازیکنی که بتواند 4 مهره خود را در یک ردیف (به صورت افقی، عمودی و یا اریب) به صف کند، برنده بازی خواهد بود. اگر تمام صفحه بازی پر شده باشد، اما هیچ 4 مهرهای به صف نشده باشند، بازی با نتیجه مساوی به اتمام خواهد رسید.
فایل game.py
این فایل حاوی قوانین بازی Connect4 است. هر مربع در صفحه بازی یک شماره بین 0 تا 41 دارد:
فایل game.py منطق پشت ایجاد هر وضعیت جدید را در صفحه بازی ارائه میکند. برای مثال، صفحه بازی را خالی درنظر بگیرید، سپس اقدام 38 انجام میشود، متد takeAction منجر به ایجاد یک وضعیت جدید در صفحه بازی میشود. این وضعیت در اثر قرار گرفتن مهره بازیکن اول در خانه میانی در پایینترین ردیف صفحه بازی ایجاد شده است.
شما میتوانید فایل game.py را با هر فایل دیگری که با این API مطابقت دارد، جایگزین کنید و بدین ترتیب، الگوریتم در چارچوب قوانینی که به آن داده شده، با خودش بازی میکند و استراتژیهای لازم برای آن بازی را میآموزد.
فایل run.ipynb
این فایل حاوی کدهایی است که فرآیند یادگیری را آغاز میکنند. این فایل قوانین بازی را بارگذاری میکند و پس از آن، حلقه اصلی الگوریتم که دارای سه مرحله 1. بازی با خود، 2. آموزش مجدد شبکه عصبی و 3. ارزیابی شبکه عصبی است را تکرار میکند.
در این حلقه دو عامل تصمیمگیرنده حضور دارند: best_player و current_player.
عامل best_player شبکه عصبی است که بهترین عملکرد را از خود نشان داده و برای ایجاد خاطرات بازی با خود استفاده میشود. عامل current_player نیز شبکه عصبی خود را با کمک آن خاطرات مجدداً آموزش میدهد و در مقابل best_player بازی میکند. اگر این عامل برنده شود، شبکه عصبی درون آن با شبکه عصبی درون best_player عوض میشود و حلقه دوباره از ابتدا آغاز خواهد شد.
[irp posts=”22769″]فایل agent.py
این فایل حاوی کلاس عامل تصمیمگیرنده (بازیکنان بازی) است. هر بازیکن در این بازی توسط یک شبکه عصبی و یک درخت جستوجوی مونت کارلو مختص به خود تعریف میشود.
متد simulation فرآیند جستوجوی درختی مونت کارلو را اجرا میکند. به این ترتیب، عامل تصمیمگیرنده به یکی از گرههای برگی این درخت میرود، آن گره را از طریق شبکه عصبی خود ارزیابی میکند و سپس ارزش آن گره را به درخت بازمیگرداند.
متد act بارها و بارها متد simulation را تکرار میکند تا دریابد کدام حرکت، بهترین حرکت در وضعیت کنونی است. سپس اقدام انتخابی به بازی برمیگردد تا حرکت انجام شود.
متد replay نیز شبکه عصبی را با استفاده از خاطرات بازیهای قبلی، آموزش میدهد.
فایل model.py
این فایل حاوی کلاس Residual_CNN است که در آن نحوه ساخت سریع شبکه عصبی شرح داده شده است.
در مقاله آلفاگو زیرو گفته شده که این الگوریتم از نسخه فشرده معماری شبکه عصبی Condensed version of the neural network architecture استفاده میکند. به عبارت دیگر، ابتدا یک لایه پیچشی Convolutional layer داریم که چندین لایه باقیمانده درون آن وجود دارد که بعدتر به دو بخش ارزش و سیاست تقسیم میشود.
عمق و تعداد فیلترهای پیچشی را میتوان در فایلconfig معین کرد. در اینجا، برای ساخت شبکه از کتابخانهKeras و Tensorflow استفاده شده است. برای مشاهده هر فیلتر پیچشی و لایههای densely connected در شبکه عصبی، کد زیر را در فایل run.ipynb اجرا کنید.
فایل MCTS.py
این فایل حاوی کلاسهای Node ،Edge و MCTS است که درخت جستوجوی مونت کارلو را تشکیل میدهند. کلاس MCTS حاوی متدهای moveToLeaf و backFill است که پیشتر به آنها اشاره کردیم. همچنین، نمونههای کلاس Edge، آمار و اطلاعات مربوط به هر حرکت بالقوه را ذخیره میکنند.
فایل config.py
در این فایل پارامترهای اصلی که در الگوریتم تأثیرگذار هستند، تعریف میشوند.
تنظیم این متغیرها روی زمان اجرای کد، دقت شبکه عصبی و موفقیت کلی الگوریتم تأثیر میگذارد. پارامترهای بالا یک بازیکن قدرتمند میسازند، اما اجرای آنها زمان زیادی میبرد. برای افزایش سرعت این الگوریتم، میتوان از پارامترهای زیر استفاده کرد:
فایل funcs.py
این فایل حاوی توابع playMatches و playMatchesBetweenVersions است که بازی را بین دو عامل تصمیمگیرنده آغاز میکند. برای بازی کردن و رقابت یک الگوریتم با خودش، کد زیر را اجرا کنید (این کد در فایل run.ipynb نیز موجود است):
from game import Game from funcs import playMatchesBetweenVersions import loggers as lgenv = Game() playMatchesBetweenVersions( env , 1 # the run version number where the computer player is located , -1 # the version number of the first player (-1 for human) , 12 # the version number of the second player (-1 for human) , 10 # how many games to play , lg.logger_tourney # where to log the game to , 0 # which player to go first - 0 for random )
فایل initialise.py
وقتی الگوریتم را اجرا میکنید، تمام فایلهای model و memory در پوشه run که در پوشه اصلی قرار گرفته، ذخیره میشوند. از این نقطه به بعد، برای اجرای مجدد الگوریتم باید پوشه run را به پوشه run_archive منتقل کنید و یک شماره اجرا به نام آن اضافه کنید. سپس باید شماره فولدر اجرا، شماره نسخه مدل و شماره نسخه حافظه را در فایل initialise.py تعریف کنید بهطوریکه متناظر با محل قرار گرفتن فایلهای مذکور در پوشه run_archive باشد. به این ترتیب، با اجرای کردن الگوریتم به همان روش همیشگی، اجرای آن از این نقطه شروع میشود.
فایل memory.py
یکی از نمونههای کلاس Memory خاطرات مربوط به بازیهای قبلی را ذخیره میکند. الگوریتم از این خاطرات برای آموزش مجدد شبکه عصبی عامل current_player استفاده میکند.
فایل loss.py
این فایل حاوی یک تابع هزینه دلخواه custom loss function است که از رسیدن پیشبینیهایی که ناشی از حرکات خلاف قوانین بازی هستند به تابع زیان آنتروپی متقاطع cross entropy loss function جلوگیری میکند.
فایل settings.py
این فایل محلی است که پوشههای run و run_archive در آن ذخیره شدهاند.
فایل loggers.py
فایلهای log در پوشه log که درون پوشه run قرار گرفته، ذخیره میشوند.
برای فعال کردن فرآیند logging، باید مقدار متغیرهای logger_disabled در این فایل را برابر False قرار دهید.
مشاهده فایلهای log به شما کمک میکند تا سازوکار الگوریتم را بهتر درک کنید و ذهن آن را بخوانید. یک نمونه از فایل logger.mcts را میتوانید در ادامه ملاحظه کنید.
[irp posts=”17100″]حرکتهای داده شده را مشاهده نمایید:
نتایج
پس از چند روز آموزش الگوریتم به نمودار زیر میرسیم که زیان را در مقابل تعداد تکرارهای mini-batch به تصویر میکشد:
بالاترین خط نشاندهنده خطا در بخش سیاست است (آنتروپی متقاطع احتمالات حرکت در درخت جستوجوی مونت کارلو دربرابر خروجی شبکه عصبی). پایینترین خط نیز خطا در بخش ارزش را نشان میدهد (میانگین مربعات خطا بین ارزش واقعی بازی و ارزش پیشبینیشده توسط شبکه عصبی). خط میانی نیز میانگین خطا در این دو بخش است.
همانطور که ملاحظه میفرمایید، واضح است که توانایی و دقت شبکه عصبی در پیشبینی موقعیت بازی و حرکت احتمالی بعدی بهتدریج بهبود پیدا کرده است. من یک رقابت بین 17 بازیکن (با شبکههای عصبی شماره 1 تا 49) ترتیب دادم تا به شما نشان دهم که این بهبود باعث میشود بازی الگوریتم قویتر و بهتر شود. هر جفت بازیکن در این رقابت دو بار با یکدیگر بازی کردند بهنحوی که در هر بازی یکی از آنها حرکت اول را انجام میداد.
جدول زیر جایگاه نهایی بازیکنان را نشان میدهد:
روشن است که نسخههای جدیدتر شبکه عصبی عملکرد بهتری از نسخههای ابتدایی داشتهاند و در اغلب بازیهایشان برنده شدهاند. علاوه بر این، در اینجا یادگیری هنوز تکمیل نشده است و با صرف زمان بیشتر برای آموزش الگوریتم، بازیکنان قویتر میشوند و استراتژیهای پیچیدهتری را خواهند آموخت.
برای مثال، یکی از استراتژیهای موردعلاقه شبکه عصبی در این بازی پر کردن ستون میانی صفحه بازی است. بیایید تفاوت نسخه اول و سیام شبکه عصبی در اجرای این استراتژی را با هم ببینیم:
این استراتژی، استراتژی خوبی است، زیرا برای به صف کردن مهرهها عمدتاً به ستون میانی صفحه بازی نیاز داریم. بنابراین، با اشغال این ستون در همان ابتدای بازی، میتوان اطمینان حاصل کرد که رقیب این مزیت را به دست نیاورد. شبکه عصبی خود و بدون کمک یا دخالت انسان این نکته را آموخته است.
یادگیری سایر بازیها
در پوشه games یک فایل به نام game.py نیز هست که حاوی اطلاعات مربوط به بازی Metasquares است. در این بازی هر بازیکن ایتدا یکی از مهرههای X یا O را انتخاب میکند و سپس باید مهرههای خود را به نحوی در صفحه بازی بچیند که یک مربع (در هر سایزی) تشکیل شود. هر چه سایز مربع بزرگتر باشد، امتیاز بازیکن بیشتر خواهد بود و درنهایت، بازیکنی برنده میشود که امتیاز بیشتری کسب کرده باشد.
اگر فایل game.py بازی Connect4 را با فایل game.py بازی Metasquares عوض کنید، همین الگوریتم میتواند بازی Metasquares را بهجای Connect4 یاد بگیرد.