درس تطبيقي حول الترميز في الوقت الفعلي لتحسين عمليات الشراء داخل التطبيق

1. نظرة عامة

1cbf855eda62c306.png

مرحبًا بك في تجربة Realtime on-device in-app purchase optimization. في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية استخدام TensorFlow Lite وFirebase لتدريب نموذج تخصيص مخصّص ونشره في تطبيقك.

يوضّح هذا البرنامج التعليمي كيفية إنشاء نموذج تعلُّم آلي للتخصيص، ولا سيما نموذج يتوقّع أفضل عرض لعملية شراء داخل التطبيق (IAP) بالنظر إلى الحالة التي يكون فيها المستخدم الحالي. هذا مثال على مشكلة اللصوص المتعدّدين المسلّحين بالسياق، وهو نوع مهم وقابل للتطبيق على نطاق واسع من مشاكل تعلُّم الآلة التي ستتعرّف على المزيد عنها في هذا الدرس العملي.

أهداف الدورة التعليمية

  • جمع بيانات الإحصاءات من خلال "إحصاءات Firebase"
  • المعالجة المُسبقة لبيانات الإحصاءات باستخدام BigQuery
  • تدريب نموذج بسيط لتعلُّم الآلة من أجل تحسين عمليات الشراء داخل التطبيق على الجهاز
  • نشر نماذج TFLite في Firebase ML والوصول إليها من تطبيقك
  • قياس النماذج المختلفة وتجربتها من خلال ميزة "اختبار A/B من Firebase"
  • تدريب نماذج جديدة ونشرها باستخدام أحدث البيانات بوتيرة متكرّرة

المتطلبات

  • الإصدار 3.4 من Android Studio أو إصدار أحدث
  • جهاز اختبار حقيقي يعمل بالإصدار 2.3 من نظام التشغيل Android أو الإصدارات الأحدث و"خدمات Google Play" 9.8 أو الإصدارات الأحدث، أو محاكي يعمل بالإصدار 9.8 من "خدمات Google Play" أو الإصدارات الأحدث
  • في حال استخدام جهاز اختبار فعلي، يجب توفير كابل توصيل.
  • معرفة أساسية بتعلُّم الآلة

كيف ستستخدم هذا البرنامج التعليمي؟

قراءة المحتوى فقط قراءة المحتوى وإكمال التمارين

كيف تقيّم تجربتك في إنشاء تطبيقات Android؟

مبتدئ متوسط متقدّم

2. بيان المشكلة

لنفترض أنّك مطوّر ألعاب وتريد عرض اقتراحات مخصّصة لعمليات الشراء داخل التطبيق (IAP) في نهاية كل مستوى. يمكنك عرض عدد محدود فقط من خيارات الشراء داخل التطبيق في كل مرة، ولا تعرف الخيارات التي ستحقّق أفضل معدّل إحالات ناجحة. بما أنّ كل مستخدم وكل جلسة يختلفان عن غيرهما، كيف يمكننا العثور على عرض الشراء داخل التطبيق الذي يقدّم أعلى مكافأة متوقّعة؟

3- الحصول على الرمز النموذجي

استنسِخ مستودع GitHub من سطر الأوامر.

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

يحتوي هذا المستودع على ما يلي:

  1. دفتر ملاحظات Jupyter‏ (‎.ipynb) يدرب نموذج التخصيص ويحزمه في نموذج TFLite
  2. تطبيق Kotlin نموذجي يستخدم نموذج TFLite لتقديم توقّعات على الجهاز

4. تشغيل التطبيق باستخدام Firebase

في هذا الدرس العملي، سنعمل على تحسين عمليات الشراء داخل التطبيق في تطبيق اللعبة الوهمية Flappy Sparky. اللعبة عبارة عن لعبة تمرير جانبي يتحكّم فيها اللاعب في شخصية Sparky، ويحاول الطيران بين أعمدة الجدران بدون الاصطدام بها. في بداية المستوى، يتم عرض عرض شراء داخل التطبيق على المستخدم يمنحه عنصرًا معزّزًا. سننفّذ في هذا الدرس العملي الجزء المتعلّق بتحسين عمليات الشراء داخل التطبيق فقط.

ستتمكّن من تطبيق ما تعلّمته هنا على تطبيقك الخاص المرتبط بمشروع على Firebase. يمكنك بدلاً من ذلك إنشاء مشروع جديد على Firebase لهذا الدرس العملي. إذا كنت بحاجة إلى مساعدة في بدء استخدام Firebase، يُرجى الاطّلاع على البرامج التعليمية حول هذا الموضوع ( Android و iOS).

5- جمع أحداث التحليلات في تطبيقك

تقدّم أحداث "إحصاءات Google" إحصاءات حول سلوك المستخدِمين، ويتم استخدامها لتدريب نموذج تعلُّم الآلة. على سبيل المثال، قد يتعلّم النموذج أنّ المستخدمين الذين يلعبون لفترة أطول من المرجّح أن يجروا عملية شراء داخل التطبيق للحصول على محاولات إضافية. يحتاج نموذج تعلُّم الآلة إلى أحداث الإحصاءات كمدخلات لتعلُّم هذه المعلومات.

تشمل بعض أحداث الإحصاءات التي قد نريد تسجيلها ما يلي:

  • مدة لعب المستخدم للعبة
  • المستوى الذي يصل إليه المستخدم
  • عدد العملات المعدنية التي ينفقها المستخدم
  • السلع التي يشتريها المستخدم

تنزيل نموذج البيانات (اختياري)

في الخطوات التالية، سنستخدم "إحصاءات Firebase" لتسجيل أحداث الإحصاءات التي سيتم استخدامها في نموذجنا. إذا كانت لديك بيانات إحصاءات تريد استخدامها، انتقِل إلى قسم "تدريب نموذج التحسين" في هذا الدرس العملي، ويمكنك اتّباع الخطوات باستخدام بياناتنا النموذجية.

جمع البيانات باستخدام حزمة تطوير البرامج (SDK) في "إحصاءات Firebase"

سنستخدم "إحصاءات Firebase" للمساعدة في جمع أحداث الإحصاءات هذه. تسجّل حزمة تطوير البرامج (SDK) لخدمة "إحصاءات Firebase" تلقائيًا عددًا من الأحداث وخصائص المستخدِمين. ويتيح لك أيضًا تحديد أحداثك المخصّصة لقياس الأحداث الفريدة لتطبيقك.

تثبيت حزمة تطوير البرامج (SDK) لخدمة "إحصاءات Firebase"

يمكنك البدء في استخدام "إحصاءات Firebase" في تطبيقك باتّباع مستندات البدء في استخدام "إحصاءات Google". يتضمّن مستودع firebase-iap-optimization الذي تم استنساخه في بداية هذا الدرس التطبيقي حزمة تطوير البرامج (SDK) لخدمة "إحصاءات Firebase".

تسجيل الأحداث المخصّصة

بعد إعداد حزمة تطوير البرامج (SDK) في "إحصاءات Firebase"، يمكننا البدء في تسجيل الأحداث التي نحتاج إليها لتدريب نموذجنا.

قبل إجراء ذلك، من المهم ضبط رقم تعريف مستخدم في حدث الإحصاءات، حتى نتمكّن من ربط بيانات الإحصاءات الخاصة بهذا المستخدم ببياناته الحالية في التطبيق.

MainActivity.kt

firebaseAnalytics.setUserId("player1")

بعد ذلك، يمكننا تسجيل أحداث اللاعبين. لتحسين عمليات الشراء داخل التطبيق، نريد تسجيل كل عرض لعملية شراء داخل التطبيق يتم تقديمه للمستخدم وما إذا كان المستخدم ينقر على هذا العرض. سيؤدي ذلك إلى إنشاء حدثَين تحليليَّين، هما 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".

6. المعالجة المُسبقة للبيانات في BigQuery

في الخطوة الأخيرة، جمعنا أحداثًا حول عرض المنتج داخل التطبيق الذي يتم تقديمه للمستخدم وعرض المنتج داخل التطبيق الذي ينقر عليه المستخدم. في هذه الخطوة، سندمج بيانات الحدث هذه مع بيانات المستخدمين ليتمكّن نموذجنا من التعلّم من صورة كاملة.

لإجراء ذلك، علينا البدء بتصدير أحداث الإحصاءات إلى BigQuery.

لربط مشروع Firebase وتطبيقاته بخدمة BigQuery:

  1. سجّل الدخول إلى Firebase.
  2. انقر على رمز الإعدادات، ثم اختَر "إعدادات المشروع".
  3. في صفحة "إعدادات المشروع"، انقر على علامة التبويب "عمليات الدمج".
  4. في بطاقة BigQuery، انقر على "ربط".

(اختياري) تصدير مجموعات Firestore إلى BigQuery

في هذه الخطوة، يمكنك تصدير بيانات مستخدمين إضافية من Firestore إلى BigQuery لاستخدامها في المساعدة على تدريب النموذج. إذا كنت تريد تخطّي هذه الخطوة في الوقت الحالي، انتقِل إلى قسم "إعداد البيانات في BigQuery" من هذا الدرس العملي، ويمكنك متابعة أحداث "إحصاءات Firebase" التي تم تسجيلها في الخطوة الأخيرة.

قد يكون Firestore هو المكان الذي خزّنت فيه تاريخ اشتراك المستخدمين أو عمليات الشراء داخل التطبيق أو المستويات في اللعبة أو العملات في الرصيد أو أي سمات أخرى قد تكون مفيدة في تدريب النموذج.

لتصدير مجموعات Firestore إلى BigQuery، يمكنك تثبيت إضافة Firestore BigQuery Export. بعد ذلك، اربط الجداول في BigQuery لدمج هذه البيانات مع البيانات من "إحصاءات Google" لاستخدامها في نموذج التخصيص وفي بقية هذا الدرس العملي.

إعداد البيانات في BigQuery

في الخطوات القليلة التالية، سنستخدم BigQuery لتحويل بيانات الإحصاءات الأولية إلى بيانات قابلة للاستخدام في تدريب نموذجنا.

لكي يتمكّن نموذجنا من معرفة عرض المنتجات داخل التطبيق الذي يجب تقديمه استنادًا إلى المستخدم وحالة اللعبة، علينا تنظيم البيانات حول ما يلي:

  • المستخدم
  • حالة اللعبة
  • العرض المقدَّم
  • ما إذا تم النقر على العرض التقديمي أم لا

يجب تنظيم كل هذه البيانات في صف واحد في جدول لكي يتمكّن النموذج من معالجتها. لحسن الحظ، تم إعداد 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 حتى نتمكّن من استخدامها في تدريب النموذج.

888daa7ba4db8e44.png

14d22bf474fae455.png

7. تدريب نموذج التحسين

عيّنات البيانات

استخدِم بياناتك من الخطوة السابقة "المعالجة المُسبقة للبيانات في BigQuery" أو البيانات النموذجية القابلة للتنزيل المتوفّرة هنا لمتابعة بقية هذا الدرس العملي.

تعريف المشكلة

قبل البدء في تدريب النموذج، لنخصّص بعض الوقت لتحديد مشكلة اللصوص السياقية.

شرح عن اللصوص السياقيين

في بداية كل مستوى في لعبة Flappy Sparky، يتم عرض عرض شراء داخل التطبيق على المستخدم يمنحه ميزة إضافية. يمكننا عرض خيار واحد فقط من خيارات الشراء داخل التطبيق في كل مرة، ولا نعرف الخيارات التي ستحقّق أفضل معدّل إحالات ناجحة. بما أنّ كل مستخدم وكل جلسة يختلفان عن غيرهما، كيف يمكننا العثور على عرض الشراء داخل التطبيق الذي يقدّم أعلى مكافأة متوقّعة؟

في هذه الحالة، لنحدّد قيمة المكافأة على أنّها 0 إذا لم يقبل المستخدم عرض الشراء داخل التطبيق، وقيمة الشراء داخل التطبيق إذا قبله. ولتحقيق الحد الأقصى من المكافأة، يمكننا استخدام بياناتنا السابقة لتدريب نموذج يتوقّع المكافأة المتوقّعة لكل إجراء يجريه المستخدم، والعثور على الإجراء الذي يحقّق أعلى مكافأة.

e7d3264141498bff.jpeg

في ما يلي ما سنستخدمه في التوقّع:

  • الحالة: معلومات عن المستخدم وجلسة التصفّح الحالية
  • الإجراء: عروض IAP التي يمكننا اختيار عرضها
  • المكافأة: قيمة العرض الترويجي للشراء داخل التطبيق

الاستغلال مقابل الاستكشاف

في جميع مسائل اللصوص متعدّدي الأذرع، تحتاج الخوارزمية إلى تحقيق التوازن بين الاستكشاف (الحصول على المزيد من البيانات لمعرفة الإجراء الذي يحقّق النتيجة المثلى) والاستغلال (استخدام النتيجة المثلى للحصول على أعلى مكافأة).

في نسختنا من المشكلة، سنبسّط هذه العملية لتقتصر على تدريب النموذج بشكل دوري على السحابة الإلكترونية وإجراء التوقعات فقط عند استخدام النموذج على جهاز المستخدم (بدلاً من التدريب على جهاز المستخدم أيضًا). للتأكّد من توفّر بيانات تدريب كافية بعد استخدام النموذج، سنحتاج أحيانًا إلى عرض نتائج عشوائية لمستخدمي تطبيقنا (مثل %30). تُعرف استراتيجية تحقيق التوازن بين الاستكشاف والاستغلال باسم Epsilon-greedy.

تدريب النموذج

يمكنك استخدام النص البرمجي التدريبي (training.ipynb) المتوفّر مع الدرس التطبيقي حول الترميز للبدء. هدفنا هو تدريب نموذج يتوقّع المكافآت المتوقّعة لكل إجراء في حالة معيّنة، ثم العثور على الإجراء الذي يمنحنا أعلى المكافآت المتوقّعة.

التدريب محليًا

أسهل طريقة للبدء في تدريب نموذجك الخاص هي إنشاء نسخة من دفتر الملاحظات في عيّنة الرمز البرمجي لهذا الدرس العملي.

لا تحتاج إلى وحدة معالجة الرسومات (GPU) في هذا الدرس العملي، ولكن إذا كنت بحاجة إلى جهاز أكثر قوة لاستكشاف بياناتك وتدريب نموذجك، يمكنك الحصول على مثيل دفتر ملاحظات في "منصة الذكاء الاصطناعي" لتسريع عملية التدريب.

في نص التدريب البرمجي المقدَّم، أنشأنا مكرّرًا ينشئ بيانات التدريب من ملفات CSV التي صدّرناها من BigQuery. بعد ذلك، استخدمنا البيانات لبدء تدريب نموذجنا باستخدام Keras. يمكنك الاطّلاع على تفاصيل حول كيفية تدريب النموذج في تعليقات دفتر ملاحظات Python.

قياس أداء النموذج

أثناء تدريب النموذج، سنقارنه بعميل عشوائي يختار عروض المنتجات داخل التطبيق بشكل عشوائي لمعرفة ما إذا كان نموذجنا يتعلّم بالفعل. تتوفّر هذه المنطق ضمن 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، يمكنك اتّباع الخطوات الواردة في برنامج إضافة 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 هو أفضل عنصر تحسين يمكن شراؤه داخل التطبيق لهذا المستخدم تحديدًا.

a3381dbcdbdf811e.png

قياس دقة النموذج

لقياس دقة النموذج، يمكننا ببساطة تتبُّع عروض الشراء داخل التطبيق التي يتوقّعها النموذج وما إذا كان يتم النقر عليها باستخدام "إحصاءات Firebase". يمكنك استخدام هذا الإعداد مع اختبار A/B من Firebase لقياس الأداء الفعلي للنموذج. يمكنك أيضًا إجراء اختبارات A/B على تكرارات مختلفة من النموذج. يمكنك الاطّلاع على مزيد من المعلومات عن اختبار A/B باستخدام Firebase في مستند إنشاء "تجارب الإعداد عن بُعد في Firebase" باستخدام ميزة "اختبار A/B".

9. (اختياري): تعديل النموذج بانتظام باستخدام بيانات جديدة

إذا كنت بحاجة إلى تعديل نموذجك عند ورود بيانات جديدة، يمكنك إعداد مسار لإعادة تدريب نموذجك بشكل متكرّر. لإجراء ذلك، عليك أولاً التأكّد من توفّر بيانات جديدة لاستخدامها في التدريب باستخدام استراتيجية إبسيلون الجشعة التي ذكرناها أعلاه. (على سبيل المثال، استخدام نتيجة توقّع النموذج بنسبة% 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

الخطوات التالية

  • تدريب نموذج تحسين ونشره لتطبيقك

مزيد من المعلومات