실시간 온디바이스 인앱 구매 최적화 Codelab

1. 개요

1cbf855eda62c306.png

실시간 온디바이스 인앱 구매 최적화 Codelab에 오신 것을 환영합니다. 이 Codelab에서는 TensorFlow Lite 및 Firebase를 사용하여 맞춤 맞춤설정 모델을 학습시키고 앱에 배포하는 방법을 알아봅니다.

이 튜토리얼에서는 맞춤설정을 위한 머신러닝 모델, 특히 현재 사용자의 상태를 고려하여 최적의 인앱 구매 (IAP) 서비스를 예측하는 모델을 빌드하는 방법을 보여줍니다. 이는 컨텍스트 밴딧 문제의 예시로, 중요하고 널리 적용되는 머신러닝 문제이며 이 Codelab에서 자세히 알아봅니다.

학습할 내용

  • Firebase 애널리틱스를 통해 애널리틱스 데이터 수집
  • BigQuery를 사용하여 분석 데이터 사전 처리
  • 인앱 구매 (IAP)의 기기 내 최적화를 위한 간단한 ML 모델 학습
  • 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 혜택을 찾으려면 어떻게 해야 할까요?

3. 샘플 코드 가져오기

명령줄에서 GitHub 저장소를 클론합니다.

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

이 저장소에는 다음이 포함됩니다.

  1. 맞춤설정 모델을 학습시켜 TFLite 모델로 패키징하는 Jupyter 노트북 (.ipynb)
  2. TFLite 모델을 사용하여 기기에서 예측하는 Kotlin 샘플 앱

4. Firebase로 앱 실행

이 Codelab에서는 가상의 게임 앱 Flappy Sparky의 IAP를 최적화합니다. 이 게임은 플레이어가 Sparky를 조종하는 사이드스크롤 게임으로, 벽의 기둥에 부딪히지 않고 여기저기 날아가려고 시도합니다. 레벨 시작 시 사용자에게 파워업을 제공하는 IAP 혜택이 표시됩니다. 이 Codelab에서는 앱의 IAP 최적화 부분만 구현합니다.

여기서 배운 내용은 Firebase 프로젝트에 연결된 앱에 적용할 수 있습니다. 또는 이 Codelab을 위한 새 Firebase 프로젝트를 만들 수 있습니다. Firebase를 시작하는 데 도움이 필요하면 이 주제에 대한 튜토리얼 ( AndroidiOS)을 참조하세요.

5. 앱에서 분석 이벤트 수집

애널리틱스 이벤트는 사용자 행동에 대한 유용한 정보를 제공하며 ML 모델을 학습시키는 데 사용됩니다. 예를 들어, 모델은 게임 플레이 시간이 길수록 추가 생명을 얻기 위해 인앱 구매를 할 가능성이 높다는 사실을 학습할 수 있습니다. ML 모델은 이 정보를 학습하기 위한 입력으로 분석 이벤트가 필요합니다.

기록할 만한 분석 이벤트는 다음과 같습니다.

  • 사용자가 게임을 플레이한 시간
  • 사용자가 도달한 레벨
  • 사용자가 소비한 코인 수
  • 사용자가 구매하는 상품

샘플 데이터 다운로드 (선택사항)

다음 단계에서는 Firebase 애널리틱스를 사용하여 모델에서 사용할 분석 이벤트를 로깅합니다. 사용하려는 애널리틱스 데이터가 이미 있는 경우 이 Codelab의 '최적화 모델 학습' 섹션으로 이동하여 샘플 데이터를 따라해 보세요.

Firebase 애널리틱스 SDK로 데이터 수집

Firebase 애널리틱스를 사용하여 이러한 애널리틱스 이벤트를 수집할 예정입니다. Firebase 애널리틱스 SDK는 여러 이벤트와 사용자 속성을 자동으로 캡처합니다. 또한 맞춤 이벤트를 직접 정의하여 앱에 고유한 이벤트를 측정할 수도 있습니다.

Firebase 애널리틱스 SDK 설치

Google 애널리틱스 시작하기 문서에 따라 앱에서 Firebase 애널리틱스를 시작할 수 있습니다. 이 Codelab의 시작 부분에서 클론한 firebase-iap-optimization 저장소에는 이미 Firebase 애널리틱스 SDK가 포함되어 있습니다.

커스텀 이벤트 로깅

Firebase 애널리틱스 SDK를 설정하고 나면 모델 학습에 필요한 이벤트 로깅을 시작할 수 있습니다.

그 전에 분석 이벤트에서 사용자 ID를 설정하여 해당 사용자의 애널리틱스 데이터를 앱의 기존 데이터와 연결할 수 있도록 하는 것이 중요합니다.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

다음으로 플레이어 이벤트를 로깅할 수 있습니다. IAP 최적화를 위해 사용자에게 표시된 각 IAP 혜택을 기록하고 사용자가 해당 혜택을 클릭했는지 여부를 기록하려고 합니다. 이렇게 하면 offer_iapoffer_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 애널리틱스 로그 이벤트 문서를 참고하세요.

6. BigQuery에서 데이터 사전 처리

마지막 단계에서는 사용자에게 어떤 IAP 혜택이 제시되고 어떤 IAP 혜택을 사용자가 클릭하는지에 대한 이벤트를 수집했습니다. 이 단계에서는 모델이 전체적인 그림을 학습할 수 있도록 이 이벤트 데이터를 사용자 데이터와 결합합니다.

그러려면 먼저 분석 이벤트를 BigQuery로 내보내야 합니다.

Firebase 프로젝트 및 앱을 BigQuery에 연결하는 방법은 다음과 같습니다.

  1. Firebase에 로그인합니다.
  2. 설정 아이콘를 클릭한 다음 프로젝트 설정을 선택합니다.
  3. 프로젝트 설정 페이지에서 통합 탭을 클릭합니다.
  4. BigQuery 카드에서 연결을 클릭합니다.

(선택사항) Firestore 컬렉션을 BigQuery로 내보내기

이 단계에서는 모델 학습에 사용할 수 있도록 Firestore에서 BigQuery로 추가 사용자 데이터를 내보내는 옵션이 있습니다. 지금 이 단계를 건너뛰려면 이 Codelab의 'BigQuery에서 데이터 준비' 섹션으로 이동하여 마지막 단계에서 로깅된 Firebase Analytics 이벤트를 따라 해 보세요.

Firestore는 사용자의 가입일, 인앱 구매, 게임 레벨, 잔액의 잔액 또는 모델 학습에 유용할 수 있는 기타 속성을 저장한 곳일 수 있습니다.

Firestore 컬렉션을 BigQuery로 내보내려면 Firestore BigQuery Export 확장 프로그램을 설치하면 됩니다. 그런 다음 BigQuery의 테이블을 조인하여 이 데이터와 Google 애널리틱스의 데이터를 결합하여 맞춤설정 모델 및 이 Codelab의 나머지 부분에서 사용합니다.

BigQuery에서 데이터 준비

다음 몇 단계에서는 BigQuery를 사용하여 원시 분석 데이터를 모델을 학습시키는 데 사용할 수 있는 데이터로 변환합니다.

모델이 사용자와 게임 상태에 따라 어떤 인앱 구매 제안이 제공되는지 학습하려면 다음에 관한 데이터를 구성해야 합니다.

  • 사용자
  • 게임 상태
  • 제시된 오퍼가
  • 제시된 혜택을 클릭했는지 여부

이 모든 데이터는 모델에서 데이터를 처리할 수 있도록 테이블에서 단일 행으로 구성되어야 합니다. 다행히 BigQuery는 바로 이러한 작업을 수행하도록 설정되어 있습니다.

BigQuery를 사용하면 '뷰'를 만들어 쿼리를 체계적으로 정리할 수 있습니다. 뷰는 SQL 쿼리로 정의하는 가상 테이블입니다. 뷰를 만들 때는 테이블을 쿼리할 때와 같은 방식으로 쿼리합니다. 이를 사용하여 먼저 분석 데이터를 정리할 수 있습니다.

각 인앱 구매 혜택이 클릭되었는지 확인하려면 이전 단계에서 기록한 offer_iapoffer_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에서 데이터 사전 처리'의 데이터 또는 여기에 제공된 다운로드 가능한 샘플 데이터를 사용하여 이 Codelab의 나머지 과정을 진행합니다.

문제 정의

모델 학습을 시작하기 전에 잠시 시간을 내어 문맥 밴딧 문제를 정의해 보겠습니다.

컨텍스트 밴딧 설명

Flappy Sparky에서 각 레벨이 시작될 때 사용자에게 파워업을 제공하는 IAP 혜택이 표시됩니다. Google에서는 한 번에 하나의 인앱 구매 옵션만 표시할 수 있으며, 어떤 옵션이 최고의 전환을 가져다줄지 알지 못합니다. 사용자와 세션이 다르다는 점을 고려했을 때, 가장 높은 보상을 제공하는 IAP 혜택을 찾으려면 어떻게 해야 할까요?

이 경우 사용자가 IAP 제안을 수락하지 않으면 보상을 0으로 만들고, 수락하지 않으면 IAP 가치를 부여해 보겠습니다. 보상을 극대화하기 위해 Google에서는 이전 데이터를 사용하여 사용자의 행동별로 예상되는 보상을 예측하는 모델을 학습시키고 가장 보상이 높은 액션을 찾습니다.

E7d3264141498bff.jpeg

예측에 사용할 항목은 다음과 같습니다.

  • 상태: 사용자 및 사용자의 현재 세션에 관한 정보
  • 조치: 표시하도록 선택할 수 있는 IAP 혜택
  • 리워드: 인앱 구매 제안의 가치

익스플로잇 vs. 탐색

모든 다중 슬롯머신 문제의 경우 알고리즘은 탐색 (어떤 동작이 최적의 결과를 얻는지 알아보기 위해 더 많은 데이터를 얻음)과 악용 (최적의 결과를 사용하여 가장 높은 보상을 얻음) 사이의 균형을 유지해야 합니다.

이번 문제 버전에서는 클라우드에서 주기적으로 모델을 학습시키고 사용자의 기기에서 모델을 사용할 때만 예측을 수행하도록 이를 단순화합니다 (사용자 기기에서도 학습하는 것과는 다름). 모델을 사용한 후 충분한 학습 데이터를 얻기 위해 앱 사용자에게 무작위 결과를 표시해야 하는 경우가 있습니다 (예: 30%). 이처럼 탐색과 악용의 균형을 맞추는 전략을 Epsilon-greedy라고 합니다.

모델 학습

Codelab과 함께 제공된 학습 스크립트 (training.ipynb)를 사용하여 시작할 수 있습니다. 우리의 목표는 어떤 상태에 따라 각 행동에 대해 예상되는 보상을 예측하는 모델을 학습시킨 다음, 가장 높은 보상이 예상되는 액션을 찾는 것입니다.

로컬 학습

자체 모델 학습을 시작하는 가장 쉬운 방법은 이 Codelab의 코드 샘플에서 노트북의 사본을 만드는 것입니다.

이 Codelab에서는 GPU가 필요하지 않지만 자체 데이터를 탐색하고 자체 모델을 학습시키기 위해 더 강력한 머신이 필요한 경우 AI Platform Notebook 인스턴스를 사용하여 학습 속도를 높일 수 있습니다.

제공된 학습 스크립트에서는 BigQuery에서 내보낸 CSV 파일에서 학습 데이터를 생성하는 반복기를 만들었습니다. 그런 다음 데이터를 사용하여 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에 배포하는 방법을 알아보려면 TFLite 기반 Android 앱에 Firebase 추가 Codelab을 따르세요. Firebase Console 또는 Python API를 사용하여 배포할 수 있습니다.

8. 기기에서 예측 실행

다음 단계는 기기에서 모델을 사용하여 예측하는 것입니다. 다운로드한 샘플 코드의 app 폴더에서 Firebase ML의 모델을 다운로드하는 예시 앱을 찾아 이를 사용하여 일부 클라이언트 측 데이터로 추론을 수행할 수 있습니다.

모델 학습 중에 일부 전처리를 적용했으므로 기기에서 실행할 때 동일한 전처리를 모델 입력에도 적용해야 합니다. 이를 위한 간단한 방법은 전처리 수행 방법에 대한 메타데이터에 대한 모든 기능의 맵이 포함된 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

모델 정확도 측정

모델 정확성을 측정하기 위해 Firebase Analytics를 사용하여 모델이 예측한 IAP 혜택을 추적하고 이 오퍼가 클릭되었는지 여부를 간단히 추적할 수 있습니다. 이를 Firebase A/B 테스팅과 함께 사용하여 모델의 실제 성능을 측정할 수 있습니다. 한 단계 더 나아가 다양한 반복 모델에 대해 A/B 테스트를 수행할 수도 있습니다. Firebase를 사용한 A/B 테스팅에 대한 자세한 내용은 A/B 테스팅으로 Firebase 원격 구성 실험 만들기 문서를 참조하세요.

9. (선택사항): 새 데이터로 모델을 정기적으로 업데이트

새 데이터가 들어올 때 모델을 업데이트해야 하는 경우 모델을 반복적으로 재학습하도록 파이프라인을 설정할 수 있습니다. 이렇게 하려면 먼저 위에서 언급한 epsilon-greedy 전략을 사용하여 학습에 사용할 새 데이터가 있는지 확인해야 합니다. (예: 70% 확률로 모델 예측 결과 사용, 30% 확률로 무작위 결과 사용)

새 데이터로 학습 및 배포하도록 파이프라인을 구성하는 작업은 이 Codelab에서 다루지 않습니다. 시작하려면 Google Cloud AI PlatformTFX를 확인하세요.

10. 수고하셨습니다.

이 Codelab에서는 Firebase를 사용하여 인앱 구매를 최적화하기 위해 온디바이스 TFLite 모델을 학습시키고 배포하는 방법을 알아봤습니다. TFLite 및 Firebase에 대해 자세히 알아보려면 다른 TFLite 샘플과 Firebase 시작 가이드를 살펴보세요.

궁금한 점이 있으면 Stack Overflow #firebase-machine-learning에 남겨주시기 바랍니다.

학습한 내용

  • TensorFlow Lite
  • Firebase ML
  • Firebase 애널리틱스
  • BigQuery

다음 단계

  • 앱의 옵티마이저 모델을 학습시키고 배포합니다.

자세히 알아보기