Gamedev Андрей Верещагин
3 130

Как устроена система персональных рекомендаций в магазине в Clash Royale

Машинное обучение и анализ поведения игроков.

В закладки

На конференции Games First Helsinki 2018 Джарно Сеппанен из компании Supercell рассказал о том, как студия разрабатывала персонализированные предложения для внутриигрового магазина Clash Royale — то есть делала так, чтобы пользователи видели на витрине то, что им действительно нужно. На помощь разработчикам пришло машинное обучение и нейросети. Мы расшифровали доклад и выбрали главное.

Мы оперируем Clash Royale в реальном времени, подстраиваясь под нужды игроков. Мы стараемся представить игроку как можно более богатый опыт. Мы также стремимся к тому, чтобы игра ощущалась по-новому каждый раз, когда вы заходите в неё. Тут речь идёт о разнообразных ивентах, не дающих заскучать и освежающих игру.

На запуске Clash Royale нам не удавалось проводить их достаточно часто, так как график добавления нового контента был привязан к графику выхода обновлений. Команда разработчиков тратила месяц или два на создание обновления, затем оно проходило одобрение Apple и Google, и только после этого появлялось в игре. Таким образом, в течение пары месяцев в игре ничего не происходило. Но, в конце концов, мы смогли отделить эти графики друг от друга и проводить ивенты тогда, когда захотим.

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

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

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

Представьте себе программу. Это просто кусок кода, который трансформирует заданные данные во что-то. Машинное обучение, в свою очередь, работает иначе. Вместо того, чтобы передавать программе лишь данные ввода, мы передаём ей «данные обучения» (training data) — набор информации и о вводе, и о выводе. Система сама определяет, как превратить конкретные входные данные в те или иные выходные, самостоятельно выстраивает связи между ними.

По итогу получается иной тип программы, который называется «Моделью». Её преимущество в том, что теперь, изменяя механику игры, вам не нужно переписывать код программы. Достаточно лишь собрать новые данные и заново «обучить» систему с ними управляться, получив другую модель.

Так как это всё работает в Clash Royale? Во внутриигровом магазине можно увидеть особые индивидуальные предложения. Кому-то может высвечиваться предложение купить трёх мушкетёров, а кому-то — всадников на кабанах. Всё зависит от стиля игры каждого конкретного пользователя.

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

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

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

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

Предложениями также не следовало спамить. Поэтому «слабые» офферы фильтровались. Если система уверена, что вы никогда не приобретёте тот или иной комплект, она не станет вам его показывать вовсе. Нам нужно было и не «сломать» экономику игры, поэтому офферы менялись каждые две недели.

Все проблемы удалось решить за четыре простых шага. Первым делом нужно было создать инвентарь офферов из 21 изображения комплектов с заданными ценами и количеством карт в них. Затем следовало получить данные обучения, на основе которых система предполагала бы два варианта исхода: либо игрок покупает то, что ему предлагают, либо нет. После этого нужно было просто имплементировать это в Clash Royale.

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

Поэтому в июне 2017 года мы решили просто предлагать игрокам случайные карты, позволив пользователям решить самостоятельно, какие из них представляют интерес. Мы подумали, что в Clash Royale и так порядочно рандома, поэтому случайные предложения не повредят игре. Однако мы сильно ошибались.

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

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

Система таргетинга работает на основе 3,8 тысячи входных сигналов. Комбинируя их, она выбирает, какие карты предлагать игроку. Сам выбор производится с помощью нейронной сети. Если говорить о технической стороне вопроса, то данные мы собираем с помощью Kinesis и EMR от Amazon. Обучение производится оффлайн. Мы вручную передаём модели всю необходимую ей информацию. Это происходит с использованием PyTorch, Arrow и EC2. Затем мы имплементируем модель в игру. Раз в день система сканирует аккаунты игроков, чтобы собрать новые данные.

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

Последняя строка — это третья итерация системы таргетинга. Как видно, она подстегнула внутриигровые продажи.

#опыт #мобайл

{ "author_name": "Андрей Верещагин", "author_type": "editor", "tags": ["\u043e\u043f\u044b\u0442","\u043c\u043e\u0431\u0430\u0439\u043b"], "comments": 9, "likes": 31, "favorites": 19, "is_advertisement": false, "subsite_label": "gamedev", "id": 23286, "is_wide": false, "is_ugc": false, "date": "Mon, 16 Jul 2018 14:47:22 +0300" }
{ "id": 23286, "author_id": 22254, "diff_limit": 1000, "urls": {"diff":"\/comments\/23286\/get","add":"\/comments\/23286\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/23286"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954, "possessions": [] }

9 комментариев 9 комм.

Популярные

По порядку

Написать комментарий...
5

Следующий шаг - программа начнёт корректировать саму игру, повышая ретеншен и лтв. И мобильные игры окончательно превратятся в деньговыжимательный сервис.

Ответить
2

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

Ответить
1

Гм... а разве они еще не превратились?

Ответить
1

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

Ответить
–10

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

У вас там скоро Путин на четвертый срок пойдет. Советую еще покупать доллары перед Олимпиадой.

Ответить
0

очередной горящий незалежный пукан))

Ответить
0

Статья хорошая, а вот перспективы удручающие.

Ответить
0

Спасибо за интересную статью, Андрей! Хотелось бы еще больше интересного по монетизации мобильных игр.

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Уве Болл вернулся в кино
и начал экранизировать flash-игры
Подписаться на push-уведомления