Большой разбор: ИИ научился играть в динозаврика из Chrome

При­вет!

В бра­у­зе­ре Google Chrome есть игра с дино­зав­ри­ком. Когда нет интер­не­та, бра­у­зер пока­зы­ва­ет такое:


Если нажать на про­бел, то дино­зав­рик ожи­вёт, и ваша зада­ча — управ­лять им с помо­щью про­бе­ла (пры­жок) и стре­лоч­ки вниз (при­сесть), что­бы не стал­ки­вать­ся с пре­пят­стви­я­ми.

Недав­но в Chrome доба­ви­ли воз­мож­ность поиг­рать в эту игру даже с интер­не­том: вбей­те в адрес chrome://dino

Про­грам­мист из Австра­лии по име­ни Эван (на Юту­бе — CodeBullet) напи­сал ней­ро­сеть, кото­рая сама игра­ет в эту игру, и выло­жил об этом видео:

Спой­лер: в кон­це ИИ про­сто рвёт игру на части.

Давай­те по шагам раз­бе­рём, что он сде­лал и что у него полу­чи­лось в ито­ге. Сам ролик на англий­ском, поэто­му, если вы не зна­е­те англий­ско­го, счи­тай­те эту ста­тью смыс­ло­вым пере­во­дом про­ис­хо­дя­ще­го.

Создание игры

Мож­но научить ИИ играть в игру, про­сто гля­дя на экран и ана­ли­зи­руя всё, что там про­ис­хо­дит. Но тогда быст­ро­дей­ствие ИИ будет огра­ни­че­но ско­ро­стью рабо­ты экра­на, то есть на каких-то сверх­ско­ро­стях ИИ играть уже не смо­жет. А мы хотим играть на сверх­ско­ро­стях, поэто­му эффек­тив­нее будет встро­ить ИИ пря­мо в игру.

Пол и пры­гу­чий пер­со­наж. Что­бы попро­бо­вать первую вер­сию игры как мож­но быст­рее, Эван не рису­ет дино­зав­ра, а дела­ет вме­сто него пры­га­ю­щий пря­мо­уголь­ник. С поверх­но­стью то же самое: про­стая линия вме­сто доро­ги с пер­спек­ти­вой и пес­ком в слу­чай­ных местах. Един­ствен­ное, что пока мож­но в игре — пры­гать пря­мо­уголь­ни­ком на месте:

Кста­ти, если вы обра­ти­те вни­ма­ние на игру в Chrome, то заме­ти­те, что хотя дино­зав­рик (по ощу­ще­ни­ям) бежит по зем­ле, на самом деле его коор­ди­на­та X на экране не меня­ет­ся. Мож­но пред­ста­вить, что это не дино­зав­рик бежит, а как­ту­сы летят на него со всё более высо­кой ско­ро­стью. Иллю­зия!

Дви­же­ние и пре­пят­ствия. На сле­ду­ю­щем шаге Эван дела­ет так, что­бы на дино­зав­ри­ка дви­га­лись как­ту­сы. Но как­ту­сы тоже рисо­вать дол­го, поэто­му сно­ва берём пря­мо­уголь­ни­ки. Сна­ча­ла дела­ем их малень­ки­ми и смот­рим, что про­ис­хо­дит:

Пока всё хоро­шо: пер­со­наж пры­га­ет, пря­мо­уголь­ни­ки дви­га­ют­ся. Мож­но сде­лать сле­ду­ю­щий шаг — доба­вить как­ту­сы раз­ной высо­ты и шири­ны, как в ори­ги­наль­ной игре. И сно­ва это всё ещё пря­мо­уголь­ни­ки:

Смерть от как­ту­сов. Послед­нее, что дела­ет Эван — добав­ля­ет в игру усло­вие, что как толь­ко пер­со­наж кос­нул­ся как­ту­са, то уми­ра­ет. Это дела­ет­ся про­сто про­вер­кой пере­се­че­ния гра­ниц одно­го и вто­ро­го объ­ек­та. Кос­нул­ся как­ту­са — всё исчез­ло:


Теперь всё гото­во для пер­вой вер­сии, мож­но поиг­рать и про­ве­рить, всё ли там про­ис­хо­дит как надо.

Эван не начал про­грам­ми­ро­вать сра­зу всю игру с дино­зав­ра­ми, гра­фи­кой и кра­си­вы­ми как­ту­са­ми. Вме­сто это­го он сде­лал макет игры и физи­ку; потом убе­дил­ся, что всё рабо­та­ет; и толь­ко после это­го заме­нил пря­мо­уголь­ни­ки на дино­зав­ра и как­ту­сы, а линию на полу — на доро­гу с пес­ком. Всё это он про­сто выре­зал из игры и вста­вил в свой про­ект:


Крас­ные пря­мо­уголь­ни­ки — раз­мет­ка гра­ниц объ­ек­тов для опре­де­ле­ния столк­но­ве­ний. Поз­же они про­па­дут.

За кад­ром оста­лось то, как Эван делал птиц: они могут летать низ­ко, повы­ше или совсем высо­ко. Но мы уже пони­ма­ем, что сна­ча­ла это был пря­мо­уголь­ник выше линии, а потом его заме­ни­ли на кар­тин­ку с пти­цей.

Дино­зав­ри­ку тоже при­шлось научить­ся при­ги­бать­ся — пря­мо­уголь­ник, кото­рый умень­шал свою высо­ту, пре­вра­тил­ся в при­ги­ба­ю­ще­го­ся дино­зав­ри­ка:

Нейросеть

Когда игра гото­ва, мож­но к ней при­кру­чи­вать искус­ствен­ный интел­лект. Для это­го Эван пишет про­стую само­обу­ча­ю­щу­ю­ся ней­ро­сеть, кото­рая рабо­та­ет по прин­ци­пу обу­че­ния с под­креп­ле­ни­ем. Это зна­чит, что ИИ сна­ча­ла ниче­го не зна­ет о мире, в кото­рый его поме­сти­ли, и его зада­ча — опре­де­лить для себя пра­ви­ла, кото­рые помо­гут играть в игру как мож­но доль­ше.

Если очень корот­ко, то это рабо­та­ет так:

  • дела­ют пер­вое поко­ле­ние сети;
  • запус­ка­ют её в игру и смот­рят резуль­тат;
  • те вер­сии пер­во­го поко­ле­ния, кото­рые пока­за­ли наи­луч­шие резуль­та­ты или доль­ше всех игра­ли, оста­ют­ся, а осталь­ные уби­ра­ют­ся;
  • эти удач­ные вер­сии сно­ва запус­ка­ют в игру и тоже смот­рят, какие из них пока­жут наи­луч­ший резуль­тат;
  • новых везун­чи­ков остав­ля­ют, осталь­ных уби­ра­ют, и всё повто­ря­ет­ся до тех пор, пока ИИ не научит­ся пол­но­стью про­хо­дить игру.

Пер­вая вер­сия ИИ, кото­рую сде­лал Эван, про­сто пры­га­ла слу­чай­ным обра­зом, и, если пове­зёт, то пере­пры­ги­ва­ла как­ту­сы:


Синяя линия — связь меж­ду пара­мет­ра­ми игры и дей­стви­ем дино­зав­ри­ка. Пока всё при­ми­тив­но.

У пер­вых несколь­ких поко­ле­ний ИИ была при­ми­тив­ная так­ти­ка: про­сто пры­га­ешь и наде­ешь­ся, что интер­вал прыж­ков сов­па­дёт с рас­сто­я­ни­я­ми меж­ду как­ту­са­ми. Это не сра­бо­та­ло, поэто­му к седь­мо­му поко­ле­нию ней­ро­сеть нашла вза­и­мо­связь меж­ду рас­сто­я­ни­ем до пре­пят­ствия, рас­сто­я­ни­ем меж­ду пре­пят­стви­ем и момен­том, когда надо под­пры­ги­вать:


Цвет­ные линии ввер­ху — это свя­зи внут­ри ней­ро­се­ти в упро­щён­ном виде. Вид­но, как одни пара­мет­ры начи­на­ют вли­ять на дру­гие.

Теперь ИИ уме­ет дожи­дать­ся, пока как­ту­сы не ока­жут­ся доста­точ­но близ­ко для прыж­ка, вме­сто того что­бы пере­пры­ги­вать их слу­чай­ным обра­зом.

Инте­рес­ный момент: так как Эван исполь­зу­ет само­обу­ча­ю­щу­ю­ся ней­ро­сеть, то мы можем заме­тить, как в неко­то­рых момен­тах дино­зав­рик раз­два­и­ва­ет­ся или рас­па­да­ет­ся на мно­же­ство частей.

Это свя­за­но с тем, что ИИ посто­ян­но про­ве­ря­ет, что луч­ше: прыг­нуть чуть рань­ше или чуть поз­же. И если какая-то стра­те­гия даёт резуль­тат луч­ше, чем у осталь­ных вари­ан­тов — ИИ дела­ет эту стра­те­гию базо­вой и в сле­ду­ю­щем поко­ле­нии опи­ра­ет­ся уже на неё.


25-е поко­ле­ние — здесь появи­лась реак­ция на низ­ко летя­щую утку: нуж­но при­гнуть­ся.

40-е поко­ле­ние — свя­зи поме­ня­лись, что­бы при­спо­со­бить­ся к высо­кой ско­ро­сти игры, когда как­ту­сы за секун­ду про­ле­та­ют от одно­го края до дру­го­го.

43-е поко­ле­ние — визу­аль­но отли­чие не силь­но замет­но, но неко­то­рые линии в свя­зях ста­ли тол­ще. Это зна­чит, что одни коэф­фи­ци­ен­ты и пара­мет­ры ста­ли силь­нее вли­ять на дру­гие.

Финал

К сорок тре­тье­му поко­ле­нию ней­ро­сеть Эва­на научи­лась играть в дино­зав­ри­ка с такой ско­ро­стью, кото­рая выхо­дит за пре­де­лы чело­ве­че­ских воз­мож­но­стей. Имен­но для это­го и исполь­зу­ют ИИ — что­бы помочь чело­ве­ку справ­лять­ся с зада­ча­ми ещё луч­ше, чем он это дела­ет сей­час.

Есть и другие

На Юту­бе мно­го при­ме­ров, как ней­ро­се­ти учат­ся играть в эту игру. Под­хо­ды суще­ству­ют раз­ные, но чаще все­го вы уви­ди­те какие-то эво­лю­ци­он­ные или гене­ти­че­ские алго­рит­мы, смысл кото­рых в одном: слу­чай­ным обра­зом мути­ру­ешь мно­го исход­ных пер­со­на­жей, про­ве­ря­ешь их, отби­ра­ешь луч­ше­го, потом дела­ешь ему копии и слу­чай­ным обра­зом мути­ру­ешь их. И так шаг за шагом, поко­ле­ние за поко­ле­ни­ем удач­ные мута­ции укреп­ля­ют­ся, а ненуж­ные про­па­да­ют.

Так как маши­ны могут про­го­нять поко­ле­ния очень быст­ро, бук­валь­но за секун­ды, за несколь­ко часов мож­но обу­чить ней­рон­ку какой-нибудь неслож­ной игре, даже если она не зна­ет её пра­вил. А за дни, неде­ли и меся­цы мож­но обу­чить и более слож­ным играм. Об этом — в сле­ду­ю­щих частях.

Нравятся эксперименты с данными? Попробуйте аналитику
Прак­ти­че­ский курс и билет в про­фес­сию ана­ли­ти­ка. Побеж­дай­те зна­ни­я­ми и дан­ны­ми. Посмот­ри­те, что внут­ри.