नए कस्टम मॉडल को ट्रेन करने के बाद, A/B Testing का इस्तेमाल करके यह देखा जा सकता है कि असल दुनिया की स्थितियों में, नया मॉडल कैसा परफ़ॉर्म करता है. इसकी तुलना, पहले से इस्तेमाल किए जा रहे मॉडल से की जाती है. जब आपको यह पक्का हो जाए कि आपका नया मॉडल बेहतर है, तब उसे अपने सभी उपयोगकर्ताओं के लिए आसानी से रोल आउट किया जा सकता है. इसके लिए, ऐप्लिकेशन को अपडेट करने की ज़रूरत नहीं होती.
इस पेज पर बताया गया है कि किसी ऐसे मॉडल के दो वर्शन का आकलन करने के लिए A/B टेस्ट कैसे किया जा सकता है जो पौधों की खोज करने की काल्पनिक सुविधा को बेहतर बनाता है. यह सुविधा, इमेज लेबलिंग के कस्टम मॉडल का इस्तेमाल करती है. इससे लोगों को पौधों की इमेज से उनकी प्रजातियों की पहचान करने में मदद मिलती है.
मान लें कि आपने अभी-अभी पौधों के लेबल लगाने वाला एक नया मॉडल पब्लिश किया है,
plant_labeler_v2 और आपको एक ऐसा एक्सपेरिमेंट चलाना है जिसमें इसकी तुलना
आपके मौजूदा मॉडल plant_labeler_v1 से की जा सके. यहां दिए गए तरीके से, एक्सपेरिमेंट को सेट अप किया जा सकता है, उसे चलाया जा सकता है, और नतीजों के आधार पर कार्रवाई की जा सकती है.
1. अपने मॉडल को रिमोटली कॉन्फ़िगर करने की सुविधा देना
अपने मॉडल की A/B टेस्टिंग करने के लिए, सबसे पहले अपने ऐप्लिकेशन में बदलाव करें. इसके लिए, Remote Config पैरामीटर का इस्तेमाल करें, ताकि यह तय किया जा सके कि ऐप्लिकेशन कौनसा मॉडल इस्तेमाल करेगा. शुरुआत में, इस पैरामीटर की डिफ़ॉल्ट वैल्यू के तौर पर उस मॉडल को सेट किया जाएगा जिसका इस्तेमाल आपका ऐप्लिकेशन पहले से ही करता है. हालांकि, मॉडल का नाम, रिमोटली कॉन्फ़िगर किए जा सकने वाले पैरामीटर से कंट्रोल किया जाता है. इसलिए, हर बार उपयोगकर्ताओं को ऐप्लिकेशन के अपडेट पुश किए बिना, अलग-अलग मॉडल को बदला जा सकता है और उन पर एक्सपेरिमेंट किया जा सकता है.
इसलिए, अगर आपने अपने मौजूदा मॉडल को
plant_labeler_v1 नाम से पब्लिश किया है, तो आपको अपने ऐप्लिकेशन के इनिशियलाइज़ेशन कोड में,
plant_labeler_model पैरामीटर की डिफ़ॉल्ट वैल्यू के तौर पर
plant_labeler_v1 को सेट करना होगा. जैसा कि यहां दिए गए उदाहरण में दिखाया गया है:
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];
इसके बाद, मॉडल सेटअप कोड में बदलाव करके, plant_labeler_model पैरामीटर से तय किया गया मॉडल लोड करें:
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
अब आपका ऐप्लिकेशन, Remote Config पैरामीटर का इस्तेमाल करके यह तय करता है कि कौनसे मॉडल को लोड करना है. इसलिए, सिर्फ़ एक नया मॉडल पब्लिश करके और उसका नाम Remote Config पैरामीटर को असाइन करके, मॉडल को बदला जा सकता है. इस सुविधा की मदद से, A/B Testing अलग-अलग उपयोगकर्ताओं को अलग-अलग मॉडल असाइन कर सकता है, ताकि उनकी तुलना की जा सके.
आगे बढ़ने से पहले, मॉडल डाउनलोड करने के कोड में यह भी जोड़ें:
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];
}
}];
ऊपर दिया गया कोड, Analytics के कस्टम इवेंट को लॉग करता है. इसका इस्तेमाल बाद में, एक्सपेरिमेंट के
2. लक्ष्य मेट्रिक तय करना
अगला चरण यह तय करना है कि आपके मॉडल की परफ़ॉर्मेंस का आकलन कैसे किया जाएगा. साथ ही, यह पक्का करना है कि आपका ऐप्लिकेशन, ज़रूरी डेटा इकट्ठा कर रहा हो. इससे यह टेस्ट किया जा सकेगा कि मॉडल के अलग-अलग वर्शन, उस मेट्रिक के हिसाब से कितनी अच्छी परफ़ॉर्म करते हैं.
A/B Testing में कई बिल्ट-इन मेट्रिक होती हैं. इनमें रेवेन्यू, रोज़ाना का जुड़ाव, और उपयोगकर्ता को अपने साथ जोड़े रखना शामिल है. ये मेट्रिक, अक्सर अलग-अलग यूज़र एक्सपीरियंस फ़्लो की टेस्टिंग या पैरामीटर को बेहतर बनाने के लिए काम आती हैं. हालांकि, हो सकता है कि ये मेट्रिक आपके मॉडल और इस्तेमाल के उदाहरण का आकलन करने के लिए सही न हों. इस स्थिति में, Analytics के कस्टम इवेंट के लिए ऑप्टिमाइज़ करने की कोशिश करें.
उदाहरण के लिए, मान लें कि आपने काल्पनिक विज़ुअल प्लांट सर्च सुविधा का इस्तेमाल करके, अपने उपयोगकर्ता को खोज के नतीजे दिखाए. आपने हर नतीजे में मॉडल के कॉन्फ़िडेंस के क्रम में नतीजे दिखाए. अपने मॉडल की सटीकता का पता लगाने के लिए, यह देखा जा सकता है कि उपयोगकर्ताओं ने खोज के पहले नतीजे को कितनी बार खोला.
यह जांच करने के लिए कि किस मॉडल ने सबसे ज़्यादा टॉप नतीजे क्लिक करने का लक्ष्य हासिल किया है, आपको हर बार एक कस्टम इवेंट लॉग करना होगा, जब कोई उपयोगकर्ता नतीजों की सूची में पहले आइटम पर टैप करता है.
Swift
Analytics.logEvent("first_result_opened", parameters: nil)
Objective-C
[FIRAnalytics logEventWithName:@"first_result_opened" parameters:nil];
आपको जिस मेट्रिक के लिए टेस्ट करना है वह इस बात पर निर्भर करती है कि आपका ऐप्लिकेशन आपके मॉडल का इस्तेमाल कैसे करता है.
इस चरण में, अपने ऐप्लिकेशन को App Store पर डिप्लॉय किया जा सकता है. आपका ऐप्लिकेशन, आपके ओरिजनल मॉडल का इस्तेमाल करता रहेगा. हालांकि, जोड़े गए Remote Config और Analytics कोड की मदद से, सिर्फ़ Firebase कंसोल का इस्तेमाल करके अलग-अलग मॉडल के साथ एक्सपेरिमेंट किया जा सकेगा.
3. A/B Testing एक्सपेरिमेंट चलाना
अब आपका ऐप्लिकेशन उपयोगकर्ताओं के पास है और वह आंकड़ों का डेटा इकट्ठा कर रहा है. इसलिए, A/B Testing ऐसा एक्सपेरिमेंट बनाएं जिससे यह पता चल सके कि मौजूदा मॉडल के बजाय नए मॉडल का इस्तेमाल करने से क्या असर पड़ता है.
एक्सपेरिमेंट बनाने के लिए:
-
Firebase कंसोल के इवेंट पेज पर जाकर, पुष्टि करें कि आपने काम के Analytics इवेंट लॉग किए हों. जैसे, ऐक्टिवेशन इवेंट और लक्ष्य मेट्रिक.
Firebase कंसोल में दिखने से पहले, आपके ऐप्लिकेशन को हर इवेंट को कम से कम एक बार लॉग करना होगा.
-
Firebase कंसोल में, A/B Testing सेक्शन खोलें.
-
नया एक्सपेरिमेंट बनाने के लिए:
एक्सपेरिमेंट बनाएं > Remote Config पर क्लिक करें.
-
टारगेटिंग सेक्शन में जाकर:
- सूची में से अपना ऐप्लिकेशन चुनें
- यह तय करें कि आपको कितने उपयोगकर्ताओं को एक्सपेरिमेंट में शामिल करना है
- वह ऐक्टिवेशन इवेंट चुनें जिसे आपने लॉग करना शुरू किया था. इस उदाहरण में, nondefault_model_downloaded
-
लक्ष्य सेक्शन में, लक्ष्य की वह मेट्रिक चुनें जिसे आपने पिछले सेक्शन में तय किया था. इस उदाहरण में, first_result_opened है. इसके बाद, लक्ष्य की मेट्रिक की सूची से, कोई भी अतिरिक्त मेट्रिक चुनें जिसे आपको ट्रैक करना है. जैसे, खरीदारी से मिलने वाला रेवेन्यू या क्रैश न होने की समस्या वाले उपयोगकर्ता.
-
वैरिएंट सेक्शन में, दो वैरिएंट तय करें:
- कंट्रोल ग्रुप (अपने-आप बनाया गया)
- एक्सपेरिमेंट के तौर पर उपलब्ध, पौधों की पहचान करने वाला टूल
कंट्रोल ग्रुप के लिए,
plant_labeler_modelपैरामीटर बनाएं और इसेplant_labeler_v1पर सेट करें. कंट्रोल ग्रुप में शामिल उपयोगकर्ताओं को पुराने मॉडल का इस्तेमाल करने की अनुमति होगी. (पैरामीटर को(no change)पर सेट न करें, क्योंकि आपके ऐप्लिकेशन में यह जांच की जा रही है कि रिमोट वैल्यू का इस्तेमाल किया जा रहा है या नहीं.)एक्सपेरिमेंट के तौर पर उपलब्ध प्लांट लेबलर वैरिएंट के लिए,
plant_labeler_modelपैरामीटर कोplant_labeler_v2पर सेट करें. मान लें कि आपने अपने नए मॉडल को इसी नाम से पब्लिश किया है. इस वैरिएंट को असाइन किए गए उपयोगकर्ता, नए मॉडल का इस्तेमाल करेंगे.
एक्सपेरिमेंट शुरू करें और इसे कई दिनों तक चलने दें. ऐसा तब तक करें, जब तक A/B Testing किसी एक को लीडर के तौर पर नहीं चुन लेता. अगर एक्सपेरिमेंट से यह पता नहीं चलता कि सबसे अच्छा परफ़ॉर्म करने वाला वैरिएंट कौन-सा है, तो आपको एक्सपेरिमेंट को ज़्यादा उपयोगकर्ताओं के लिए उपलब्ध कराना पड़ सकता है.
4. सबसे अच्छा परफ़ॉर्म करने वाले वैरिएंट को सभी उपयोगकर्ताओं के लिए रोल आउट करना
A/B Testing के पास जब यह तय करने के लिए ज़रूरी जानकारी इकट्ठा हो जाती है कि कौनसे विज्ञापन को लीडर घोषित किया जाए, तब आपके पास यह तय करने का विकल्प होता है कि आपको जीतने वाले विज्ञापन (या किसी अन्य विज्ञापन) को सभी उपयोगकर्ताओं के लिए रोल आउट करना है या नहीं. इस मामले में, लीडर वह विज्ञापन है जिसे खोज के सबसे ऊपर दिखने वाले नतीजों में सबसे ज़्यादा क्लिक मिले हैं.
Firebase कंसोल के A/B Testing सेक्शन में जाकर, पूरे हो चुके एक्सपेरिमेंट की ज़्यादा जानकारी वाला व्यू खोलें. इस व्यू में, यह देखा जा सकता है कि आपके लक्ष्य की मेट्रिक और चुनी गई किसी भी सेकंडरी मेट्रिक के हिसाब से, हर वैरिएंट की परफ़ॉर्मेंस कैसी रही. इस जानकारी की मदद से, यह तय किया जा सकता है कि लीडिंग वैरिएंट को रोल आउट करना है या किसी दूसरे वैरिएंट को.
किसी वैरिएंट को सभी उपयोगकर्ताओं के लिए रोल आउट करने के लिए, एक्सपेरिमेंट की ज़्यादा जानकारी वाले पेज पर, more_vert > वैरिएंट को रोल आउट करें पर क्लिक करें. ऐसा करने पर, सभी उपयोगकर्ताओं के लिए plant_labeler_model पैरामीटर की वैल्यू plant_labeler_v2 हो जाएगी.
ऐप्लिकेशन के आने वाले अपडेट में, आपको plant_labeler_model पैरामीटर की डिफ़ॉल्ट वैल्यू को plant_labeler_v2 में बदलना होगा. साथ ही, अगर बंडल किए गए मॉडल का इस्तेमाल किया जाता है, तो उसे अपडेट करना होगा. हालांकि, आपके उपयोगकर्ता पहले से ही नए मॉडल का इस्तेमाल कर रहे हैं. इसलिए, जब भी आपको ठीक लगे, तब इस अपडेट को पब्लिश किए गए ऐप्लिकेशन के हिस्से के तौर पर पुश किया जा सकता है. जैसे, जब आपको अगली बार किसी सुविधा को अपडेट करना हो.