T-Rex Runner — игра-пасхалка, спрятанная в Chrome, недавно я использовал только что запущенныйTensorFlow.jsРазработана программа ИИ, которая работает полностью независимо в среде браузера. Как показано на рисунке ниже, ИИ может легко управлять Тираннозавром (T-Rex), чтобы избегать препятствий.
ИИ постепенно научился управлять тираннозавром, чтобы избегать препятствий после 3 попыток.
После введения генетического алгоритма ИИ может научиться управлять со 2-х попыток
Посмотреть онлайн-демонстрацию
Версия для нейронной сети- Поддерживает только настольную версию Chrome.
Генетический алгоритм + нейронная сеть- Поддерживает только настольную версию Chrome.
Загрузите или добавьте мой исходный код в закладки на Github
Как приверженец браузера Chrome, вы, возможно, уже обнаружили пасхальное яйцо «T-Rex Runner», скрытое на странице ошибки браузера Chrome «Не удается подключиться к Интернету».
Если вы еще не играли в T-Rex Runner, вы можете открыть пасхальные яйца, выполнив следующие действия:
Откройте браузер Chrome, введите chrome://dino в адресной строке и нажмите Enter;
Вы увидите указанный выше интерфейс ошибки, но он все еще находится в статическом состоянии, не бойтесь, что это вход в яйцо;
Нажмите пробел и начните игру!
Ваша задача - продолжать двигаться вперед, не встречая в воздухе кактусов и птерозавров. Чем дольше вы будете упорствовать, тем выше балл и выше сложность.
О TensorFlow.js
Будучи популярным жареным цыпленком в мире глубокого обучения, организация с открытым исходным кодом TensorFlow, наконец, запустила первую в марте 2018 года.версия JavaScript. TensorFlow.js может выполнять основные задачи, такие как обучение модели, выполнение и переобучение, на стороне браузера, а с помощью технологии WebGL он может выполнять процесс вычислений с помощью аппаратного ускорения графического процессора, такого как версии Python и C++.
В настоящее время в Интернете очень мало руководств по TensorFlow.js, которые в основном представляют собой анализ официальных примеров.Эта статья надеется начать с примеров и дать вам некоторую мотивацию к обучению!
Об этой статье
Цель этой статьи — построить искусственную нейронную сеть на стороне браузера на основе TensorFlow.js и посредством повторного обучения позволить ИИ научиться управлять тираннозавром, чтобы успешно избегать препятствий. Структура работы выглядит следующим образом:
Изменить игровую программу: представить основную логику кода игры, провести рефакторинг кода игры с использованием ES6 и других технологических стеков, а также ввести новые события жизненного цикла игры.
Реализация алгоритмических моделей: сосредоточьтесь на том, как реализовать модели алгоритмов ИИ на основе искусственных нейронных сетей.
модель ансамблевого алгоритма: Интеграция модели алгоритма с игрой.
Модель алгоритма оптимизации: Увеличивая количество игроков с ИИ и тираннозавров, мы можем легко повысить эффективность машинного обучения без изменения модели алгоритма.
Суммировать
1. Модифицировать игровую программу
1.1 Рефакторинг с использованием современного переднего стека технологий
Исходный код T-Rex Runner можно найти по адресуРепозиторий кода Chromium, но эта маленькая игра была написана в 2014 году, с использованием технологий эпохи ES5, и что еще хуже, так это отсутствие модульности, исходный код всей игры размещен вв том же файле, что значительно увеличивает сложность понимания и модификации исходного кода.
Поэтому я потратил полдня, переписывая проект t-rex-runner с помощью современного стека технологий, таких как ES6/ES7 + LESS + Webpack, и внедрил ESLint для обеспечения качества кода.
Кроме того, я также удалил сопутствующие коды, такие как звуковые эффекты, управление мышью, поддержку мобильного терминала и экран GameOver, а для того, чтобы позже использовать генетический алгоритм, я также добавил в игру многопользовательский режим (Multiplayer Mode, т. е. в той же игре одновременно появляются несколько тираннозавров).
t-rex-runner — довольно стандартная игровая программа для объектно-ориентированного программирования, на самом деле вы можете использовать ее как классический пример начала разработки игр HTML5. Рефакторинг проекта t-rex-runner в основном включает в себя следующие типы:
Класс бегуна: это ядро игры и управляет жизненным циклом всей игры.Основные члены класса включают в себя:
свойство currentSpeed: Указывает текущую скорость игры. Чем дольше игрок упорствует, тем быстрее будет скорость. Чем выше скорость, тем выше сложность.
метод инициализации(): Ответственный за инициализацию параметра конфигурацииCanvas,Horizon,DistanceMeter,TRexGroupи другие экземпляры класса, и срабатывает в первый разrestart()а такжеupdate().
метод перезапуска(): сбросить все параметры среды выполнения и перезапустить новую игру.
метод обновления(): обновить и перерисовать текущий кадр с помощьюrequestAnimationFrame()называется со скоростью около 60 кадров в секунду (поRuntime.getFPS()метод).
Трекс класс: представляет T-Rex, Tyrannosaurus rex. Основные члены класса:
Прыжки недвижимости: указывает, находится ли текущий тираннозавр в состоянии прыжка (прыгает, прыгает или приземляется и т. д.).true).
метод сброса(): сбросить все параметры Тираннозавра, установленныеRunner.restart()Вызывается перед перезапуском игры
Метод startJump(): Управляйте тираннозавром, чтобы он взлетел и уклонился от кактуса.
Метод setDuck(): управляйте тираннозавром, чтобы он полз вперед, чтобы избежать низколетящих птерозавров.
Класс TrexGroup: представляет собой популяцию, состоящую из n тираннозавров, которой нет в исходном коде Причина концепции популяции заключается в поддержке многопользовательского режима, то есть n тираннозавров играют в одну и ту же игру независимо друг от друга в одно и то же время. . Помимо поддержки большинства методов класса Trex, он также включает:
Метод жизней(): получить количество живых тираннозавров в текущей популяции.
Класс препятствий: Представляет препятствия, такие как кактусы различной высоты и ширины и птерозавры в воздухе.Основные члены класса включают:
Атрибут типа: указывает текущий тип препятствия, включая кактус (CACTUS_SMALL / CACTUS_LARGE) и птерозавр (PTERODACTYL).
Свойства ширины и высоты: указывают размер препятствия.
Свойства xPos и yPos: указывают положение препятствия.
В дополнение к вышеупомянутым основным типам, другие включают:
Класс горизонта: Представляет весь фон или сцену игровой сцены. Учащиеся, знакомые с разработкой игр, должны знать, что это похоже на концепцию сцены / сцены / фона во многих фреймворках. Эта игра включает в себя облака, звезды, луну и самые важные препятствия Препятствия .
Класс HorizonLine: представляет собой горизонт, а ухабистая дорога помогает оттолкнуться от текущей «скорости».
Класс CollisionBox: Представляет прямоугольник, обычно Trex или Obstacle могут использовать несколько прямоугольников для формирования приблизительного многоугольника для расчета коллизий многоугольников.
Облачный класс: От имени облачных вычислений это должно создавать помехи при идентификации компьютерного изображения.
** Класс дистанционного времени: ** представляет измеритель расстояния в правом верхнем углу.
Модуль ImageSprite: Классическая текстура Sprite.
модуль констант: используется для хранения параметров конфигурации игры по умолчанию.
модуль утилит: Содержит часто используемые инструменты и методы.
1.3 Обеспечение событий жизненного цикла
Чтобы ИИ заменил людей в игре, нам нужно предоставить необходимые события в качестве входных данных в классе Runner в дополнение к методам выходного класса, таким как Trex.startJump():
Событие onReset(): это событие будет запущено при перезапуске игры, обычно в этом событии завершается процесс обучения модели ИИ.
событие onRunning(): Каждый тираннозавр без "крушения" будетupdate()После запуска события возвращаемое значение события будет использоваться какaction,когдаactionдля1указывает, что прыжок будет выполнен,0значит без изменений. Это событие можно использовать для отслеживания состояния игры и в то же время дать команду тираннозавру изменить состояние прыжка в определенное время.
Событие onCrash(): при столкновении тираннозавра с кактусом или птерозавром будет запущено это событие, которое можно использовать для оценки эффекта модели ИИ.Например, в генетическом алгоритме его можно использовать для расчета рейтинга Модель тираннозавра в популяции.
Вот пример программы, основанной на вышеуказанных событиях жизненного цикла:
2.1 Алгоритмическая модель, которую могут понять ученики младших классов средней школы
Термин «алгоритмическая модель» может показаться немного непредсказуемым для учащихся, которые плохо знакомы с ИИ, но это не так.Давайте сначала закроем учебник и взглянем на следующую простую формулу, которую мы выучили в средней школе:
По статистике на каждую дополнительную формулу читателей будет на n меньше Это третья последняя формула этой статьи.
когда, потому что это такЛинейная функция (линейная функция, также известная как линейное уравнение), так это называетсяЛинейная модель, помимо формулы функции в модель также включеныweight,biasи другие параметры, для примера сказано, что если в статье будет на одну формулу больше, то читателей будет на n меньше Это типичная линейная модель**;**
На самом деле решение ИИ, прыгать или нет, также является линейной моделью, которая представлена линейной функцией:
obstacleXа такжеobstacleWidthявляются входными данными, поступающими изhandleRunning()методstateпараметр, в котором:
-obstacleXАбсцисса, представляющая ближайшее препятствие
-obstacleWidthУказывает ширину препятствия
-speedУказывает текущую глобальную скорость игры.
когдаyВыходное значение меньше, чем0, значит, требуется "прыжок".
вw1,w2СоответственноobstacleXа такжеobstacleWidthизмасса,bдасмещение (смещение), которые являются всеми параметрами линейной модели.
В отличие от математики в младших классах средней школы, здесь ввод и вывод обычновектор, в отличие от предыдущих примеров, все скалярные **, ** и в основном линейные операции. Не пугайтесь линейной математики и формул, «алгоритмы» — это не совсем «математика», не говоря уже об «арифметике», читайте дальше.
2.2 Прогнозирование, обучение и оценка
Прогноз
В машинном обучении известные входные данныеxи модельyназывается процессом **прогнозирования**.
повышение квалификации
по известному вводуxи элементы выводаyнастроить модельw1,w2а такжеbПроцесс параметров до "наилучшего эффекта" называетсяобучение (поезд)процесс, иyПоскольку это известный вывод, его также называютэтикетка, аxа такжеyВместе они называются обучающим набором данных. **Для достижения «наилучших результатов» тренировку обычно необходимо повторять много раз.
Оценка
Во время процесса обученияxВ качестве входных данных выполните процесс прогнозирования, свяжите результаты прогнозирования с меткамиyФактические результаты сравниваются, и оценка получается с помощью функции, представляющей способность текущей модели подгонки, которая называетсяоценка (оценка)процесс, эта функция называется оценочной функцией илифункция потерь.
Машинное обучение — это непрерывное обучение, оценка итеративного процесса обучения модели, обучение тем лучше, чем точнее предсказание будущего.
Содержание разделов 2.1 и 2.2 является кратким изложением многолетней практики автора.Пожалуйста, поймите, что существуют неизбежные различия с учебником.Определения терминов можно найти в учебнике.
2.3 Определить абстрактный класс модели алгоритма
Прежде чем официально приступить к реализации алгоритма ИИ, нам также необходимо определить общую объектно-ориентированную модель ИИ——Абстрактный класс модели, членами которого в основном являются:
метод прогнозирования (вводX): по даннымinputXпредсказыватьyзначение и вернуть его.
метод train(inputs, labels): Оптимизация параметров модели на основе входных данных и листов этикеток.
метод fit(inputs, labels): Повторное выполнениеtrain()метод, условие остановки может выполняться определенное количество раз, или когдаloss()Среднеквадратическая ошибка, возвращаемая методом, меньше порогового значения.
Метод потерь (прогнозированные Ys, метки): расчет значения оценки на основе прогнозируемого значения и фактического значения метки. Чем меньше значение, тем лучше подходит текущая модель. Значение по умолчанию:среднеквадратическая ошибка, на самом деле, вычтите значение метки из каждого предсказанного значения, а затем возведите его в квадрат, чтобы найти среднее значение квадратов.
вышесказанноеinputX,inputsа такжеlabelsИ т. д. представлены **векторами**, которые могут быть представлены массивами, а в TensorFlow.jstf.TensorВыражать.
В этом проектеModelАбстрактный класс является базовым классом для всех моделей алгоритмов, давайте посмотрим на исходный код самой простой модели — случайной модели:
Примечание автора: не стоит недооценивать эту модель.С помощью генетического алгоритма случайная модель также может управлять тираннозавром, чтобы избегать препятствий, но эффективность обучения немного ниже.Посмотреть демоверсию в Chrome для настольных ПК.
2.4 Определите вход и выход модели алгоритма
Вход
Проще говоря, мы сначала ставимhandleRunning()метод полученstateПараметр JSON преобразуется в трехмерный вектор, то есть трехмерный массив, и нормализуется.Так называемая **нормализация** может пониматься как функция, которая преобразует скаляр в значение от 0 до 1. . Соответствующий код выглядит следующим образом:
Затем мы определяем выходной термин, самый простой способ — двумерный вектор, где первое измерение представляет вероятность того, что тираннозавр останется неизменным, а второе измерение представляет вероятность прыжка. Например:
[0, 1]выражать跳跃;
[0.2158, 0.8212]выражать跳跃;
[0.998, 0.997]означает保持不变,двигаться дальше;
f([0.1428, 0.02012, 0.00549]) = [0.2158, 0.8212]указывает, что прогнозируемый результат跳跃;
еслиstateдля{ obstacleX: 0.1428, obstacleWidth: 0.02012, speed: 0.00549 }, Тираннозавр разбился после прыжка, вы можете пройти[0.1428, 0.02012, 0.00549]соответствует[1, 0]метка, чтобы сообщить ИИ, чтобы он не делал этого снова в следующий раз, когда он столкнется с этой ситуацией跳跃вверх, но должен保持不变.
2.5 Модель искусственной нейронной сети
Из-за ограниченности места здесь невозможно повторить принципы нейронных сетей. Далее выдержка изWikipedia:
Искусственные нейронные сети(английский: искусственная нейронная сеть, сокращенно ANN), сокращенноНейронные сети(нейронная сеть, сокращенная НН) илинейронная сеть,существуетмашинное обучениеа такжекогнитивная наукадомен, имитациябиологическая нейронная сеть(животныеЦентральная нервная система,особенномозг) структуры и функцииматематическая модельиливычислительная модель, дляфункциясделать оценку или приближение. Нейронные сети рассчитываются путем соединения большого количества искусственных нейронов. В большинстве случаев искусственная нейронная сеть может изменять внутреннюю структуру на основе внешней информации, которая является своего родаадаптивная система. [исходный запрос]Современная нейронная сеть представляет собойнелинейныйстатистическое моделирование данныхинструмент. Типичная нейронная сеть состоит из следующих трех частей:структура(Architecture) структура определяет переменные в сети и их топологические отношения. Например, переменные в нейронной сети могут быть связаны нейронами.Веса(веса) и активации нейронов.
**Правило активности** Большинство моделей нейронных сетей имеют краткосрочное динамическое правило, которое определяет, как нейрон изменяет свое собственное значение возбуждения в зависимости от активности других нейронов. Общая функция активации зависит от весов в сети (то есть параметров этой сети).
**Правило обучения** Правило обучения определяет, как веса в сети корректируются с течением времени. Обычно это рассматривается как кинетическое правило в долговременном масштабе. В целом правила обучения зависят от значений возбуждения нейронов. Это также может зависеть от целевого значения, предоставленного супервизором, и значения текущих весов. Например, дляраспознавание почеркаНейронная сеть с набором входных нейронов. Входные нейроны активируются данными из входного изображения. Значения возбуждения взвешиваются и передаютсяфункцияПосле (определяется разработчиком сети) значения срабатывания этих нейронов передаются другим нейронам. Этот процесс повторяется до тех пор, пока не сработает выходной нейрон. Наконец, значение срабатывания выходного нейрона определяет, какая буква будет распознана.
Обычная многослойная нейронная сеть состоит из трех частей:Входной слой, многие нейроны (Neurons) принимают большое количество нелинейных входных сообщений. Входящее сообщение называется входным вектором.Выходной слой, сообщение передается, анализируется и взвешивается в нейронной связи для формирования выходного результата. Выходное сообщение называется выходным вектором.Скрытый слой, называемый «скрытым слоем», представляет собой слой, состоящий из множества нейронов и связей между входным и выходным слоями. Скрытый слой может иметь несколько слоев, и обычно используется один слой. Количество узлов (нейронов) в скрытом слое не фиксировано, но чем их больше, тем значительнее нелинейность нейронной сети, поэтомупрочность(Система управления сохраняет определенные рабочие характеристики при возмущении определенных параметров, таких как структура и размер.) Более существенно. Обычно выбирают узлы в 1,2–1,5 раза больше, чем входные узлы.
2.6 Построение искусственной нейронной сети
Как показано на рисунке выше, в этом разделе мы построим двухслойную нейронную сеть (Neural Network, сокращенно NN), входным элементом будет матрица, состоящая из трехмерных векторов, а выходным элементом будет матрица, состоящая из двух -мерные векторы Содержит 6 нейронов, а функция возбужденияsigmoid.
Если вы раньше использовали версию TensorFlow для Python, нетрудно обнаружить, что приведенный выше код представляет собой линейную математическую формулу или Python, переведенный в код JavaScript. В отличие от версии Python, поскольку в JavaScript отсутствует языковая функция перегрузки символов Python (перегрузка операций), он более громоздкий в формульных выражениях, таких как математические формулы:
В Python это может быть напрямую выражено как:
y = tf.sigmoid(tf.matmul(x, Weights) + biases)
В JavaScript из-за отсутствия перегрузки плюсика записывается так:
y = tf.sigmoid(tf.matMul(x, weights).add(biases));
3. Модель интегрированного алгоритма
В главе 2 мы реорганизовали структуру кода T-Rex Runner и выставили события жизненного цикла, чтобы ИИ мог перехватывать и контролировать поведение Tyrannosaurus Rex, В конце главы 3 на основе TensorFlow.js мы создали это в 50 строках кода Теперь нам нужно только органично объединить их, чтобы реализовать ИИ, играющий в игры Конкретные шаги заключаются в следующем:
существуетhandleRunning()В обработке событий вызовите модельpredict()метод, согласно действующемуstateрешить, прыгать ли;
существуетhandleCrash()При обработке событий, если тираннозавр разбился из-за «прыжка», запишите метку как «оставить без изменений» в наборе обучающих данных, в противном случае запишите его как «прыжки», что мы называем «учебными уроками» в образовании». процесс «Перебор»;
существуетhandleReset()В обработке событий выполните модельfit()метод, итеративное обучение выполняется в соответствии с последним набором обучающих данных.
Конкретный фрагмент кода выглядит следующим образом:
если вы заметили этоОнлайн-демонстрацияНетрудно обнаружить, что обычно после 4-5 падений ИИ постепенно учится времени и навыкам прыжков через препятствия, но иногда это может занять более 10 раз, если "не повезло", так есть ли способ оптимизировать алгоритм? Ответ да:
Один из способов - через многопользовательский режим, то есть 3 тираннозавра появляются в одной и той же игре одновременно, что соответствует 3 моделям искусственной нейронной сети AI, которые делят уроки неудач Оптимизация приводит к очень высокому уровню успеха и значительно сокращает время обучения, но все же имеет определенную степень случайности.Посмотреть демоверсию в Chrome для настольных ПК
Другим методом по-прежнему является многопользовательский режим, всего 10 тираннозавров за один раунд, разница в том, что мы ввели дарвиновский механизм «выживания сильнейших», то есть после каждого раунда выявляются два тираннозавра, которые продержались дольше всех. будет играть в игру.Спаривание (кроссовер), родитьДетеныши (потомство), медвежонок"хромосома«Унаследовано от родителей и в целях обеспечения биоразнообразия, но и случайномутироватьчастьген, который называется "Генетический алгоритмВ сочетании с генетическим алгоритмом почти гарантировано получение оптимальных параметров модели нейронной сети в течение 4 поколений.Посмотреть демоверсию в Chrome для настольных ПК.
5. Резюме
В этой статье представлен процесс рефакторинга кода игры и использования TensorFlow.js для быстрого создания искусственной нейронной сети на примере игры ИИ с T-Rex Runner.
В будущем этот проект планирует напрямую захватывать информацию об изображении в HTML Canvas с помощью сверточной нейронной сети CNN, анализироватьhandleRunning()серединаstateусловие. Если вам интересен этот проект,Пожалуйста, следите за этим проектом на GithubЯ буду продолжать постоянно обновляться.
Возможно, вы обнаружили, что в этом проекте используется аналогичный режим работы **Test Bench**, да, вы также можете самостоятельно разрабатывать и тестировать новые модели алгоритмов.
Добро пожаловать, чтобы общаться со мной в области комментариев ниже.
Наконец, обратите внимание на нашу колонку:
: поговорим о «интерфейсных технологиях» и «интерфейсном искусственном интеллекте».
Специальный выпуск Alibaba Nanjing Technology: официальный канал обмена технологиями Центра исследований и разработок Alibaba в Нанкине.
Центр исследований и разработок Alibaba в Нанкине набирает передовых технических экспертов и старших инженеров (только социальный набор), добро пожаловать в нашу команду!