एनोटेशन डेटा पर मॉडल प्रशिक्षित करना
कई एनोटेटरों के लेबल को प्रशिक्षण लक्ष्यों में समाधानित करें, राउंडों के बीच होल्ड-आउट test स्प्लिट स्थिर रखें, दर्ज करें कि हर मॉडल ने क्या देखा, और पहले रन का आकार तय करें।
एनोटेशन डेटा पर मॉडल प्रशिक्षित करने के लिए, हर आइटम के लेबल को एक लक्ष्य में या एनोटेटरों के मत-विभाजन में समाधानित करें, आइटमों को ऐसे नियम से train, validation और test स्प्लिट में बाँटें जो राउंडों के बीच स्थिर रहे, और जब भी validation स्प्लिट ने चेकपॉइंट चुना हो तब test स्कोर रिपोर्ट करें। Potato का मॉडल प्रशिक्षण अध्ययन के अपने एनोटेशन पर हर चरण चलाता है और दर्ज करता है कि हर रन ने किन आइटमों पर प्रशिक्षण लिया।
v2.14.0 में नया
एनोटेशन डेटा शायद ही कभी उस रूप में आता है जिसे ट्रेनर पढ़ता है। ओवरलैप वाले अध्ययन में हर आइटम पर कई लेबल होते हैं, और लेबल अक्सर असहमत होते हैं। चल रहे अध्ययन में हर दिन लेबल बढ़ते हैं, और दोबारा प्रशिक्षण का हर राउंड पिछले राउंड से अधिक आइटम देखता है। ट्रेनर को हर आइटम का एक लक्ष्य और स्कोर करने के लिए आइटमों का एक स्थिर सेट चाहिए, और नीचे के निर्णय दोनों देते हैं। नीचे का हर अनुभाग वह Potato सेटिंग बताता है जो निर्णय लेती है। Training पेज के लिए मॉडल प्रशिक्षण का अवलोकन और पहला मॉडल प्रशिक्षित करने वाला ट्यूटोरियल देखें। अपने कोड में प्रशिक्षण के लिए, मशीन लर्निंग के लिए एनोटेशन निर्यात करना निर्यात फ़ॉर्मैट कवर करता है, और निर्यात की गई फ़ाइल पर वही निर्णय लागू होते हैं।
कई एनोटेटरों को एक लेबल में समाधानित करना
एकत्रीकरण कई एनोटेटरों के एक आइटम पर दिए लेबल को वह एकल लेबल बनाता है जिस पर मॉडल प्रशिक्षित होता है। सबसे सरल विधि बहुमत मत है। बहुमत मत हर एनोटेटर का उत्तर एक बार गिनता है और सबसे आम उत्तर रखता है। Dawid और Skene (1979) एक्सपेक्टेशन-मैक्सिमाइज़ेशन से हर एनोटेटर के लिए कन्फ़्यूज़न मैट्रिक्स का आकलन करते हैं और हर मत को एनोटेटर की अनुमानित विश्वसनीयता से भारित करते हैं। तब लापरवाह एनोटेटर परिणाम को सावधान एनोटेटर से कम प्रभावित करता है। क्राउड लेबल का एकत्रीकरण दोनों विधियों और Dawid-Skene पर बने मॉडलों की तुलना करता है।
Potato में प्रशिक्षण रन लेबलों को model_training.aggregation से समाधानित करता है। डिफ़ॉल्ट consensus तब Dawid-Skene चलाता है जब प्रोजेक्ट में एक से अधिक एनोटेटर हों, और आकलन विफल होने पर बहुमत मत पर लौट आता है। दूसरा मान majority केवल बहुमत मत चलाता है। दोनों विधियाँ किसी स्कीम पर एनोटेटर के पूरे उत्तर को एक मत गिनती हैं। इसलिए दो multiselect उत्तर तभी एक ही मत गिने जाते हैं जब दोनों उत्तर लेबलों का एक ही समूह चुनें।
रन की consensus सेटिंग और सहमति निर्यात अलग सुविधाएँ हैं। सहमति निर्यात हर एनोटेटर को एक मत देता है, हर आइटम के हर उत्तर की गिनती और अंश रिपोर्ट करता है, और हर आइटम को retired या needs_review चिह्नित करता है। जब आप आइटम-दर-आइटम देखना चाहें कि एनोटेटर कहाँ बँटे, तब प्रशिक्षण से पहले निर्यात पढ़ें। MACE उन्हीं मतों से हर एनोटेटर के लिए सक्षमता स्कोर का आकलन करता है।
असहमति से सीखना
आपत्तिजनकता या भावना जैसे व्यक्तिपरक कार्यों पर एनोटेटर इसलिए असहमत हो सकते हैं कि हर एनोटेटर आइटम को अलग तरह पढ़ता है, और एकल मत वाला लेबल विभाजन को फेंक देता है। Uma et al. (2021) ऐसी विधियों का सर्वेक्षण करते हैं जो एक एकत्रित लेबल के बजाय असहमति पर प्रशिक्षित करती हैं। इन विधियों का एक परिवार सॉफ़्ट लेबल पर प्रशिक्षित करता है। सॉफ़्ट लेबल लेबलों पर एक प्रायिकता वितरण है, जो हर लेबल चुनने वाले एनोटेटरों के अंश से बनता है।
hf-text-classification पैरामीटर soft_targets: true लेता है। पैरामीटर सेट होने पर, जिस आइटम पर दो या अधिक एनोटेटरों ने लेबल लगाया वह वितरण के विरुद्ध क्रॉस-एन्ट्रॉपी से एनोटेटरों के विभाजन की ओर प्रशिक्षित होता है। जब तीन में से दो एनोटेटरों ने positive कहा, तब लक्ष्य 0.67 positive और 0.33 negative है। multiselect स्कीम के लिए हर लेबल उन एनोटेटरों के अंश की ओर प्रशिक्षित होता है जिन्होंने उसे चुना। एक एनोटेटर वाला आइटम पहले की तरह उसी एनोटेटर के लेबल पर प्रशिक्षित होता है। तब मॉडल वहाँ अनिश्चित रहता है जहाँ लोग असहमत थे, और हर भविष्यवाणी में मॉडल के probabilities शामिल होते हैं। मत-विभाजन वाले होल्ड-आउट आइटमों पर रन तीन और मीट्रिक रिपोर्ट करता है:
| मीट्रिक | मीट्रिक क्या मापता है |
|---|---|
soft_jsd | मॉडल के वितरण और एनोटेटरों के विभाजन के बीच Jensen-Shannon विचलन, 0 से 1 तक बिट में |
soft_cross_entropy | मॉडल के वितरण के तहत एनोटेटरों के विभाजन की क्रॉस-एन्ट्रॉपी |
ece | मतदान किए लेबल के विरुद्ध शीर्ष लेबल की अपेक्षित कैलिब्रेशन त्रुटि, 10 विश्वास बिन पर |
सॉफ़्ट लेबल स्कीम में हर एनोटेटर स्लाइडरों से एक वितरण देता है। hf-text-classification soft_label स्कीम को हमेशा एनोटेटरों के औसत वितरण की ओर प्रशिक्षित करता है, और प्री-लेबल स्लाइडरों को भविष्यवाणी किए वितरण पर सेट करता है। सॉफ़्ट लक्ष्यों को एक आइटम पर दो या अधिक लेबल चाहिए। इसलिए असहमति पर प्रशिक्षण की योजना बनाने वाला अध्ययन शुरू से ओवरलैपिंग लेबल जुटाता है, और आपको कितने एनोटेटर चाहिए? ओवरलैप सेटिंग कवर करता है। असहमति संकेत है, शोर नहीं विभाजन को डेटा में रखने का तर्क देता है।
Train, validation और test स्प्लिट
प्रशिक्षण, validation और test स्प्लिट तीन अलग काम करते हैं। train स्प्लिट मॉडल के वज़न फ़िट करता है। validation स्प्लिट उम्मीदवार मॉडलों में से चुनता है, उदाहरण के लिए किस epoch पर रुकना है। test स्प्लिट अनदेखे डेटा पर प्रदर्शन का आकलन करता है और दोनों चुनावों में कोई भूमिका नहीं निभाता। validation पर चेकपॉइंट चुनना validation पर फ़िट करने का एक रूप है। सर्वश्रेष्ठ validation स्कोर के लिए रखे गए चेकपॉइंट का validation स्कोर ऊपर की ओर पक्षपाती होता है, और केवल test स्कोर उन आइटमों से आता है जिनसे चुनाव ने कभी सलाह नहीं ली।
Potato का रन लेबल किए आइटमों को डिफ़ॉल्ट रूप से 70/15/15 में बाँटता है (splits)। हर आइटम का स्प्लिट आइटम की ID के सीड वाले हैश से आता है (split_seed)। इसलिए एक रन में होल्ड-आउट रहा आइटम अगले रन में भी होल्ड-आउट रहता है, जब तक split_seed और splits वही रहें। दोनों में से कोई भी सेटिंग बदलने से होल्ड-आउट आइटम प्रशिक्षण में जा सकते हैं, और बदलाव के बाद का हर स्कोर आंशिक रूप से याद करने को मापता है। दोनों एक बार, अध्ययन की शुरुआत में सेट करें।
hf-text-classification जैसे फ़ाइन-ट्यून करने वाले ट्रेनर वह चेकपॉइंट रखते हैं जो validation पर सबसे अच्छे epoch का था। ऐसे रन का मुख्य स्कोर test से आता है। sklearn-text, setfit, rdkit-property, निर्णय-मॉडल ट्रेनर और इन्फ़रेंस ब्रिज validation पर कुछ नहीं चुनते, और इनमें से किसी ट्रेनर का रन मुख्य स्कोर validation से तब लेता है जब validation में आइटम हों। Runs तालिका के Held-out score स्तंभ का टूलटिप हर संख्या के पीछे का स्प्लिट और मीट्रिक बताता है। जिस आइटम पर लेबल है और भविष्यवाणी नहीं, वह गलत गिना जाता है। ट्रेनर कठिन आइटम छोड़कर स्कोर नहीं बढ़ा सकता, और <split>_coverage उन आइटमों का अंश रिपोर्ट करता है जिन्हें भविष्यवाणी मिली।
सुधारे और पिन किए आइटम
दो तरह के आइटम हर बाद के रन के train स्प्लिट में जाते हैं, हैश ने कोई भी स्प्लिट दिया हो। पहला वह आइटम है जिसे समीक्षक ने मॉडल समीक्षा में सुधारा, और दूसरा वह आइटम है जिसे किसी ने Catalog पेज पर किसी स्लाइस के बगल के Train on these से पिन किया। सुधार उन आइटमों से आते हैं जिन पर मॉडल सबसे बुरा रहा, और validation या test में रहने पर सुधार मॉडल को उसी की अपनी गलतियों के नमूने पर स्कोर करते। जो रन होल्ड-आउट आइटम प्रशिक्षण में ले जाता है वह गिनती के साथ चेतावनी लॉग करता है, और तब रन का होल्ड-आउट स्कोर पहले के रन के स्कोर से सीधे तुलनीय नहीं रहता। जो रन किसी सुधारे आइटम पर प्रशिक्षित होता है जिसे पहले का रन होल्ड-आउट रखे था, वह भी चेतावनी लॉग करता है, क्योंकि पहले के रन के validation या test आइटमों पर, या उन आइटमों से सहेजे डेटासेट पर, स्कोर में तब वे आइटम शामिल होते हैं जिन पर नए मॉडल ने प्रशिक्षण लिया। सुधार और पिन किए आइटम हमेशा प्रशिक्षित होते हैं नियम देता है।
दर्ज करना कि हर मॉडल ने किस पर प्रशिक्षण लिया
दो रनों की तुलना के लिए जानना ज़रूरी है कि हर रन ने किन आइटमों पर प्रशिक्षण लिया और स्कोर किया। Potato का हर रन <output_annotation_dir>/training/runs/<run_id>/bundle/ के नीचे train.jsonl, val.jsonl, test.jsonl, labels.json और manifest.json के साथ एक बंडल लिखता है। मैनिफ़ेस्ट स्प्लिट सीड, एकत्रीकरण विधि, हर स्प्लिट में आइटमों की संख्या, प्रशिक्षण में धकेले गए आइटमों की गिनती और स्प्लिट फ़ाइलों का SHA-256 डाइजेस्ट दर्ज करता है। बंडल में कुछ भी Potato की ओर वापस संकेत नहीं करता, और Potato के बाहर की स्क्रिप्ट बंडल को समाधानित लेबलों और स्प्लिट की स्वतःपूर्ण कॉपी के रूप में पढ़ सकती है।
प्रोजेक्ट डेटाबेस project.sqlite प्रति रन एक पंक्ति वाला लेजर रखता है। हर पंक्ति ट्रेनर, पैरामीटर, स्प्लिट के आकार, स्प्लिट सीड, होल्ड-आउट मीट्रिक और बंडल डाइजेस्ट दर्ज करती है। दूसरी तालिका दर्ज करती है कि हर रन में हर आइटम किस स्प्लिट में था। राइट-बैक वह तालिका पढ़ता है और ऐसे किसी आइटम को कभी प्री-लेबल नहीं करता जिस पर लेजर में बचा कोई रन प्रशिक्षित हुआ (retain_runs डिफ़ॉल्ट रूप से पाँच पूरे रन रखता है)। मॉडल अपने प्रशिक्षित आइटमों पर ऐसे कारणों से आश्वस्त होता है जो नए डेटा के बारे में कुछ नहीं बताते।
बाद के मॉडलों की ठीक उन्हीं आइटमों पर तुलना के लिए, रन के पेज का Keep this split as a dataset रन के validation, test या train आइटम सहमत मानव लेबल के साथ किसी डेटासेट के संस्करण के रूप में सहेजता है। सहेजा गया संस्करण बाद में नहीं बदलता। हर सहेजे संस्करण में एक स्प्लिट होता है और वह पिछले संस्करण में जोड़ने के बजाय शून्य से शुरू होता है। रन 1 के ऊपर सहेजे गए रन 2 के validation आइटमों में वरना वे आइटम शामिल होते जिन पर रन 2 ने प्रशिक्षण लिया। सहेजे संस्करण पर मूल्यांकन मॉडल का उत्तर नहीं पढ़ सकता, क्योंकि सहेजे इनपुट प्री-लेबल फ़ील्ड छोड़ देते हैं। सहेजने के लिए datasets.enabled: true चाहिए। जब मॉडल या डेटासेट प्रोजेक्ट से बाहर जाए, तब डेटासेट और मॉडल का दस्तावेज़ीकरण डेटाशीट और मॉडल कार्ड कवर करता है।
पहले मॉडल को कितना डेटा चाहिए
हर Potato ट्रेनर train स्प्लिट में min_instances से कम आइटम होने पर फ़िट करने से मना करता है। नीचे के डिफ़ॉल्ट वे संख्याएँ हैं जिन पर रन शुरू होता है:
| ट्रेनर | min_instances डिफ़ॉल्ट | टिप्पणी |
|---|---|---|
setfit | 8 | प्रोजेक्ट के शुरुआती दिनों के लिए बना, प्रति लेबल लगभग आठ आइटम से |
sklearn-text | 10 | विश्वास मान केवल 50 प्रशिक्षण आइटम से ऊपर कैलिब्रेट करता है |
hf-audio-tagger | 10 | |
hf-text-classification, hf-token-classification, hf-image-classification | 20 | |
llm-sft, llm-dpo | 20 |
सीमा केवल train स्प्लिट गिनती है। डिफ़ॉल्ट 70/15/15 स्प्लिट पर sklearn-text रन तब शुरू होता है जब लगभग 15 आइटमों पर लेबल हों। Potato की रिपॉज़िटरी का मॉडल प्रशिक्षण उदाहरण एक मापा हुआ बिंदु देता है। उदाहरण की 160 कृत्रिम उत्पाद समीक्षाओं में से 120 पर एक-एक बार लेबल होने पर, एक sklearn-text रन ने validation पर 0.84 macro-F1 स्कोर किया और 80 प्री-लेबल प्रकाशित किए। यह आँकड़ा एक कृत्रिम दो-लेबल कार्य से आया है, और आपके कार्य के लिए पढ़ने वाली संख्या आपके अपने रनों का होल्ड-आउट स्कोर है।
sklearn-text से शुरू करें। ट्रेनर को सामान्य इंस्टॉल के अलावा कुछ नहीं चाहिए और GPU भी नहीं। लेबल आने पर दोबारा प्रशिक्षित करें, और split_seed बिना बदले रन-दर-रन होल्ड-आउट स्कोर देखते रहें। प्री-लेबल एनोटेटरों को एंकर करते हैं। जब तक होल्ड-आउट स्कोर मॉडल के उत्तर दिखाने का समर्थन न करे, writeback.schemas खाली रखें। मॉडल-सहायित लेबलिंग कवर करती है कि एनोटेटरों के प्री-लेबल देखने पर क्या बदलता है, और समीक्षा और रबर-स्टैम्पिंग में अंतर कैसे पहचानें कवर करती है कि कैसे जाँचें कि एनोटेटर अब भी आइटम पढ़ रहे हैं।
हर निर्णय सेट करने वाली config
नीचे की config दो-लेबल भावना स्कीम पर प्रशिक्षित करती है। model_training के नीचे की हर कुंजी ऊपर के निर्णयों में से एक सेट करती है:
annotation_task_name: "Review sentiment"
task_dir: "."
data_files:
- "data/reviews.json"
item_properties:
id_key: "id"
text_key: "text"
output_annotation_dir: "annotation_output"
annotation_schemes:
- annotation_type: "radio"
name: "sentiment"
description: "Is this review positive or negative?"
labels: ["positive", "negative"]
model_training:
enabled: true
aggregation: consensus
split_seed: 0
splits: {train: 0.7, val: 0.15, test: 0.15}
trainer_params:
hf-text-classification:
soft_targets: trueaggregation: consensus ओवरलैपिंग लेबलों को Dawid-Skene से समाधानित करता है। split_seed और splits डिफ़ॉल्ट मानों पर लिखे गए हैं क्योंकि अध्ययन के जीवन भर कोई भी सेटिंग नहीं बदलनी चाहिए। soft_targets: true प्रोजेक्ट पर चलने वाले हर hf-text-classification रन को मत-विभाजन पर प्रशिक्षित कराता है। उस ट्रेनर को pip install "potato-annotation[train-text]" चाहिए, और sklearn-text उसी config पर बिना अतिरिक्त इंस्टॉल के चलता है। writeback ब्लॉक के बिना एनोटेटर कोई प्री-लेबल नहीं देखते। config के साथ सर्वर पुनः आरंभ करें, /admin/training खोलें, ट्रेनर और sentiment स्कीम चुनें, और Train now पर क्लिक करें। मॉडल प्रशिक्षण config संदर्भ हर कुंजी सूचीबद्ध करता है, और चक्र में मॉडल ट्यूटोरियल राइट-बैक और स्वचालित दोबारा प्रशिक्षण जोड़ता है।
आगे पढ़ें
- मॉडल प्रशिक्षण का अवलोकन
- अपना पहला मॉडल प्रशिक्षित करें
- मॉडल-सहायित लेबलिंग
- मशीन लर्निंग के लिए एनोटेशन निर्यात करना
- क्राउड लेबल का एकत्रीकरण
- अंतर-एनोटेटर सहमति
- GitHub पर मॉडल प्रशिक्षण संदर्भ, हर स्कीम प्रकार के होल्ड-आउट मीट्रिक के साथ
संदर्भ
- Dawid, A. P., and Skene, A. M. (1979). Maximum Likelihood Estimation of Observer Error-Rates Using the EM Algorithm. Applied Statistics, 28(1), 20. doi.org/10.2307/2346806
- Uma, A. N., Fornaciari, T., Hovy, D., Paun, S., Plank, B., and Poesio, M. (2021). Learning from Disagreement: A Survey. Journal of Artificial Intelligence Research, 72, 1385–1470. doi.org/10.1613/jair.1.12752