Pull to refresh

Comments 63

Если бы она обучалась прямо во время матча, думаю комментариями бы уже завалили, но подход был основательный.
Как вы себе это представляете? Для обучения нужно N порядков (сколько там игр за 2 суток обучения прошло?) игр, а не 2-3, которые успеют сыграть во время матча.
Можно былобы брать информацию из реальных матчей где играют Профи против Профи. На этих матчах и тренировать ИИ
Это другой метод, но это возможно, нужно только взять где-то эти данные
То есть запускать на сервере только серверную часть и рейтинговую таблицу, а клиенты чтобы коннектились через интернет к серверу и участвовали в поединках.

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

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

Такое решение не оправдалось бы, т.к. призовой фонд был не слишком большой.

Было бы интересно посмотреть на игру исходной (неурезанной) нейросети против хотя бы SmartGuy из поставки, а лучше, против какой-нибудь из стратегий лидеров, выложенных на GitHub — все же 700-е место это не так много.
На досуге можно попробовать. Если займусь, то добавлю в пост еще одно видео.
Сервер подбирает оппонентов и запускает игры максимизируя равномерность оценки игроков. Для этого каждому участнику нужен 24/7 работающий сервер, что не очень удобно.
Тут я бы предложил по аналогии со Старкрафтом, стратегия логинится и запрашивает поиск игры, тогда нет необходимости в 24/7

А что делать если две стратегии, между которыми назначен матч, не пересекутся во времени? Или вы предлагаете доверять случаю, не планируя матчи вовсе? В таком случае что делать с накрутками?

Матч не назначается системой, стратегии логинятся и запрашивают матч, дальше система подбирает им соперников, которые есть он-лайн, с учетом рейтинга. С накрутками должен бороться рейтинг. Опять же в Старкрафте 2 нету проблемы частотой матчей. Есть игроки, которые часто играют и все равно находятся снизу в рейтинге и те, кто играет не часто и находится в топе, только за счет скилла.

Вот только в Старкрафте не разрешены боты, а тут только они и есть. И онлайн тоже разный.


Алгоритм накруток довольно прост. Делаем кучу ботов, которые сливаются в каждом матче — и запускаем у них поиск игры одновременно с основной стратегией. С большой вероятностью поиск игры сопоставит их друг другу — вот и накрутка.


Можно даже заранее выбрать время когда онлайн небольшой. А еще можно найти внеигровые способы проверить что два бота играют друг с другом (одинаковый порт / одинаковый ID игры / пр.)

Периодически можно было бы устраивать ланы с расписанием, жеребьевкой и прочим. Ну и потом просто посмотреть в код перед определением победителя.
Протестировать его с тем же seed на тех же партиях. Или на небольшой выборке партий.

Ха! Разбежались! Наш код работает на кластере из 18 хостов по 160 Гб оперативной памяти в каждом.

Согласен, ввести какие-то разумные ограничения не помешало бы.
Причем здесь это? Статья про очередной RAIC — с упрощенной MOBA-игрой.
пару суток на GeForce GTX 1080 на эксперимент

Насколько получается её загрузить? На днях поставил себе GTX 1080, пробовал позапускать примеры с gym/universe. Упирается в процессор, видеокарта не особо загружена. Или я что-то делаю не так, или процессор тоже пора менять (сейчас i5 2500), или для симуляций это типично и нет смысла менять еще половину системника.
У меня проц i7 6700k
Загрузка GPU сильно зависела от размера состояния, на 394 параметрах была около 20%, на 3144 опускалась ниже 10% вроде бы. И как я понял дело даже не в проце, просто надо реорганизовать обучение. У меня весь опыт по мере поступления складывается в replay buffer и оттуда же я выбираю минибатчи для обучения, затем отправляю их в TensorFlow. На supervised learning задачах, где изначально есть датасет и ты по нему бегаешь загрузка 99% на GPU. Я думаю, надо попробовать сделать как в supervised, то есть иметь отдельно буфер для складывания опыта и второй для обучения и периодически их синхронизировать. И еще лучше попытаться организовать этот буфер прямо в GPU.
Для меня статья оказалась очень интересной — первые позывы, когда решил участвовать в конкурсе, были написать нейросеть или что-нибудь из машинного обучения. Однако, остановился на другом.

Как мне кажется, исходя из турнира, нейросети — это стрельба из пушки по воробьям. Намного важнее было:
1. Алгоритм движения (как пройти из точки а в точку б и обойти препятствие)
2. Алгоритм уклонения
3. Алгоритм движения в глобальном смысле (куда идти)
4. Древо развития талантов.
5. Взаимодействие с командой.

Я имел полный и бесповоротный фейл с 1 пунктом ( как раз перед вторым этапом. Захотелось написать нормальный поиск пути, вместо дуболомного, а получился фейл), 2ой отсутствовал, но кое-что сделал из 3 и 4. Как итог — когда 1 пункт ещё как-то работал ( тупой обход препятствий. Между первым туром и серединой междутурья) удавалось быть где-то в районе 400го места.
Увы в этом году поиск/выбор пути был не самым приоритетным.
Развивал только его не вдаваясь в боевку и микру.
Получилось реализовать А* для дальних маршрутов и 10 симуляций мира на 200 тиков вперед (9 направлений + отступление). Итог раунд 1 = 180 место раунд 2 = 335.
Соревнование действительно оказалось не очень подходящим для нейросетей, так как ресурсов мало и нельзя использовать готовые библиотеки. Но если есть какие-то заготовки то почему нет? У меня как раз некоторые заготовки были, поэтому я и решился. В прошлом году заготовок не было, поэтому не участвовал.
ну да. Мне ж поэтому и интересно было — что даст именно такой подход :)
1,2,3 — справиться одна небольшая сеть заточенная на движение, под это нейросеть обучить проще всего
4 — отдельный модуль нейросети для развития талантов, но можно обойтись и решающим деревом
5 — модуль нейросети, определяющий общую стратегию поведения, хотя в принципе, это может и модуль, отвечающий за движение
итого 2-3 нейросети + 1 для применения способностей, прицеливания и атаки

А так в тот же футбол может играть достаточно простенькая нейросетка, всего где-то на 22 нейрона

А писать известные алгоритмы для конкурса — ну как-то нудно и не интересно, а тот же А* так вообще читерство истой воды (навигация IRL у живых человеков чисто локальная)
Очень жду и надеюсь увидеть вашего бота в RAIC 2017
Ну если у меня на работе решат оторвать задач оптимизации, и скажут «пиши бота для RAIC 2017», то не вопрос :-)… ну или хотя бы еще программистов наберут…

А так я вообще только сегодня узнал, что в РФ такие конкурсы оказывается проводятся
Все участники кого я знаю, участвовали в ущерб работе, сну, отношениям.
Бонусом можно взять какой-нибудь новый для себя ЯП.
Но все это того стоило, градус азарта перекрывал всю недополученную прибыль и недосып.
И да я впервые использовал А* в этом году… до этого вообще был ЛИ. так что в следующем году у вас есть все шансы обыграть таких как я )

Не знаком с машинным обучением, поэтому такой вопрос: А можно ли по аналогии с нейронными сетями использовать генетические алгоритмы в данной задаче? Если да, то это будет функция с 3000+ параметров или как вообще это делается?

Я не спец в генетических алгоритмах, но я думаю что можно, только если тупо в лоб, то вероятно это будет долго, с учетом того, что локальный симулятор работает довольно долго. Наверное нужно как-то бить на подзадачи и какой-то свой симулятор писать.
Про генетические алгоритмы есть довольно много инфы. Да, это нейросеть с большим количеством параметров — весов.
Пример из этого же соревнования.

Я пушу нижний лайн. Снёс вышку.Начинаю бить в одиночестве вторую и вижу: мне на верхнем лайне вдвоём начинают сносить вторую вышку. Мои союзники пушат мид. Вчетвером троих. Диллема- что мне делать? Бежать на базу отбиваться? Присоединиться к пушу мида и сыграть наперегонки?
Побегу на базу — если отобьюсь, а наш пуш мида захлебнётся, то вероятно будет ничья( в турнире было ограничение по времени). А при ничьей я по очкам в конце буду тогда. А если наши выиграют, то я всё равно мало получу.
Плюнуть и пойти пушить мид? Если проиграем, то потери по очкам.

Вот в такой ситуации генетический алгоритм мог бы помочь принять решение.
Была бы оценочная функция. На вход ей подавалась бы инфа о моих союзниках — таланты, опыт, местоположение, о врагах, которых вижу, инфа о базах под прессингом, расстояние до базы. Задача генетического алгоритма- максимизировать мою прибыль по очкам. Ну, что-нибудь в таком духе
Можно. Задача обучения ИНС является многопараметрической задачей нелинейной оптимизации в пространстве состояний, соответственно все алгоритмы глобальной оптимизации: эволюционные алгоритмы, Particle Swarm Optimization (алгоритм роя частиц) и Simulated annealing (алгоритм имитации отжига) будут давать достаточно хорошие результаты, на порядок лучше классического обучения с учителем.

В контексте ИНС — это целое направление нейроэволюционных алгоритмов (Neuroevolution). Но это все можно считать разновидностью обучения с подкреплением, собственно Q-learning из той же области.

Только вот не стоит забывать, что алгоритмы глобальной оптимизации хоть и находят глобальный оптимум, но обычно крутятся в его горловине, поэтому желательно уточнять решение каким-нибудь классическим алгоритмом локальной оптимизации (для ИНС это будет back propagation, например) в таком случае будет получено наилучшее решение. Правда есть там все равно опредмеченные трудности, для такой избыточной сети (она реально избыточная для такой задачи) как у автора, наверное замучаешься обучать её.
Есть езе один момент: эволюционные и роевые алгоритмы хорошо справляются с задачами, где функционал задан в неявном виде и/или очень сложный, с целой кучей ограничений, да и в целом может оказаться неизвестным (учителя с розгами не приставишь уже), а полноценной обучающей выборки как таковой нет. А боты как раз этот самый случай => поэтому с ними проще ставить кибернетический эксперимент => смотреть как стайка ИИ взаимодействует с окружающей средой => от итерации к итерации эволюционировать их (ну где-то в районе 200-500 поколений наверное уже будут проявлять зачатки интеллекта). А учитывая что задача в общем случае нелинейна (поэтому всякие там back propagtion будут переобучаться, инфа 145%), то да, все эти метаэвристики будут хорошо работать… только вот надо правильно продумать весь алгоритм а то нифига не сработает: вот например на ютубе можете найти ролик Evolution of a self-organizing robot soccer team (а в гугле статьи по нему) где показано очень изящное и простое решение NN+GA которая играет в футболл, но в дотку такой ИИ играть врядли сможет (надо будет по другому реализовывать)
В прошлом году 1 место занял алгоритм перебора, очень отдаленно напоминающий генетический алгоритм https://habrahabr.ru/post/273649/
Прошу извинить за размер формул, не хотел, чтобы они были маленькие, перестарался с принтскрином.

А вы перепишите их на TeX – теперь уже можно
Почему это все называют дотой, если это просто moba?

Смотрим определение MOBA и видим: "жанр компьютерных игр, сочетающий в себе элементы стратегий в реальном времени и компьютерных ролевых игр и выделяющийся схожестью с DotA".


Дота — это родоначальник, жанр MOBA был выделен только после появления кучи клонов.


Разница тут такая же, как между ксероксом и копиром. Почему все говорят "ксерокс"? Привыкли потому что.

ИМХО, автор явно переусердствоал с задачей.

Во-первых, сеть вида 394 x 192 x 128 x 128 x 128 x 128 x 6 мягко говоря избыточная, очень избыточная.

Во-вторых, лучше использовать несколько маленьких ИНС, каждая для своей задачи: движение, стрельба, глобальная стратегия и т.п.(тут на самом деле большой простор для творчества, много чего можно наэксперемнтировать).
Нервные системы всяких человеков и прочьих животных и дажек букашек, на самом деле разбиты на отдельные подсистемы и отделы, каждые из которых занимаются конкретно своими делами (разделяй и властвуй, ёпс) и специализируются на определенном наборе функций. И это все не с проста, а результат эволюции — так то можно этот путь повторить используя ИНС и эволюционные алгоритмы (которые не просто подбирают веса, а подбирают структуру ИНС), там даже будут видны какие-то зачатки специализации, вот только сколько потребовалось челокам миллионов лет, шоб играть в дотку IRL? И сколько в итоге нейронов у человеков просто так бездельничают — более 90% (на самом деле они нужны на всякий случай, дабы после того как тюкнешься головой случайно не разучиться ходить и говорить, но то что мозг полностью функционален даже после 80% потери мозгового вещества — известный медицинский факт, хоть и не рядовой).
Поэтому лучше эту задачу решить самому, а не надеяться на обучение (оно то рано или поздно достигнет просветления, только эт вообще-то NP-полная задача) и сразу делать специализированные модули ИИ (собственно к чему автор и начал сам потихоньку приходить): быстрее обучишь, меньше нейронов потребуется (я имею ввиду суммарное число всех нейронов всех ИНС), а результат окажется куда более эффективным — на эту тему в принципе уже не одна научная статья писана.
А можно поподробнее про подбор архитектуры ИНС для задачи? Посоветуйте где можно почитать/посмотреть про подбор архитектур ИНС? Если не использовать эволюционные алгоритмы.
Только суровый метод научного тыка, тока хардкор…
Ну вот на tproger есть краткая шпаралка по нейросетям, прям так и называется: Шпаргалка по разновидностям нейронных сетей. Часть первая. Элементарные конфигурации
Правда второй части я не увидел, но это перевод, т.е. на буржуинском можно найти искомую статью полностью. Впрочем на хабре вроде тоже это было: Зоопарк архитектур нейронных сетей. Уже в 2-х частях.

Есть хороший обзор по нейросетям в играх с большим количеством ссылок. Презенташка разработчиков Supreme Command (да они там используют ИНС). Статья по модульным ИНС на примере классической космической пострелушке. Встречал очень много статей по Старкрафту, вот например одна из одна. И даже по шутерам, там как раз тоже модульная нейросетка.
Но вообще последнее время популярно использовать использовать именно генетику, например особенно популярен алгоритм NEAT там действительно хорошие результаты получались или вот

Но вообще, проще всего ИНС присобачить для гонок — для задач навигации их наверное проще всего обучить и там можно обойтись без генетики. Для стрельбы и прицеливания — тоже наверное лучше одну отдельную нейросетку использовать. И отдельную сеть для выборов шаблонов поведения как в одной книжке
Но от генетики никуда сейчас не денешься, обучать то как-то нейросеть нужно, и сделать это так, что бы она не переобучилась (не попала в локальный минимум), а тут тока GA и PSO. Ну и агент должен как-то учитывать прошлую информацию, т.е. сеть должна быть рекурентной (как раз таки отсюда глубокие нейронные сети и сверточные нейронные сети), цепи Маркова, машину Больцмана, т.к. они обладают памятью, а это нужно.

Вот кстати шпоры 1 и 2 на хабре, и на tproger. Вдруг пригодятся.

А вот пример эволюционирующей нейросети, обучаются достаточно резво.
Далеко не все глубокие нейронные сети рекуррентные, сверточная нейросеть тоже не рекуррентная.
Я и не писал, что свёрточная и рекуррентная одно и тоже, — я написал что они обе из одной степи, т.е. из глубинного обучения. Я хотел изменить на более понятный вариант, но Хабр не дает редактировать сообщения (сколько он там дает, 2 минуты где-то?)
И вот еще парочка ссылочек на одного канадского китайца с примерами на Жабе:
http://blog.otoro.net/2015/03/28/neural-slime-volleyball/
http://blog.otoro.net/2015/05/07/creatures-avoiding-planks/
http://blog.otoro.net/2015/03/10/esp-algorithm-for-double-pendulum/

Приятно видеть, что были и академические решения, а не только банальные 'if' на все случаи жизни!
P.S. Победители — без обид. Там тоже, уверен, непростая работа проделана.

Тоже хотел использовать DRL в турнире, но времени не было.
Мне кажется, правильнее было бы обучать две сети:
* первая отвечает за макро-стратегию — куда идти волшебнику;
* вторая отвечает за микро — боевой режим, который включается при приближении противника на некоторое расстояние.
Бой богат на результативные действия, поэтому вторая модель должна довольно быстро обучаться. А первую стратегию даже можно было просто захардкодить для начала.
можно вообще использовать лес стратегий.
вначале давать примитивной стратегии
преимущество, пусть ее копирует нейросеть
Ухты это же моя стратегия оппонент) Она без нейросети на JS и криво написана но достойно держится) Спасибо сделал мой день)

Я не шарю в нейронных сетях, но мне кажется вы ошиблись с целью. основная цель — набрать как можно большее количество очков за игру. А для этого может потребоваться не собирать крохи за действие. Сеть должна стремиться завершить партию с наибольшим количеством очков. Что толку рубить ладью, если в результате этого через х ходов неизбежно потеряешь ферзя?

Согласен, но при недостатке мощностей сеть лучше учится на более частых наградах, чем на какой-то очень далекой, но самой важной награде
При недостатке мощностей можно поставить несколько мелких задач. Например, положение на карте, в результате которого были получены очки. Тут можно еще добавить близость других единиц (своих и вражеских). В общем добавить больше данных. Тогда сеть будет уметь уже не только микроконтроль, но и какие-то тактические штучки.

Я еще не знаю что у вас представляет из себя «мозг»? Все хранится в оперативе до конца партии? Или сразу все изменения весов падают в файл? Тогда файл этот можно залить в облако и запускать обучение одновременно дома, на работе, на aws amazon, у друзей под пиво… :)
Все правильно, только не на все хватает времени в период чемпионата. Так как чтобы увидеть, что какое-то изменение реально работает, бывает, надо потратить несколько дней на обучение
Поэтому я бы посоветовал перед началом следующего чемпионата создать модули для этого заранее, чтобы их можно было подключить к существующей сети.
Я бы тоже хотел задействовать нейросеть для этого, но времени на освоение совсем нет. Не знаю как ее готовить от слова «совсем». :)
В общем, если будете участвовать в следующем турнире и так же используете нейронную сеть, напишите в личку ваш ник, буду наблюдать за вами в рейтинге и болеть за вас! :)

Скорее даже тут дело не в недостатке мощности, а в принципиальной разнице в количестве обучающих примеров. Сколько бы не было мощности — за то время пока набирается 1 итог партии можно собрать кучу промежуточных итогов.

Only those users with full accounts are able to leave comments. Log in, please.