تست A/B دو نسخه از یک مدل

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

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

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

1. مدل خود را از راه دور قابل تنظیم کنید

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

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

Kotlin+KTX

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+KTX

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/label-images-with-automl#configure-a-local-model-source
// 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/label-images-with-automl#configure-a-local-model-source
// https://firebase.google.com/docs/ml/android/use-custom-models#configure_a_local_model

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

قبل از ادامه، موارد زیر را نیز به کد دانلود مدل خود اضافه کنید:

Kotlin+KTX

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 سفارشی را ثبت می کند که بعداً به عنوان آزمایش خود استفاده خواهید کرد رویداد فعال سازی . رویداد فعال‌سازی رویدادی است که کاربر باید قبل از اینکه بخشی از آزمایش در نظر گرفته شود، راه‌اندازی کند. این تضمین می‌کند که کاربران در تست A/B شما ثبت نخواهند شد تا زمانی که دستگاه آنها دانلود مدل ML سفارشی‌شان را تمام کند.

2. یک متریک هدف را تعیین کنید

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

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

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

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

Kotlin+KTX

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

Java

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

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

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

3. یک آزمایش A/B Testing را اجرا کنید

اکنون که برنامه شما در دست کاربران شماست و داده های تحلیلی را جمع آوری می کند، یک آزمایش 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. در قسمت Variants دو نوع تعریف کنید:

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

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

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

    صفحه پیکربندی تست A/B

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

4. نسخه برنده را برای همه کاربران عرضه کنید

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

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

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

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

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