Оптимизация покупок в приложении в реальном времени Codelab

1. Обзор

1cbf855eda62c306.png

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

В этом руководстве показано, как создать модель машинного обучения для персонализации, в частности, модель, которая предсказывает оптимальное предложение внутриигровой покупки (IAP) в зависимости от текущего состояния пользователя. Это пример задачи контекстного многорукого бандита — важной и широко применимой задачи машинного обучения, о которой вы узнаете больше в этом практическом занятии.

Что вы узнаете

  • Собирайте аналитические данные с помощью Firebase Analytics.
  • Предварительная обработка аналитических данных с использованием BigQuery.
  • Обучите простую модель машинного обучения для оптимизации внутриигровых покупок (IAP) на устройстве.
  • Развертывайте модели TFLite в Firebase ML и получайте к ним доступ из своего приложения.
  • Проводите измерения и эксперименты с различными моделями с помощью A/B-тестирования Firebase.
  • Обучайте и внедряйте новые модели, используя самые свежие данные, с регулярной периодичностью.

Что вам понадобится

  • Android Studio версии 3.4+
  • Для тестирования потребуется физическое устройство с Android 2.3+ и Google Play Services 9.8 или более поздней версии, либо эмулятор с Google Play Services 9.8 или более поздней версии.
  • При использовании физического измерительного прибора потребуется соединительный кабель.
  • Начальные знания в области машинного обучения

Как вы будете использовать этот учебный материал?

Прочитайте только от начала до конца. Прочитайте текст и выполните упражнения.

Как бы вы оценили свой опыт разработки приложений для Android?

Новичок Средний Профессионал

2. Постановка проблемы

Предположим, вы — разработчик игр, который хочет показывать персонализированные предложения внутриигровых покупок (IAP) в конце каждого уровня. Вы можете показывать лишь ограниченное количество вариантов IAP за раз, и вы не знаете, какие из них обеспечат наилучшую конверсию. Учитывая, что каждый пользователь и каждая сессия уникальны, как нам найти предложение IAP, которое обеспечит наибольшую ожидаемую выгоду?

3. Получите пример кода.

Клонируйте репозиторий GitHub из командной строки.

git clone https://github.com/googlecodelabs/firebase-iap-optimization.git

Этот репозиторий содержит:

  1. Блокнот Jupyter (.ipynb), который обучает модель персонализации и упаковывает её в модель TFLite.
  2. Пример приложения на Kotlin, использующего модель TFLite для прогнозирования на устройстве.

4. Запустите приложение с помощью Firebase.

В этом практическом занятии мы займемся оптимизацией внутриигровых покупок (IAP) в нашем вымышленном игровом приложении Flappy Sparky . Игра представляет собой сайд-скроллер, где игрок управляет Спарки, пытаясь пролететь между колоннами стен, не задевая их. В начале уровня пользователю предлагается IAP-бонус. В этом практическом занятии мы будем реализовывать только часть приложения, посвященную оптимизации IAP.

Вы сможете применить полученные здесь знания в собственном приложении, подключенном к проекту Firebase. В качестве альтернативы вы можете создать новый проект Firebase для этого практического занятия. Если вам нужна помощь в начале работы с Firebase, пожалуйста, ознакомьтесь с нашими руководствами по этой теме ( Android и iOS ).

5. Собирайте аналитические события в своем приложении.

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

К числу аналитических событий, которые мы можем захотеть зарегистрировать, относятся:

  • Как долго пользователь играет в игру
  • До какого уровня добирается пользователь
  • Сколько монет потратил пользователь
  • Какие товары покупает пользователь

Скачать пример данных (необязательно)

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

Собирайте данные с помощью Firebase Analytics SDK.

Для сбора этих аналитических событий мы будем использовать Firebase Analytics. SDK Firebase Analytics автоматически фиксирует ряд событий и свойств пользователей. Он также позволяет определять собственные пользовательские события для измерения событий, уникальных для вашего приложения.

Установка Firebase Analytics SDK

Начать работу с Firebase Analytics в вашем приложении можно, следуя инструкциям в документации «Начало работы с Google Analytics». Репозиторий firebase-iap-optimization клонированный в начале этого руководства, уже включает SDK Firebase Analytics.

Регистрировать пользовательские события

После установки Firebase Analytics SDK мы можем начать регистрировать события, необходимые для обучения нашей модели.

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

MainActivity.kt

firebaseAnalytics.setUserId("player1")

Далее мы можем регистрировать события, происходящие с игроком. Для оптимизации внутриигровых покупок нам нужно регистрировать каждое предложение, показанное пользователю, и то, кликнул ли пользователь на это предложение. Это даст нам два аналитических события — offer_iap и offer_accepted . Мы также будем отслеживать уникальный offer_id, чтобы позже использовать его для объединения этих данных и определения, было ли предложение принято.

MainActivity.kt

predictButton?.setOnClickListener {
  predictionResult = iapOptimizer.predict()

  firebaseAnalytics.logEvent("offer_iap"){
    param("offer_type", predictionResult)
    param("offer_id", sessionId)
  }
}

acceptButton?.setOnClickListener {
  firebaseAnalytics.logEvent("offer_accepted") {
    param("offer_type", predictionResult)
    param("offer_id", sessionId)
  }
}

Для получения дополнительной информации о регистрации пользовательских событий посетите документацию по регистрации событий в Firebase Analytics .

6. Предварительная обработка данных в BigQuery

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

Для этого нам потребуется начать с экспорта аналитических событий в BigQuery.

Чтобы связать ваш проект Firebase и его приложения с BigQuery:

  1. Войдите в Firebase.
  2. Нажмите the Settings icon Затем выберите «Настройки проекта».
  3. На странице «Настройки проекта» перейдите на вкладку «Интеграции».
  4. На карточке BigQuery нажмите «Ссылка».

(Необязательно) Экспортируйте свои коллекции Firestore в BigQuery

На этом шаге у вас есть возможность экспортировать дополнительные данные о пользователях из Firestore в BigQuery для использования в процессе обучения модели. Если вы хотите пропустить этот шаг, перейдите к разделу «Подготовка данных в BigQuery» этого руководства, и вы сможете следить за событиями Firebase Analytics, зарегистрированными на предыдущем шаге.

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

Для экспорта коллекций Firestore в BigQuery можно установить расширение Firestore BigQuery Export Extension . Затем объедините таблицы в BigQuery , чтобы скомбинировать эти данные с данными из Google Analytics и использовать их в модели персонализации и во всей остальной части этого практического занятия.

Подготовка данных в BigQuery

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

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

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

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

BigQuery позволяет создавать «представления» для организации запросов. Представление — это виртуальная таблица, определяемая SQL-запросом. При создании представления вы выполняете запрос к нему так же, как и к обычной таблице. Используя это, мы можем сначала очистить наши аналитические данные.

Чтобы проверить, был ли совершен клик по каждому предложению внутриигровой покупки, нам нужно объединить события offer_iap и offer_accepted , которые мы зарегистрировали на предыдущем шаге.

all_offers_joined - представление BigQuery

SELECT
  iap_offers.*,
  CASE
    WHEN accepted_offers.accepted IS NULL THEN FALSE ELSE TRUE
  END
  is_clicked,
FROM
  `iap-optimization.ml_sample.accepted_offers` AS accepted_offers
RIGHT JOIN
  `iap-optimization.ml_sample.iap_offers` AS iap_offers
ON
 accepted_offers.offer_id =iap_offers.offer_id;

all_offers_with_user_data - представление BigQuery

SELECT
  offers.is_clicked,
  offers.presented_powerup,
  offers.last_run_end_reason,
  offers.event_timestamp,
  users.*
FROM
  `iap-optimization.ml_sample.all_offers_joined` AS offers
LEFT JOIN
  `iap-optimization.ml_sample.all_users` AS users
ON
  users.user_id = offers.user_id;

Экспорт набора данных bigQuery в Google Cloud Storage

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

888daa7ba4db8e44.png

14d22bf474fae455.png

7. Обучение модели оптимизации

Пример данных

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

Определение проблемы

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

Объяснение контекстных бандитов

В начале каждого уровня в Flappy Sparky пользователю предлагается внутриигровая покупка (IAP), которая дает ему бонус. Мы можем показывать только один вариант IAP за раз, и мы не знаем, какие из них обеспечат наилучшую конверсию. Учитывая, что каждый пользователь и каждая сессия индивидуальны, как нам найти предложение IAP, которое обеспечит наибольшую ожидаемую выгоду?

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

e7d3264141498bff.jpeg

В прогнозе мы будем использовать следующие данные:

  • Состояние: информация о пользователе и его текущей сессии.
  • Действие: Встроенные покупки, которые мы можем показывать по своему выбору.
  • Вознаграждение: стоимость предложения IAP.

Эксплуатация против исследования

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

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

Обучение модели

Для начала вы можете использовать скрипт обучения ( training.ipynb ), предоставленный вместе с практической работой. Наша цель — обучить модель, которая предсказывает ожидаемое вознаграждение за каждое действие в зависимости от состояния, а затем найти действие, которое дает нам наибольшее ожидаемое вознаграждение.

Обучение на местном уровне

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

Для этого практического занятия вам не понадобится графический процессор, но если вам требуется более мощный компьютер для анализа собственных данных и обучения собственной модели, вы можете приобрести экземпляр AI Platform Notebook, чтобы ускорить процесс обучения.

В предоставленном скрипте обучения мы создали итератор, который генерирует обучающие данные из CSV-файлов, экспортированных из BigQuery. Затем мы использовали эти данные для начала обучения нашей модели с помощью Keras. Подробности о том, как обучать модель, можно найти в комментариях к блокноту Python.

Оцените производительность модели.

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

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

Экспорт модели TFLite

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

train.ipynb

converter = tflite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

with tf.io.gfile.GFile('iap-optimizer.tflite', 'wb') as f:
  f.write(tflite_model)

Отсюда вы можете загрузить модель и включить её в своё приложение.

В качестве дополнительной опции для производственного приложения мы рекомендуем развернуть модель в Firebase ML и разместить ее на хостинге Firebase. Это полезно по двум основным причинам:

  1. Мы можем уменьшить размер устанавливаемого приложения и загружать модель только при необходимости.
  2. Модель может регулярно обновляться с другим циклом выпуска, чем всё приложение целиком.

Чтобы узнать, как развернуть модель в Firebase ML, вы можете воспользоваться руководством по добавлению Firebase в ваше Android-приложение на базе TFLite . Вы можете развернуть модель с помощью консоли Firebase или API Python.

8. Прогнозирование непосредственно на устройстве.

Следующий шаг — выполнение прогнозов с использованием модели на устройстве. Пример приложения, загружающего модель из Firebase ML, можно найти в папке app загруженного вами примера кода, и использовать его для выполнения вывода с некоторыми данными на стороне клиента.

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

Далее мы подаем на вход модели тестовый сигнал следующим образом:

IapOptimzer.kt

  val testInput = mapOf(
    "coins_spent" to                       2048f,
    "distance_avg" to                      1234f,
    "device_os" to                         "ANDROID",
    "game_day" to                          10f,
    "geo_country" to                       "Canada",
    "last_run_end_reason" to               "laser"
  )

Модель показывает, что sparky_armor — это лучшее усиление для внутриигровых покупок для данного пользователя.

a3381dbcdbdf811e.png

Оцените точность модели.

Для оценки точности нашей модели мы можем просто отслеживать предсказанные моделью предложения IAP и клики по ним с помощью Firebase Analytics. Это можно использовать вместе с A/B-тестированием Firebase для оценки фактической производительности модели. Более того, вы можете проводить A/B-тестирование на разных итерациях модели. Подробнее об A/B-тестировании с Firebase можно узнать в документации « Создание экспериментов Firebase Remote Config с помощью A/B-тестирования» .

9. (Необязательно): Регулярное обновление модели новыми данными.

Если вам необходимо обновлять модель по мере поступления новых данных, вы можете настроить конвейер для периодического переобучения модели. Для этого сначала необходимо убедиться, что у вас есть новые данные для обучения, используя упомянутую выше стратегию «эпсилон-жадности» (например, используя результат прогноза модели в 70% случаев и случайные результаты в 30% случаев).

Настройка конвейера для обучения и развертывания с новыми данными выходит за рамки данного практического занятия; для начала вы можете ознакомиться с платформой Google Cloud AI Platform и инструментом TFX .

10. Поздравляем!

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

Если у вас возникнут вопросы, вы можете задать их на Stack Overflow в канале #firebase-machine-learning .

Что мы рассмотрели

  • TensorFlow Lite
  • Firebase ML
  • Firebase Analytics
  • BigQuery

Следующие шаги

  • Обучите и разверните модель оптимизатора для вашего приложения.

Узнать больше