оригинал:Machine Learning is Fun! Part 2 -- Using Machine Learning to generate Super Mario Maker levels
автор:Adam Geitgey
Перевод: Кайзер (Weibo: Ван Ситу)
в сериалеPart 1Мы уже говорили, что машинное обучение — это использование общих алгоритмов для извлечения интересных вещей из данных без написания кода для конкретных задач.
На этот раз мы увидим крутое исполнение универсального алгоритма — создание реалистичных игровых уровней. Мы построим нейронную сеть, импортируем существующие данные Super Mario и создадим новые уровни.
Как и часть 1, эта серия руководств предназначена для всех читателей, интересующихся машинным обучением, но не знающих, с чего начать. Надеюсь, все смогут его прочитать, так что это должно быть немного небрежно. Впрочем, пока человека можно завести в яму ОД, зря это не пишется.
угадай умнее
В части 1 мы написали простой алгоритм прогнозирования цены на основе свойств объекта, данные представлены в следующей таблице:
Функция предсказания выглядит следующим образом:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price = 0
# 加少量配方1
price += num_of_bedrooms * 0.123
# 加大把配方2
price += sqft * 0.41
# 适量的配方3
price += neighborhood * 0.57
return price
То есть прогнозируемое значение цены дома умножается на каждый атрибут.Весадобавил снова. Графически представить:
Но этот алгоритм действителен только для очень простых линейных задач, что, если настоящие законы, лежащие в основе цен на жилье, не так просты? Например, окружающая среда может иметь значительное влияние на очень большой или маленький дом, но не влияет на средний тип комнаты. Как мы можем запечатлеть эти сложные детали?
Чтобы быть более изобретательным, мы можем выполнять алгоритм несколько раз с разными весами, каждый набор весов соответствует разным граничным случаям.
Теперь у нас есть четыре ценовых прогноза, а затем эти 4 объединяем в конечный результат, а также по взвешиванию (изменилось только значение веса).
Новый _суперответ_ объединяет четыре попытки решения, поэтому можно смоделировать больше случаев, чем в исходной простой модели.
Что такое нейронная сеть?
Объединение моих четырех попыток решения в одну большую картину:
Это нейронная сеть! Этот узел имеет набор входных данных, выполняет взвешенные вычисления и выдает выходное значение. Соединяя эти узлы вместе, можно моделировать сложные функции.
Для экономии места я многое здесь пропустил (например,Масштабирование функцийиФункция возбуждения), но наиболее важной частью являются следующие основные идеи:
-
Мы используем простую функцию для взвешивания входных данных для получения выходных данных.Эта простая функция называетсянейроны.
-
Объединяя вместе множество простых нейронов, можно моделировать сложные проблемы, которые не могут быть описаны одним нейроном.
Как и в Lego, из одного блока ничего не получится, но с достаточным количеством блоков можно построить что угодно.
Пусть нейросеть имеет память
При том же входе предыдущая нейронная сеть также даст тот же результат, который в терминах программирования называетсяалгоритм без сохранения состояния.
Во многих случаях (например, при прогнозировании цен на жилье) это именно то, что нам нужно. Но такие модели не могут справиться с изменяющимися во времени закономерностями в данных.
Представьте, что я дал вам клавиатуру, чтобы вы написали рассказ. Прежде чем я начну, я собираюсь угадать, какую букву вы можете написать, так как мне угадать?
Я могу использовать свои знания английского языка, чтобы увеличить количество попаданий, например, первая буква, которую вы пишете, часто является первой буквой слова. Если я прочитаю ваши прошлые статьи, я могу еще больше сузить область в соответствии с вашим стилем письма. Если бы у меня были все данные, я мог бы построить нейронную сеть для расчета вероятности того, что вы напишете письмо.
Модель может выглядеть так:
Интереснее посмотреть на более сложный вопрос, поставить его в любом месте рассказа, и тогда я угадаю твою _следующую_ букву.
В качестве примера возьмем «И восходит солнце» Хемингуэя:
Robert Cohn was once middleweight boxi
какая следующая буква?
Вы можете догадаться, что это 'n' - слово должно быть _boxing_. Такие догадки основаны на накоплении общеизвестных английских слов. В то же время «средний вес» также дает дополнительные подсказки боксу.
Следующую букву легко угадать, потому что мы включаем предложения, которые ей предшествуют, в сочетании с языком, который мы уже знаем.
Чтобы решить эту проблему с помощью нейронной сети, нам нужно было бы добавить _state_ в модель, и каждый раз, когда мы запрашиваем ответ у нейронной сети, мы также получаем промежуточное вычисление и используем его как часть ввода при следующем повторном использовании. Таким образом, наша модель корректирует свои прогнозы на основе предыдущего ввода.
Следите за состоянием, хотя вы не можете угадать _первую_ букву, но вы можете угадать _следующую_ по предыдущей букве.
Это основная идея _Recurrent Neural Network_. Каждый раз, когда мы его используем, мы обновляем сеть, что позволяет нам обновлять прогнозы на основе наиболее распространенных предыдущих входных данных. Пока «памяти» достаточно, это может моделировать изменяющиеся во времени закономерности в данных.
Чем полезно письмо?
Угадывать следующую букву в рассказе бесполезно, так зачем ее поднимать?
Автоматическое завершение метода ввода мобильного телефона - это приложение:
Размышляя о вычислениях, если мы позволим модели угадывать одну за другой и так далее, и так далее, мы можем позволить компьютеру написать историю самостоятельно!
производственная история
Зная, как угадать следующую букву в предложении Хемингуэя, попробуем составить законченный рассказ в стиле Хемингуэя.
мы будем использоватьAndrej KarpathyразвитиеРекуррентная нейронная сеть. Андрей — исследователь глубокого обучения в Стэнфордском университете, и он написалОтличное введение в рекуррентную генерацию текста нейронной сети, ты сможешьGitHubСм. полный код.
Модель основана на текстовых данных из книги «И восходит солнце» — 362 239 слов, 84 символа (включая знаки препинания). По сравнению с практическими приложениями этот объем данных на самом деле очень мал. Для того, чтобы действительно построить хорошую модель стиля Хемингуэя, необходимо как минимум в несколько раз больше образца текста, но для вводного примера достаточно и текущего.
Когда я впервые начал обучать RNN, способность к прогнозированию была не очень хорошей.Это результат после 100 итераций обучения:
hjCTCnhoofeoxelif edElobe negnk e iohehasenoldndndAmdaI ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe.
Детская кроватка Ddelnss.eelaishaner AAfhB ht ltny
ehbih a” на bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr er deffijha
Вы можете видеть, что между словами уже есть пробелы.
После 1000 итераций он явно выглядит лучше:
hing soor ither. And the caraos, and the crowebel for figttier and ale the room of me? Streat was not to him Bill-stook of the momansbed mig out ust on the bull, out here. I been soms inick stalling that aid.
"Hon't me and acrained on .Hw's don't you for the roed", "В паре".
«Хотя выйти за него замуж».
Модель идентифицировала основные шаблоны предложений и знает, как добавлять точки в конце предложений, ставить кавычки вокруг диалогов и понимать отдельные слова, но вся статья по-прежнему является чепухой.
После еще нескольких тысяч итераций он выглядит довольно хорошо:
Он подошел к калитке кафе, похожей на деревенскую кровать.
— Ты знаешь, что это был я.
— Проклятые нас, — сказал Билл.
"Я был опасен, - сказал я. - Ты был там, где она сделала это, и думаешь, что я хорошо тебя накину," сказал я.
«Я не могу выглядеть странно в такси».
«Ты же знаешь, что я был в этом», — сказал Бретт.
"Это драки неважно?"
«Это заставляет делать это».
"Вы делаете это?"
«Садитесь, — сказал я, — мне жаль, что я немного не возился с этим человеком».
"Ты нашел это."
"Я не знаю."
"Видите ли, мне очень жаль болтовню, - сказал Билл. - Вы думаете, что это друг позади, и вы действительно напиваетесь".
Пока что алгоритм уловил короткий и лаконичный диалог Хемингуэя, а некоторые фразы даже дошли до сути.
Сравните его с реальным текстом в книге:
There were a few people inside at the bar, and outside, alone, sat Harvey Stone. He had a pile of saucers in front of him, and he needed a shave.
«Садитесь, — сказал Харви, — я вас искал».
"В чем дело?"
"Ничего. Просто ищу тебя".
"Был на скачках?"
«Нет, не с воскресенья».
— Что ты слышишь из Штатов?
«Ничего. Абсолютно ничего».
"В чем дело?"
Даже следуя шаблону одной буквы, наш алгоритм имитировал нос и глаза, и это хорошо!
Вместо того, чтобы генерировать текст с нуля, мы можем предоставить первые несколько букв в качестве «начальных значений» и позволить алгоритму найти последние самостоятельно.
В развлекательных целях давайте создадим фальшивую книгу, которая использует «Эр», «Он», «С» в качестве затравки для создания новых имен авторов и новых заголовков:
Неплохо!
Что действительно интересно, так это то, что алгоритм может идентифицировать шаблоны в произвольных данных и может легко генерироватьменюиФальшивая речь Обамы. Зачем ограничивать себя человеческим языком? Мы можем применить его к любым данным со встроенной схемой.
возможно ты играл в поддельного марио
В 2015 году Nintendo выпустила игровую приставку Wii U.редактор супер марио.
Эта игра позволяет вам свободно создавать уровни Super Mario и загружать их в Интернет, чтобы поделиться ими с друзьями. Можно добавить все классические органы и врагов из старых игр, это виртуальный лего незнакомца из эпохи Марио.
Могу ли я использовать модель, генерирующую поддельный текст Хемингуэя, для создания поддельных уровней Марио?
Сначала вам нужно подготовить тренировочные данные, извлечь все уровни на открытом воздухе из оригинальной игры Super Mario Bros. В игре 32 уровня, около 70% из которых находятся на открытом воздухе, так что начните отсюда.
Для того, чтобы получить дизайн каждого уровня, я написал программу для извлечения дизайна уровней из игры.Супер Марио имеет историю более 30 лет, поэтому в интернете есть много ресурсов по геймдизайну. Извлечение данных из старых игр также является интересным упражнением по программированию, которое вы можете попробовать.
При ближайшем рассмотрении игровой уровень на самом деле состоит из набора мешей:
Мы можем представить эту сетку набором символов, каждый из которых является объектом:
--------------------------
--------------------------
--------------------------
#??#----------------------
--------------------------
--------------------------
--------------------------
-##------=--=----------==-
--------==--==--------===-
-------===--===------====-
------====--====----=====-
=========================-
Каждый объект является символом:
- '-' пусто
- '=' - сплошной кирпич
- «#» — это кирпич, который можно сломать.
- '?' - монетный кирпич
Эффект после замены персонажа такой:
Глядя на текстовый файл, вы можете увидеть, что уровень Марио не имеет шаблона, если вы посмотрите на него построчно:
Но если вы посмотрите столбец за столбцом, закономерность очевидна:
Чтобы алгоритм распознал закономерности, данные необходимо вводить столбец за столбцом. Найдите наиболее эффективное представление из входных данных (т.е.Выбор функций) является ключом к эффективному использованию алгоритмов машинного обучения.
Для обучения модели мы инвертируем текстовый файл на 90 градусов, что делает особенности более заметными:
-----------=
-------#---=
-------#---=
-------?---=
-------#---=
-----------=
-----------=
----------@=
----------@=
-----------=
-----------=
-----------=
---------PP=
---------PP=
----------==
---------===
--------====
-------=====
------======
-----=======
---=========
---=========
Обучите модель
Как и в примере с подражанием стилю Хемингуэя, чем больше обучена модель, тем лучше. Результат после небольшого количества тренировок выглядит действительно мусором:
--------------------------
LL+<&=------P-------------
--------
---------------------T--#--
-----
-=--=-=------------=-&--T--------------
--------------------
--=------$-=#-=-_
--------------=----=<----
-------b
-
Я, наверное, понял, что «-» и «=» встречаются чаще, но просто так я не нашел никаких закономерностей.
После нескольких тысяч итераций что-то начало выглядеть так:
--
-----------=
----------=
--------PP=
--------PP=
-----------=
-----------=
-----------=
-------?---=
-----------=
-----------=
Модель в основном выяснила, что каждый ряд должен быть одинаковой длины, а также начала обнаруживать некоторые особенности игры: трубы всегда имеют две длины и по крайней мере две части, поэтому буква «P» появляется в группах. 2х2, что приятно!
После дополнительного обучения модель сгенерировала много достоверных данных:
--------PP=
--------PP=
----------=
----------=
----------=
---PPP=---=
---PPP=---=
----------=
Давайте посмотрим на полный уровень, сгенерированный моделью (вернемся к горизонтальной версии):
Это выглядит довольно хорошо! Стоит отметить несколько основных моментов:
-
начать сLakitu(Aerial Floater) В небе - как настоящий уровень Марио.
-
Трубка в воздухе должна иметь кирпич на дне и не парить в воздухе изолированно.
-
Распределение монстров разумное.
-
Не будет тупика, чтобы организовать игроков вперед.
-
Это очень похоже на настоящий уровень.
Если у вас есть редактор Super Mario, вы можете сделатьbookmarking it onlineили найти код4AC9-0000-0157-F3C3Приходите играть на этом уровне.
Игрушки и настоящее
Алгоритм RNN, который мы используем для обучения модели, — это тот же алгоритм, который многие компании используют в реальном мире для решения сложных задач (таких как распознавание речи, машинный перевод). Но наша модель построена только на небольшом количестве данных, поэтому ее можно рассматривать только как «игрушку», а не как настоящую. В оригинальной игре Super Mario недостаточно уровней, чтобы обучить действительно хорошую модель.
Если мы сможем получить сотни тысяч данных об уровнях, созданных игроками, как Nintendo, мы сможем создать более надежную модель. Но Nintendo не будет сидеть сложа руки и смотреть, как это происходит, и ни одна крупная компания не будет открывать данные бесплатно.
Поскольку машинное обучение становится все более и более важным во многих отраслях, разница между хорошими и плохими программами все больше отражается в объеме данных, используемых для обучения модели. Вот почему такие компании, как Google и Facebook, так нуждаются в ваших данных.
Например, Google недавно открыла пакеты программного обеспечения для создания крупномасштабных приложений машинного обучения.TensorFlow, Google бесплатно открыл такую важную и мощную технологию, что вызвало большой резонанс, а TensorFlow — это фон, поддерживающий Google Translate.
Но без огромной сокровищницы данных Google на всех языках вы не смогли бы конкурировать с Google Translate.Данные — настоящий убийца Google. в следующий раз когда откроешьGoogle Maps Location HistoryилиFacebook Location HistoryКогда вы в пути, следите за тем, чтобы они не записывали все, что вы делаете.