실시간 기기 내 인앱 구매 최적화 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 혜택이 표시됩니다. 이 Codelab에서는 앱의 IAP 최적화 부분만 구현합니다.

여기에서 학습한 내용을 Firebase 프로젝트에 연결된 자체 앱에 적용할 수 있습니다. 또는 이 Codelab을 위해 새 Firebase 프로젝트를 만들 수 있습니다. Firebase 시작에 도움이 필요한 경우 이 주제에 관한 튜토리얼 ( AndroidiOS)을 참고하세요.

5. 앱에서 애널리틱스 이벤트 수집

분석 이벤트는 사용자 행동에 관한 유용한 정보를 제공하며 ML 모델을 학습시키는 데 사용됩니다. 예를 들어 모델은 더 오래 플레이하는 사용자가 추가 생명을 얻기 위해 인앱 구매를 할 가능성이 더 높다는 것을 학습할 수 있습니다. ML 모델이 이 정보를 학습하려면 분석 이벤트가 입력으로 필요합니다.

로깅할 수 있는 애널리틱스 이벤트의 예시는 다음과 같습니다.

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

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

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

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

Google에서는 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에서 데이터 전처리

마지막 단계에서는 사용자에게 표시되는 인앱 구매 혜택과 사용자가 클릭하는 인앱 구매 혜택에 관한 이벤트를 수집했습니다. 이 단계에서는 모델이 전체 그림에서 학습할 수 있도록 이 이벤트 데이터를 사용자 데이터와 결합합니다.

이를 위해 먼저 분석 이벤트를 BigQuery로 내보내야 합니다.

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

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

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

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

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

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

BigQuery에서 데이터 준비

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

모델이 사용자 및 게임 상태에 따라 표시할 IAP 혜택을 학습하려면 다음 사항에 관한 데이터를 정리해야 합니다.

  • 사용자
  • 게임 상태
  • 제시된 혜택
  • 표시된 혜택이 클릭되었는지 여부

모델이 데이터를 처리하려면 이 모든 데이터를 표의 단일 행으로 정리해야 합니다. 다행히 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 혜택이 표시됩니다. 매번 하나의 IAP 옵션만 표시할 수 있으며 어떤 옵션의 전환율이 가장 높은지 알 수 없습니다. 사용자와 세션이 모두 다르므로 예상 보상이 가장 높은 IAP 혜택을 어떻게 찾을 수 있을까요?

이 경우 사용자가 IAP 제안을 수락하지 않으면 보상을 0으로 설정하고 수락하면 IAP 값으로 설정합니다. 보상을 극대화하기 위해 이전 데이터를 사용하여 사용자에게 주어진 각 행동의 예상 보상을 예측하는 모델을 학습하고 보상이 가장 높은 행동을 찾을 수 있습니다.

e7d3264141498bff.jpeg

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

  • 상태: 사용자 및 현재 세션에 관한 정보
  • 작업: 표시할 수 있는 IAP 혜택
  • 리워드: IAP 혜택의 가치

착취와 탐색

모든 다중 무장 도적 문제에서 알고리즘은 탐색 (최적의 결과를 제공하는 작업을 학습하기 위해 더 많은 데이터 가져오기)과 활용 (최고의 보상을 얻기 위해 최적의 결과 사용) 사이에서 균형을 맞춰야 합니다.

이 문제의 버전에서는 클라우드에서 주기적으로 모델을 학습시키고 사용자의 기기에서 모델을 사용할 때만 예측을 실행하는 방식으로 간소화합니다 (사용자의 기기에서도 학습시키는 대신). 모델을 사용한 후 충분한 학습 데이터를 확보하려면 앱 사용자에게 무작위 결과를 표시해야 합니다 (예: 30%). 탐색과 활용의 균형을 맞추는 이 전략을 입실론 그리디라고 합니다.

모델 학습

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이 가장 적합한 인앱 구매 파워업이라고 제안합니다.

a3381dbcdbdf811e.png

모델 정확도 측정

모델 정확도를 측정하려면 모델에서 예측한 IAP 혜택과 클릭 여부를 Firebase 애널리틱스를 사용하여 추적하면 됩니다. Firebase A/B 테스팅과 함께 사용하여 모델의 실제 성능을 측정할 수 있습니다. 한 단계 더 나아가 모델의 여러 반복에 대해 A/B 테스트를 실행할 수도 있습니다. A/B 테스팅으로 Firebase 원격 구성 실험 만들기 문서에서 Firebase를 사용한 A/B 테스팅에 대해 자세히 알아보세요.

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

새 데이터가 들어올 때 모델을 업데이트해야 하는 경우 모델을 주기적으로 재학습하도록 파이프라인을 설정할 수 있습니다. 이렇게 하려면 먼저 위에서 언급한 입실론 그리디 전략을 사용하여 학습에 사용할 새 데이터가 있는지 확인해야 합니다. (예: 모델 예측 결과를 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

다음 단계

  • 앱의 최적화 프로그램 모델을 학습시키고 배포합니다.

자세히 알아보기