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, bạn có thể sử dụng A/B Testing để 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 mà bạn đang 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 bản cập nhật ứng dụng.

Trang này cho biết cách bạn có thể tiến hành 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 của kết quả tìm kiếm thực vật bằng hình ảnh giả định. Tính năng này sử dụng một 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 của chúng.

Giả sử bạn vừa phát hành một mô hình gắn nhãn thực vật mới, plant_labeler_v2 và bạn muốn chạy một thử nghiệm so sánh mô hình này 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 thử nghiệm, chạy thử nghiệm và thực hiện hành động dựa trên kết quả.

1. Thiết lập mô hình có thể định cấu hình từ xa

Bước đầu tiên để thử nghiệm A/B các mô hình là sửa đổi ứng dụng để sử dụng tham số Remote Config 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 đã sử dụng. Tuy nhiên, 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 các mô hình khác nhau mà không cần phải gửi 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 đã phát hành mô hình hiện tại dưới tên plant_labeler_v1, thì 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:

Swift

let remoteConfig = RemoteConfig.remoteConfig()
let defaults = [
    "plant_labeler_model": "plant_labeler_v1" as NSObject,
    // ...
]
remoteConfig.setDefaults(defaults)
remoteConfig.fetchAndActivate()

Objective-C

FIRRemoteConfig *remoteConfig = [FIRRemoteConfig remoteConfig];
NSDictionary<NSString *, NSObject *> *defaults = @{
  @"plant_labeler_model" : (NSObject *)@"plant_labeler_v1",
  // ...
};
[remoteConfig setDefaults:defaults];
[remoteConfig fetchAndActivateWithCompletionHandler:nil];

Sau đó, hãy thay đổi mã thiết lập mô hình để tải mô hình do tham số plant_labeler_model chỉ định:

Swift

let rcValue = remoteConfig.configValue(forKey: "plant_labeler_model")
guard let remoteModelName = rcValue.stringValue else { return }

// ...

let remoteModel = RemoteModel(
    name: remoteModelName,
    allowsModelUpdates: true,
    initialConditions: initialConditions,
    updateConditions: updateConditions
)
ModelManager.modelManager().register(remoteModel)

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

Objective-C

FIRRemoteConfigValue *rcValue = [remoteConfig configValueForKey:@"plant_labeler_model"];
NSString *remoteModelName = [rcValue stringValue];

// ...

FIRRemoteModel *remoteModel = [[FIRRemoteModel alloc] initWithName:remoteModelName
                                                allowsModelUpdates:YES
                                                 initialConditions:initialConditions
                                                  updateConditions:updateConditions];
[[FIRModelManager modelManager] registerRemoteModel:remoteModel];

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

Giờ đây, ứng dụng của bạn sử dụng tham số Remote Config để 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 của mô hình đó cho tham số Remote Config. Tính năng này cho phép A/B Testing chỉ định các mô hình khác nhau cho những người dùng khác nhau nhằm so sánh các mô hình đó.

Trước khi tiếp tục, hãy thêm thông tin sau vào mã tải mô hình xuống:

Swift

NotificationCenter.default.addObserver(
    forName: .firebaseMLModelDownloadDidSucceed,
    object: nil,
    queue: nil
) { [weak self] notification in
    guard let _ = self,
        let userInfo = notification.userInfo,
        let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]
            as? RemoteModel,
        model.name == remoteModelName
        else { return }
    // If the model downloaded was specified by a remote parameter, log an
    // event, which will be our experiment's activation event.
    if rcValue.source == .remote {
        Analytics.logEvent("nondefault_model_downloaded", parameters: nil)
    }
}

Objective-C

__weak typeof(self) weakSelf = self;

[NSNotificationCenter.defaultCenter
    addObserverForName:FIRModelDownloadDidSucceedNotification
                object:nil
                 queue:nil
            usingBlock:^(NSNotification *_Nonnull note) {
              if (weakSelf == nil | note.userInfo == nil) {
                return;
              }

              FIRRemoteModel *model = note.userInfo[FIRModelDownloadUserInfoKeyRemoteModel];
              if ([model.name isEqualToString:remoteModelName] &&
                  rcValue.source == FIRRemoteConfigSourceRemote) {
                // If the model downloaded was specified by a remote parameter, log an
                // event, which will be our experiment's activation event.
                [FIRAnalytics logEventWithName:@"nondefault_model_downloaded" parameters:nil];
              }
            }];

Đoạn mã ở trên ghi lại một sự kiện Analytics tuỳ chỉnh mà bạn sẽ sử dụng sau này làm sự kiện kích hoạtcủ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 đượ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 ML 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 rằng ứng dụng đang thu thập dữ liệu cần thiết để kiểm tra mức độ hiệu quả của các phiên bản mô hình khác nhau theo chỉ số đó.

A/B Testing có một số chỉ số 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 để kiểm thử các quy trình trải nghiệm người dùng khác nhau hoặc tinh chỉnh các tham số, 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.

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ự mức độ tin cậy của mô hình đối với từng kết quả. Một cách để bạn có thể nắm được độ chính xác của mô hình là xem tần suất người dùng mở kết quả tìm kiếm đầu tiên.

Để kiểm thử 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ả.

Swift

Analytics.logEvent("first_result_opened", parameters: nil)

Objective-C

[FIRAnalytics logEventWithName:@"first_result_opened" parameters:nil];

Chỉ số mà bạn kiểm thử cuối cùng sẽ phụ thuộc vào cách ứng dụng sử 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 lên App Store. Ứng dụng sẽ tiếp tục sử dụng mô hình ban đầu, nhưng mã Remote Config và Analytics mà bạn đã thêm sẽ cho phép bạn thử nghiệm các mô hình khác nhau chỉ bằng bảng điều khiển Firebase.

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

Giờ đây, ứng dụng của bạn đã được người dùng sử dụng và đang thu thập dữ liệu phân tích, hãy tạo một thử nghiệm A/B Testing để kiểm thử 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 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 lại mỗi 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 Firebase.

  2. Trong bảng điều khiển Firebase, hãy mở phần A/B Testing.

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

    1. Nhấp vào Tạo thử nghiệm > Remote Config.

    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_downloaded)
    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) trong danh sách chỉ số mục tiêu và chọn mọi chỉ số bổ sung mà bạn muốn theo dõi, chẳng hạn như doanh thu từ giao dịch mua hoặc 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)
      • Mô hình gắn nhãn thực vật thử nghiệm

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

      Đối với biến thể Mô hình gắn nhãn thực vật 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 dưới tên đó). 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à để thử nghiệm chạy trong vài ngày trở lên cho đến khi A/B Testing tuyên bố một biến thể hiệu quả nhất. Nếu thử nghiệm không thể xác định được biến thể hiệu quả nhất, bạn có thể cần 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 A/B Testing thu thập đủ thông tin để tuyên bố một biến thể dẫn đầu—trong trường hợp này là biến thể tối đa hoá số lượt nhấp vào kết quả tìm kiếm hàng đầu—bạn có thể quyết định có triển khai biến thể dẫn đầu (hoặc một biến thể khác) cho tất cả người dùng hay không.

Trong phần A/B Testing của bảng điều khiển Firebase, hãy mở chế độ xem chi tiết của thử nghiệm đã hoàn tất. Trong chế độ xem này, bạn có thể thấy 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 có triển khai biến thể hiệu quả nhất hay một biến thể khác hay không.

Để triển khai 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 thông tin chi tiết của thử nghiệm. Sau khi bạn thực hiện việc này, giá trị của tham số plant_labeler_model sẽ là plant_labeler_v2 cho tất cả người dùng.

Trong bản cập nhật ứng dụng trong tương lai, 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 đó. Tuy nhiên, người dùng của bạn đã sử dụng mô hình mới nhất, vì vậy, bạn có thể gửi 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 thực hiện bản cập nhật tính năng tiếp theo.