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

1. Обзор

1cbf855eda62c306.png

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

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

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

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

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

  • Android-студия версии 3.4+
  • Физическое тестовое устройство с Android 2.3+ и сервисами Google Play 9.8 или новее или эмулятор с сервисами Google Play 9.8 или новее.
  • При использовании физического тестового устройства соединительный кабель
  • Начинающие знания ML

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

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

Как бы вы оценили свой опыт создания приложений для 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. Собирайте аналитические события в своем приложении.

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

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

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

Загрузите образец данных (необязательно)

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

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

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

e7d3264141498bff.jpeg

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

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

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

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

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

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

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

Обучение на месте

Самый простой способ начать обучение собственной модели — сделать копию блокнота из примера кода для этой лаборатории кода.

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

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

Измерьте производительность модели

Во время обучения модели мы будем сравнивать ее со случайным агентом, который случайным образом выбирает предложения IAP, чтобы увидеть, действительно ли наша модель обучается. Эта логика находится под 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 или Python API.

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 с помощью A/B-тестирования» .

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

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

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

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

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

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

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

  • ТензорФлоу Лайт
  • Firebase ML
  • Аналитика Firebase
  • Большой запрос

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

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

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