Текст / Зебай
Эта статья основана наFlappyLearningсклад, даНейроэволюцияПредварительное понимание было достигнуто для дальнейшего углубленного понимания. Причина выбора этого репозитория в том, что размер кода в репозитории небольшой (всего два скрипта, game.js и Neuroevolution.js) и нет внешних зависимостей. А как игру врубишь, так будет интереснее.
Первая попыткаFlappyLearning Demo, иметь представление об общем результате, а потом пониматьНейроэволюцияВики-концепция проекта, предварительное понимание модели нейронной сети, используемой в этом проекте, и понимание части реализации кода, упомянутой в последующих статьях, также будут полезны.
Реализация игры
Общая реализация хранилища может быть представлена на следующем рисунке (далее — Рисунок 1), который реализован двумя сценариями, game.js и Neuroevolution.js. Среди них game.js отвечает за реализацию игровой логики, а Neuroevolution.js — за реализацию моделей эволюционных нейронных сетей и генетических алгоритмов.
Общую логику работы игры можно увидеть в левом нижнем углу, который разделен на два метода: отображение и обновление. Во-первых, состояние всего игрового процесса сохраняется в контексте текущего объекта экземпляра Game, например, координаты каждой птицы, положение трубы и т. д. Общее логическое разделение очень четкое: при оцифровке всех состояний состояния считываются и записываются двумя независимыми способами.
Метод обновления в основном используется для связи с экземпляром Neuroevolution, а затем для обновления текущего состояния игры, такого как информация о координатах каждой птицы, количество и положение труб и т. д. Частота вызова обновления контролируется setTimeout, интервал равен 1000/FPS, а FPS по умолчанию равен 60.
Метод display в основном считывает текущее состояние игры, а затем рисует текущее состояние на холсте Частота вызовов контролируется requestAnimationFrame.
игровой процесс
Создайте экземпляр игрового объекта
Во-первых, создайте экземпляр объекта Neuroevolution (раздел инициализации в правом верхнем углу рисунка 1), который определяет количество птиц в каждом поколении и количество нейронов в каждом слое сетевой модели. Общая нейронная сеть имеет иерархическую структуру. Созданная сеть определяет количество нейронов во входном слое, скрытом слое и выходном слое соответственно. Нейроны также называются персептронами.Perceptrons - the most basic form of a neural networkПодробное введение в эту статью, чтобы понять концепцию персептронов.
На шаге 1 рисунка 1 создается экземпляр объекта Game и вызывается метод start.В это время через экземпляр Neuvol создается первое поколение из 50 сетей, каждая сеть соответствует птице, а их значения веса равны генерируется случайным образом.
обновление взаимодействует с Neuroevolution
Шаг 2 на Рисунке 1 представляет собой логику метода update.Во-первых, он обходит каждую птицу и вычисляет ввод, требуемый текущей птицей для netowrk, то есть два параметра. Первый параметр — это отношение координаты y птицы к высоте холста. Второй параметр — это отношение высоты следующего верхнего конвейера к высоте холста. Два параметра передаются в качестве входных параметров для сетевых вычислений, то есть шаг 3 на рисунке 1. .
Сеть возвращает результат выходного слоя посредством вычислений, а затем делает простое суждение о результате, чтобы определить, летит ли птица вверх или свободно падает под действием силы тяжести.
В методе сетевых вычислений входные параметры сначала назначаются входному слою, а затем передаются скрытому слою, который передается вниз слой за слоем, а окончательный результат помещается в выходной слой и возвращается. Это также относительно простая топология нейронной сети: сеть с прямой связью, в которой сигнал течет только в одном направлении, а значение предыдущего слоя используется в качестве входных данных для следующего слоя.
В этот момент, зная, движется ли текущая птица вверх или вниз в следующем кадре, вы можете судить, мертва ли птица.Если она мертва, текущее состояние сети птицы привязано к счету текущей игры. , а баллы отсортированы в порядке убывания генов. Сохраните его (метод addGenome), то есть шаг 4 на рисунке 1.
После обхода выживших в настоящее время птиц, если еще есть выжившие птицы, повторите описанный выше процесс, в противном случае начните новое поколение, то есть шаг 5 на рисунке 1.
После того, как каждая птица будет мертва, будет запущен метод addGenome, в конце раунда будет сохранена сеть из 50 птиц, что является правой частью рисунка ниже.
Генерация нового поколения (генетический/эволюционный алгоритм)
Для начала новой игры требуется новое поколение птиц.Чтобы позволить следующему поколению получить более высокие баллы в игре, чем предыдущее поколение, эволюционный алгоритм здесь в основном разделен на три части. Первая часть: элитарность, то есть прямое взятие десяти лучших генов предыдущего поколения и копирование 10 птиц нового поколения. Вторая часть: случайное поведение, возьмите десять лучших генов, добавьте случайный фактор и создайте новое поколение из 10 птиц. Третья часть: размножение, два гена с высокими баллами предпочтительно комбинируются, и случайные факторы добавляются в качестве мутаций для создания оставшихся птиц в новом поколении.
После поколений итераций эволюционного алгоритма производительность сети будет все больше и больше соответствовать ожиданиям, и она будет непобедима в игре примерно в 30-м поколении. В списке задач также есть люди, которые обсуждают, как оптимизировать алгоритм для достижения непобедимости через 2 поколения.
соматосенсорный
Нет предела обучению, и используйте это хранилище как попытку расширить свой путь глубокого обучения.