۱. مرور کلی

به آزمایشگاه کد بهینهسازی خرید درونبرنامهایِ بلادرنگ روی دستگاه خوش آمدید. در این آزمایشگاه کد، نحوه استفاده از TensorFlow Lite و Firebase را برای آموزش و استقرار یک مدل شخصیسازی سفارشی در برنامه خود خواهید آموخت.
این آموزش نحوه ساخت یک مدل یادگیری ماشین برای شخصیسازی را نشان میدهد، به ویژه مدلی که پیشنهاد بهینه خرید درونبرنامهای (IAP) را با توجه به وضعیتی که کاربر فعلی در آن قرار دارد، پیشبینی میکند. این نمونهای از مسئله راهزن زمینهای است، نوعی مسئله مهم و پرکاربرد در یادگیری ماشین که در این آزمایشگاه کد بیشتر در مورد آن خواهید آموخت.
آنچه یاد خواهید گرفت
- جمعآوری دادههای تحلیلی از طریق Firebase analytics
- پیشپردازش دادههای تحلیلی با استفاده از BigQuery
- آموزش یک مدل ساده یادگیری ماشین برای بهینهسازی خریدهای درون برنامهای (IAP) روی دستگاه
- مدلهای TFLite را در Firebase ML مستقر کنید و از برنامه خود به آنها دسترسی داشته باشید
- اندازهگیری و آزمایش با مدلهای مختلف از طریق تست A/B فایربیس
- آموزش و استقرار مدلهای جدید با استفاده از آخرین دادهها در یک روند تکرارشونده
آنچه نیاز دارید
- اندروید استودیو نسخه ۳.۴ به بالا
- یک دستگاه تست فیزیکی با اندروید ۲.۳+ و سرویسهای گوگل پلی ۹.۸ یا بالاتر، یا یک شبیهساز با سرویسهای گوگل پلی ۹.۸ یا بالاتر
- در صورت استفاده از دستگاه تست فیزیکی، کابل اتصال
- دانش ML مبتدی
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را در ساخت برنامههای اندروید چگونه ارزیابی میکنید؟
۲. بیان مسئله
فرض کنید شما یک توسعهدهنده بازی هستید که میخواهید در پایان هر مرحله، پیشنهادهای خرید درونبرنامهای شخصیسازیشده (IAP) را نشان دهید. شما فقط میتوانید تعداد محدودی از گزینههای IAP را هر بار نشان دهید و نمیدانید کدام یک بهترین تبدیل را خواهند داشت. با توجه به اینکه هر کاربر و هر جلسه متفاوت است، چگونه میتوانیم پیشنهاد IAP را پیدا کنیم که بالاترین پاداش مورد انتظار را ارائه دهد؟
۳. کد نمونه را دریافت کنید
مخزن گیتهاب را از خط فرمان کلون کنید.
git clone https://github.com/googlecodelabs/firebase-iap-optimization.git
این ریپو شامل موارد زیر است:
- یک دفترچه یادداشت Jupyter (.ipynb) که مدل شخصیسازی را آموزش میدهد و آن را در یک مدل TFLite بستهبندی میکند.
- یک نمونه برنامه کاتلین که از مدل TFLite برای پیشبینی روی دستگاه استفاده میکند
۴. برنامه را با Firebase اجرا کنید
در این آزمایشگاه کد، ما روی بهینهسازی IAPهای (هزینههای ورودی) برنامه بازی تخیلی خود - Flappy Sparky - کار خواهیم کرد. این بازی یک بازی پیمایشی جانبی است که در آن بازیکن یک Sparky را کنترل میکند و سعی میکند بدون برخورد به ستونهای دیوارها، بین آنها پرواز کند. در ابتدای مرحله، به کاربر یک پیشنهاد IAP ارائه میشود که به او قدرت میدهد. ما در این آزمایشگاه کد فقط بخش بهینهسازی IAP برنامه را پیادهسازی خواهیم کرد.
شما میتوانید آموختههای خود را در اینجا در برنامهی خودتان که به یک پروژهی Firebase متصل است، اعمال کنید. همچنین میتوانید یک پروژهی Firebase جدید برای این آزمایشگاه کد ایجاد کنید. اگر برای شروع کار با Firebase به کمک نیاز دارید، لطفاً به آموزشهای ما در این زمینه ( اندروید و iOS ) مراجعه کنید.
۵. رویدادهای تحلیلی را در برنامه خود جمعآوری کنید
رویدادهای تحلیلی، بینشی در مورد رفتار کاربر ارائه میدهند و برای آموزش مدل یادگیری ماشینی استفاده میشوند. به عنوان مثال، مدل ممکن است یاد بگیرد که کاربرانی که مدت طولانیتری بازی میکنند، احتمال بیشتری دارد که برای دریافت جان اضافی، IAP انجام دهند. مدل یادگیری ماشینی برای یادگیری این اطلاعات به رویدادهای تحلیلی به عنوان ورودی نیاز دارد.
برخی از رویدادهای تحلیلی که ممکن است بخواهیم ثبت کنیم عبارتند از:
- مدت زمانی که کاربر بازی را انجام میدهد
- کاربر به چه سطحی میرسد
- کاربر چند سکه خرج میکند
- کاربر کدام اقلام را خریداری میکند
دانلود دادههای نمونه (اختیاری)
در مراحل بعدی، از Firebase Analytics برای ثبت رویدادهای تحلیلی جهت استفاده در مدل خود استفاده خواهیم کرد. اگر از قبل دادههای تحلیلی دارید که میخواهید از آنها استفاده کنید، به بخش «آموزش مدل بهینهسازی» در این آزمایشگاه کد بروید و میتوانید با دادههای نمونه ما همراه شوید.
جمعآوری دادهها با Firebase Analytics SDK
ما از Firebase Analytics برای جمعآوری این رویدادهای تحلیلی استفاده خواهیم کرد. Firebase Analytics SDK به طور خودکار تعدادی از رویدادها و ویژگیهای کاربر را ثبت میکند. همچنین به شما امکان میدهد رویدادهای سفارشی خود را برای اندازهگیری رویدادهای منحصر به فرد برنامه خود تعریف کنید.
نصب SDK فایربیس آنالیتیکس
شما میتوانید با دنبال کردن مستندات «شروع به کار با گوگل آنالیتیکس» (Get Started with Google Analytics)، کار با فایربیس آنالیتیکس را در برنامه خود شروع کنید. مخزن firebase-iap-optimization که در ابتدای این آزمایشگاه کد شبیهسازی شده است، از قبل شامل کیت توسعه نرمافزار (SDK) فایربیس آنالیتیکس است.
ثبت رویدادهای سفارشی
پس از تنظیم SDK مربوط به Firebase Analytics، میتوانیم شروع به ثبت رویدادهایی کنیم که برای آموزش مدل خود نیاز داریم.
قبل از انجام این کار، مهم است که یک شناسه کاربری در رویداد تحلیلی تنظیم کنیم ، تا بتوانیم دادههای تحلیلی آن کاربر را با دادههای موجود او در برنامه مرتبط کنیم.
فعالیت اصلی.kt
firebaseAnalytics.setUserId("player1")
در مرحله بعد میتوانیم رویدادهای بازیکن را ثبت کنیم. برای بهینهسازی IAP، میخواهیم هر پیشنهاد IAP ارائه شده به کاربر و اینکه آیا کاربر روی آن پیشنهاد کلیک میکند یا خیر را ثبت کنیم. این کار دو رویداد تحلیلی به ما میدهد - offer_iap و offer_accepted . ما همچنین یک offer_id منحصر به فرد را پیگیری خواهیم کرد تا بتوانیم بعداً از آن برای ترکیب این دادهها استفاده کنیم تا ببینیم آیا پیشنهادی پذیرفته شده است یا خیر.
فعالیت اصلی.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 مراجعه کنید.
۶. پیشپردازش دادهها در BigQuery
در مرحله آخر، رویدادهایی را در مورد اینکه کدام پیشنهاد IAP به کاربر ارائه میشود و کدام پیشنهاد IAP توسط کاربر کلیک میشود، جمعآوری کردیم. در این مرحله، دادههای این رویدادها را با دادههای کاربر ترکیب خواهیم کرد تا مدل ما بتواند از یک تصویر کامل یاد بگیرد.
برای انجام این کار، باید با ارسال رویدادهای تحلیلی به BigQuery شروع کنیم.
پروژه Firebase خود را به BigQuery پیوند دهید
برای پیوند دادن پروژه Firebase و برنامههای آن به BigQuery:
- وارد فایربیس شوید.
- کلیک
، سپس تنظیمات پروژه را انتخاب کنید. - در صفحه تنظیمات پروژه، روی برگه ادغامها کلیک کنید.
- در کارت BigQuery، روی پیوند (Link) کلیک کنید.
(اختیاری) مجموعههای 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 صادر کنیم تا بتوانیم از آن در آموزش مدل خود استفاده کنیم.


۷. مدل بهینهسازی را آموزش دهید
دادههای نمونه
برای ادامهی این کد، میتوانید از دادههای مرحلهی قبل، «پیشپردازش دادهها در BigQuery»، یا دادههای نمونهی قابل دانلود ارائه شده در اینجا، استفاده کنید.
تعریف مسئله
قبل از شروع آموزش مدل، بیایید زمانی را صرف تعریف مسئلهی راهزنان زمینهای خود کنیم.
توضیح راهزنان زمینهای
در ابتدای هر مرحله در Flappy Sparky، به کاربر یک پیشنهاد IAP ارائه میشود که به او قدرت میدهد. ما هر بار فقط میتوانیم یک گزینه IAP را نشان دهیم و نمیدانیم کدام یک بهترین تبدیل را خواهند داشت. با توجه به اینکه هر کاربر و هر جلسه متفاوت است، چگونه میتوانیم پیشنهاد IAP را پیدا کنیم که بالاترین پاداش مورد انتظار را ارائه دهد؟
در این حالت، اگر کاربر پیشنهاد IAP را نپذیرد، پاداش را ۰ و اگر بپذیرد، مقدار IAP را تعیین میکنیم. برای به حداکثر رساندن پاداش، میتوانیم از دادههای تاریخی خود برای آموزش مدلی استفاده کنیم که پاداش مورد انتظار برای هر عمل داده شده به کاربر را پیشبینی کند و عملی را که بالاترین پاداش را دارد، پیدا کند.

آنچه در پیشبینی استفاده خواهیم کرد به شرح زیر است:
- وضعیت: اطلاعات مربوط به کاربر و جلسه فعلی او
- اقدام: پیشنهادهای IAP که میتوانیم برای نمایش انتخاب کنیم
- پاداش: ارزش پیشنهاد IAP
بهرهبرداری در مقابل اکتشاف
برای همه مسائل مربوط به راهزنان چندمسلح، الگوریتم باید بین اکتشاف (دریافت دادههای بیشتر برای یادگیری اینکه کدام عمل نتیجه بهینه میدهد) و بهرهبرداری (استفاده از نتیجه بهینه برای به دست آوردن بالاترین پاداش) تعادل برقرار کند.
در نسخه ما از این مسئله، ما این را ساده میکنیم تا مدل را فقط به صورت دورهای در فضای ابری آموزش دهیم و فقط هنگام استفاده از مدل روی دستگاه کاربر پیشبینی انجام دهیم (برخلاف آموزش روی دستگاه کاربر). برای اطمینان از اینکه دادههای آموزشی کافی پس از استفاده از مدل داریم، باید گاهی اوقات نتایج تصادفی را به کاربران برنامه خود نشان دهیم (مثلاً 30٪). این استراتژی ایجاد تعادل بین اکتشاف و بهرهبرداری ، اپسیلون-حریص نامیده میشود.
آموزش مدل
برای شروع میتوانید از اسکریپت آموزشی ( training.ipynb ) که همراه با codelab ارائه شده است، استفاده کنید. هدف ما آموزش مدلی است که پاداشهای مورد انتظار برای هر عمل با توجه به یک حالت را پیشبینی کند، سپس عملی را پیدا میکنیم که بالاترین پاداشهای مورد انتظار را به ما میدهد.
آموزش به صورت محلی
سادهترین راه برای شروع آموزش مدل خودتان، تهیه یک کپی از دفترچه یادداشت موجود در نمونه کد این آزمایشگاه کد است.
برای این آزمایشگاه کد به پردازنده گرافیکی (GPU) نیازی ندارید، اما اگر به دستگاه قدرتمندتری برای کاوش در دادههای خود و آموزش مدل خود نیاز دارید، میتوانید یک نمونه از نوتبوک پلتفرم هوش مصنوعی (AI Platform Notebook) تهیه کنید تا آموزش خود را سرعت بخشید.
در اسکریپت آموزشی ارائه شده، ما یک تکرارکننده ایجاد کردیم که دادههای آموزشی را از فایلهای CSV که از BigQuery صادر کردهایم، تولید میکند. سپس از دادهها برای شروع آموزش مدل خود با Keras استفاده کردیم. جزئیات نحوه آموزش مدل را میتوانید در نظرات دفترچه پایتون بیابید.
اندازهگیری عملکرد مدل
هنگام آموزش مدل، آن را با یک عامل تصادفی که پیشنهادهای IAP را به صورت تصادفی انتخاب میکند، مقایسه میکنیم تا ببینیم آیا مدل ما واقعاً در حال یادگیری است یا خیر. این منطق تحت ValidationCallback قرار دارد .
در پایان آموزش، از دادههای موجود در test.csv برای آزمایش مجدد مدل خود استفاده میکنیم. مدل قبلاً هرگز این دادهها را ندیده است، بنابراین میتوانیم مطمئن باشیم که نتیجه به دلیل بیشبرازش نیست. در این حالت، مدل ۲۸٪ بهتر از عامل تصادفی عمل میکند.
مدل TFLite را صادر کنید
اکنون یک مدل آموزشدیده آماده استفاده داریم، با این تفاوت که در حال حاضر در قالب TensorFlow است. برای اینکه بتوان آن را روی دستگاههای تلفن همراه اجرا کرد، باید مدل را با فرمت TFLite خروجی بگیریم.
قطار.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 میزبان مدل شما باشد. این به دو دلیل اصلی مفید است:
- میتوانیم حجم نصب برنامه را کوچک نگه داریم و فقط در صورت نیاز مدل را دانلود کنیم
- این مدل میتواند به طور منظم و با چرخه انتشار متفاوتی نسبت به کل برنامه بهروزرسانی شود.
برای یادگیری نحوهی استقرار مدل در Firebase ML، میتوانید از بخش «افزودن Firebase به آزمایشگاه کد برنامهی اندروید مبتنی بر TFLite » استفاده کنید. میتوانید با استفاده از کنسول Firebase یا API پایتون، مدل را مستقر کنید.
۸. انجام پیشبینیها روی دستگاه
مرحله بعدی انجام پیشبینیها با استفاده از مدل روی دستگاه است. میتوانید یک برنامه نمونه که مدلی را از 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 برای این کاربر خاص است.

اندازهگیری دقت مدل
برای سنجش دقت مدل، میتوانیم به سادگی پیشنهادات IAP پیشبینیشده توسط مدل و اینکه آیا روی آنها کلیک میشود یا خیر را با استفاده از Firebase Analytics پیگیری کنیم. میتوانید از این ابزار به همراه تست A/B در Firebase برای سنجش عملکرد واقعی مدل استفاده کنید. با یک قدم فراتر، میتوانید تستهای A/B را روی تکرارهای مختلف مدل نیز انجام دهید. میتوانید در مورد تست A/B با Firebase در مستندات Create Firebase Remote Config Experiments with A/B Testing اطلاعات بیشتری کسب کنید.
۹. (اختیاری): بهروزرسانی منظم مدل با دادههای جدید
اگر نیاز دارید که مدل خود را با ورود دادههای جدید بهروزرسانی کنید، میتوانید یک خط لوله (pipeline) راهاندازی کنید تا مدل خود را به صورت مکرر آموزش مجدد دهید. برای انجام این کار، ابتدا باید مطمئن شوید که دادههای جدیدی برای استفاده در آموزش با استفاده از استراتژی اپسیلون-حریصانه که در بالا ذکر شد، دارید. (مثلاً استفاده از نتیجه پیشبینی مدل در ۷۰٪ مواقع و استفاده از نتایج تصادفی در ۳۰٪ مواقع).
پیکربندی یک خط لوله برای آموزش و استقرار با دادههای جدید فراتر از محدوده این آزمایشگاه کد است، میتوانید برای شروع به Google Cloud AI Platform و TFX مراجعه کنید.
۱۰. تبریک میگویم!
در این آزمایشگاه کد، یاد گرفتید که چگونه یک مدل TFLite روی دستگاه را برای بهینهسازی خریدهای درونبرنامهای با استفاده از Firebase آموزش داده و مستقر کنید. برای کسب اطلاعات بیشتر در مورد TFLite و Firebase، به سایر نمونههای TFLite و راهنماهای شروع به کار با Firebase نگاهی بیندازید.
اگر سوالی دارید، میتوانید آنها را در Stack Overflow #firebase-machine-learning مطرح کنید.
آنچه ما پوشش دادهایم
- تنسورفلو لایت
- فایربیس امال
- تجزیه و تحلیل فایربیس
- بیگکوئری
مراحل بعدی
- یک مدل بهینهساز برای برنامه خود آموزش داده و مستقر کنید.