Внешний искусственный интеллект? TensorFlow.js учится проходить игру

алгоритм JavaScript игра Нейронные сети
Внешний искусственный интеллект? TensorFlow.js учится проходить игру

Заголовок: Если вам понравилась наша статья, не забудьте нажать и подписаться на специальный выпуск Ali Nanjing Technology~ Эта статья воспроизведена изСпециальный выпуск Alibaba Nanjing Technology — Знание, приветствуем Даниэля и Маверикс для публикации вакансий, таких как разработка клиентского/внутреннего интерфейса Alibaba Nanjing, подробности см.Alibaba Nanjing искренне приглашает внешних партнеров присоединиться~.

Ключевые слова: Tensorflow, JavaScript, AI, front-end разработка, искусственный интеллект, нейронная сеть, генетический алгоритм.


Сначала конечный эффект

T-Rex Runner — игра-пасхалка, спрятанная в Chrome, недавно я использовал только что запущенныйTensorFlow.jsРазработана программа ИИ, которая работает полностью независимо в среде браузера. Как показано на рисунке ниже, ИИ может легко управлять Тираннозавром (T-Rex), чтобы избегать препятствий.

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

После введения генетического алгоритма ИИ может научиться управлять со 2-х попыток

Посмотреть онлайн-демонстрацию

  • Версия для нейронной сети- Поддерживает только настольную версию Chrome.
  • Генетический алгоритм + нейронная сеть- Поддерживает только настольную версию Chrome.

Загрузите или добавьте мой исходный код в закладки на Github


Обзор

О игре T-Rex Runner

Как приверженец браузера Chrome, вы, возможно, уже обнаружили пасхальное яйцо «T-Rex Runner», скрытое на странице ошибки браузера Chrome «Не удается подключиться к Интернету».

img

Если вы еще не играли в T-Rex Runner, вы можете открыть пасхальные яйца, выполнив следующие действия:

  1. Откройте браузер Chrome, введите chrome://dino в адресной строке и нажмите Enter;
  2. Вы увидите указанный выше интерфейс ошибки, но он все еще находится в статическом состоянии, не бойтесь, что это вход в яйцо;
  3. Нажмите пробел и начните игру!

Ваша задача - продолжать двигаться вперед, не встречая в воздухе кактусов и птерозавров. Чем дольше вы будете упорствовать, тем выше балл и выше сложность.

О TensorFlow.js

img

Будучи популярным жареным цыпленком в мире глубокого обучения, организация с открытым исходным кодом TensorFlow, наконец, запустила первую в марте 2018 года.версия JavaScript. TensorFlow.js может выполнять основные задачи, такие как обучение модели, выполнение и переобучение, на стороне браузера, а с помощью технологии WebGL он может выполнять процесс вычислений с помощью аппаратного ускорения графического процессора, такого как версии Python и C++.

В настоящее время в Интернете очень мало руководств по TensorFlow.js, которые в основном представляют собой анализ официальных примеров.Эта статья надеется начать с примеров и дать вам некоторую мотивацию к обучению!

Об этой статье

Цель этой статьи — построить искусственную нейронную сеть на стороне браузера на основе TensorFlow.js и посредством повторного обучения позволить ИИ научиться управлять тираннозавром, чтобы успешно избегать препятствий. Структура работы выглядит следующим образом:

  1. Изменить игровую программу: представить основную логику кода игры, провести рефакторинг кода игры с использованием ES6 и других технологических стеков, а также ввести новые события жизненного цикла игры.
  2. Реализация алгоритмических моделей: сосредоточьтесь на том, как реализовать модели алгоритмов ИИ на основе искусственных нейронных сетей.
  3. модель ансамблевого алгоритма: Интеграция модели алгоритма с игрой.
  4. Модель алгоритма оптимизации: Увеличивая количество игроков с ИИ и тираннозавров, мы можем легко повысить эффективность машинного обучения без изменения модели алгоритма.
  5. Суммировать

1. Модифицировать игровую программу

1.1 Рефакторинг с использованием современного переднего стека технологий

Исходный код T-Rex Runner можно найти по адресуРепозиторий кода Chromium, но эта маленькая игра была написана в 2014 году, с использованием технологий эпохи ES5, и что еще хуже, так это отсутствие модульности, исходный код всей игры размещен вв том же файле, что значительно увеличивает сложность понимания и модификации исходного кода.

Поэтому я потратил полдня, переписывая проект t-rex-runner с помощью современного стека технологий, таких как ES6/ES7 + LESS + Webpack, и внедрил ESLint для обеспечения качества кода.

Кроме того, я также удалил сопутствующие коды, такие как звуковые эффекты, управление мышью, поддержку мобильного терминала и экран GameOver, а для того, чтобы позже использовать генетический алгоритм, я также добавил в игру многопользовательский режим (Multiplayer Mode, т. е. в той же игре одновременно появляются несколько тираннозавров).

Код загружен наGithub, видетьsrc/gameв каталоге.

1.2 Основной код игры

t-rex-runner — довольно стандартная игровая программа для объектно-ориентированного программирования, на самом деле вы можете использовать ее как классический пример начала разработки игр HTML5. Рефакторинг проекта t-rex-runner в основном включает в себя следующие типы:

img

  • Класс бегуна: это ядро ​​игры и управляет жизненным циклом всей игры.Основные члены класса включают в себя:

    • свойство 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():

img

  • Событие onReset(): это событие будет запущено при перезапуске игры, обычно в этом событии завершается процесс обучения модели ИИ.
  • событие onRunning(): Каждый тираннозавр без "крушения" будетupdate()После запуска события возвращаемое значение события будет использоваться какaction,когдаactionдля1указывает, что прыжок будет выполнен,0значит без изменений. Это событие можно использовать для отслеживания состояния игры и в то же время дать команду тираннозавру изменить состояние прыжка в определенное время.
  • Событие onCrash(): при столкновении тираннозавра с кактусом или птерозавром будет запущено это событие, которое можно использовать для оценки эффекта модели ИИ.Например, в генетическом алгоритме его можно использовать для расчета рейтинга Модель тираннозавра в популяции.

Вот пример программы, основанной на вышеуказанных событиях жизненного цикла:

let runner = null;

// 排名
let rankList = [];

// 初始化游戏。
function setup() {
  // 创建游戏运行时
  runner = new Runner(
    '.game',            // HTML 中对应的游戏 DIV 容器
    {
      T_REX_COUNT: 10,  // 每一局同时有 10 只暴龙
      onReset: handleReset,
      onRunning: handleRunning,
      onCrash: handleCrash
    }
  );
  // 初始化
  runner.init();
}

let firstTime = true;
// 每次游戏重新开始前会调用此方法。
// tRexes 参数表示当前的暴龙种群。
function handleReset({ tRexes }) {
  if (firstTime) {
    firstTime = false;
    tRexes.forEach((tRex) => {
      // 随机初始化每一只暴龙的模型
      // minDistance 在本例中代表可容忍的障碍物最小间距
      tRex.model = { minDistance: Math.random() * 50 };
    });
  } else {
    // 打印排名
    rankList.forEach(
      (tRex, i) => console.info(i + 1, tRex.model.minDistance)
    );
    // 清空排名
    rankList.splice(0);
  }
}

// 在游戏运行中,活着的暴龙会持续调用此方法来询问是否要跳跃。
// tRex 参数表示当前上下文中的暴龙。
// state 参数中,obstacleX 表示距离最近的障碍物的横坐标,obstacleWidth
// 表示障碍物宽度,speed 表示当前游戏全局速度。
// 方法返回 1 表示跳跃,2 则表示不变。
function handleRunning({ tRex, state }) {
  if (state.obstacleX <= tRex.model.minDistance &&
      !tRex.jumping) {
    // 这里我们直接用一个“人工【的】智能”,即:
    // 当前障碍物距离到达阈值,则命令暴龙跳跃
    return 1;
  }
  return 0;
}

const deadTrexes = [];
// 当暴龙“crash”时,会调用此方法来通知。
function handleCrash({ tRex }) {
  // 记录排名,最后 crashed 暴龙排在最前面
  rankList.unshift(tRex);
}

// 订购 DOMContentLoaded 事件以触发 setup() 方法
document.addEventListener('DOMContentLoaded', setup);

2. Реализовать модель алгоритма

2.1 Алгоритмическая модель, которую могут понять ученики младших классов средней школы

Термин «алгоритмическая модель» может показаться немного непредсказуемым для учащихся, которые плохо знакомы с ИИ, но это не так.Давайте сначала закроем учебник и взглянем на следующую простую формулу, которую мы выучили в средней школе:

img
По статистике на каждую дополнительную формулу читателей будет на n меньше Это третья последняя формула этой статьи.

формула,xэто одинВХОДЫ, гвыходы,а такжеf(x)то естьмодельосновная функция. Например:

  • когда
    y = weight \cdot x + bias
    , потому что это такЛинейная функция (линейная функция, также известная как линейное уравнение), так это называетсяЛинейная модель, помимо формулы функции в модель также включеныweight,biasи другие параметры, для примера сказано, что если в статье будет на одну формулу больше, то читателей будет на n меньше Это типичная линейная модель**;**

На самом деле решение ИИ, прыгать или нет, также является линейной моделью, которая представлена ​​линейной функцией:

y = w1 * obstacleX + w2 * obstacleWidth + b

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Абстрактный класс является базовым классом для всех моделей алгоритмов, давайте посмотрим на исходный код самой простой модели — случайной модели:

import Model from '../Model';

// 随机模型继承自 Model
export default class RandomModel extends Model {
  // weights 和 biases 是 RandomModel 的模型参数
  weights = [];
  biases = [];

  init() {
    // 初始化就是随机的过程
    this.randomize();
  }

  predict(inputXs) {
    // 最简单的线性模型
    const inputX = inputXs[0];
    const y =
      this.weights[0] * inputX[0] +
      this.weights[1] * inputX[1]+
      this.weights[2] * inputX[2] +
      this.biases[0];
    return y < 0 ? 1 : 0;
  }

  train(inputs, labels) {
    // 随机模型还要啥训练,直接随机!
    this.randomize();
  }

  randomize() {
    // 随机生成所有模型参数
    this.weights[0] = random();
    this.weights[1] = random();
    this.weights[2] = random();
    this.biases[0] = random();
  }
}

function random() {
  return (Math.random() - 0.5) * 2;
}

Примечание автора: не стоит недооценивать эту модель.С помощью генетического алгоритма случайная модель также может управлять тираннозавром, чтобы избегать препятствий, но эффективность обучения немного ниже.Посмотреть демоверсию в Chrome для настольных ПК.

2.4 Определите вход и выход модели алгоритма

Вход

Проще говоря, мы сначала ставимhandleRunning()метод полученstateПараметр JSON преобразуется в трехмерный вектор, то есть трехмерный массив, и нормализуется.Так называемая **нормализация** может пониматься как функция, которая преобразует скаляр в значение от 0 до 1. . Соответствующий код выглядит следующим образом:

function handleRunning({ state }) {
  const inputs = convertStateToVector(state);
  ...
}

function convertStateToVector(state) {
  if (state) {
    // 生成一个包含 3 个数字的数组,即向量
    // 数字被归一后,值域为 0 到 1
    // 如 [0.1428, 0.02012, 0.00549]
    return [
      state.obstacleX / CANVAS_WIDTH,      // 障碍物离暴龙的距离
      state.obstacleWidth / CANVAS_WIDTH,  // 障碍物宽度
      state.speed / 100                    // 当前游戏全局速度
    ];
  }
  return [0, 0, 0];
}

выходной элемент

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

  • [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 Построение искусственной нейронной сети

img

Как показано на рисунке выше, в этом разделе мы построим двухслойную нейронную сеть (Neural Network, сокращенно NN), входным элементом будет матрица, состоящая из трехмерных векторов, а выходным элементом будет матрица, состоящая из двух -мерные векторы Содержит 6 нейронов, а функция возбужденияsigmoid.

Ниже приведен исходный код NNModel:

import * as tf from '@tensorflow/tfjs';

import { tensor } from '../../utils';
import Model from '../Model';

/**
 * 神经网络模型
 */
export default class NNModel extends Model {
  weights = [];
  biases = [];

  constructor({
    inputSize = 3,
    hiddenLayerSize = inputSize * 2,
    outputSize = 2,
    learningRate = 0.1
  } = {}) {
    super();
    this.hiddenLayerSize = hiddenLayerSize;
    this.inputSize = inputSize;
    this.outputSize = outputSize;
    // 我们使用 ADAM 作为优化器
    this.optimizer = tf.train.adam(learningRate);
  }

  init() {
    // 隐藏层
    this.weights[0] = tf.variable(
      tf.randomNormal([this.inputSize, this.hiddenLayerSize])
    );
    this.biases[0] = tf.variable(tf.scalar(Math.random()));
    // 输出层tput layer
    this.weights[1] = tf.variable(
      tf.randomNormal([this.hiddenLayerSize, this.outputSize])
    );
    this.biases[1] = tf.variable(tf.scalar(Math.random()));
  }

  predict(inputXs) {
    const x = tensor(inputXs);
    // 预测的是指
    const prediction = tf.tidy(() => {
      const hiddenLayer = tf.sigmoid(x.matMul(this.weights[0]).add(this.biases[0]));
      const outputLayer = tf.sigmoid(hiddenLayer.matMul(this.weights[1]).add(this.biases[1]));
      return outputLayer;
    });
    return prediction;
  }

  train(inputXs, inputYs) {
    // 训练的过程其实就是将带标签的数据交给内置的 optimizer 进行优化
    this.optimizer.minimize(() => {
      const predictedYs = this.predict(inputXs);
      // 计算损失值,优化器的目标就是最小化该值
      return this.loss(predictedYs, inputYs);
    });
  }
}

Если вы раньше использовали версию TensorFlow для Python, нетрудно обнаружить, что приведенный выше код представляет собой линейную математическую формулу или Python, переведенный в код JavaScript. В отличие от версии Python, поскольку в JavaScript отсутствует языковая функция перегрузки символов Python (перегрузка операций), он более громоздкий в формульных выражениях, таких как математические формулы:

y = sigmoid(x \cdot weights + biases)

В 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 строках кода Теперь нам нужно только органично объединить их, чтобы реализовать ИИ, играющий в игры Конкретные шаги заключаются в следующем:

  1. существуетhandleRunning()В обработке событий вызовите модельpredict()метод, согласно действующемуstateрешить, прыгать ли;
  2. существуетhandleCrash()При обработке событий, если тираннозавр разбился из-за «прыжка», запишите метку как «оставить без изменений» в наборе обучающих данных, в противном случае запишите его как «прыжки», что мы называем «учебными уроками» в образовании». процесс «Перебор»;
  3. существуетhandleReset()В обработке событий выполните модельfit()метод, итеративное обучение выполняется в соответствии с последним набором обучающих данных.

Конкретный фрагмент кода выглядит следующим образом:

let firstTime = true;
function handleReset({ tRexes }) {
  // 由于当前模型中我们只有一只暴龙,因此只需要第一只就够了
  const tRex = tRexes[0];
  if (firstTime) {
    // 首次初始化模型
    firstTime = false;
    tRex.model = new NNModel();
    tRex.model.init();
    tRex.training = {
      inputs: [],
      labels: []
    };
  } else {
    // 根据最新收集的训练数据重新训练
    tRex.model.fit(tRex.training.inputs, tRex.training.labels);
  }
}

function handleRunning({ tRex, state }) {
  return new Promise((resolve) => {
    if (!tRex.jumping) {
      let action = 0;
      const prediction = tRex.model.predictSingle(convertStateToVector(state));
      // tensor.data() 方法是对 tensor 异步求值的过程,返回一个 Promise 对象:
      prediction.data().then((result) => {
        if (result[1] > result[0]) {
          // 应该跳跃
          action = 1;
          // 记录最后“跳跃”时的状态,以备 handleCrash() 复盘时使用
          tRex.lastJumpingState = state;
        } else {
          // 保持不变,并记录最后“保持不变”的状态值,以备 handleCrash() 复盘时使用
          tRex.lastRunningState = state;
        }
        resolve(action);
      });
    } else {
      resolve(0);
    }
  });
}

function handleCrash({ tRex }) {
  let input = null;
  let label = null;
  if (tRex.jumping) {
    // 跳错了,应该保持不变!下次记住了!
    input = convertStateToVector(tRex.lastJumpingState);
    label = [1, 0];
  } else {
    // 不应该保守的,应该跳跃才对!下次记住了!
    input = convertStateToVector(tRex.lastRunningState);
    label = [0, 1];
  }
  tRex.training.inputs.push(input);
  tRex.training.labels.push(label);
}

Пожалуйста, ознакомьтесь с текущим эффектом модели ИИ на основе искусственной нейронной сети.Посмотреть демоверсию в Chrome для настольных ПК.


4. Модель алгоритма оптимизации

если вы заметили этоОнлайн-демонстрацияНетрудно обнаружить, что обычно после 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 в Нанкине набирает передовых технических экспертов и старших инженеров (только социальный набор), добро пожаловать в нашу команду!