AI रिसर्च कैसे करेंमध्यमपाठ 3269 मिनट का पाठ

एक साफ़-सुथरा एक्सपेरिमेंट डिज़ाइन करना

एक अच्छा एक्सपेरिमेंट किसी एक साफ़ सवाल का निष्पक्ष जवाब देता है। छोटे से Python उदाहरण के साथ hypotheses, baselines, ablations, random seeds और साफ़ data splits के बारे में सीखें।

पाठ वीडियो में

60 सेकंड में

एक साफ़-सुथरा एक्सपेरिमेंट डिज़ाइन करना

एक अच्छा एक्सपेरिमेंट किसी एक साफ़ सवाल का निष्पक्ष जवाब देता है। छोटे से Python उदाहरण के साथ hypotheses, baselines, ablations, random seeds और साफ़ data splits के बारे में सीखें।

1/6
आसान शब्दों में
दो दोस्त इस बात पर बहस करते हैं कि क्या कोई नई खाद फ़ायदेमंद है या नहीं। अगर एक उसे धूप वाले खेत में लगाता है और दूसरा उसके बिना किसी छाया वाले खेत में लगाता है, तो यह टेस्ट आपको कुछ नहीं बताता। एक निष्पक्ष टेस्ट में एक जैसा खेत, एक जैसे बीज और एक जैसा पानी इस्तेमाल होता है। सिर्फ़ खाद बदलती है। एक साफ़-सुथरा AI एक्सपेरिमेंट भी इसी तरह का एक निष्पक्ष टेस्ट होता है।
एक एक्सपेरिमेंट एक योजनाबद्ध टेस्ट होता है जो किसी सवाल का जवाब देता है। AI रिसर्च में यह सवाल अक्सर होता है "क्या मेरे बदलाव से मॉडल बेहतर बनता है, और क्यों?"। एक साफ़-सुथरा एक्सपेरिमेंट ऐसा जवाब देता है जिस पर आप और दूसरे लोग भरोसा कर सकें। एक गड़बड़ एक्सपेरिमेंट ऐसा नंबर देता है जो जवाब जैसा तो दिखता है, लेकिन वह महज़ शोर या कोई ग़लती हो सकता है।

1. एक hypothesis से शुरुआत करें

एक hypothesis एक साफ़ और टेस्ट करने लायक अंदाज़ा होती है। कुछ भी चलाने से पहले इसे लिख लें। यह भी लिखें कि किस नतीजे से आप ग़लत साबित होंगे।
अस्पष्ट
  • "मेरा तरीक़ा बेहतर है।"
  • "देखते हैं data augmentation से क्या होता है।"
टेस्ट करने लायक
  • "बैक-ट्रांसलेशन डेटा जोड़ने से हमारे test set पर हिंदी-से-अंग्रेज़ी accuracy बेहतर होती है, उसकी तुलना में जब वही मॉडल इसके बिना हो।"
  • "अगर 5 seeds में औसत बढ़त (mean gain) seeds के फैलाव (spread) से कम है, तो मैं यह मानूँगा कि इससे साफ़ तौर पर कोई फ़ायदा नहीं होता।"

2. निष्पक्ष baselines चुनें

एक baseline वह होती है जिससे आप तुलना करते हैं। कम से कम एक आसान baseline (उदाहरण के लिए, हमेशा सबसे कॉमन क्लास का अनुमान लगाना) और एक मज़बूत baseline (एक जाना-माना अच्छा तरीक़ा) इस्तेमाल करें। baselines को एक निष्पक्ष मौक़ा दें: उन्हें अपनी विधि जितनी ही मेहनत और उतने ही बजट के साथ ट्यून करें।

3. ablations की योजना बनाएँ

अगर आपके तरीक़े में तीन नए हिस्से हैं, तो एक-एक करके हर हिस्से को हटाएँ। इसे ablation कहते हैं। इससे पता चलता है कि असल में कौन सा हिस्सा मदद करता है। कभी-कभी नतीजा हैरान करने वाला होता है: एक हिस्सा ही सारा काम करता है और बाक़ी कुछ भी नहीं जोड़ते।
रनहिस्सा Aहिस्सा Bहिस्सा Cयह आपको क्या बताता है
पूरा तरीक़ाचालूचालूचालूमुख्य नतीजा
बिना A केबंदचालूचालूA का कितना योगदान है
बिना B केचालूबंदचालूB का कितना योगदान है
बिना C केचालूचालूबंदC का कितना योगदान है
Baselineबंदबंदबंदजहाँ से आपने शुरुआत की थी

4. train, validation और test को अलग-अलग रखें

  • Training set: मॉडल इससे सीखता है।
  • Validation set: आप इसका इस्तेमाल सेटिंग्स चुनने के लिए करते हैं, जैसे कि learning rate या कब रुकना है।
  • Test set: आप आख़िर में अंतिम नंबर रिपोर्ट करने के लिए इसे सिर्फ़ एक बार देखते हैं।
ख़तरा
अगर आप सेटिंग्स चुनते समय बार-बार test set की जाँच करते हैं, तो आपका टेस्ट स्कोर ज़रूरत से ज़्यादा अच्छा दिखने लगता है। तब यह यह नहीं मापता कि मॉडल सचमुच नए डेटा पर कैसा काम करता है। साथ ही leakage की भी जाँच करें: train और test दोनों में एक जैसे या लगभग डुप्लिकेट उदाहरण होना, या ट्रेनिंग डेटा में भविष्य की जानकारी होना।

5. कई random seeds चलाएँ

एक random seed किसी रन में रैंडम चॉइस तय करता है: शुरुआती weights, डेटा का क्रम, और कभी-कभी data split। seed बदलने पर नतीजा थोड़ा बदल जाता है, भले ही कोई दूसरा बदलाव न किया गया हो। इसलिए सिर्फ़ एक रन से यह पता नहीं चल सकता कि थोड़ी सी बढ़त असली है या नहीं। कई seeds चलाएँ, फिर mean (औसत) और standard deviation (नतीजे कितने फैले हुए हैं) रिपोर्ट करें।
नीचे दिया गया उदाहरण काल्पनिक डेटा पर एक आसान baseline की तुलना एक छोटे logistic regression मॉडल से करता है। यह validation set पर learning rate चुनता है, हर seed के लिए test set को सिर्फ़ एक बार इस्तेमाल करता है, और mean तथा standard deviation रिपोर्ट करता है। यह केवल Python standard library का इस्तेमाल करता है।
seed_experiment.py: an experiment across seedspython
import math
import random
import statistics


def make_data(rng, n=400, noise=1.2):
    """Two overlapping clouds of points. Label 1 sits up and right."""
    rows = []
    for _ in range(n):
        y = rng.randint(0, 1)
        c = 1.0 if y == 1 else -1.0
        rows.append(((rng.gauss(c, noise), rng.gauss(0.5 * c, noise)), y))
    return rows


def split(rows, rng):
    rows = rows[:]
    rng.shuffle(rows)
    a, b = int(0.6 * len(rows)), int(0.8 * len(rows))
    return rows[:a], rows[a:b], rows[b:]   # train, validation, test


def train_logreg(train, rng, lr, epochs=20):
    w1, w2, bias = rng.gauss(0, 0.1), rng.gauss(0, 0.1), 0.0
    train = train[:]
    for _ in range(epochs):
        rng.shuffle(train)
        for (x1, x2), y in train:
            z = max(-30.0, min(30.0, w1 * x1 + w2 * x2 + bias))
            g = 1 / (1 + math.exp(-z)) - y
            w1, w2, bias = w1 - lr * g * x1, w2 - lr * g * x2, bias - lr * g
    return lambda x: 1 if w1 * x[0] + w2 * x[1] + bias > 0 else 0


def majority_baseline(train):
    guess = 1 if 2 * sum(y for _, y in train) >= len(train) else 0
    return lambda x: guess


def accuracy(model, rows):
    return sum(model(x) == y for x, y in rows) / len(rows)


def run_once(seed):
    rng = random.Random(seed)
    train, val, test = split(make_data(rng), rng)
    # Choose the learning rate on VALIDATION data only.
    best_lr = max([0.001, 0.01, 0.1],
                  key=lambda lr: accuracy(train_logreg(train, random.Random(seed), lr), val))
    model = train_logreg(train, random.Random(seed), best_lr)
    # Touch the TEST set once, at the very end.
    return accuracy(majority_baseline(train), test), accuracy(model, test), best_lr


SEEDS = [0, 1, 2, 3, 4]
base, ours = [], []
for s in SEEDS:
    b, m, lr = run_once(s)
    base.append(b)
    ours.append(m)
    print(f"seed {s}: baseline {b:.3f}  model {m:.3f}  (lr chosen on val: {lr})")

print(f"baseline: {statistics.mean(base):.3f} +/- {statistics.stdev(base):.3f}")
print(f"model:    {statistics.mean(ours):.3f} +/- {statistics.stdev(ours):.3f}")
print(f"runs per setting: {len(SEEDS)} (std is the sample standard deviation)")
इसे चलाएँ और हर seed वाली लाइनों को देखें। मॉडल की accuracy एक seed से दूसरे seed में बदल जाती है, भले ही कुछ और न बदला हो। यहाँ तक कि चुना गया learning rate भी बदल सकता है। यह फैलाव वही चीज़ है जिसे सिर्फ़ एक भाग्यशाली रन छुपा लेता।
नोट
यहाँ seed, data split और ट्रेनिंग दोनों को बदलता है। किसी असली प्रोजेक्ट में आप अक्सर data split को तय रखते हैं और सिर्फ़ ट्रेनिंग seed को बदलते हैं, या फिर दोनों को बदलते हैं और इसका ज़िक्र करते हैं। दोनों ही तरीक़े ठीक हैं, जब तक कि आप यह रिपोर्ट करें कि आपने क्या किया। ज़्यादा seeds बेहतर तस्वीर देते हैं; अगर सिर्फ़ कुछ ही seeds हैं, तो standard deviation को एक मोटे अंदाज़े की तरह लें।

6. नतीजे देखने से पहले अपनी योजना लिख लें

  1. 1

    Hypothesis

    एक वाक्य, और साथ में वह बात जिससे यह ग़लत साबित हो सकती है।
  2. 2

    Setup

    डेटा, split, metric, baselines, ablations।
  3. 3

    Budget

    कितने seeds और सेटिंग्स, और सेटिंग्स कैसे चुनी जाती हैं (सिर्फ़ validation से)।
  4. 4

    रन करें और लॉग करें

    लैब नोटबुक में हर रन, असफल वाले भी।
  5. 5

    सब कुछ रिपोर्ट करें

    Mean, फैलाव (spread), seeds की संख्या, और वे नतीजे भी जो आपके मनमुताबिक नहीं रहे।
सावधान रहें
कई seeds चलाना और सिर्फ़ सबसे अच्छे वाले को रिपोर्ट करना cherry-picking का एक रूप है। इसी तरह कई metrics आज़माना और सिर्फ़ उसी को रिपोर्ट करना जो अच्छा दिखे, वह भी cherry-picking है। अपना metric और seeds की संख्या पहले से तय करें, और हर रन की रिपोर्ट दें।
यह आज़माएँ। उदाहरण में noise=1.2 को बदलकर noise=2.0 करें और इसे फिर से चलाएँ। mean और spread का क्या होता है? इसके कारण के बारे में एक वाक्य लिखें।

और देखें और पढ़ें

लैब

एक छोटी seed-variance स्टडी जो दिखाती है कि क्या कोई बदलाव वाकई मदद करता है, mean, spread और प्रति-seed अंतरों के साथ।

~35 min

समस्या

स्टार्टर कोड को seed_lab.py के रूप में सेव करें और इसे Python 3 (केवल standard library) के साथ चलाएं। यह एक ही छोटे मॉडल की दो सेटिंग्स, A और B की तुलना करता है।

  1. इसे NUM_SEEDS = 1 के साथ चलाएं। लिखें कि इस एक रन से आप क्या नतीजा निकालेंगे।
  2. इसे बदलकर NUM_SEEDS = 5, फिर 20 करें। means, standard deviations, और wins, losses व ties को लिखें।
  3. अब SETTING_B को {"epochs": 30} और SETTING_A को {"epochs": 1} में बदलें, और 20 seeds के साथ दोहराएं।
  4. हर तुलना के लिए एक ईमानदार वाक्य लिखें: क्या B साफ़ तौर पर बेहतर है, साफ़ तौर पर बदतर है, या साफ़ नहीं है? इसे सही ठहराने के लिए spread का इस्तेमाल करें।

प्रैक्टिस लैब

कोड में बदलाव करें और इसे रन करें। Python आपके ब्राउज़र में चलता है — हमारे सर्वर पर कुछ नहीं भेजा जाता।

आउटपुट

कोई आउटपुट नहीं। वैल्यूज़ देखने के लिए print(...) जोड़ें।

आपका काम तब पूरा होगा जब

कठिन सवाल

उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।

Q1स्टार्टर कोड A और B के लिए एक ही seeds का इस्तेमाल क्यों करता है और प्रति-seed अंतरों को क्यों देखता है?दिखाएं

एक ही seed के साथ, A और B एक ही डेटा और एक ही शुरुआती पॉइंट देखते हैं, इसलिए ज़्यादातर रैंडम नॉइज़ (noise) साझा होती है। ऐसे में प्रति-seed अंतर दो अलग-अलग averages की तुलना करने की तुलना में सेटिंग के असर को ज़्यादा साफ़ दिखाता है। इसे paired comparison कहा जाता है।

Q220 seeds के साथ, B 11 पर जीतता है और 9 पर हारता है। एक दोस्त कहता है "B ज़्यादा बार जीतता है, इसलिए यह बेहतर है"। आप क्या कहेंगे?दिखाएं

11 बनाम 9 उस नतीजे के बहुत करीब है जो A और B के बराबर होने पर सिर्फ़ तुक्के से आ सकता है। अंतरों के साइज़ और spread को भी देखें। जब तक कि ज़्यादा seeds या कोई सही statistical टेस्ट कुछ और न साबित कर दे, तब तक ईमानदार निष्कर्ष यही होगा कि "कोई साफ़ अंतर नहीं है"।

जारी रखने के लिए कृपया साइन इन करें।

अक्सर पूछे जाने वाले सवाल

कितने seeds काफ़ी होते हैं?

इसकी कोई एक तय संख्या नहीं है। ज़्यादा seeds साफ़ तस्वीर देते हैं, लेकिन हर एक में compute खर्च होता है। कई छोटे अध्ययनों में मुट्ठी भर seeds का इस्तेमाल होता है। सबसे अहम बात यह है कि एक से ज़्यादा इस्तेमाल करें, यह बताएं कि कितने किए, और spread दिखाएँ। अगर तरीक़ों के बीच का फ़र्क spread की तुलना में छोटा है, तो कोई भी दावा करने से पहले और seeds चलाएँ।

क्या मेरा तरीक़ा बेहतर है, यह साबित करने के लिए standard deviation काफ़ी नहीं है?

यह शुरुआत में जाँचने का एक अच्छा तरीक़ा है, कोई सबूत नहीं। अगर दोनों रेंज काफ़ी हद तक एक-दूसरे के ऊपर आ रही हैं, तो आप साफ़ जीत का दावा नहीं कर सकते। मज़बूत दावों के लिए, दोनों तरीक़ों के लिए एक ही seeds का इस्तेमाल करें और हर seed के अंतर को देखें, या किसी सही statistical test का उपयोग करें। एक स्टैटिस्टिक्स की किताब या शिक्षक इसे चुनने में आपकी मदद कर सकते हैं।

अगर मेरे पास कोई validation set न हो तो क्या करें?

एक बना लें। काम शुरू करने से पहले अपने ट्रेनिंग डेटा का एक हिस्सा अलग कर लें, और उस पर कभी ट्रेन न करें। अगर डेटा बहुत कम है, तो cross-validation (बारी-बारी से अलग-अलग हिस्से को बचा कर रखना) एक आम विकल्प है।

क्या मुझे असफल एक्सपेरिमेंट्स की भी रिपोर्ट देनी चाहिए?

अपनी लैब नोटबुक में तो हमेशा। किसी पेपर में, उन एक्सपेरिमेंट्स की रिपोर्ट दें जो पाठक के लिए मायने रखते हैं, जैसे कि वे ablations जिनसे कोई मदद नहीं मिली या ऐसी सेटिंग्स जहाँ आपका तरीक़ा पिछड़ जाता है। इससे आपके काम पर भरोसा बढ़ता है, घटता नहीं।

पाठ का टेस्ट

5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।

टेस्ट देने और अपनी प्रोग्रेस सेव करने के लिए साइन इन करें