सामग्री पर जाएं

अपने एनोटेशन से अपना पहला मॉडल प्रशिक्षित करें

Potato का नमूना समीक्षा अध्ययन बिना GPU के लैपटॉप पर चलाएँ, सिमुलेटर से 120 समीक्षाओं पर लेबल लगवाएँ, sklearn-text प्रशिक्षित करें, और मॉडल के प्री-लेबल देखें।

v2.14.0 में नया

यह ट्यूटोरियल एक नमूना अध्ययन के अपने लेबलों पर भावना वर्गीकारक प्रशिक्षित करता है और वर्गीकारक के उत्तर अगले एनोटेटर को प्री-लेबल के रूप में दिखाता है। ट्यूटोरियल उस अध्ययन स्वामी के लिए लिखा गया है जो Potato के मॉडल प्रशिक्षण को पहली बार आज़मा रहा है, और हर चरण बिना GPU के लैपटॉप पर चलता है, जिसमें Potato के अलावा कुछ इंस्टॉल नहीं करना पड़ता। आप Potato का नमूना समीक्षा प्रोजेक्ट शुरू करते हैं, यूज़र सिमुलेटर से प्रोजेक्ट की 160 में से 120 समीक्षाओं पर लेबल लगवाते हैं, एडमिन Training पेज से sklearn-text प्रशिक्षित करते हैं, रन का होल्ड-आउट स्कोर पढ़ते हैं, और नए एनोटेटर के रूप में लॉगिन करके मॉडल के उत्तर देखते हैं। चक्र का हर हिस्सा सामान्य रूप से क्या करता है, यह जानने के लिए मॉडल प्रशिक्षण का अवलोकन देखें।

Potato और उदाहरण प्रोजेक्ट इंस्टॉल करना

ट्यूटोरियल sklearn-text का उपयोग करता है, जो हर समीक्षा को TF-IDF फ़ीचर में बदलता है और एक लॉजिस्टिक रिग्रेशन वर्गीकारक फ़िट करता है। sklearn-text को अतिरिक्त इंस्टॉल की ज़रूरत नहीं है, क्योंकि scikit-learn Potato की मूल निर्भरताओं में से एक है। नमूना प्रोजेक्ट pip पैकेज में नहीं, Potato की GitHub रिपॉज़िटरी में है, इसलिए Potato इंस्टॉल करें और रिपॉज़िटरी क्लोन करें:

bash
pip install --upgrade potato-annotation
git clone https://github.com/davidjurgens/potato.git
cd potato

नीचे का हर कमांड रिपॉज़िटरी की रूट से चलता है। प्रोजेक्ट फ़ोल्डर examples/ai-assisted/model-training/ में तीन फ़ाइलें हैं:

  • config.yaml अध्ययन की config है, और इस ट्यूटोरियल के कमांड उसकी टिप्पणियों में हैं।
  • data/reviews.json में 160 कृत्रिम उत्पाद समीक्षाएँ हैं, हर पंक्ति में एक JSON ऑब्जेक्ट, जिसमें id और text हैं।
  • data/gold.json हर समीक्षा का सही लेबल देती है। सिमुलेटर इसी फ़ाइल से उत्तर देता है।

उदाहरण config

config एक radio स्कीम sentiment परिभाषित करती है, जिसमें लेबल positive और negative हैं, और मॉडल प्रशिक्षण चालू करती है। नीचे का ब्लॉक टिप्पणियाँ हटाई हुई शिप की गई फ़ाइल है, और फ़ाइल बिना बदलाव python -m potato.validate_cli --strict पास करती है:

yaml
annotation_task_name: "Review Sentiment (model training demo)"
 
data_files:
  - "data/reviews.json"
 
item_properties:
  id_key: "id"
  text_key: "text"
 
task_dir: "."
output_annotation_dir: "annotation_output"
 
require_password: false
admin_api_key: "demo-admin-key"
 
num_annotators_per_item: 1
 
annotation_schemes:
  - annotation_type: "radio"
    name: "sentiment"
    description: "Is this review positive or negative?"
    labels:
      - "positive"
      - "negative"
    sequential_key_binding: true
 
model_training:
  enabled: true
  writeback:
    schemas: ["sentiment"]
    include_unlabeled: true
    min_confidence: 0.6

चार सेटिंग ट्यूटोरियल को आकार देती हैं:

  • num_annotators_per_item: 1 हर समीक्षा को एक लेबल देता है। 40-40 समीक्षाओं वाले तीन सिमुलेटेड एनोटेटर तब 120 अलग समीक्षाएँ कवर करते हैं और 40 को मॉडल के लिए बिना लेबल छोड़ देते हैं।
  • require_password: false नए एनोटेटर को केवल उपयोगकर्ता नाम से लॉगिन करने देता है। अंतिम चरण इसी तरह लॉगिन करता है।
  • admin_api_key: "demo-admin-key" एडमिन पेज खोलता है। जिस सर्वर तक दूसरे लोग पहुँच सकते हैं, उस पर कुंजी बदल दें।
  • model_training /admin/training रूट पंजीकृत करता है। writeback ब्लॉक sentiment स्कीम की भविष्यवाणियाँ एनोटेटरों को दिखाता है, और नीचे राइट-बैक का अनुभाग हर कुंजी समझाता है।

पोर्ट 8000 पर सर्वर शुरू करना

उदाहरण config के साथ Potato शुरू करें:

bash
potato start examples/ai-assisted/model-training/config.yaml -p 8000

सर्वर 160 समीक्षाएँ लोड करता है और http://localhost:8000 पर एनोटेशन पेज परोसता है। यदि आपकी मशीन पर पोर्ट 8000 लिया हुआ है, तो -p को दूसरा पोर्ट दें और नीचे के हर URL में वही पोर्ट इस्तेमाल करें।

सिमुलेटर से 120 समीक्षाओं पर लेबल लगाना

मॉडल को सीखने के लिए मानव लेबल चाहिए। यूज़र सिमुलेटर तीन एनोटेटरों की जगह लेता है। हर सिमुलेटेड एनोटेटर गोल्ड फ़ाइल से उत्तर देता है और ज़्यादातर उत्तर सही देता है। सिमुलेटर को दूसरे टर्मिनल में, रिपॉज़िटरी की रूट से चलाएँ:

bash
python -m potato.simulator --server http://localhost:8000 --users 3 \
  --strategy gold_standard --competence good=1.0 --max-annotations 40 \
  --gold-file examples/ai-assisted/model-training/data/gold.json \
  --sequential --fast-mode --no-export

--strategy gold_standard हर सिमुलेटेड एनोटेटर से gold.json में से उत्तर दिलवाता है, और --competence good=1.0 तीनों एनोटेटरों को सिमुलेटर की good प्रोफ़ाइल देता है। good एनोटेटर 0.80 से 0.90 के बीच एक सटीकता चुनता है और उसी प्रायिकता से हर समीक्षा का उत्तर सही देता है। इसलिए लेबलों में त्रुटियाँ होती हैं, जैसी किसी असली टीम के लेबलों में होती हैं। --sequential तीनों एनोटेटरों को एक के बाद एक चलाता है, --fast-mode उत्तरों के बीच का ठहराव हटा देता है, और --no-export सिमुलेटर की अपनी परिणाम फ़ाइलें लिखना छोड़ देता है। सिमुलेटर लगभग दो सेकंड में पूरा होता है और सारांश के साथ खत्म होता है। आगे बढ़ने से पहले जाँच लें कि सारांश में Total annotations: 120 दिखता है। आप http://localhost:8000 पर समीक्षाओं पर हाथ से भी लेबल लगा सकते हैं। train स्प्लिट में 10 से कम लेबल किए गए आइटम हों तो sklearn-text फ़िट करने से मना कर देता है।

एडमिन कुंजी से Training पेज खोलना

Training पेज को एडमिन सत्र चाहिए। http://localhost:8000/admin खोलें, पेज के API कुंजी माँगने पर demo-admin-key दर्ज करें, और फिर http://localhost:8000/admin/training खोलें।

Potato का Training पेज, जिसमें sklearn-text, sentiment स्कीम और local बैकएंड चुने हैं, और उसके ऊपर Runs तालिका में दो पूरे हुए रन 0.847 और 0.840 के होल्ड-आउट स्कोर के साथ सूचीबद्ध हैंनमूना प्रोजेक्ट पर दो sklearn-text रन के बाद Training पेज

सबसे ऊपर का Start a run पैनल पूरा सेटअप रखता है। Schema प्रोजेक्ट की एकमात्र स्कीम sentiment (radio) सूचीबद्ध करता है। Trainer सभी 38 ट्रेनर सूचीबद्ध करता है, और जो ट्रेनर प्रोजेक्ट नहीं चला सकता उसके नाम के पास कारण लिखा होता है, जैसे "not installed"। पेज sklearn-text तब चुन लेता है जब sklearn-text स्कीम के अनुकूल हो। Runs on प्रोजेक्ट का एकमात्र बैकएंड local (this machine) दिखाता है।

sklearn-text प्रशिक्षित करना

ट्रेनर के डिफ़ॉल्ट इस्तेमाल करने के लिए Parameters खाली छोड़ें और Train now पर क्लिक करें। रन एनोटेशनों को हर समीक्षा के एक लेबल में समाधानित करता है, 120 लेबल की गई समीक्षाओं को train, val और test सेट में बाँटता है, और मॉडल को एक अलग प्रोसेस में फ़िट करता है। हमारे रन में 1.5 सेकंड लगे, और रन पूरा होने पर पैनल ने "Run finished." दिखाया।

sklearn-text फ़ीचर के लिए डिफ़ॉल्ट रूप से scikit-learn का TfidfVectorizer और वर्गीकारक के लिए LogisticRegression इस्तेमाल करता है। train स्प्लिट में 50 या अधिक आइटम होने पर sklearn-text वर्गीकारक के विश्वास मानों को कैलिब्रेट भी करता है। कैलिब्रेशन 1,000 प्रशिक्षण आइटम से कम पर Platt स्केलिंग और 1,000 आइटम से आइसोटोनिक रिग्रेशन इस्तेमाल करता है। कैलिब्रेट किया हुआ मॉडल तभी रखा जाता है जब कैलिब्रेशन से प्रशिक्षण सटीकता 0.05 से अधिक न गिरे। कैलिब्रेशन यहाँ इसलिए मायने रखता है कि राइट-बैक का चरण हर विश्वास मान की तुलना min_confidence से करता है।

वही रन किसी स्क्रिप्ट से शुरू करने के लिए एडमिन कुंजी X-API-Key हेडर में भेजें:

bash
curl -X POST -H "X-API-Key: demo-admin-key" -H "Content-Type: application/json" \
  http://localhost:8000/admin/training/api/runs \
  -d '{"trainer": "sklearn-text", "schemas": ["sentiment"]}'

प्रतिक्रिया में नया run_id और "started": true होता है।

रन का पेज और होल्ड-आउट स्कोर

पूरा हुआ रन Runs तालिका में अपने train और val आकार और अपने Held-out score के साथ दिखता है। रन का पेज /admin/training/runs/<run_id> पर खोलने के लिए रन ID पर क्लिक करें। रन का पेज रन की स्थिति, ट्रेनर, बैकएंड, स्प्लिट के आकार, स्प्लिट सीड, होल्ड-आउट स्कोर और पैरामीटर सूचीबद्ध करता है, फिर हर मीट्रिक की तालिका और रन का लॉग।

रन डिफ़ॉल्ट रूप से लेबल किए गए आइटम का 15% val के लिए और 15% test के लिए होल्ड-आउट रखता है, और split_seed तय करता है कि कौन-सा आइटम कहाँ जाए। split_seed का मान वही रहने तक स्प्लिट रन-दर-रन वही रहता है, इसलिए एक ही लेबल पर दो रन एक ही आइटम पर स्कोर होते हैं। sklearn-text रन का होल्ड-आउट स्कोर val पर macro-F1 है। Macro-F1 हर लेबल के F1 स्कोर का औसत है, यहाँ positive और negative का। रन test पर सटीकता और macro-F1 भी दर्ज करता है। train स्प्लिट की सटीकता train_accuracy के रूप में दर्ज होती है और स्कोर के रूप में कभी इस्तेमाल नहीं होती। हमारे रन में लॉग यह था:

text
[info] Read 76 labelled rows from the train split
[info] Applied sigmoid calibration over 5 folds
[info] Held-out val macro_f1: 0.725

Potato के अपने दस्तावेज़ इसी प्रोजेक्ट पर एक रन की रिपोर्ट देते हैं, और तालिका उस रन को हमारे रन के साथ रखती है:

Potato के दस्तावेज़हमारा रन
लेबल की गई समीक्षाएँ120120
Train, val और test आइटमनहीं बताए गए76, 19 और 25
होल्ड-आउट स्कोर (val macro-F1)0.840.725
Test macro-F1नहीं बताया गया0.826
प्रकाशित प्री-लेबल8073
min_confidence से कम भविष्यवाणियाँ411

आपके आँकड़े दोनों स्तंभों से अलग होंगे, क्योंकि हर सिमुलेटेड एनोटेटर यादृच्छिक रूप से एक सटीकता चुनता है और अलग गलतियाँ करता है। हमारे रन में सिमुलेटेड लेबल 120 में से 97 समीक्षाओं पर और 19 val समीक्षाओं में से 15 पर gold.json से मेल खाए। होल्ड-आउट स्कोर आपके एनोटेटरों के लेबल से सहमति मापता है, किसी उत्तर कुंजी से नहीं, इसलिए val में एनोटेटर की गलतियाँ स्कोर घटाती हैं। हमारे रन के प्रकाशित किए सभी 73 प्री-लेबल gold.json से मेल खाए। गोल्ड फ़ाइल के बिना असली अध्ययन में, कम होल्ड-आउट स्कोर पढ़ने पर मॉडल को दोष देने से पहले एनोटेटरों की सहमति जाँचें।

स्कीम के लिए राइट-बैक चालू करना

किसी रन की भविष्यवाणियाँ एनोटेटरों तक केवल राइट-बैक से पहुँचती हैं। उदाहरण config sentiment स्कीम के लिए राइट-बैक पहले से चालू करती है। अपने प्रोजेक्ट के लिए config में model_training के नीचे यह ब्लॉक जोड़ें और सर्वर पुनः आरंभ करें:

yaml
model_training:
  enabled: true
  writeback:
    schemas: ["sentiment"]
    include_unlabeled: true
    min_confidence: 0.6

writeback.schemas उन स्कीमों के नाम देता है जिनकी भविष्यवाणियाँ एनोटेटर देखते हैं। यह सूची डिफ़ॉल्ट रूप से खाली होती है, इसलिए प्रशिक्षण चालू करने से एनोटेशन पेज पर तब तक कुछ नहीं बदलता जब तक आप कोई स्कीम नामित न करें। include_unlabeled: true हर रन को val और test समीक्षाओं के साथ उन समीक्षाओं पर भी भविष्यवाणी करवाता है जिन पर किसी ने लेबल नहीं लगाया। include_unlabeled के बिना रन केवल val और test समीक्षाओं पर भविष्यवाणी करता है, और उन पर पहले से मानव लेबल होता है। min_confidence: 0.6 किसी भविष्यवाणी को एनोटेशन पेज से बाहर रखता है जब मॉडल का विश्वास 0.6 से कम हो। Potato फिर भी भविष्यवाणी को सहेजता है।

राइट-बैक हर सफल रन के बाद चलता है और रन के train स्प्लिट के किसी भी आइटम को छोड़ देता है। हमारे रन में मॉडल ने 84 समीक्षाओं पर भविष्यवाणी की (19 val, 25 test और 40 बिना लेबल वाली), 11 भविष्यवाणियाँ 0.6 से नीचे रहीं, और रन ने बाकी 73 प्रकाशित कीं। GET /admin/training/api/status का writeback फ़ील्ड यही गिनतियाँ देता है, सारांश "Published 73 prediction(s) as prelabels." के साथ। सहेजी गई भविष्यवाणियाँ सर्वर शुरू होने पर फिर से राइट-बैक होती हैं, इसलिए प्री-लेबल पुनः आरंभ के बाद भी बने रहते हैं। किसी रन के प्री-लेबल आइटमों से हटाने के लिए DELETE /admin/training/api/runs/<run_id>/predictions भेजें।

नए एनोटेटर को दिखने वाला प्री-लेबल

किसी प्राइवेट ब्राउज़र विंडो में http://localhost:8000 खोलें और ऐसे उपयोगकर्ता नाम से लॉगिन करें जो किसी ने इस्तेमाल न किया हो, जैसे newannotator। हर लेबल की गई समीक्षा के पास अपना एक लेबल पहले से है, इसलिए नए एनोटेटर को 40 बिना लेबल वाली समीक्षाएँ मिलती हैं, और हमारे रन में प्रगति काउंटर 0/40 दिखा रहा था। हमारी पहली समीक्षा "The toaster: Disappointed, it stopped working within a week. Much smaller than the photos suggest." थी, जिसमें Negative 0.68 के विश्वास पर पहले से चुना था।

एक टोस्टर समीक्षा का Potato एनोटेशन पेज, जिसमें मॉडल ने Positive विकल्प पहले से चुना है और आइटम अब भी Not labeled चिह्नित हैवह समीक्षा जो मॉडल के चुने उत्तर के साथ खुलती है, इससे पहले कि एनोटेटर कुछ सहेजे

जब तक एनोटेटर केवल समीक्षा देख रहा है, प्री-लेबल सहेजा नहीं जाता, और स्थिति चिप तब तक "Not labeled" दिखाती है जब तक एनोटेटर कोई उत्तर न सहेजे। एनोटेटर के चयन बदलने या Next पर क्लिक करने पर मॉडल का उत्तर एनोटेटर का उत्तर बन जाता है। हमारे रन में जिन 5 बिना लेबल वाली समीक्षाओं की भविष्यवाणी min_confidence से कम रही, वे कुछ भी चुने बिना खुलीं। जिस एनोटेटर को ai_support.holdout से मशीनी मदद से बाहर रखा गया है, उसे कोई प्री-लेबल नहीं दिखता। प्री-लेबल एनोटेटरों को मॉडल के उत्तर की ओर खींचते हैं, इसलिए राइट-बैक तब चालू करें जब होल्ड-आउट स्कोर भरोसे लायक ऊँचा हो, और हर प्री-लेबल को स्वीकार कर लेने वाले एनोटेटरों पर बिना सोचे स्वीकार किए गए प्री-लेबल की पहचान की जाँचों से नज़र रखें।

अगले कदम

अपने डेटा पर जाने से पहले यही प्रोजेक्ट कुछ और प्रयोगों को सहारा देता है:

  • पैरामीटर बदलें। Parameters में {"vectorizer_kwargs": {"ngram_range": [1, 2]}} लिखें और फ़ीचर में शब्द-युग्म जोड़ने के लिए फिर प्रशिक्षित करें। शब्द-युग्मों वाले हमारे दूसरे रन ने उसी स्प्लिट पर 0.774 val macro-F1 स्कोर किया और 74 प्री-लेबल प्रकाशित किए। जो पैरामीटर नाम sklearn-text नहीं लेता, उसे ट्रेनर के लिए मान्य नामों की सूची के साथ अस्वीकार कर दिया जाता है।
  • ट्रांसफ़ॉर्मर आज़माएँ। hf-text-classification (pip install "potato-annotation[train-text]") और setfit (pip install "potato-annotation[embeddings]") यही स्कीम सीखते हैं, और ट्रेनर पेज हर ट्रेनर के पैरामीटर देता है।
  • चक्र बंद करें। चक्र में मॉडल समीक्षा कतार, auto_retrain से एनोटेशन आने के साथ दोबारा प्रशिक्षण, और रन के स्प्लिट को डेटासेट संस्करण के रूप में सहेजना जोड़ता है।
  • प्रशिक्षण GPU पर ले जाएँ। GPU सर्वर, SLURM क्लस्टर या NAT के पीछे की मशीन पर प्रशिक्षण वही रन दूसरी मशीन पर भेजता है।
  • दूसरे तरह के मॉडल प्रशिक्षित करें। LLM को फ़ाइन-ट्यून करने, विज़न मॉडल, ऑडियो मॉडल और विज्ञान के मॉडल के ट्यूटोरियल दूसरे ट्रेनरों और स्कीमों के साथ यही चरण दोहराते हैं।

यहाँ इस्तेमाल हुई हर कुंजी मॉडल प्रशिक्षण config संदर्भ में सूचीबद्ध है। अपने प्रोजेक्ट का पहला रन शुरू करने के लिए ऊपर का model_training ब्लॉक अपनी config में कॉपी करें और writeback.schemas में अपनी स्कीम का नाम दें।

आगे पढ़ें