실시간 기기 내 인앱 구매 최적화 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 앱 빌드 경험을 평가해 주세요.

<ph type="x-smartling-placeholder"></ph> 초보자 중급 숙련도

2. 문제 서술

각 레벨이 끝날 때마다 맞춤형 인앱 구매 (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를 최적화합니다. 이 게임은 플레이어가 스파키를 제어하는 횡스크롤 게임으로, 벽의 열 사이에 닿지 않고 날아다닐 수 있습니다. 레벨이 시작될 때 파워업을 할 수 있는 IAP 혜택이 사용자에게 제공됩니다. 이 Codelab에서는 앱의 IAP 최적화 부분만 구현합니다.

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

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

애널리틱스 이벤트는 사용자 행동에 대한 통계를 제공하며 ML 모델을 학습시키는 데 사용됩니다. 예를 들어 모델은 게임을 더 오래 플레이하는 사용자가 추가 생명을 얻기 위해 IAP를 사용할 가능성이 더 높다는 것을 학습할 수 있습니다. ML 모델이 이 정보를 학습하려면 입력으로 애널리틱스 이벤트가 필요합니다.

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

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

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

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

Firebase Analytics SDK로 데이터 수집

Firebase Analytics를 사용하여 이러한 분석 이벤트를 수집할 것입니다. Firebase Analytics SDK는 여러 이벤트와 사용자 속성을 자동으로 포착합니다. 또한 자체 맞춤 이벤트를 정의하여 앱에 고유한 이벤트를 측정할 수도 있습니다.

Firebase Analytics SDK 설치

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

맞춤 이벤트 기록

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

이를 수행하기 전에 해당 사용자의 애널리틱스 데이터를 앱의 기존 데이터와 연결할 수 있도록 애널리틱스 이벤트에서 사용자 ID를 설정해야 합니다.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

다음으로 플레이어 이벤트를 로깅할 수 있습니다. 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 Extension을 설치하면 됩니다. 그런 다음 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 혜택이 표시됩니다. Google에서는 한 번에 하나의 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이 이 특정 사용자에게 가장 적합한 IAP 파워업이라고 제안합니다.

a3381dbcdbdf811e.png

모델 정확도 측정

모델의 정확성을 측정하기 위해, 모델에서 예측한 IAP 제안과 Firebase Analytics를 사용하여 이러한 제안이 클릭되었는지를 간단히 추적하면 됩니다. 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

다음 단계

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

자세히 알아보기