Tiến hành thử nghiệm A/B trên hai phiên bản của một mô hình

Sau khi huấn luyện một mô hình tuỳ chỉnh mới hoặc mô hình AutoML Vision Edge, bạn có thể sử dụng tính năng Thử nghiệm A/B để xem mô hình mới hoạt động hiệu quả như thế nào trong điều kiện thực tế, so với mô hình bạn đã sử dụng. Sau khi xác nhận rằng mô hình mới là một điểm cải tiến, bạn có thể dễ dàng triển khai mô hình mới cho tất cả người dùng mà không cần cập nhật ứng dụng.

Trang này cho biết cách bạn có thể tiến hành một thử nghiệm A/B để đánh giá hai phiên bản của một mô hình hỗ trợ tính năng tìm kiếm thực vật giả định bằng hình ảnh. Tính năng này sử dụng mô hình gắn nhãn hình ảnh tuỳ chỉnh để giúp người dùng xác định các loài thực vật từ hình ảnh về chúng.

Giả sử bạn vừa xuất bản một mô hình gắn nhãn cây mới plant_labeler_v2 và bạn muốn chạy một thử nghiệm để so sánh mô hình đó với mô hình hiện tại có tên là plant_labeler_v1. Các bước bên dưới cho biết cách thiết lập, chạy thử nghiệm và thực hiện hành động dựa trên kết quả.

1. Cho phép mô hình của bạn có thể định cấu hình từ xa

Bước đầu tiên để kiểm thử A/B các mô hình là sửa đổi ứng dụng để sử dụng thông số Cấu hình từ xa nhằm xác định mô hình mà ứng dụng đó sử dụng. Ban đầu, bạn sẽ đặt giá trị mặc định của tham số này là mô hình mà ứng dụng của bạn đang sử dụng, nhưng vì tên mô hình được kiểm soát bằng một tham số có thể định cấu hình từ xa, nên bạn có thể thay đổi và thử nghiệm với nhiều mô hình mà không phải đẩy bản cập nhật ứng dụng cho người dùng mỗi lần.

Vì vậy, nếu bạn đã xuất bản mô hình hiện tại dưới tên plant_labeler_v1, trong mã khởi chạy ứng dụng, bạn sẽ đặt plant_labeler_v1 làm giá trị mặc định của tham số plant_labeler_model, như trong ví dụ sau:

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.
                  // ...
                }
            }
        });

Sau đó, hãy thay đổi mã thiết lập mô hình để tải mô hình được chỉ định bằng thông số 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

Giờ đây, khi ứng dụng của bạn sử dụng thông số Cấu hình từ xa để xác định mô hình cần tải, bạn có thể thay đổi mô hình chỉ bằng cách phát hành một mô hình mới và chỉ định tên mô hình cho thông số Cấu hình từ xa. Khả năng này cho phép Thử nghiệm A/B chỉ định các mô hình khác nhau cho những người dùng khác nhau để so sánh các mô hình đó.

Trước khi tiếp tục, hãy bổ sung thêm những nội dung sau vào mã tải mô hình xuống:

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);
                }
            }
        });

Đoạn mã ở trên ghi lại một sự kiện Analytics tuỳ chỉnh mà sau này bạn sẽ sử dụng làm sự kiện kích hoạt của thử nghiệm. Sự kiện kích hoạt là một sự kiện mà người dùng phải kích hoạt trước khi họ được coi là một phần của thử nghiệm. Điều này đảm bảo rằng người dùng sẽ không được ghi lại trong thử nghiệm A/B cho đến khi thiết bị của họ tải xong mô hình học máy tuỳ chỉnh.

2. Xác định chỉ số mục tiêu

Bước tiếp theo là quyết định cách bạn sẽ đo lường mức độ thành công của mô hình và đảm bảo ứng dụng của bạn đang thu thập dữ liệu cần thiết để kiểm thử mức độ hiệu quả của các phiên bản của mô hình theo chỉ số đó.

Tính năng Thử nghiệm A/B có một vài chỉ số được tích hợp sẵn, bao gồm doanh thu, mức độ tương tác hằng ngày và tỷ lệ giữ chân người dùng. Các chỉ số này thường hữu ích khi kiểm thử các luồng trải nghiệm người dùng hoặc tham số tinh chỉnh khác nhau, nhưng có thể không phù hợp để đánh giá mô hình và trường hợp sử dụng của bạn. Trong trường hợp này, bạn có thể thử tối ưu hoá cho một sự kiện Analytics tuỳ chỉnh.

Hãy lấy tính năng tìm kiếm thực vật bằng hình ảnh giả định làm ví dụ, giả sử bạn trình bày kết quả tìm kiếm cho người dùng theo thứ tự độ tin cậy của mô hình trong mỗi kết quả. Có một cách để giúp bạn nắm được độ chính xác của mô hình là xem xét tần suất người dùng mở kết quả tìm kiếm đầu tiên.

Để kiểm tra xem mô hình nào đạt được mục tiêu tối đa hoá số lượt nhấp vào kết quả hàng đầu, bạn sẽ ghi lại một sự kiện tuỳ chỉnh mỗi khi người dùng nhấn vào mục đầu tiên trong danh sách kết quả.

Kotlin+KTX

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

Java

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

Cuối cùng, chỉ số bạn kiểm thử phụ thuộc vào cách ứng dụng dùng mô hình của bạn.

Tại thời điểm này, bạn có thể triển khai ứng dụng của mình cho Cửa hàng Play. Ứng dụng của bạn sẽ tiếp tục sử dụng mô hình ban đầu, nhưng Cấu hình từ xa và mã Analytics mà bạn đã thêm sẽ cho phép bạn thử nghiệm với nhiều mô hình khác nhau chỉ bằng bảng điều khiển của Firebase.

3. Chạy thử nghiệm A/B

Hiện ứng dụng của bạn đã nằm trong tay người dùng và đang thu thập dữ liệu phân tích, hãy tạo một thử nghiệm Thử nghiệm A/B để thử nghiệm hiệu quả của việc sử dụng mô hình mới thay vì mô hình hiện tại.

Cách tạo thử nghiệm:

  1. Trên trang Sự kiện của bảng điều khiển của Firebase, hãy xác minh rằng bạn đang ghi lại các sự kiện Analytics có liên quan: sự kiện kích hoạt và chỉ số mục tiêu.

    Ứng dụng của bạn cần ghi nhật ký từng sự kiện ít nhất một lần trước khi sự kiện đó xuất hiện trong bảng điều khiển của Firebase.

  2. Trong bảng điều khiển của Firebase, hãy mở mục Thử nghiệm A/B.

  3. Tạo thử nghiệm mới:

    1. Nhấp vào Tạo thử nghiệm > Cấu hình từ xa.

    2. Trong phần Nhắm mục tiêu:

      • Chọn ứng dụng của bạn trong danh sách
      • Chỉ định số lượng người dùng mà bạn muốn đưa vào thử nghiệm
      • Chọn sự kiện kích hoạt mà bạn đã bắt đầu ghi nhật ký (trong ví dụ này là nondefault_model_download)
    3. Trong phần Mục tiêu, hãy chọn chỉ số mục tiêu mà bạn đã xác định trong phần trước (trong ví dụ này là first_result_opened) từ danh sách các chỉ số mục tiêu và chọn bất kỳ chỉ số nào khác mà bạn muốn theo dõi, chẳng hạn như doanh thu từ giao dịch mua hàng hoặc số người dùng không gặp sự cố.

    4. Trong phần Biến thể, hãy xác định 2 biến thể:

      • Nhóm đối chứng (được tạo tự động)
      • Công cụ gắn nhãn cây thử nghiệm

      Đối với Nhóm đối chứng, hãy tạo một tham số plant_labeler_model rồi đặt tham số đó thành plant_labeler_v1. Người dùng được chỉ định vào nhóm đối chứng sẽ sử dụng mô hình cũ. (Đừng đặt tham số này thành (no change), vì trong ứng dụng, bạn đang kiểm thử xem mình có đang sử dụng một giá trị từ xa hay không.)

      Đối với biến thể Trình gắn nhãn cây thử nghiệm, hãy đặt tham số plant_labeler_model thành plant_labeler_v2 (giả sử bạn đã phát hành mô hình mới bằng tên đó). Những người dùng được chỉ định cho biến thể này sẽ sử dụng mô hình mới.

    Màn hình cấu hình thử nghiệm A/B

Bắt đầu thử nghiệm và chạy trong vài ngày trở lên cho đến khi Thử nghiệm A/B khai báo biến thể dẫn đầu. Nếu thử nghiệm không thể xác định biến thể dẫn đầu, thì bạn có thể phải mở rộng thử nghiệm cho nhiều người dùng hơn.

4. Triển khai biến thể hiệu quả nhất cho tất cả người dùng

Thẻ kết quả thử nghiệm A/B

Sau khi thử nghiệm A/B thu thập đủ thông tin để khai báo biến thể dẫn đầu (trong trường hợp này là biến thể giúp tăng tối đa số lượt nhấp vào kết quả tìm kiếm hàng đầu), bạn có thể quyết định xem nên triển khai biến thể chiến thắng (hoặc một biến thể khác) cho tất cả người dùng hay không.

Trong mục Thử nghiệm A/B của bảng điều khiển của Firebase, hãy mở chế độ xem chi tiết của thử nghiệm đã hoàn tất. Từ chế độ xem này, bạn có thể xem hiệu suất của từng biến thể theo chỉ số mục tiêu và mọi chỉ số phụ mà bạn chọn. Với thông tin này, bạn có thể quyết định xem nên triển khai biến thể chính hay một biến thể khác.

Để ra mắt một biến thể cho tất cả người dùng, hãy nhấp vào > Triển khai biến thể trên trang chi tiết của thử nghiệm. Sau khi bạn làm như vậy, giá trị của tham số plant_labeler_model sẽ là plant_labeler_v2 đối với tất cả người dùng.

Trong bản cập nhật ứng dụng sau này, bạn nên thay đổi giá trị mặc định của tham số plant_labeler_model thành plant_labeler_v2 và cập nhật mô hình đi kèm nếu bạn sử dụng mô hình đi kèm. Tuy nhiên, người dùng hiện đã sử dụng mô hình mới nhất, vì vậy, bạn có thể đẩy bản cập nhật này như một phần của ứng dụng đã phát hành bất cứ khi nào thuận tiện, chẳng hạn như khi bạn cập nhật tính năng vào lần tới.