آزمون آ/ب دو نسخه از یک مدل

پس‌از آموزش مدل سفارشی جدید، می‌توانید از A/B Testing استفاده کنید تا ببینید مدل جدید در شرایط دنیای واقعی در مقایسه با مدلی که قبلاً استفاده می‌کردید چقدر خوب عمل می‌کند. پس‌از اینکه تأیید کردید مدل جدیدتان بهبود یافته است، می‌توانید به‌راحتی مدل جدید را برای همه کاربران بدون نیاز به به‌روزرسانی برنامه عرضه کنید.

این صفحه نشان می‌دهد که چگونه می‌توانید آزمایش A/B را انجام دهید که دو نسخه از مدلی را که ویژگی جستجوی تصویری فرضی گیاه را تقویت می‌کند ارزیابی می‌کند. این ویژگی از مدل برچسب‌گذاری تصویر سفارشی برای کمک به کاربران در شناسایی گونه‌های گیاهی ازطریق تصاویر آن‌ها استفاده می‌کند.

فرض کنید به‌تازگی مدل برچسب‌گذاری گیاهان جدیدی منتشر کرده‌اید، plant_labeler_v2 و می‌خواهید آزمایشی اجرا کنید که آن را با مدل کنونی‌تان، plant_labeler_v1، مقایسه کند. مراحل زیر نشان می‌دهد که چگونه آزمایش را راه‌اندازی کنید، آن را اجرا کنید و براساس نتایج اقدام کنید.

۱. مدل خود را از دور پیکربندی‌پذیر کنید

اولین گام برای آزمون آ/ب مدل‌هایتان این است که برنامه‌تان را اصلاح کنید تا از پارامتر Remote Config برای تعیین مدل مورد استفاده‌اش استفاده کند. در ابتدا، مقدار پیش‌فرض این پارامتر را روی مدلی که برنامه‌تان ازقبل استفاده می‌کند تنظیم می‌کنید، اما ازآنجایی‌که نام مدل با پارامتر پیکربندی‌پذیر از دور کنترل می‌شود، می‌توانید بدون نیاز به ارسال به‌روزرسانی‌های برنامه به کاربران در هر بار، مدل‌های مختلف را تغییر دهید و آزمایش کنید.

بنابراین، اگر مدل کنونی‌تان را با نام plant_labeler_v1 منتشر کرده‌اید، در کد مقداردهی اولیه برنامه، plant_labeler_v1 را به‌عنوان مقدار پیش‌فرض پارامتر plant_labeler_model تنظیم می‌کنید، همان‌طور که در مثال زیر نشان داده شده است:

Kotlin

val remoteConfig = FirebaseRemoteConfig.getInstance()

val remoteConfigDefaults = HashMap<String, Any>()
remoteConfigDefaults["plant_labeler_model"] = "plant_labeler_v1"
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults))

remoteConfig.fetchAndActivate().addOnSuccessListener { success ->
    if (success) {
      // Okay to get remote values.
      // ...
    }
}

Java

final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();

Map<String, Object> remoteConfigDefaults = new HashMap<>();
remoteConfigDefaults.put("plant_labeler_model", "plant_labeler_v1");
Tasks.await(remoteConfig.setDefaultsAsync(remoteConfigDefaults));

remoteConfig.fetchAndActivate().addOnSuccessListener(
        new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean success) {
                if (success) {
                  // Okay to get remote values.
                  // ...
                }
            }
        });

سپس، کد راه‌اندازی مدل را تغییر دهید تا مدل مشخص‌شده توسط پارامتر plant_labeler_model را بار کند:

Kotlin

val rcValue = remoteConfig.getValue("plant_labeler_model")
val remoteModelName = rcValue.asString()

// ...

val remoteModel = FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build()
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel)

// Optionally configure a local model:
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model

Java

FirebaseRemoteConfigValue rcValue = remoteConfig.getValue("plant_labeler_model");
String remoteModelName = rcValue.asString();

// ...

FirebaseRemoteModel remoteModel = new FirebaseRemoteModel.Builder(remoteModelName)
        .enableModelUpdates(true)
        .setInitialDownloadConditions(initialConditions)
        .setUpdatesDownloadConditions(updateConditions)
        .build();
FirebaseModelManager.getInstance().registerRemoteModel(remoteModel);

// Optionally configure a local model:
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model

اکنون که برنامه‌تان از پارامتر Remote Config برای تعیین مدل بارگذاری استفاده می‌کند، می‌توانید فقط با انتشار مدل جدید و اختصاص دادن نام آن به پارامتر Remote Config، مدل را تغییر دهید. این قابلیت به A/B Testing اجازه می‌دهد مدل‌های مختلف را به کاربران مختلف اختصاص دهد تا آن‌ها را مقایسه کند.

پیش‌از ادامه دادن، موارد زیر را نیز به کد بارگیری مدل اضافه کنید:

Kotlin

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
    .addOnSuccessListener {
        // If the model downloaded was specified by a remote parameter, log an
        // event, which will be our experiment's activation event.
        if (rcValue.source == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
            FirebaseAnalytics.getInstance(this).logEvent("nondefault_model_downloaded", null)
        }
    }

Java

FirebaseModelManager.getInstance().downloadRemoteModelIfNeeded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // If the model downloaded was specified by a remote parameter, log an
                // event, which will be our experiment's activation event.
                if (rcValue.getSource() == FirebaseRemoteConfig.VALUE_SOURCE_REMOTE) {
                    FirebaseAnalytics.getInstance(YourActivity.this)
                            .logEvent("nondefault_model_downloaded", null);
                }
            }
        });

کد بالا رویداد Analytics سفارشی را ثبت می‌کند که بعداً از آن به‌عنوان رویداد فعال‌سازی آزمایش خود استفاده خواهید کرد. رویداد فعال‌سازی رویدادی است که کاربر باید قبل‌از اینکه به‌عنوان بخشی از آزمایش درنظر گرفته شود راه‌اندازی کند. این کار تضمین می‌کند که کاربران تا زمانی که دستگاهشان بارگیری مدل سفارشی ML را تکمیل نکرده است در آزمایش A/B شما ضبط نشوند.

۲. تعیین سنجه هدف

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

‫A/B Testing چندین سنجه داخلی دارد، ازجمله درآمد، تعامل روزانه، و حفظ کاربر. این سنجه‌ها اغلب برای آزمایش جریان‌های مختلف تجربه کاربری یا تنظیم دقیق پارامترها مفید هستند، اما ممکن است برای ارزیابی مدل و مورد استفاده شما منطقی نباشند. در این شرایط، می‌توانید به‌جای آن برای رویداد سفارشی Analytics بهینه‌سازی کنید.

بااستفاده از ویژگی جستجوی تصویری فرضی گیاه به‌عنوان مثال، فرض کنید نتایج جستجو را به کاربرتان براساس ترتیب اطمینان مدل به هر نتیجه ارائه دهید. یکی از راه‌هایی که می‌توانید از دقت مدل خود مطلع شوید این است که ببینید کاربران چند بار اولین نتیجه جستجو را باز کرده‌اند.

برای آزمایش اینکه کدام مدل بهتر به هدف بیشینه‌سازی کلیک‌های نتیجه برتر دست یافته است، هرگاه کاربری روی اولین مورد در فهرست نتایج تک‌ضرب زد، رویداد سفارشی را گزارش می‌کنید.

Kotlin

FirebaseAnalytics.getInstance(this).logEvent("first_result_opened", null)

Java

FirebaseAnalytics.getInstance(YourActivity.this).logEvent("first_result_opened", null);

سنجه‌ای که برای آن آزمایش می‌کنید درنهایت به نحوه استفاده برنامه شما از مدل بستگی دارد.

در این مرحله، می‌توانید برنامه‌تان را در «فروشگاه Play» مستقر کنید. برنامه شما همچنان از مدل اصلی‌تان استفاده خواهد کرد، اما کد Remote Config و Analytics که اضافه کرده‌اید به شما امکان می‌دهد بااستفاده از فقط کنسول Firebase با مدل‌های مختلف آزمایش کنید.

۳. اجرای آزمایش A/B Testing

اکنون که برنامه‌تان در دست کاربران است و داده‌های Analytics را جمع‌آوری می‌کند، آزمایشی A/B Testing ایجاد کنید که تأثیر استفاده از مدل جدیدتان به‌جای مدل فعلی را آزمایش کند.

برای ایجاد آزمایش:

  1. در صفحه رویدادها در کنسول Firebase، بررسی کنید که رویدادهای Analytics مربوطه را ثبت می‌کنید: رویداد فعال‌سازی و معیار هدف.

    برنامه شما باید هر رویداد را حداقل یک‌بار ثبت کند تا در کنسول Firebase نشان داده شود.

  2. در کنسول Firebase، بخش A/B Testing را باز کنید.

  3. ایجاد آزمایش جدید:

    1. روی ایجاد آزمایش > Remote Config کلیک کنید.

    2. در بخش هدف‌یابی:

      • برنامه‌تان را از فهرست انتخاب کنید
      • مشخص کنید می‌خواهید چند نفر از کاربران شما در آزمایش شرکت کنند
      • رویداد فعال‌سازی را که ثبت گزارش آن را شروع کرده‌اید انتخاب کنید (در این مثال، nondefault_model_downloaded)
    3. در بخش اهداف، سنجه هدفی را که در بخش قبلی تعیین کردید (در این مثال، first_result_opened) از فهرست سنجه‌های هدف انتخاب کنید و هر سنجه تکمیلی را که می‌خواهید پیگیری کنید، مثل درآمد خرید یا کاربران بدون خرابی، انتخاب کنید.

    4. در بخش انواع، دو نوع را تعریف کنید:

      • گروه کنترل (خودکارایجادشده)
      • برچسب‌زن آزمایشی گیاه

      برای گروه کنترل، پارامتر plant_labeler_model را ایجاد کنید و آن را روی plant_labeler_v1 تنظیم کنید. کاربران اختصاص‌یافته به گروه کنترل از مدل قدیمی استفاده خواهند کرد. (پارامتر را روی (no change) تنظیم نکنید، زیرا در برنامه‌تان، آزمایش می‌کنید که از مقدار ازدور استفاده می‌کنید.)

      برای متغیر برچسب‌زن گیاه آزمایشی، پارامتر plant_labeler_model را روی plant_labeler_v2 تنظیم کنید (با فرض اینکه مدل جدیدتان را تحت آن نام منتشر کرده‌اید). کاربران اختصاص‌داده‌شده به این گونه از مدل جدید استفاده خواهند کرد.

    صفحه پیکربندی آزمایش A/B

آزمایش را شروع کنید و اجازه دهید چند روز یا بیشتر اجرا شود تا A/B Testing رهبر را اعلام کند. اگر آزمایش نتواند رهبری را تعیین کند، ممکن است لازم باشد آزمایش را به کاربران بیشتری گسترش دهید.

۴. عرضه کردن گونه برنده به همه کاربران

کارت نتیجه آزمایش A/B

پس‌از اینکه A/B Testing اطلاعات کافی برای اعلام یک رهبر جمع‌آوری کرد—در این مورد، گونه‌ای که کلیک‌های نتیجه جستجوی برتر را به حداکثر رسانده است—می‌توانید تصمیم بگیرید که گونه برنده (یا گونه‌ای دیگر) را برای همه کاربران خود عرضه کنید یا نه.

در بخش A/B Testing از Firebase کنسول، نمای جزئیات آزمایش تکمیل‌شده را باز کنید. از این نما می‌توانید ببینید هر گونه براساس سنجه هدف و هر سنجه ثانویه‌ای که انتخاب کرده‌اید چگونه عمل کرده است. با این اطلاعات، می‌توانید تصمیم بگیرید که گونه پیشرو را عرضه کنید یا گونه دیگری را.

برای عرضه کردن یک متغیر به همه کاربران، روی > عرضه کردن متغیر در صفحه جزئیات آزمایش کلیک کنید. پس‌از انجام این کار، مقدار پارامتر plant_labeler_model برای همه کاربران plant_labeler_v2 خواهد بود.

در به‌روزرسانی آینده برنامه، باید مقدار پیش‌فرض پارامتر plant_labeler_model را به plant_labeler_v2 تغییر دهید و مدل دسته‌ای را درصورت استفاده به‌روز کنید. بااین‌حال، کاربران شما ازقبل از جدیدترین مدل استفاده می‌کنند، بنابراین می‌توانید این به‌روزرسانی را به‌عنوان بخشی از برنامه منتشرشده هر زمان که راحت بودید، مثلاً زمانی که به‌روزرسانی ویژگی بعدی را انجام می‌دهید، ارائه دهید.