Рубрики
Без рубрики

Прогнозирование результатов MOBA Match

Предсказание матча приводит к Vainglory с использованием KERAS и FLOYDHUB. Помечено с машиной, керами, питоном.

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

Поэтому я решил предсказать результаты матча для моей любимой MOBA, Vainglory Отказ

  1. Эта проблема
  2. Немного больше контекста
  3. Набор данных
  4. Обучение модели
  5. Начальные результаты
  6. Уборка данных
  7. Позже результаты с чистыми данными
  8. Разница (или их отсутствие) между тренировкой с талантами и без
  9. Что мы узнали?
  10. Следующие шаги

Прогнозировать эффективность таланта

Я решил сосредоточиться на одном режиме, в частности, «Aral», повседневный режим, который выбирает герои случайным образом для игроков, и у игроков, а затем выбирают таланты, чтобы выбрать. Цель состоит в том, чтобы уничтожить базу другой команды, сохраняя свою собственную стоять.

Чтобы поставить его просто, я хочу ответить на следующий вопрос:

Какой талант дает мне лучшие шансы на выигрыше конкретный матч?

С «специфическим матчем» определяется как реестр уже выбранных героев из обеих команд.

Что такое моба

Моба, Многопользовательская онлайн-боевая арена Видеоигра Жанр популяризован (может быть, даже возник) до Dota, Защита древних мод Warcraft 3.

Мод был настолько популярен, что он породил достаточно большого количества последующих игр, особенно Dota 2 и Лига легендов Отказ На мобильной стороне, Vainglory и Арена доблести были довольно успешными и лично, не имея хорошего настройки ПК, я стекался к этим мобильным.

Игра Жанр играет немного похоже на это:

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

Что такое герой

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

Например, герой, который я играю больше всего на Vainglory – Лира . Она маг с исцелением и защитной магией. У нее есть базовая атака, которая замедляет цели и не сильно на пути механизмов личной обороны.

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

Что такое способность

Каждый герой в Vainglory имеет 1 перк и 3 способности.

Перк часто привязан к их основной атаке. Например, Перк Лиры, Принцип Арканум , добавляет второй удар в ее основную атаку, что делает его более мощным и замедлять ее цель.

Способности обычно активируются игроком для обеспечения эффекта и имеют перезарядку и, возможно, какую-то стоимость (например, MANA, STAMINAINA, RAGE ETC).

Например, Lyra имеет эти 3 способности:

  • Империал Сигил : Она вписывает Сигил на земле, которая исцеляет союзников и ущерб врагов
  • Яркий бульвар : Она вызывает пузырь, который предотвращает использование врагов, используя способности на основе движения
  • Тайный проход : Она создает телепортационный туннель между двумя точками

Основная атака, Перк и способности являются основными способами, которыми герой влияет на их среду и ход матча.

Что такое талант

В режимах выбора Vainglory, а именно Aral и Blitz, игроки могут выбрать одну из 3 талантов для своих героев. Эти таланты уникальны для каждого героя и влияют на то, как играет их герой.

Например, вот таланты Лиры:

  • Двойная ракета : торгует эффект замедления ее основной атаки на большее повреждение
  • Mobile Bulwark : заставляет ее пузырь следовать за ней вместо того, чтобы оставаться на месте, где она бросила его
  • Gythian Ward : дает небольшой барьер и очищает все дебафты до союзников в пределах его периметра

Эти таланты обычно являются торговля между преимуществом и недостатком. Они также могут быть улучшены для повышения их эффективности.

Мои данные состоят из матчей, уже играемых вместе с их результатами.

Три горячего вектора для состава команд

Чтобы моделировать состав героя каждой команды, я закончил использовать Три горячего вектора Отказ (Я понятия не имею, если это реальная вещь)

Что такое три горячие?

А один горячий вектор это вектор (с вектором существенно заказанным списком номеров), где все значения 0 и только один из них 1. Это выглядит немного так:

vector = [0, 0, 0, 1, 0, 0, 0, 0, 0]

Идея трех горячего вектора состоит в том, что это как одно горячее вектор, но с тремя позициями, установленными на 1 вместо только одного. Это позволяет представлять набор из 3 уникальных значений. Похоже, это выглядит:

vector = [0, 1, 0, 1, 1, 0, 0, 0, 0]

Еще один способ объяснить это с теорией типа. В этом случае одно горячее вектор может представлять enum и трех горячем вектором можно представлять уникальный набор ровно трех перечислений.

Почему три горячие?

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

Кроме того, герои не заказываются в команде.

Это позволяет нам выразить список одной команды одним из трех горячего вектора, размер которого является сумма доступных героев (45 на момент написания).

Таланты одно горячие вектор

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

Поскольку каждый герой имеет 3 таланта (редкие, эпические, легендарные), я мог бы выбрать Softmax 3 Активация для выходного узла. Я решил против этого, потому что он чувствовал себя слишком сложным для модели, чтобы узнать все ассоциации.

Другой подход был бы снова моделировать вывод как Softmax, но включить все таланты всех героев (всего 135). Это также чувствовало себя неоптимальным, потому что всегда будет 132 талантов, которые недоступны игроку.

Вместо этого я пошел с трюком, который я узнал в курсе Курсера. Я положил список талантов на вход и попросил модель прогнозировать возможный результат, учитывая выбранный талант. Таким образом, мне придется придержать 3 прогноза каждый раз, чтобы ответить на мой вопрос «Какой талант?».

Итак, я закончил представлять таланты как одно горячие вектор позиций (45 героев х 3 талантов каждый + 1 «Нет выбранных таланта»). Обратите внимание, что для игрока можно не разблокировать любые таланты из выбранного героя. Это тот случай, когда позиция «без таланта выбрана» будет перевернута.

Sidenote: На втором мысли позиция «нет выбора таланта» на вектор талантов, вероятно, может быть устранено. Я должен выполнить эксперимент или два, чтобы подтвердить это.

Эксперименты на этикетке (Tanh, Sigmoid, Softmax)

Для этикеток я понятия не имел, как моделировать их, поэтому я бегу несколько экспериментов.

(-1, 1) усадьба
(0, 1) сигмоид
2x (0, 1) Softmax.

Из вышесказанного, Softmax Подход привел к лучшим результатам (как измеряется по точности набора валидации) Так что я застрял с этим. Разница была маленькой, и я могу только догадаться, что это было частично на пути Tensorflow (keras Backend я использую) оптимизирован.

Положить их все вместе

Чтобы генерировать вход от одного матча, я принял матч и для каждого героя, который я определил:

  • Моя команда как трех горячий вектор
  • другая команда как трех горячий вектор
  • Мой талант как одно горячее вектор
  • Вердикт С точки зрения героя как число от 1 (Win) до -1 (потеряно)

И сложены векторы для производства вектора 226 размеров.

Например, вот предварительно укладывается запись данных:

{
  "matchID": "ab137e32-e381-11e8-a4e9-02b7582ce766",
  "x": {
    "ours": [
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0
    ],
    "theirs": [
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0
    ],
    "myTalents": [
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    ]
  },
  "y": 1
}

Что представляет собой матч между «нашей» командой с INARA, PETAL и VARYA и «Их» с кинетикой, Ringo и Skaarf. Выбранный талант – «отказов» лепестка, и приговор был выигрыш для нашей (петальской) команды.

Поскольку мы компилируем каждый ввод данных с точки зрения одного героя/проигрывателя, мы в конечном итоге с 6 записями за матч (2 команды х 3 героев).

API для получения матчей

Чтобы скомпилировать мой набор данных, я использовал Vainglory API Отказ У него есть Удобная конечная точка для получения последних матчей а потом другой, чтобы получить телеметрию матча (который включает в себя таланты, выбранные для каждого героя). С Люкс маленьких сценариев , работает на удаленном виртуальной машине, мне удалось получить около 30K записей данных в день.

Почему масштаб VM.

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

Чтобы сохранить данные для получения, я получил дешевые VM by Mancy Maxty Отказ По 2 доллара в месяц он не может получить гораздо дешевле, и он позволяет мне получать данные и компилировать мой набор данных 24/7.

Разделить на тренировку/dev/test

Чтобы начать тренировку, я разделил свой набор данных в 3 частях:

  1. Тестовый набор 10K, который будет использоваться после того, как все тренировки были выполнены для оценки модели.
  2. Установка DEV 10K (также называемая набор валидации иногда), который иногда используется на каждой подготовке эпохи для оценки прогресса обучения.
  3. Остальные как учебный набор, используемый для обучения модели.

Все мой код можно найти в https://gitlab.com/gademo/vainglory-stats Отказ Кодекс делает несколько предположений о том, где проживают вещи. Не стесняйтесь вилкой и редактировать и запускать свои собственные эксперименты.

Почему керас

Я выбрал Керас На этом, потому что я хотел больше сосредоточиться на процессе обучения и развиваться модель и меньше на деталях оптимизации ее. KERAS позволяет мне определить и тренировать модель с очень несколькими строками кода:

# a few imports...

X = Input(shape=(n_x,))
Y = Dense(1024, activation=relu)(X)
Y = Dropout(0.1)(Y)
Y = Dense(256, activation=relu)(Y)
Y = Dropout(0.1)(Y)
Y = Dense(n_y, activation=softmax)(Y)

model = Model(inputs=X, outputs=Y)

model.compile('Adam')
model.fit(
    X_train, Y_train, # the training set
    epochs=num_of_epochs,
    validation_data=(X_dev, Y_dev) # the dev set
)

С вышеупомянутым фрипплетом KERAS будет обучать модель и печатать полезные метрики, такие как точность и потеря на каждой эпоху.

В полном объеме тренировочного скрипта можно найти на Gitlab Отказ

Почему Floydhub.

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

floyd run --data vrinek/datasets/casual-aral:casual_aral "python train.py"

Что --дата Аргумент исходит от ранее загруженного скомпилированного набора данных в Floydhub с:

floyd data init vrinek/casual-aral # one time setup
floyd data upload                  # every time the dataset updates (about daily)

Может быть, стоит упомянуть здесь, что Floydhub поставляется с несколькими часами использования процессора и GPU бесплатно и больше можно приобрести.

Результаты на 99% точности

Итак, у меня есть мой набор данных, я таксую, разделив его в тренировках/dev/Test Sets и пусть мой тренировочный скрипт обучает модель.

После некоторых экспериментов я смог ударить на 99% точности (как измеряется на тестовом наборе) с нейронной сетью 2 скрытых слоев: 1024 единиц RELU и 256 единиц RELU. Каждое устройство сопровождалось 10% раскрывающимся слоем.

Вся модель выглядела так, как написано в KERAS:

X = Input(shape=(n_x,))
Y = Dense(1024, activation=relu)(X)
Y = Dropout(0.1)(Y)
Y = Dense(256, activation=relu)(Y)
Y = Dropout(0.1)(Y)
Y = Dense(n_y, activation=softmax)(Y)

Триумф, отказавшись к скептицизму

Результаты точности 99% немного странно для этой проблемы. И даже более странный в течение первого исследователя.

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

Чтобы проверить я повторную обучение модели, на этот раз без талантов. Я понял, что выявление талантов части входных данных не изменило результатов, точность осталась на уровне 99%.

Скептицизм усиливается … 🤔

Матчины, присутствующие как в поезде, так и в разработке.

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

Другими словами, я проверял мою модель на одни и те же данные, на которых я его тренировал.

Мой очевидный следующий шаг должен был убирать этот беспорядок.

Утверждения

Мой первый приоритет должен был ввести некоторые утверждения, чтобы это не повторилось (я привык к TDD, чтобы это сделал для меня абсолютным смыслом).

training_set_ids = set([match['matchID'] for match in training_set])
dev_set_ids = set([match['matchID'] for match in dev_set])
test_set_ids = set([match['matchID'] for match in test_set])

# Assert that the three sets do not overlap
assert(len(training_set_ids & dev_set_ids) == 0)
assert(len(training_set_ids & test_set_ids) == 0)
assert(len(dev_set_ids & test_set_ids) == 0)

Опустить спреивание

Очевидно, что с этими линиями на месте мой тренировочный скрипт не провалился, что только подтвердило мои более ранние наблюдения. Самый простой способ исправить это было, чтобы опустить перетасовывать мои данные (а также настроить размер наборов на несколько 6).

Лечение данных как серии времени

Я не был особенно рад, что опустил свои данные. Пытаясь обсудить это С моей резиновой укой Я напомнил, что когда модель обучается на временной серии данных (например, метеорологические или финансовые) данные не перетасовываются. В этих случаях важно для моделей сможет предсказать Будущее Учитывая прошлое Отказ

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

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

По сравнению с базовой точностью 50%

Повторное обучение модели на наборе тренировок (на этот раз с записями данных 500K, ~ 83K матчами), результаты были довольно плохими:

  • Установка DEV Точность зависала вокруг 56% ( Предполагая, что базовый алгоритм «выбора случайного числа» преуспеют на 50%)
  • Dev устанавливает убыток неуклонно растет во время потери поезда сжимается

Я также сравнил результаты между тренировкой моделью и без талантов:

Разница в точности является маргинальным на установленном разработке. Даже на наборе тренировок не кажется никакой пользы при добавлении талантов на набор данных (80% против 79,3%).

Вклад талантов в первом слое

Чтобы проверить уровень вклада талантов, я нанесел веса первого слоя в качестве тепломапа:

С этой визуализацией было довольно легко обнаружить разницу. 0-89 на оси y представляет собой высокопоставленные весы героя и 90-225 представляют собой талантные. В среднем он выглядит как особенности, специфичные героя, находящиеся на более экстремальных весах, чем таланты.

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

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

Итак, что я узнал?

О проблеме

Модель не узнала много. Это может означать несколько вещей:

Архитектура модели не может соответствовать данным

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

Недостаточно данных

Вполне возможно. Прямо сейчас, с записями данных 600K, мы стоим на матчах 100К. Это может быть небольшой набор данных для этой проблемы.

Очевидное решение этого состоит в том, чтобы собрать больше данных. Учитывая, у меня есть маленькая виртуальная машина, работающая неустанно, чтобы собрать данные, это должно быть вопрос времени.

Различная смесь функций улучшит результаты

В качестве активного игрока Vainglory у меня мало «экспертных» знаний по предмету. Результат матча зависит от формирования команды (герои каждой команды), но это вряд ли единственный фактор влияния. Другие факторы могут быть:

  1. Опыт игрока

    Один из важнейших факторов, когда речь идет о вердикте матча, является опыт участвующих игроков. Vainglory – это очень много навыков.

    API VAINGLORY обнаруживает данные на уровне квалификации игроков, но он не был включен в модель в попытке, чтобы сохранить его простым.

  2. Фитнес игрока

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

    Это не то, что API VAINGLORY имеет (или может легко иметь) данные о том, как точка здесь состоит в том, что наша модель не сможет это предсказать. Мы могли бы, возможно, может сделать это как-то, может быть,.

  3. Уровни таланта

    Как я уже упоминал ранее, таланты имеют уровни. Возможно, что талант на уровне 1 и на уровне 10 влияет на результат по-разному.

  4. Игрок AFK.

    Иногда игрок идет AFK. Иногда бот берет на себя (если игра признает это поведение), в других случаях героя видится на холостом ходу на карте. В обоих случаях ожидается, что шансы на команду ухудшаются.

    API Vainglory имеет информацию об этом, и она может быть легко включена в наши данные довольно легко.

  5. Игрок – Совместимость героев/Опыт

    Другими словами: «Насколько хорош этот игрок, когда играет этот конкретный герой?». До недавнего времени Vainglory не предоставил данные об этом. Это может быть выведено, осматривая исторические матчи игрока с указанным героем Но это отдельная проблема самостоятельно.

    Недавно, хотя Vainglory начал запись бара «Hero XP», который заполняет после отделки спички. Это может быть достаточно хорошим прокси для совместимости героя/игрок.

О гигиене данных

Единственный способ, способ для изучения, – это по данным. Если учебный набор недостаточно отделен от разработчиков и тестирования, то модель не будет обобщать.

Отсутствие обобщения была проблема, которую я имел, но она проявилась по-другому, чем то, что я ожидал: вместо большой разницы между тренировкой и ошибкой Dev Set, я увидел идеальные оценки, где я больше всего не видел.

Дополнительные данные

Как я уже упоминал ранее, буду собирать больше данных. Как только я попал в 1,2 млн записей (200 тысяч матчей), я дам это еще один выстрел. Я ожидаю, что разработчик разработки не улучшится Но я также ожидаю, что тренировочная установка будет ближе к тому, где будет набор Dev. Это потому, что модель будет вынуждена обобщить больше со всеми этими данными.

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

заявка

Ожидаемый конечный результат этого эксперимента будет создавать приложение, которое обслуживает эту модель в качестве веб-службы. Я определил пару полезных технологий, чтобы сделать это (например, Tensorflow-JS ), и я планирую дать ему попробовать, ожидая набора данных, чтобы собраться.

Оригинал: “https://dev.to/vrinek_94/predicting-moba-match-results-575a”