بهینه‌سازی خرید درون‌برنامه‌ای روی دستگاه، Codelab

1. بررسی اجمالی

1cbf855eda62c306.png

به آزمایشگاه کدهای بهینه‌سازی خرید درون‌برنامه‌ای روی دستگاه Realtime خوش آمدید. در این کد لبه یاد خواهید گرفت که چگونه از TensorFlow Lite و Firebase برای آموزش و استقرار یک مدل شخصی سازی سفارشی در برنامه خود استفاده کنید.

این آموزش نشان می دهد که چگونه می توان یک مدل یادگیری ماشین برای شخصی سازی ساخت، به ویژه مدلی که پیشنهاد خرید درون برنامه ای بهینه (IAP) را با توجه به وضعیتی که کاربر فعلی در آن قرار دارد، پیش بینی می کند. یک نوع مشکل یادگیری ماشین که به طور گسترده قابل اجرا است و در این کد لبه بیشتر در مورد آن خواهید آموخت

چیزی که یاد خواهید گرفت

  • داده های تجزیه و تحلیل را از طریق تجزیه و تحلیل Firebase جمع آوری کنید
  • پیش پردازش داده های تجزیه و تحلیل با استفاده از BigQuery
  • آموزش یک مدل ML ساده برای بهینه‌سازی خریدهای درون‌برنامه‌ای در دستگاه (IAP)
  • مدل های TFLite را در Firebase ML مستقر کنید و از برنامه خود به آنها دسترسی داشته باشید
  • اندازه گیری و آزمایش با مدل های مختلف از طریق Firebase A/B Testing
  • آموزش و استقرار مدل های جدید با استفاده از آخرین داده ها در یک آهنگ تکرار شونده

آنچه شما نیاز دارید

  • اندروید استودیو نسخه 3.4+
  • یک دستگاه آزمایش فیزیکی با Android نسخه 2.3 و بالاتر و خدمات Google Play نسخه 9.8 یا بالاتر، یا شبیه ساز با خدمات Google Play نسخه 9.8 یا بالاتر
  • در صورت استفاده از دستگاه تست فیزیکی، یک کابل اتصال
  • دانش ML مبتدی

چگونه از این آموزش استفاده خواهید کرد؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

به تجربه خود از ساخت اپلیکیشن های اندرویدی چه امتیازی می دهید؟

تازه کار حد واسط مسلط

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 جدید برای این Codelab ایجاد کنید. اگر برای شروع کار با Firebase به کمک نیاز دارید، لطفاً به آموزش های ما در مورد این موضوع ( اندروید و iOS ) مراجعه کنید.

5. رویدادهای تجزیه و تحلیل را در برنامه خود جمع آوری کنید

رویدادهای تجزیه و تحلیل بینشی در مورد رفتار کاربر ارائه می دهند و برای آموزش مدل ML استفاده می شوند. برای مثال، این مدل ممکن است یاد بگیرد که کاربرانی که برای مدت طولانی‌تری بازی می‌کنند، احتمال بیشتری دارد که یک IAP برای دریافت عمر اضافی بسازند. مدل ML به رویدادهای تحلیلی به عنوان ورودی برای یادگیری این اطلاعات نیاز دارد.

برخی از رویدادهای تحلیلی که ممکن است بخواهیم ثبت کنیم عبارتند از:

  • کاربر چه مدت بازی را انجام می دهد
  • کاربر به چه سطحی می رسد
  • کاربر چقدر سکه خرج می کند
  • کدام اقلام را کاربر خریداری می کند

دانلود نمونه داده (اختیاری)

در مراحل زیر، از Firebase Analytics برای ثبت رویدادهای تحلیلی برای استفاده در مدل خود استفاده خواهیم کرد. اگر قبلاً داده‌های تحلیلی دارید که می‌خواهید از آن استفاده کنید، به بخش «آموزش مدل بهینه‌سازی» در این کد لبه بروید و می‌توانید داده‌های نمونه ما را دنبال کنید.

جمع آوری داده ها با Firebase Analytics SDK

ما از Firebase Analytics برای کمک به جمع آوری این رویدادهای تحلیلی استفاده خواهیم کرد. Firebase Analytics SDK به طور خودکار تعدادی از رویدادها و ویژگی های کاربر را ضبط می کند. همچنین به شما امکان می دهد رویدادهای سفارشی خود را برای اندازه گیری رویدادهای منحصر به فرد برنامه خود تعریف کنید.

نصب Firebase Analytics SDK

با دنبال کردن مستندات Get Started with Google Analytics می توانید با Firebase 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 Log Events دیدن کنید.

6. داده ها را در BigQuery پیش پردازش کنید

در مرحله آخر، رویدادهایی را جمع آوری کردیم که کدام پیشنهاد IAP به کاربر ارائه می شود و روی کدام پیشنهاد IAP توسط کاربر کلیک می شود. در این مرحله، داده‌های رویداد را با داده‌های کاربر ترکیب می‌کنیم تا مدل ما بتواند از یک تصویر کامل یاد بگیرد.

برای انجام این کار، باید با صادرات رویدادهای تحلیلی به BigQuery شروع کنیم.

برای پیوند دادن پروژه Firebase و برنامه‌های آن به BigQuery:

  1. وارد Firebase شوید.
  2. کلیک the Settings icon و سپس Project Settings را انتخاب کنید.
  3. در صفحه تنظیمات پروژه، روی تب Integrations کلیک کنید.
  4. در کارت BigQuery، روی پیوند کلیک کنید.

(اختیاری) مجموعه های Firestore خود را به BigQuery صادر کنید

در این مرحله، شما می‌توانید داده‌های کاربر اضافی را از Firestore به BigQuery صادر کنید تا از آن برای آموزش مدل استفاده کنید. اگر می‌خواهید فعلاً از این مرحله بگذرید، به بخش «آماده‌سازی داده‌ها در BigQuery» این کد لبه بروید و می‌توانید رویدادهای Firebase Analytics را که در مرحله آخر ثبت شده‌اند دنبال کنید.

Firestore ممکن است جایی باشد که تاریخ ثبت نام کاربران، خریدهای درون برنامه‌ای انجام شده، سطوح موجود در بازی، سکه‌ها در تعادل یا هر ویژگی دیگری را که ممکن است در آموزش مدل مفید باشد، ذخیره کرده باشید.

برای صادر کردن مجموعه‌های Firestore خود به BigQuery، می‌توانید افزونه Export Firestore BigQuery را نصب کنید. سپس، جداول را در BigQuery بپیوندید تا این داده‌ها را با داده‌های Google Analytics ترکیب کنید تا در مدل شخصی‌سازی خود و در بقیه قسمت‌های این Codelab استفاده کنید.

آماده سازی داده ها در BigQuery

در چند مرحله بعدی، از BigQuery برای تبدیل داده های تحلیلی خام خود به داده های قابل استفاده برای آموزش مدل خود استفاده خواهیم کرد.

برای اینکه مدل ما یاد بگیرد که کدام پیشنهاد IAP را بر اساس کاربر و وضعیت بازی ارائه می دهد، باید داده ها را در مورد موارد زیر سازماندهی کنیم:

  • کاربر
  • وضعیت بازی
  • پیشنهاد ارائه شده
  • آیا بر روی پیشنهاد ارائه شده کلیک شده است یا خیر

همه این داده ها باید در یک ردیف در یک جدول سازماندهی شوند تا مدل ما آن را پردازش کند. خوشبختانه، BigQuery برای کمک به ما در انجام این کار راه اندازی شده است.

BigQuery به ایجاد "نما" اجازه می دهد تا پرس و جو شما را سازماندهی کند. View یک جدول مجازی است که توسط یک کوئری SQL تعریف می شود. هنگامی که یک View ایجاد می کنید، به همان روشی که یک جدول را درخواست می کنید، آن را پرس و جو می کنید. با استفاده از این می توانیم ابتدا داده های تجزیه و تحلیل خود را پاک کنیم.

برای اینکه ببینیم روی هر پیشنهاد خرید درون‌برنامه‌ای کلیک می‌شود یا خیر، باید به رویدادهای 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 به کاربر ارائه می‌شود که به او یک powerup می‌دهد. هر بار فقط می‌توانیم یک گزینه IAP را نشان دهیم و نمی‌دانیم کدام یک بهترین تبدیل را خواهند داشت. با توجه به اینکه هر کاربر و هر جلسه متفاوت است، چگونه می‌توانیم پیشنهاد IAP را پیدا کنیم که بالاترین پاداش مورد انتظار را داشته باشد؟

در این مورد، اگر کاربر پیشنهاد IAP را نپذیرفت، پاداش را 0 و اگر آن را قبول کرد، مقدار IAP را در نظر بگیریم. برای تلاش برای به حداکثر رساندن پاداش خود، می‌توانیم از داده‌های تاریخی خود برای آموزش مدلی استفاده کنیم که پاداش مورد انتظار را برای هر اقدامی که به کاربر داده می‌شود، پیش‌بینی می‌کند و اقدامی را با بالاترین پاداش پیدا می‌کند.

e7d3264141498bff.jpeg

موارد زیر چیزی است که ما در پیش بینی استفاده خواهیم کرد:

  • وضعیت: اطلاعاتی در مورد کاربر و جلسه فعلی او
  • اقدام: پیشنهادات IAP که می‌توانیم انتخاب کنیم تا نشان دهیم
  • پاداش: ارزش پیشنهاد IAP

استثمار در مقابل اکتشاف

برای همه مشکلات راهزنان چند مسلح، الگوریتم باید بین اکتشاف (به دست آوردن داده های بیشتر برای یادگیری اینکه کدام عمل نتیجه بهینه را می دهد) و بهره برداری (استفاده از نتیجه بهینه برای به دست آوردن بالاترین پاداش) تعادل برقرار کند.

در نسخه ما از مشکل، ما این را ساده می‌کنیم تا فقط مدل را به صورت دوره‌ای در فضای ابری آموزش دهیم و فقط هنگام استفاده از مدل در دستگاه کاربر پیش‌بینی کنیم (بر خلاف آموزش روی دستگاه کاربر). برای اطمینان از اینکه پس از استفاده از مدل، داده های آموزشی کافی داریم، باید گاهی اوقات نتایج تصادفی را به کاربران برنامه خود نشان دهیم (مثلاً 30٪). این استراتژی برای ایجاد تعادل بین اکتشاف و بهره برداری ، اپسیلون گریدی نامیده می شود.

آموزش مدل

برای شروع می توانید از اسکریپت آموزشی ( training.ipynb ) ارائه شده به همراه codelab استفاده کنید. هدف ما این است که مدلی را آموزش دهیم که پاداش های مورد انتظار را برای هر اقدامی که یک حالت داده شده پیش بینی می کند، سپس اقدامی را پیدا می کنیم که بالاترین پاداش مورد انتظار را به ما می دهد.

آموزش محلی

ساده ترین راه برای شروع آموزش مدل خود این است که یک کپی از دفترچه یادداشت در نمونه کد این کد لبه تهیه کنید.

برای این کد لبه نیازی به GPU ندارید، اما اگر برای کاوش داده‌های خود و آموزش مدل خود به دستگاه قدرتمندتری نیاز دارید، می‌توانید یک نمونه Notebook پلتفرم هوش مصنوعی برای سرعت بخشیدن به آموزش خود دریافت کنید.

در اسکریپت آموزشی ارائه شده، یک تکرار کننده ایجاد کردیم که داده های آموزشی را از فایل های CSV که از BigQuery صادر می کنیم، تولید می کند. سپس از داده ها برای شروع آموزش مدل خود با Keras استفاده کردیم. جزئیات نحوه آموزش مدل را می توانید در نظرات نوت بوک پایتون بیابید.

عملکرد مدل را اندازه گیری کنید

در حین آموزش مدل، آن را با یک عامل تصادفی که پیشنهادات 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، می‌توانید Add 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 روی آنها کلیک می‌شود را پیگیری کنیم. شما می توانید از این به همراه تست Firebase A/B برای اندازه گیری عملکرد واقعی مدل استفاده کنید. با برداشتن یک قدم جلوتر، می توانید تست های A/B را روی تکرارهای مختلف مدل نیز انجام دهید. می‌توانید در مستندات «Create Firebase Remote Config Experiments with A/B Testing» درباره آزمایش A/B با Firebase اطلاعات بیشتری کسب کنید.

9. (اختیاری): به روز رسانی مدل به طور منظم با داده های جدید

اگر نیاز به به روز رسانی مدل خود با ورود داده های جدید دارید، می توانید خط لوله ای را برای آموزش مجدد مدل خود به صورت مکرر راه اندازی کنید. برای انجام این کار، ابتدا باید مطمئن شوید که داده های جدیدی برای استفاده برای آموزش با استفاده از استراتژی epsilon-greedy که در بالا ذکر کردیم، دارید. (به عنوان مثال استفاده از نتیجه پیش بینی مدل در 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

مراحل بعدی

  • یک مدل بهینه ساز را برای برنامه خود آموزش دهید و اجرا کنید.

بیشتر بدانید