Оптимизация покупок в приложении в реальном времени 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 9.8 или более поздней версии или эмулятор с сервисами Google Play 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. Firebase Analytics SDK автоматически собирает ряд событий и свойств пользователей. Он также позволяет вам определять собственные события для измерения событий, уникальных для вашего приложения.

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

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

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

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

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

MainActivity.kt

firebaseAnalytics.setUserId("player1")

Далее мы можем регистрировать события игрока. Для оптимизации покупок в приложении (IAP) нам нужно регистрировать каждое предложение покупки в приложении, представленное пользователю, и то, нажал ли пользователь на него. Это даст нам два аналитических события: 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) были показаны пользователю и на какие из них он нажал. На этом этапе мы объединим данные о событиях с данными пользователей, чтобы наша модель могла получить полную картину.

Для этого нам необходимо начать с экспорта аналитических событий в 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 . Затем объедините таблицы в BigQuery , чтобы объединить эти данные с данными Google Analytics для использования в вашей модели персонализации и в остальной части этой практической работы.

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

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

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

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

Все эти данные необходимо будет упорядочить в одну строку таблицы, чтобы наша модель могла их обработать. К счастью, 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 пользователю предлагается предложение покупки в приложении, которое даст ему бонус. Мы можем показывать только один вариант покупки в приложении каждый раз, и мы не знаем, какие из них принесут наибольшую конверсию. Учитывая, что каждый пользователь и каждая сессия уникальны, как нам найти предложение покупки в приложении, которое принесёт наибольшую ожидаемую выгоду?

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

e7d3264141498bff.jpeg

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

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

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

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

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

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

Для начала вы можете использовать обучающий скрипт ( 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 — лучшее усиление IAP для данного пользователя.

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
  • BigQuery

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

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

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