एक साफ़-सुथरा एक्सपेरिमेंट डिज़ाइन करना
एक अच्छा एक्सपेरिमेंट किसी एक साफ़ सवाल का निष्पक्ष जवाब देता है। छोटे से Python उदाहरण के साथ hypotheses, baselines, ablations, random seeds और साफ़ data splits के बारे में सीखें।
60 सेकंड में
एक साफ़-सुथरा एक्सपेरिमेंट डिज़ाइन करना
एक अच्छा एक्सपेरिमेंट किसी एक साफ़ सवाल का निष्पक्ष जवाब देता है। छोटे से Python उदाहरण के साथ hypotheses, baselines, ablations, random seeds और साफ़ data splits के बारे में सीखें।
1. एक hypothesis से शुरुआत करें
- "मेरा तरीक़ा बेहतर है।"
- "देखते हैं data augmentation से क्या होता है।"
- "बैक-ट्रांसलेशन डेटा जोड़ने से हमारे test set पर हिंदी-से-अंग्रेज़ी accuracy बेहतर होती है, उसकी तुलना में जब वही मॉडल इसके बिना हो।"
- "अगर 5 seeds में औसत बढ़त (mean gain) seeds के फैलाव (spread) से कम है, तो मैं यह मानूँगा कि इससे साफ़ तौर पर कोई फ़ायदा नहीं होता।"
2. निष्पक्ष baselines चुनें
3. ablations की योजना बनाएँ
| रन | हिस्सा A | हिस्सा B | हिस्सा C | यह आपको क्या बताता है |
|---|---|---|---|---|
| पूरा तरीक़ा | चालू | चालू | चालू | मुख्य नतीजा |
| बिना A के | बंद | चालू | चालू | A का कितना योगदान है |
| बिना B के | चालू | बंद | चालू | B का कितना योगदान है |
| बिना C के | चालू | चालू | बंद | C का कितना योगदान है |
| Baseline | बंद | बंद | बंद | जहाँ से आपने शुरुआत की थी |
4. train, validation और test को अलग-अलग रखें
- Training set: मॉडल इससे सीखता है।
- Validation set: आप इसका इस्तेमाल सेटिंग्स चुनने के लिए करते हैं, जैसे कि learning rate या कब रुकना है।
- Test set: आप आख़िर में अंतिम नंबर रिपोर्ट करने के लिए इसे सिर्फ़ एक बार देखते हैं।
5. कई random seeds चलाएँ
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)")6. नतीजे देखने से पहले अपनी योजना लिख लें
- 1
Hypothesis
एक वाक्य, और साथ में वह बात जिससे यह ग़लत साबित हो सकती है। - 2
Setup
डेटा, split, metric, baselines, ablations। - 3
Budget
कितने seeds और सेटिंग्स, और सेटिंग्स कैसे चुनी जाती हैं (सिर्फ़ validation से)। - 4
रन करें और लॉग करें
लैब नोटबुक में हर रन, असफल वाले भी। - 5
सब कुछ रिपोर्ट करें
Mean, फैलाव (spread), seeds की संख्या, और वे नतीजे भी जो आपके मनमुताबिक नहीं रहे।
noise=1.2 को बदलकर noise=2.0 करें और इसे फिर से चलाएँ। mean और spread का क्या होता है? इसके कारण के बारे में एक वाक्य लिखें।और देखें और पढ़ें
लैब
एक छोटी seed-variance स्टडी जो दिखाती है कि क्या कोई बदलाव वाकई मदद करता है, mean, spread और प्रति-seed अंतरों के साथ।
समस्या
स्टार्टर कोड को seed_lab.py के रूप में सेव करें और इसे Python 3 (केवल standard library) के साथ चलाएं। यह एक ही छोटे मॉडल की दो सेटिंग्स, A और B की तुलना करता है।
- इसे
NUM_SEEDS = 1के साथ चलाएं। लिखें कि इस एक रन से आप क्या नतीजा निकालेंगे। - इसे बदलकर
NUM_SEEDS = 5, फिर20करें। means, standard deviations, और wins, losses व ties को लिखें। - अब
SETTING_Bको{"epochs": 30}औरSETTING_Aको{"epochs": 1}में बदलें, और 20 seeds के साथ दोहराएं। - हर तुलना के लिए एक ईमानदार वाक्य लिखें: क्या 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%)।