Емулация на компютърни игри с помощта на невронна мрежа

Най-четени

Даниел Десподов
Даниел Десподов
Новинар. Увличам се от съвременни технологии, информационна безопасност, спорт, наука и изкуствен интелект.

Оригиналът е на Ollin Boer Bohan, който стъпка по стъпка ни въвежда в дебрите на невронните мрежи

Аз успях да пресъздам надземния свят на Pokémon, който общо взето става за игра и може да се пробва на адрес madebyoll.in/posts/game_emulation_via_dnn/demo.

Емулация на компютърни игри с помощта на невронна мрежа

Това доста прилича на компютърна игра, само че аз не съм написал нито един ред код за нея. Всъщност това е невронна мрежа, която подражава на видеоигрите.

Програма? Игра? Невронна мрежа?

Програмите са последователности от команди, преобразуващи входните данни в изходни.

Човекът може да изпълнява команди, които преобразуват входните данни в изходни. Ето един пример:

  1. В началото вземаме две числа
  2. Сумираме ги
  3. Делим полученото на две и получаваме крайния резултат

Например, (190, 10)→100 или (2, 4)→3

Показаните по-горе команди са програма, написана на естествен за хората език. Там ги няма междинните стъпки, като например, как става събирането на две числа? И какво всъщност са числата? Но това е съвсем в реда на нещата, понеже хората имат познания, които запълват тази липса на информация.

Програмите за компютри се пишат с помощта на специални езици за програмиране

Компютърът може да изпълни следните команди, за да преобразува входните данни в изходни:

print((
int(input("1st number: ")) + int(input("2nd number: "))
) / 2)

Това също е програма, подобна на първата, само че е написана с помощта на програмен език. Тоест, ако напишем програма на някакъв език за програмиране, то на човека не се налага да я изпълнява. Ние можем да наредим това да бъде извършено от компютъра.

Проблемът за буквалното изпълнение на желанията от джиновете

Недостатъкът при писането на програми за компютър (а не за човек) е в това, че компютрите на практика нямат никакви фонови познания. Компютърът винаги послушно, съвсем точно и без каквато и да било инициатива изпълнява написаните от нас програми.

Това често води до ситуации, които в компютърните среди станаха популярни като „буквалното изпълнение на желанията от джина“ – когато компютърът върши точно това, което сме написали, а не което сме искали.

Емулация на компютърни игри с помощта на невронна мрежа

Видеоиграта също е вид програма

Видеоиграта е някаква програма, която получава входните сигнали от елементите за управление (клавиатура, джойстик и т.н.) и в зависимост от тях създава съответните видео кадри. Pokémon е един доста добър пример за този процес.

Емулация на компютърни игри с помощта на невронна мрежаНевронната  мрежа също е разновидност на компютърната програма

Невронните мрежи напомнят на покемона Дито в света на програмите. Ние можем да напишем (да обучим) невронната мрежа да имитира която и да било друга програма, която вече съществува или се предполага, че може да съществува.

Емулация на компютърни игри с помощта на невронна мрежа

По принцип, можем да обучим невронната мрежа да имитира някоя компютърна игра, а след това да използваме вече обучената невронна мрежа вместо реалната, при това по такъв начин, че никой няма да забележи разликата.

Емулация на компютърни игри с помощта на невронна мрежа

Само че не се знаят дори и основните принципи. Как ето именно сега може да на практика да се създаде невронна мрежа, която да работи като компютърна игра? Какво, ама съвсем конкретно трябва да се направи? Как да постъпим, ако направеното изобщо не работи както трябва и тотално се срива? Да започваме.

Как се създава една невронна мрежа

Невронните мрежи се пишат чрез масиви от данни

На практика всички програми, а и повечето видеоигри се пишат във вид на код с помощта на традиционните програмни езици. Но невронните мрежи се пишат с помощта на масиви от данни (Karpathy.medium.com/software-2-0-a64152b37c35). Командите вход-изход за невронната мрежа са буквално написани като огромен масив от желаните двойки вход-изход.

Тоест, за да имитирам играта Pokémon с помощта на невронна мрежа, в началото ми е необходим масив от двойки във вид (сигнали на управлението, памет)-(видео кадър). Този масив трябва да съдържа всяко подобно на игра поведение, което тази невронна мрежа трябва да покаже.

Събираме масива от данни

Изтеглих и мащабирах по подходящ начин няколко видеа с Pokémon геймплей, за да получа набор от еталонни изходни данни, които в този  случай с видео кадри.

Емулация на компютърни игри с помощта на невронна мрежа

При тези видеа липсват входните данни във вид на управление. Просто подбрах някои поредици от кадри според собствените си догадки и интуиция.

За да избегна необходимостта да маркирам и записвам в паметта всеки входен и изходен сигнал реших просто да подавам предишния видео кадър.

Емулация на компютърни игри с помощта на невронна мрежа

Но тази система, в която всичко извън пределите на екрана се забравя, ще бъде най-меко казано, повърхностна. Но си помислих, че ако невронната мрежа успее да имитира този масив от данни, то това ще е достатъчно за едно малко демо.

Емулация на компютърни игри с помощта на невронна мрежа

Кодът на обучението

Създаваме необучена невронна мрежа

За да създадем невронна мрежа, имитираща нашия масив от данни, е необходимо да се започне с чиста невронна мрежа.

Тази невронна мрежа включва хиляди параметри, които се променят по време на обучението и на нейното трениране. При различните значения на тези параметри, които понякога условно се наричат неврони, тази невронна мрежа ще демонстрира различно поведение. Първоначалните параметри обикновено имат случайни стойности и в подобно състояние невронната мрежа не може да прави нищо полезно.

Аз създадох зададох в един от многобройните електронни облаци невронна мрежа, която да има около 300 000 параметъра, което е съвсем малко според стандартите на съвременните невронни мрежи.

Емулация на компютърни игри с помощта на невронна мрежаМеханизмът  на оценяването

Сега ще ни е необходим някакъв начин за оценка, доколко добре нашата невронна мрежа имитира подготвения масив от данни, за който говорихме по-горе. Този механизъм трябва да избира случайни двойки вход/изход, да ги прокарва през невронната мрежа и да дава оценка доколко точно направените от невронната мрежа изводи съответстват на реалните изходи от нашия първоначален масив.

Казано с други думи, по този начин измерваме погрешността по отношение прогнозите на невронната мрежа и реалните данни от масива. Колкото е по-малка погрешността, толкова по-добре се справя невронната мрежа, а нулата е най-добрата оценка, която означава пълно съответствие.

В моя случай при първоначалното състояние на невронната мрежа, когато тя има параметри със случайни значения, тя създаваше еднакви серии от кадри при произволни входни данни и имаше лоши оценки. Трябваха ми по-качествени параметри.

Емулация на компютърни игри с помощта на невронна мрежа

Създаваме цикъла на обучението

За да подобрим параметрите ще трябва да създадем така нареченият цикъл на обучението. Това е фрагмент, който многократно проверява каква е оценката и внася неголеми промени в параметрите, за да я подобри. Този фрагмент е много важен, понеже при неголямата промяна нагоре и надолу на всеки един параметър, се извършва проверка, дали няма подобрение на оценката. По този начин постепенно се променят всички параметри на невронната мрежа в посока подобряване на оценката.

По време на този цикъл на обучението периодично ни се показват междинни визуализации на случващото се.

Емулация на компютърни игри с помощта на невронна мрежа

По време на изпълнение на цикъла на обучението параметрите се променят, а средната оценка става все по-добра и по-добра. Буквално пред очите ми цикълът на обучение постепенно превръща инициализираната по случаен начин невронна мрежа в такава, която много добре успява да имитира нашия конкретен масив от данни.

Емулация на компютърни игри с помощта на невронна мрежа

С течение на времето промените започват да се неутрализират една спрямо друга и оценката постепенно спира да се подобрява. Но в края на краищата имаме невронна мрежа с доста добри оценки, която сравнително добре имитира поведението вход/изход на нашия начален масив.

Емулация на компютърни игри с помощта на невронна мрежа

Ако всичко наистина се е получило, то нашата невронна мрежа е научила основните правила на имитация, които успешно ще се задействат и при съвсем други неизвестни досега входни данни.

Нашата процедура на обучение предпочита такава конфигурация на параметрите, които са близки до началните случайни значения на нейните параметри и тъй като тя няма достатъчен брой неврони (параметри) за запомнянето на целия масив от данни, става ясно, че ще започне да използва някакво обобщение.

Емулация на компютърни игри с помощта на невронна мрежа

След известно време прогнозите на тази невронна мрежа стават съвсем нелоши, а и оценките изглеждат добре. Тоест, по този начин преобразувах първоначалния масив с данни в програма, която невронната мрежа може да изпълнява. Настъпи времето да я стартирам.

Джинът нанася страшен удар

Когато се опитах да използвам тази невронна мрежа като игра, за съжаление моята невронна мрежа си остана просто невронна мрежа. Съвсем недействаща.

Емулация на компютърни игри с помощта на невронна мрежа

Защо, дявол да го вземе стана така? Да де, обучението може да се счита за код, а кодът може да има бъгове… Що за емулация на Pokémon се получи? Никаква…

Трите проблема на невронните мрежи

За съжаление, дори и да успеете да кодирате един идеален цикъл на обучение, съществуват така наречените три проблема на „джина, който изпълнява желанията съвсем буквално“ и които никакво обучение не може да премахне. Това всъщност са трите основни причини, заради които създадената и уж обучена от вас невронна мрежа не прави каквото трябва.

Проблем № 1 – недостатъчна мощност. Невронната мрежа не може сама да си добави неврони

Емулация на компютърни игри с помощта на невронна мрежа

Използваната във всеки конкретен случай невронна мрежа може да се окаже твърде слаба, за да опише възможно най-пълно връзката вход/изход от входния масив с данни (дори да бъдат намерени възможно най-добрите параметри на невроните).

Дори и многократно да удължим обучението, недостатъчно мощната невронна мрежа ще продължи да има ниски оценки.

Трябва някак да се направи така, че самата структура на нашата невронна мрежа да съответства на конкретната задача или да бъде по-гъвкава (няколко слоя от неврони), за да може да се постигне идеалната оценка за получаване на решението.

В този конкретен случай аз исках моята невронна мрежа да бъде толкова малка и опростена, че да може да работи в средата на браузър без каквито и да било специални оптимизации на производителността от моя страна. Ето защо я направих твърде маломощна.

Пробвах да удвоя нейната мощност до 600 хиляди параметъра (неврона), като едновременно с това се опитах по възможно най-добрия начин да разпределя тази мощност на базата на моето разбиране, как трябва става емулирането на тази игра. По този начин успях да намля загубите при обучението, не не много. При тестването на модела нещата започваха доста добре, но съвсем скоро невронната мрежа тотално се сриваше.

Емулация на компютърни игри с помощта на невронна мрежа

Дяволска работа. Какво още може да не е наред с моята невронна мрежа?


Край на първа част. Във втората част ще разгледаме следващите два основни проблема при работа с невронни мрежи и ще направим още няколко съвсем базови стъпки в сферата на невронните мрежи, които са в основата на изкуствения интелект.

АбонаментВсичко важно от света на технологиите, директно в пощата ти.

С абонирането приемате нашите Условия и Политика за поверителност. Може да се отпишете с един клик по всяко време.


Коментирайте статията в нашите Форуми. За да научите първи най-важното, харесайте страницата ни във Facebook, и ни последвайте в Google Новини, TikTok, Telegram и Viber или изтеглете приложението на Kaldata.com за Android, iPhone, Huawei, Google Chrome, Microsoft Edge и Opera!

1 Коментар
стари
нови оценка

Нови ревюта

Подобни новини