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

1- نظرة عامة

1cbf855eda62c306.png

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

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

المعلومات التي ستطّلع عليها

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

المتطلبات

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

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

القراءة فقط اقرأها وأكمِل التمارين

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

حديث متوسط بارع

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

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

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

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

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

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

  1. دفتر جوبيتر (.ipynb) الذي يدرّب نموذج التخصيص ويجمعه في نموذج TFLite
  2. نموذج من تطبيق Kotlin يستخدم نموذج TFLite لإجراء تنبؤات على الجهاز

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

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

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

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

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

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

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

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

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

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

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

تثبيت حزمة تطوير البرامج لخدمة "إحصاءات 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. انقر على رمز الإعدادات، ثم اختَر Project Settings (إعدادات المشروع).
  3. في صفحة Project Settings (إعدادات المشروع)، انقر فوق علامة التبويب Integrations (عمليات الدمج).
  4. في بطاقة BigQuery، انقر على "Link" (ربط).

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

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

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

لتصدير مجموعات Firestore إلى BigQuery، يمكنك تثبيت إضافة BigQuery Export من Firestore. بعد ذلك، يمكنك ربط الجداول في 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

وفيما يلي ما سنستخدمه في التنبؤ:

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

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

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

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

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

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

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

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

لا تحتاج إلى وحدة معالجة رسومات لهذه الدروس التطبيقية حول الترميز، ولكن إذا كنت بحاجة إلى جهاز أكثر فعالية لاستكشاف بياناتك وتدريب نموذجك الخاص، يمكنك الحصول على مثيل من AI Platform Notebook لتسريع تدريبك.

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

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

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

  1. يمكننا الحفاظ على صغر حجم تثبيت التطبيق وتنزيل النموذج عند الحاجة فقط
  2. يمكن تحديث النموذج بانتظام ومن خلال دورة إصدار مختلفة عن تلك التي يستغرقها التطبيق بأكمله.

للتعرّف على كيفية نشر النموذج في تعلُّم الآلة من Firebase، يمكنك متابعة الدرس التطبيقي حول إضافة Firebase إلى تطبيق Android المستنِد إلى TFLite. يمكنك النشر باستخدام وحدة تحكُّم Firebase أو واجهة برمجة تطبيقات Python.

8- إجراء التنبؤات على الجهاز

الخطوة التالية هي إجراء تنبؤات باستخدام النموذج على الجهاز. يمكنك العثور على نموذج تطبيق ينزِّل نموذجًا من تعلُّم الآلة في Firebase في المجلد 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 Analytics. يمكنك استخدامها مع اختبار 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

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

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

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