Нейросетка играет в Доту



    Всем привет! На самом деле нейросетка играет не в привычную Dota 2, а в RussianAICup 2016 CodeWizards. RussianAICup — это ежегодное открытое соревнование по программированию искусственного интеллекта. Участвовать в этом соревновании довольно интересно. В этом году темой была игра похожая на Доту. Так как я уже какое-то время занимаюсь обучением с подкреплением, то мне хотелось попробовать применить это в RussianAICup. Главной целью было научить нейронную сеть играть в эту игру, хотя занятие призового места — это, конечно, было бы приятно. В итоге нейросеть держится в районе 700 места. Что, я считаю, неплохо, ввиду ограничений соревнования. В этой статье речь пойдет скорее об обучении с подкреплением и алгоритмах DDPG и DQN, а не о самом соревновании.

    В этой статье я не буду описывать базовую информацию о нейросетях, сейчас и так очень много информации о них на просторах интернета, а раздувать публикацию не хочется. Мне же хотелось бы сосредоточится на обучении с подкреплением с использованием нейросетей, то есть о том, как обучить искусственную нейронную сеть демонстрировать нужное поведение методом проб и ошибок. Я буду упрощенно описывать 2 алгоритма, база у них одна, а области применения немного отличаются.

    Марковское состояние


    На входе алгоритмы принимают текущее состояние агента S. Здесь важно чтобы состояние обладало свойством марковости, то есть по возможности включало в себя всю информацию, необходимую для предсказания следующих состояний системы. Например у нас есть камень, брошенный под углом к горизонту. Если мы в качестве состояния примем координаты камня, это не позволит нам предсказать его дальнейшее поведение, но если мы добавим к координатам вектор скорости камня, то такое состояние нам позволит предсказать всю дальнейшую траекторию движения камня, то есть будет марковским. На основе состояния алгоритм выдает информацию о действии A, которое необходимо сделать чтобы обеспечить оптимальное поведение, то есть такое поведение, которое ведет к максимизации суммы наград. Награда R — это вещественное число, которое мы используем для обучения алгоритма. Награда выдается в момент, когда агент, находясь в состоянии S, совершает действие А и переходит в состояние S'. Для обучения эти алгоритмы используют информацию о том, что они делали в прошлом и какой при этом был результат. Эти элементы опыта состоят из 4х компонентов (S, A, R, S'). Такие четверки мы складываем в массив опыта и далее используем для обучения. В статьях он имеет имя replay buffer.

    DQN


    Или Deep Q-Networks — это тот самый алгоритм, который обучили играть в игры Atari. Этот алгоритм разработан для случаев, когда количество управляющих команд строго ограничено и в случае Atari равно количеству кнопок джойстика (18). Таким образом выход алгоритма представляет собой вектор оценок всех возможных действий Q. Индекс вектора указывает на конкретное действие, а значение указывает насколько хорошо это действие. То есть нам надо найти действие с максимальной оценкой. В этом алгоритме используется одна нейросеть, на вход которой мы подаем S, а индекс действия определяем как argmax(Q). Нейронную сеть мы обучаем с помощью уравнения Беллмана, которое и обеспечивает сходимость выхода нейросети к значениям, которые реализуют поведение максимизирующее сумму будущих наград. Для данного случая оно имеет вид:


    Если это расшифровать получается следующее:

    1. Берем пачку (minibatch) из N элементов опыта (S, A, R, S'), например 128 элементов
    2. Для каждого элемента считаем

      y = R + γ * maxпо всем A' (Qpast(S', A'))

      γ — это дискаунт фактор, число в интервале [0, 1], которое определяет насколько для нас важны будущие награды. Типичные значение обычно выбираются в интервале 0.9 — 0.99.

      Qpast — это копия нашей же нейросети, но какое-то количество итераций обучения назад, например 100 или 1000. Веса этой нейросети мы просто периодически обновляем, не обучаем.

      Qpast = (1 — α) * Qpast + α * Q

      α — скорость обновления Qpast, типичное значение 0.01

      Этот трюк обеспечивает лучшую сходимость алгоритма

    3. Далее считаем функцию потерь для нашего минибатча

      L = Σпо элементам минибатча (y — Q(S, A))2 / N

      Используем среднюю квадратичную ошибку
    4. Применяем любимый алгоритм оптимизации, используя L
    5. Повторяем пока нейросеть достаточно не обучится

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

    DDPG


    Или Deep Deterministic Policy Gradient — это алгоритм, созданный, для случая когда управляющие команды представляют собой значения из непрерывных пространств (continuous action spaces). Например, когда вы управляете автомобилем, вы поворачиваете руль на определенный угол или нажимаете педаль газа до определенной глубины. Возможных значений поворота руля и положений педали газа теоретически бесконечно много, поэтому мы хотим чтобы алгоритм выдавал нам эти самые конкретные значения, которые нам необходимо применить в текущей ситуации. Поэтому в данном подходе используются две нейросети: μ (S) — актор, который возвращает нам вектор A, компоненты которого являются значениями соответствующих управляющих сигналов. Например это может быть вектор из трех элементов (угол поворота руля, положение педали газа, положение педали тормоза) для автопилота машины. Вторая нейросеть Q(S, A) — критик, которая возвращает q — оценку действия A в состоянии S. Критик используется для обучения актора и обучается с помощью уравнения Беллмана:




    Критик обучается через градиент от оценки критика ∇Q(S, μ (S)) по весам актора



    Если это расшифровать получается:

    1. Берем минибатч из N элементов опыта (S, A, R, S')

    2. y = R + γ * Qpast (S', μpast (S'))

      Qpast, μpast — это тот же трюк что и в случае DQN, только теперь это копии двух сетей

    3. Считаем функцию потерь

      L = Σпо минибатчу (y — Q (S, A))2

    4. Обучаем критика используя L
    5. Берем градиент по весам актора ∇Q(S, μ (S)) любимым алгоритмом оптимизации и модифицируем актора, с помощью него
    6. Повторяем пока не достигнем желаемого

    RussianAICup



    Теперь я расскажу об агенте, которого я тренировал для соревнования. Подробные правила можете почитать по ссылке, если интересно. Также можете посмотреть видео и описание на главной странице. В соревновании есть 2 типа игр, первый — это когда твоя стратегия управляет одним из десяти волшебников. И второй, когда твоя стратегия управляет командой из 5 волшебников, противник при этом управляет противоположной командой из 5ти волшебников. Информация, которая доступна для стратегии включает все объекты, которые находятся в области видимости всех дружественных волшебников, все остальное пространство покрыто туманом войны:

    • волшебники
    • миньоны
    • строения (башни и базы)
    • деревья
    • бонусы
    • снаряды

    Юнит может иметь следующую информацию о себе:

    • координаты
    • количество хитпоинтов
    • количество маны
    • время до следующего удара
    • другие параметры, их много, в правилах есть полное описание

    Есть локальный симулятор (он на КПДВ), в котором можно погонять свою стратегию против самой себя или 2х встроенных противников, достаточно простых стратегий. Для начала я решил попробовать решить задачу в лоб. Я использовал DDPG. Собрал все доступные параметры о мире, их получилось 1184 и подал на вход. Выходом у меня был вектор из 13 чисел, отвечающих за скорость перемещения прямо и вбок, поворот, разные типы атаки, а также параметры атаки, такие как дальность полета снаряда, в общем все параметры, которые существуют. С наградой для начала тоже решил не мудрить, игра выдает количество XP, поэтому я давал положительную награду за повышение XP и отрицательную за уменьшение хитпоинтов. Поэкспериментировав какое-то время я понял, что в таком виде очень трудно добиться от нейросети толка, так как зависимости, которые должна была выявить моя модель, по моим прикидкам, были довольно сложными. Поэтому я решил, что надо упростить задачу для нейросети.

    Для начала я перестроил состояние, чтобы оно представляло не просто сборник всей входящей информации, а подавалось в виде кругового обзора от управляемого волшебника. Весь круговой обзор делился на 64 сегмента, в каждый сегмент могло попасть 4 ближайших объекта в этом сегменте. Таких круговых обзоров было 3, для дружественных, нейтральных и вражеских юнитов, а также для указания куда следовало двигаться. В итоге получилось еще больше параметров — 3144. Также я начал давать награду за движение в нужном направлении, то есть по дорожке к вражеской базе. Так как круговой обзор включает информацию о взаимном расположении объектов, я еще пробовал использовать сверточную сеть. Но ничего не получалось. Волшебники просто крутились на одном месте без малейшего проблеска интеллекта. И я оставил на какое-то время попытки, чтобы почитать информацию о тренировке нейросетей и вдохновиться.

    Через какое-то время я вернулся к экспериментам уже вдохновившись, уменьшил скорость обучения с 1e-3 до 1e-5, очень сильно сократил количество входных параметров до 714, попутно отказавшись от некоторых данных, чтобы ускорить процесс обработки информации. Также я решил использовать нейросеть только для движения и поворота, а стрельбу оставил за вручную прописанной простой стратегией: если можем стрелять поворачиваемся в сторону слабейшего врага и стреляем. Таким образом я снял с нейросети достаточно сложную для обучения, но легкую для прописывания задачу по прицеливанию и выстрелу. И оставил достаточно сложно формализуемую задачу наступления и отступления. В итоге стали заметны проблески интеллекта на обычной полносвязной сети. Потренировав ее какое-то время (пару суток на GeForce GTX 1080 на эксперимент), добившись неплохого качества управления (сеть обыгрывала встроенного противника), я решил загрузить сеть в песочницу.

    Веса сети я выгрузил из Tensorflow и захардкодил их в виде h файлов. В итоге получился архив в несколько десятков мегабайт и песочница отказалась его принять, сказав что максимальный файл для загрузки 1 Мб. Пришлось намного сильнее сократить нейросеть и потратить кучу времени (порядка недели или нескольких недель, я уже точно не помню) на ее обучение, подбор гиперпараметров и уложиться в размер архива 1 Мб. И вот когда я наконец снова попробовал загрузить, оно выдало, что ограничение на разархивированный архив 2 Мб, а у меня было 4Мб. Фейспалм. Поборов бурные чувства, я принялся еще больше ужимать нейросетку. В итоге ужал до следующей архитектуры:

    394 x 192 x 128 x 128 x 128 x 128 x 6 
    

    394 — это входной слой, во всех слоях кроме последнего и предпоследнего используется relu, в предпоследнем tanh в качестве активационной функции, в последнем, как водится, активационной функции нет. В таком виде контроль был не таким хорошим, но проблеск интеллекта заметен был и я решил загрузить этот вариант в аккурат за несколько часов до начала финала. С небольшими улучшениями он до сих пор и играет russianaicup.ru/profile/Parilo2 в песочнице в районе 700 места в рейтинге. В целом я доволен результатом на данный момент. Ниже видео с примером матча 1х1, моя стратегия управляет всей командой из 5ти волшебников.


    Предложения по улучшению конкурса


    В конкурсе довольно интересно участвовать. Есть плюшки в виде локального симулятора. Я бы хотел предложить несколько изменить формат. То есть запускать на сервере только серверную часть и рейтинговую таблицу, а клиенты чтобы коннектились через интернет к серверу и участвовали в поединках. Таким образом можно снять нагрузку с сервера, а также убрать ограничения по ресурсам для стратегий. В общем, так как это сделано во многих онлайн играх типа Старкрафт 2 или той же Доты.

    Код


    Код агента доступен на гитхабе. Используется С++ и для управления и для обучения. Обучение реализовано в виде отдельной программы WizardTrainer, которая зависит от TensorFlow, стратегия подключается по сети к тренеру, скидывает туда состояние среды и получает оттуда действия которые необходимо совершать. Также она туда отправляет весь получаемый опыт. Таким образом к одной нейросетке можно подключать несколько агентов и она будет управлять всеми одновременно. Собрать это все не так просто, если потребуется спросите меня как.

    Ресурсы


    Более подробно об обучении с подкреплением, этих, а также других алгоритмах можно посмотреть в замечательном курсе David Silver из Google DeepMind. Слайды доступны здесь.
    Оригинальные статьи DDPG и DQN. Формулы я брал из них.

    Спасибо, что дочитали до конца. Удачи вам на пути познания!

    P.S. Прошу извинить за размер формул, не хотел, чтобы они были маленькие, перестарался с принтскрином.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 63

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

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

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

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

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

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

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

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


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


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

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

                          А где гарантия что вам дадут актуальный код?

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

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

                                0
                                Согласен, ввести какие-то разумные ограничения не помешало бы.
                +1
                Clickbait защитан. А то я подивился, как сюда смогли приткнуть C++.
                  0
                  Причем здесь это? Статья про очередной RAIC — с упрощенной MOBA-игрой.
                    0

                    При том, что из заголовка это не очевидно.

                  +2
                  пару суток на GeForce GTX 1080 на эксперимент

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

                                                А вот пример эволюционирующей нейросети, обучаются достаточно резво.
                                                  0
                                                  Далеко не все глубокие нейронные сети рекуррентные, сверточная нейросеть тоже не рекуррентная.
                                                    0
                                                    Я и не писал, что свёрточная и рекуррентная одно и тоже, — я написал что они обе из одной степи, т.е. из глубинного обучения. Я хотел изменить на более понятный вариант, но Хабр не дает редактировать сообщения (сколько он там дает, 2 минуты где-то?)
                                                  0
                                                  И вот еще парочка ссылочек на одного канадского китайца с примерами на Жабе:
                                                  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/
                                                0

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

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

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

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

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

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

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

                                                        Самое читаемое