সরাসরি পর্বে যান
পর্ব ০৩ · ৭৭-এর মধ্যে · মডিউল ১

শেখার তত্ত্ব — ERM, generalisation gap, PAC আর VC-এর অন্তর্দৃষ্টি

Learning Theory — Risk, Empirical Risk Minimisation, the Generalisation Gap, PAC Bounds and VC Dimension

Taught in Bangla, this lesson explains true versus empirical risk, Hoeffding's inequality for a fixed classifier, why choosing by ERM makes training error optimistic, and the finite-class PAC bound through the union bound. It runs a sample-size calculator and simulations in the page, shows shattering and VC dimension, and discusses no free lunch, double descent and the limits of classical bounds.

এই পর্বে যা শিখবেন

  • True risk, empirical risk আর generalisation gap-এর নিখুঁত সংজ্ঞা, প্রতিটি চিহ্নের মানে আর একটি জানা distribution-এ হুবহু হিসাব
  • Empirical risk minimisation কী, আর বাছাই করলেই কেন train ভুল আশাবাদী হয়ে যায়
  • Hoeffding-এর অসমতা আর union bound থেকে সসীম hypothesis class-এর PAC bound নিজে বের করা, আর একটি sample-size calculator simulation দিয়ে যাচাই
  • Shattering আর VC dimension: ত্রিভুজের ৩টি বিন্দু বনাম XOR-এর ৪টি বিন্দু, LP দিয়ে পরীক্ষা
  • Bias–complexity trade-off, no free lunch, আর আধুনিক বড় model-এ classical তত্ত্বের সীমা

AI-এর ভিত্তি কোর্সের পর্ব ৫৫-এ hypothesis space, inductive bias আর generalisation-এর ধারণা এসেছিল, পর্ব ৫৬-এ train/validation/test ভাগ, আর পর্ব ৬১-এ bias–variance. এই পর্বের প্রশ্ন: হাতের n-টি উদাহরণে ভালো করা একটি model নতুন ডেটায়ও ভালো করবে, এ কথা কতটা নিশ্চয়তায় বলা যায়, আর তার জন্য কত ডেটা লাগে? চালানো যায় এমন চারটি ব্লক পাতাতেই চলে (ব্রাউজারের Python, NumPy আর SciPy); প্রথমবার প্যাকেজ নামতে কয়েক সেকেন্ড লাগে।

১ · True risk আর empirical risk — আসল ভুল বনাম খাতায় গোনা ভুল

বোর্ড পরীক্ষার কয়েক লাখ খাতার মধ্যে একজন পরীক্ষক মাত্র ১০টি খাতা দেখে বললেন, “এবার পাসের হার ৮০%.” আসল হার একটি নির্দিষ্ট সংখ্যা, আর ১০টি খাতার হার তার একটি নড়বড়ে আন্দাজ; ১,০০০টি খাতায় আন্দাজ অনেক কাছে আসে। ML-এর ভুল মাপাও ঠিক এমন: model-এর “আসল” ভুল সব ভবিষ্যৎ অর্ডারের গড়, আর আমরা দেখি কেবল কয়েকটি অর্ডারে গোনা ভুল।

প্রতিটি উদাহরণ একটি জোড়া (x, y): x হলো feature (এখানে অর্ডারের দূরত্ব, km-এ), y হলো label (দেরি হলে ১, না হলে ০)। জোড়াগুলো আসে একটি অজানা distribution D থেকে, অর্থাৎ কোন দূরত্বের অর্ডার কত ঘন ঘন আসে আর কোনটিতে দেরি হয়, তার পুরো সম্ভাবনার ছবি। একটি hypothesis h হলো x থেকে অনুমান দেওয়ার একটি নিয়ম, যেমন “১০ km-এর বেশি হলে দেরি”। সব সম্ভাব্য h-এর যে সংগ্রহ থেকে algorithm বাছাই করতে পারে, সেটি hypothesis class H. প্রতিটি অনুমানের দাম মাপে একটি loss ℓ; classification-এ সবচেয়ে সরলটি 0-1 loss: অনুমান ভুল হলে ১, ঠিক হলে ০.

R(h) = E(x,y)∼D[ ℓ(h(x), y) ] = PD( h(x) ≠ y )

R̂S(h) = (1/n) · ∑i=1..n ℓ(h(xi), yi)

প্রথম লাইনটি true risk: D থেকে নতুন একটি (x, y) টানলে h ভুল করার সম্ভাবনা। E মানে প্রত্যাশিত মান বা গড় (expected value), “∼D” মানে “D থেকে টানা”। দ্বিতীয় লাইনটি empirical risk: হাতের sample S = {(x1, y1), …, (xn, yn)}-এ ভুলের ভগ্নাংশ। দুটির পার্থক্য R(h) − R̂S(h)-কে বলে generalisation gap. নীরব শর্ত: S-এর উদাহরণগুলো i.i.d., অর্থাৎ একে অপরের থেকে স্বাধীন আর সবাই একই D থেকে টানা। ঈদের মৌসুমের অর্ডার দিয়ে শেখা model সাধারণ মাসে চালালে এই শর্ত ভাঙে; সে প্রসঙ্গ পর্ব ৫৯ (Distribution shift)-এ।

বাস্তবে D কেউ জানে না। শেখার জন্য আমরা এখানে একটি জানা, পুরোপুরি কাল্পনিক D বানাই, যাতে true risk হুবহু হিসাব করে empirical risk-এর সঙ্গে মেলানো যায়: বাজারঘরের অর্ডারের দূরত্ব x সমানভাবে ০ থেকে ২০ km-এর মধ্যে ছড়ানো (uniform), “আসল” নিয়মে ১২ km-এর বেশি হলে দেরি হয়, কিন্তু রাস্তার অপ্রত্যাশিত ঘটনায় ১০% অর্ডারের label উল্টে যায় (η = ০.১, যাকে label noise বলে)। এই noise-এর কারণে কোনো নিয়মই ১০%-এর কম ভুল করতে পারে না; এই সর্বনিম্ন সম্ভাব্য ভুলের নাম Bayes error.

h: x > 10 km হলে “দেরি”কাল্পনিক D

            
  1. D আর h ঠিক করা। ডেটার উৎস পুরোপুরি জানা (কাল্পনিক), আর আমাদের নিয়ম h একটু ভুল জায়গায় সীমা টেনেছে: ১২-র বদলে ১০ km. h ডেটা দেখার আগেই ঠিক করা।
  2. True risk হুবহু। h দুই জায়গায় ভুল করে। ১০ থেকে ১২ km-এর মাঝে সে “দেরি” বলে অথচ নিয়ম বলে না; সেখানে অর্ডার পড়ার সম্ভাবনা ০.১০, আর label না উল্টালে (০.৯) ভুল: ০.০৯. বাকি জায়গায় h নিয়মের সঙ্গে একমত, তাই ভুল শুধু label উল্টালে: ০.৯০ × ০.১ = ০.০৯. যোগফল R(h) = ০.১৮.
  3. দশটি অর্ডারের sample S. Seed দেওয়া NumPy দিয়ে D থেকে টানা দশটি কাল্পনিক অর্ডার। তিনটির (১, ৩, ৭) label noise-এ উল্টে গেছে; ডেটা দেখে তা বোঝা যায় না।
  4. Empirical risk গোনা। h-এর অনুমান label-এর সঙ্গে মেলাই। ভুল দুটি: ৩ নম্বর আর ৭ নম্বর, দুটিই উল্টানো label-এর কারণে। ১ নম্বর (১০.৮ km) h-এর “ভুল এলাকা”-য়, কিন্তু label-ও উল্টেছে, তাই h ঠিক। R̂S(h) = ২/১০ = ০.২০.
  5. Gap নড়ে। এই S-এ gap −০.০২. কিন্তু S বদলালে R̂ বদলায়: আরও পাঁচটি দশ-অর্ডারের sample-এ ০.১০, ০.২০, ০.২০, ০.২০ আর ০.০০. শেষটিতে h নিখুঁত দেখায়, অথচ আসল ভুল ১৮%! R̂ নিজেই একটি random variable.
  6. কতটা নড়বে, তার সীমা। Hoeffding-এর অসমতা (অংশ ২) বলে ফাঁক ε-এর বেশি হওয়ার সম্ভাবনা সর্বোচ্চ 2e−2nε². n = ১০-এ সংখ্যাটি ১.৬৪: কোনো তথ্য নেই। n = ১,০০০-এ প্রায় ৪ × ১০−৯: ০.১-এর বেশি ফাঁক প্রায় অসম্ভব।

একটি নির্দিষ্ট h-এর জন্য R̂S(h) হলো n-টি স্বাধীন ০/১ সংখ্যার গড়, প্রতিটি সম্ভাবনা R(h) নিয়ে ১. তাই ভুলের মোট সংখ্যা Binomial(n, R(h)), গড়ে R̂ ঠিক R(h)-এর সমান (একে বলে unbiased), আর standard deviation √(R(1−R)/n). বৃহৎ সংখ্যার নিয়ম অনুযায়ী n বাড়লে R̂ ক্রমে R-এর কাছে যায়। Binomial আর এই নিয়ম AI-এর ভিত্তি কোর্সের পর্ব ৩৬ আর পর্ব ৩৭-এ আছে। নিচের ব্লক একটি sample-এর চলমান empirical risk আঁকে, আর তারপর প্রতিটি n-এ ২০,০০০টি নতুন sample নিয়ে দেখে ফাঁক কতবার ০.০৫ ছাড়ায়। দ্বিতীয় অংশে দ্রুততার জন্য সরাসরি Binomial থেকে ভুলের সংখ্যা টানা হয়েছে; নির্দিষ্ট h-এ দুটি একই জিনিস।

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(42)
ETA, CUT, T = 0.10, 12.0, 10.0     # লেবেলের গোলমাল, আসল সীমা (km), আমাদের নিয়ম (km)

def sample(n):                      # কাল্পনিক বাজারঘর: দূরত্ব 0-20 km, দেরি হলে y = 1
    x = rng.uniform(0, 20, n)
    y = (x > CUT).astype(int)
    flip = rng.random(n) < ETA      # 10% লেবেল উল্টে যায়
    return x, np.where(flip, 1 - y, y)

R = ETA + (1 - 2 * ETA) * abs(T - CUT) / 20     # আসল risk, ঠিক হিসাব
print(f"true risk R(h) = {R:.3f}")

x, y = sample(10_000)
running = np.cumsum((x > T).astype(int) != y) / np.arange(1, 10_001)
for n in (10, 100, 1000, 10_000):
    print(f"n={n:>6}: empirical risk {running[n-1]:.4f}, |gap| {abs(running[n-1] - R):.4f}")

eps = 0.05                          # বারবার নতুন sample: ভুলের সংখ্যা ~ Binomial(n, R)
for n in (10, 100, 300, 1000):
    Rhat = rng.binomial(n, R, 20_000) / n
    p = np.mean(np.abs(Rhat - R) >= eps - 1e-9)
    print(f"n={n:>5}: sd {Rhat.std():.4f} | P(|gap| >= {eps}) {p:.4f}"
          f" | Hoeffding <= {min(1, 2 * np.exp(-2 * n * eps**2)):.4f}")

ns = np.arange(1, 10_001); band = np.sqrt(np.log(2 / 0.05) / (2 * ns))   # 95% Hoeffding
plt.figure(figsize=(6.4, 3.4), layout="constrained")
plt.fill_between(ns, R - band, R + band, color="C0", alpha=0.15, label="Hoeffding 95% band")
plt.semilogx(ns, running, "C0", lw=1, label="empirical risk (one sample)")
plt.axhline(R, color="k", ls="--", lw=1, label="true risk 0.18")
plt.ylim(0, 0.5); plt.xlabel("number of orders n"); plt.ylabel("error rate")
plt.title("Empirical risk settles on the true risk"); plt.legend(fontsize=8)
plt.show()

আসল আউটপুট (ব্রাউজারের Python):

true risk R(h) = 0.180
n=    10: empirical risk 0.1000, |gap| 0.0800
n=   100: empirical risk 0.1500, |gap| 0.0300
n=  1000: empirical risk 0.1730, |gap| 0.0070
n= 10000: empirical risk 0.1785, |gap| 0.0015
n=   10: sd 0.1215 | P(|gap| >= 0.05) 0.7012 | Hoeffding <= 1.0000
n=  100: sd 0.0384 | P(|gap| >= 0.05) 0.2391 | Hoeffding <= 1.0000
n=  300: sd 0.0220 | P(|gap| >= 0.05) 0.0271 | Hoeffding <= 0.4463
n= 1000: sd 0.0121 | P(|gap| >= 0.05) 0.0001 | Hoeffding <= 0.0135

একটি লম্বা sample-এ চলমান empirical risk ১০টি অর্ডারে ০.১০, ১০০-তে ০.১৫, ১,০০০-এ ০.১৭৩, ১০,০০০-এ ০.১৭৮৫: আসল ০.১৮-এর দিকে এগোচ্ছে। দ্বিতীয় অংশে standard deviation n-এর সঙ্গে প্রায় 1/√n হারে কমে: ০.১২১৫ → ০.০৩৮৪ → ০.০১২১, অর্থাৎ n দশগুণ হলে ছড়ানো প্রায় √১০ ≈ ৩.১৬ গুণ কমে (সূত্রে √(0.18 × 0.82 / 1000) = ০.০১২১, হুবহু মেলে)। ফাঁক ০.০৫ ছাড়ানোর আসল হার প্রতিটি সারিতে Hoeffding-এর সীমার নিচে, যেমনটা হওয়ার কথা: n = ৩০০-এ ০.০২৭ বনাম সীমা ০.৪৪৬, n = ১,০০০-এ ০.০০০১ বনাম ০.০১৩৫. সীমা সত্য, তবে বেশ ঢিলে; কারণ পরের অংশে।

২ · Hoeffding-এর অসমতা — আগে থেকে ঠিক করা একটি নিয়ম কতটা ভরসার

১৯৬৩ সালে পরিসংখ্যানবিদ Wassily Hoeffding (Journal of the American Statistical Association-এ) দেখান, সীমাবদ্ধ স্বাধীন random variable-এর গড় তার প্রত্যাশিত মান থেকে কতটা দূরে যেতে পারে, তার সম্ভাবনা n বাড়লে সূচকীয় হারে কমে। এমন ফলকে বলে concentration inequality. Learning theory-র ভাষায়:

P( |R̂S(h) − R(h)| ≥ ε ) ≤ 2 · exp(−2nε²)

এখানে ε (epsilon) হলো সহনীয় ফাঁক, n উদাহরণের সংখ্যা, exp(a) মানে ea. শর্ত: loss ০ থেকে ১-এর মধ্যে (0-1 loss তাই), উদাহরণগুলো i.i.d., আর h ডেটা দেখার আগে ঠিক করা। ডানদিকটি δ (delta, মেনে নেওয়া ব্যর্থতার সম্ভাবনা) ধরে ε-এর জন্য সমাধান করলে, অন্তত ১ − δ সম্ভাবনায়

|R̂S(h) − R(h)| ≤ √( ln(2/δ) / (2n) )

একটি পূর্ণ numerical. বাজারঘরের data দল একটি test set-এ ১,০০০টি অর্ডারে model-এর ভুল মাপল ১২.৪%. ৯৫% নিশ্চয়তায় (δ = ০.০৫) আসল ভুল কোথায়? ln(2/0.05) = ln 40 = 3.689; ভাগ 2 × 1000 = 2000; 3.689 / 2000 = 0.001844; বর্গমূল 0.0429. তাই আসল ভুল ১২.৪% ± ৪.৩%, অর্থাৎ ৮.১% থেকে ১৬.৭%-এর মধ্যে, যদি test set সত্যিই অছোঁয়া থাকে। ফাঁক ±২%-এ নামাতে চাইলে n ≥ ln 40 / (2 × 0.02²) = ৪,৬১১.১, তাই ৪,৬১২টি অর্ডার লাগবে। n বাড়ে 1/ε² হারে।

কেন এত ঢিলে? Hoeffding শুধু জানে প্রতিটি loss ০ থেকে ১-এর মধ্যে; R(h) ০.৫-এর কাছে না ০.০১-এর কাছে, তা ব্যবহার করে না। Binomial-এর আসল standard deviation ব্যবহার করলে (CLT-ভিত্তিক আনুমানিক হিসাবে) n = ১,০০০, R = ০.১৮-এ ৯৫% সীমা প্রায় 1.96 × 0.0121 = ±০.০২৪, Hoeffding-এর ±০.০৪৩-এর প্রায় অর্ধেক। Variance জানে এমন অসমতাও আছে (যেমন Bernstein-এর); তবু Hoeffding সবচেয়ে সরল আর union bound-এ সহজে বসে।

সবচেয়ে গুরুত্বপূর্ণ শর্ত: h যদি S দেখে বাছাই করা হয়, তাহলে এই অসমতা আর খাটে না। এজন্যই AI-এর ভিত্তি কোর্সের পর্ব ৫৬-এর নিয়ম: test set শেষে একবার।

৩ · Empirical risk minimisation আর generalisation gap — বাছাই করলেই আশাবাদ

বাস্তবে আমরা h আগে থেকে ঠিক করি না; ডেটা দেখে শিখি। সবচেয়ে সরল ও মৌলিক শেখার নিয়ম হলো empirical risk minimisation (ERM): H-এর সব নিয়মের মধ্যে train ডেটায় সবচেয়ে কম ভুল যার, সেটিকে বেছে নেওয়া।

ĥ = argminh ∈ H R̂S(h)

argmin মানে “যে h-এ মানটি সবচেয়ে ছোট”। MSE বা log loss কমানো, সবই ERM-এর রূপ (কখনো সঙ্গে regularization শাস্তি)। এখন প্রশ্ন: ĥ-এর train ভুল R̂S(ĥ) কি তার আসল ভুলের ভালো আন্দাজ? উত্তর: না, সাধারণত কম দেখায়। S-এর এলোমেলো সৌভাগ্য যার পক্ষে গেছে, তাকেই বাছা হয়েছে।

একটি কোচিং সেন্টার ১,০০০ জন ছাত্রকে ১০টি সত্য-মিথ্যা প্রশ্নের পরীক্ষা দিল, যাঁরা কিছুই পড়েননি, কয়েন ছুড়ে উত্তর দিলেন। গড়ে প্রত্যেকে ৫ পাবেন, কিন্তু ১,০০০ জনের মধ্যে কেউ না কেউ ১০-এ ১০ পাবেন (প্রত্যেকের সম্ভাবনা ১/১০২৪)। পরের পরীক্ষায় তিনি আবার ৫ পাবেন; বাছাইটাই আশাবাদ তৈরি করেছে। ERM-ও H-এর অনেক নিয়মের মধ্যে “সেরা ছাত্র” খোঁজে; H যত বড়, সৌভাগ্যবান কাউকে পাওয়ার সম্ভাবনা তত বেশি।

একটি ২০-অর্ডারের sample-এ ERM: খাতার ভুল বনাম আসল ভুল

True risk R(t) (V shape) and empirical risk on one sample of n = 20 (step function), threshold classifiers x > t

True risk versus empirical risk across thresholds 00.10.20.30.40.50.6 048121620 threshold t (km) — আসল R(t) — ২০টি অর্ডারে R̂(t) ফাঁক 0.117 সেরা t = 12
ছবি ৩.১ — সবুজ V আসল risk: R(t) = ০.১ + ০.০৪·|t − ১২|. নীল সিঁড়ি একটি ২০-অর্ডারের sample-এ গোনা ভুল (seed-সহ বানানো)। নীলের সর্বনিম্ন ০.১০ দুটি জায়গায়; ERM যদি প্রথমটি থেকে t ≈ ৯.১ বেছে নেয়, train-এ ১০% ভুল দেখালেও আসল ভুল ২১.৭% (লাল বিন্দু)। দ্বিতীয় জায়গা থেকে বাছলে আসল ভুল ১০%-এর কাছে।

ERM ঠিক সেই জায়গা বাছে যেখানে noise সবচেয়ে বেশি সাহায্য করেছে; আর সমান train ভুলের একাধিক t থাকলে কোনটি নেওয়া হবে, সেটিও একটি সিদ্ধান্ত (tie-breaking). এবার গড় দেখি। নিচের ব্লকের প্রথম অংশে H হলো ০ থেকে ২০-এর মধ্যে সমান দূরত্বের কয়েকটি threshold; |H| = ৩, ১১, ২০১ বা ১,০০১. প্রতিটি (|H|, n)-এ ৪০০ বার নতুন sample আর ERM. দ্বিতীয় অংশে চরম একটি H: M-টি কয়েন-ছোড়া নিয়ম, প্রত্যেকের আসল risk ঠিক ০.৫, ভুলের সংখ্যা সরাসরি Binomial(100, 0.5) থেকে।

import numpy as np

rng = np.random.default_rng(42)
ETA, CUT, REPS = 0.10, 12.0, 400
true_risk = lambda t: ETA + (1 - 2 * ETA) * np.abs(t - CUT) / 20

def sample(n):                      # একই কাল্পনিক ডেটা: দূরত্ব, দেরি = 1
    x = rng.uniform(0, 20, n)
    y = (x > CUT).astype(int)
    return x, np.where(rng.random(n) < ETA, 1 - y, y)

def emp_risk(x, y, grid):           # সব threshold-এর empirical risk একবারে
    xs, ys = x[np.argsort(x)], y[np.argsort(x)]
    ones = np.concatenate([[0], np.cumsum(ys)])
    k = np.searchsorted(xs, grid, side="right")      # কতটি x <= t
    return (ones[k] + (len(x) - k) - (ones[-1] - ones[k])) / len(x)

print("A) thresholds, mean of 400 runs: R(h_erm) / gap")
for size in (3, 11, 201, 1001):
    grid = np.linspace(0, 20, size)                  # H = সমান দূরত্বের threshold
    cells = []
    for n in (20, 100, 500):
        res = []
        for _ in range(REPS):
            e = emp_risk(*sample(n), grid)
            j = np.argmin(e)                         # ERM: train-এ সবচেয়ে কম ভুল
            res.append((true_risk(grid[j]), true_risk(grid[j]) - e[j]))
        cells.append("{:.3f}/{:.3f}".format(*np.mean(res, axis=0)))
    print(f"|H|={size:<5} best {true_risk(grid).min():.2f} | n=20 {cells[0]}"
          f"  n=100 {cells[1]}  n=500 {cells[2]}")
print("B) M coin-flip rules (true risk 0.5 each), n = 100")
for M in (1, 10, 100, 1000, 10_000):
    best = rng.binomial(100, 0.5, (200, M)).min(axis=1) / 100
    print(f"M={M:>6}: train error of ERM pick {best.mean():.3f}"
          f" | gap {0.5 - best.mean():.3f} | sqrt(ln M/2n) {np.sqrt(np.log(M) / 200):.3f}")

আসল আউটপুট (ব্রাউজারের Python):

A) thresholds, mean of 400 runs: R(h_erm) / gap
|H|=3     best 0.18 | n=20 0.192/0.020  n=100 0.180/-0.001  n=500 0.180/-0.001
|H|=11    best 0.10 | n=20 0.130/0.038  n=100 0.100/-0.001  n=500 0.100/0.000
|H|=201   best 0.10 | n=20 0.151/0.065  n=100 0.110/0.013  n=500 0.101/0.002
|H|=1001  best 0.10 | n=20 0.156/0.064  n=100 0.110/0.013  n=500 0.102/0.001
B) M coin-flip rules (true risk 0.5 each), n = 100
M=     1: train error of ERM pick 0.499 | gap 0.001 | sqrt(ln M/2n) 0.000
M=    10: train error of ERM pick 0.427 | gap 0.073 | sqrt(ln M/2n) 0.107
M=   100: train error of ERM pick 0.373 | gap 0.127 | sqrt(ln M/2n) 0.152
M=  1000: train error of ERM pick 0.341 | gap 0.159 | sqrt(ln M/2n) 0.186
M= 10000: train error of ERM pick 0.311 | gap 0.189 | sqrt(ln M/2n) 0.215

অংশ A, কলাম ধরে: n বাড়লে gap কমে। |H| = ২০১-এ n = ২০-এ গড় gap ০.০৬৫, ১০০-তে ০.০১৩, ৫০০-তে ০.০০২. সারি ধরে: n = ২০-এ |H| বাড়লে gap বাড়ে: ০.০২০ → ০.০৩৮ → ০.০৬৫. কিন্তু “best” কলামও দেখুন: |H| = ৩-এর grid-এ (০, ১০, ২০) ১২ নেই, তাই সেরা সম্ভাব্য risk ০.১৮; এটি H-এর নিজের সীমা, ডেটা যত খুশি দিন, ERM ০.১৮-এর নিচে নামবে না। |H| = ১১-এর grid-এ ১২ আছে, সেরা ০.১০. বড় class আসল নিয়মের কাছে পৌঁছাতে পারে, কিন্তু বাছাইয়ে বেশি আশাবাদ ঢোকে: এটিই অংশ ৭-এর bias–complexity trade-off. ঋণাত্মক gap মানে গড় প্রায় শূন্য। আর ২০১ ও ১,০০১-এর ফল প্রায় এক; এর ব্যাখ্যা অংশ ৬-এর VC dimension.

অংশ B: একটি নিয়ম (M = ১) নিলে train ভুল ০.৪৯৯, প্রায় সৎ। ১০,০০০টি কয়েন-ছোড়া নিয়মের সেরাটি train-এ মাত্র ৩১.১% ভুল দেখায়, যেন কিছু শিখেছে, অথচ আসলে ৫০%. Gap ln M-এর বর্গমূলের মতো বাড়ে; শেষ কলামের √(ln M / 2n) আকারে মেলে, সংখ্যায় একটু বেশি। পরের অংশে ঠিক এই রাশিটিই bound হিসেবে আসবে।

এই ফলকে একটি সূত্রে লেখা যায়। ধরুন H-এর সেরা নিয়ম h* (যার R সবচেয়ে কম), আর R* হলো Bayes error (এখানে ০.১০). তাহলে ERM-এর বাড়তি ভুল দুই ভাগে ভাঙে:

R(ĥ) − R* = [ R(h*) − R* ] + [ R(ĥ) − R(h*) ]

মোট বাড়তি ভুল = approximation error + estimation error

প্রথম বন্ধনী approximation error: H-এর ভেতরের সেরাটিও কতটা খারাপ; শুধু H-এর ওপর নির্ভর করে, ডেটার ওপর নয় (|H| = ৩-এ ০.০৮, ১১-এ ০)। দ্বিতীয় বন্ধনী estimation error: সীমিত ডেটার কারণে সেরাটি খুঁজে না পাওয়ার দাম; n বাড়লে কমে, H বড় হলে বাড়ে। AI-এর ভিত্তি কোর্সের পর্ব ৬১-এর bias আর variance-এর সঙ্গে এদের মিল আছে, কিন্তু হুবহু এক নয়: সেটি squared loss-এ একটি বিন্দুতে গড়ের ভাঙন, এটি যেকোনো loss-এ পুরো class-এর ভাঙন।

৪ · Union bound আর সসীম class-এর PAC bound

ERM-এর সমস্যা ছিল: কোন h বাছাই হবে, তা আগে জানি না। সমাধান: H-এর প্রতিটি h-কে একসঙ্গে পাহারা দেওয়া। যদি এক সঙ্গে সব h-এর empirical risk আসলের ε-এর মধ্যে থাকে (একে বলে uniform convergence), তাহলে ERM যেটিই বাছুক, সেটিও ε-এর মধ্যে। হাতিয়ার union bound: কয়েকটি ঘটনার অন্তত একটি ঘটার সম্ভাবনা আলাদা সম্ভাবনাগুলোর যোগফলের বেশি নয়।

P(A1 ∪ A2 ∪ … ∪ Ak) ≤ P(A1) + P(A2) + … + P(Ak)

এখানে Aj = “j-তম নিয়মের empirical risk আসল থেকে ε বা তার বেশি দূরে” (খারাপ ঘটনা), আর ∪ মানে “অথবা” (union). নিচের stepper পাঁচটি threshold নিয়ে যোগফলটি ধাপে ধাপে গড়ে।

H = {t = 4, 8, 12, 16, 20 km}, প্রতিটির জন্য Hoeffding: 2e−2nε²
পাহারায় যোগ হলো
নতুন নিয়মের আসল R
প্রতিটির সীমা
union bound (যোগফল)
simulation-এ আসল P(কোনো একটি খারাপ)
  1. প্রথম নিয়ম। t = ৪ km-এর নিয়মের আসল risk ০.৪২. n = ২০০ আর ε = ০.১ হলে 2nε² = 2 × 200 × 0.01 = 4, তাই তার empirical risk ০.১ বা বেশি সরে যাওয়ার সম্ভাবনা সর্বোচ্চ 2e−4 = ০.০৩৬৬.
  2. দ্বিতীয় নিয়ম যোগ। t = ৮-এর জন্যও একই সীমা, কারণ Hoeffding-এর সীমা নিয়মের ওপর নির্ভর করে না। দুটির যেকোনোটি খারাপ হওয়ার সম্ভাবনা ≤ ০.০৭৩৩.
  3. তৃতীয়। t = ১২, H-এর সেরা নিয়ম (আসল R = ০.১০)। যোগফল ০.১০৯৯.
  4. চতুর্থ। t = ১৬. যোগফল ০.১৪৬৫. |H|-টি নিয়মে মোট |H| × 2e−2nε².
  5. পঞ্চম, পুরো H. যোগফল ০.১৮৩২: অন্তত ৮১.৭% সম্ভাবনায় পাঁচটির সবার empirical risk আসলের ০.১-এর মধ্যে। ডেস্কটপে ২০,০০০ বার সত্যিই sample টেনে দেখা গেছে (নিচে) আসল সম্ভাবনা মাত্র ০.০১২১. Union bound ঢিলে।
  6. উল্টো প্রশ্ন: কত n লাগবে? মোট ব্যর্থতা δ = ০.০৫-এর মধ্যে চাইলে 5 × 2e−2n(0.01) ≤ 0.05, অর্থাৎ n ≥ (ln 5 + ln 40) / 0.02 = (1.609 + 3.689) / 0.02 = ২৬৪.৯, তাই ২৬৫. যাচাই: 10 × e−5.3 = ০.০৪৯৯ ≤ ০.০৫. Simulation-এ আসল সম্ভাবনা ০.০০২২.

শেষ ধাপের হিসাবটিই সাধারণ রূপে লিখলে পাই এই পর্বের কেন্দ্রীয় উপপাদ্য। |H|-টি নিয়ম, প্রতিটির ব্যর্থতা সর্বোচ্চ 2e−2nε²; মোট |H| · 2e−2nε² ≤ δ চাইলে:

সসীম H-এর bound (agnostic)

অন্তত ১ − δ সম্ভাবনায়, H-এর সব h-এর জন্য একসঙ্গে: |R̂S(h) − R(h)| ≤ ε, যেখানে ε = √( (ln|H| + ln(2/δ)) / (2n) ). সমানভাবে, ε নির্দিষ্ট থাকলে যথেষ্ট n ≥ (ln|H| + ln(2/δ)) / (2ε²).

এখান থেকে ERM-এর নিশ্চয়তা তিন লাইনে আসে। h* হলো H-এর সেরা নিয়ম। Uniform convergence ঘটলে: R(ĥ) ≤ R̂S(ĥ) + ε (ĥ-ও H-এর সদস্য) ≤ R̂S(h*) + ε (ERM train-এ সবচেয়ে কম বাছে) ≤ R(h*) + 2ε (h*-ও H-এর সদস্য)। অর্থাৎ অন্তত ১ − δ সম্ভাবনায় ERM-এর আসল ভুল H-এর সেরার চেয়ে 2ε-এর বেশি খারাপ নয়। বাড়তি ভুল ε′-এর মধ্যে চাইলে তাই ε = ε′/2 বসাতে হয়, যা n-কে চারগুণ করে। এখানে agnostic মানে আমরা ধরে নিইনি যে H-এ নিখুঁত নিয়ম আছে; noise থাকলে কোনোটিই নিখুঁত নয়।

Stepper-এর simulation সংখ্যাগুলো এই ছোট স্ক্রিপ্টের সত্যিকারের run থেকে (ডেস্কটপ, Python 3.14.4, NumPy 2.5.4; একটি local run):

~/bazarghar-ml$ python union_check.py
true risks: [0.42 0.26 0.1  0.26 0.42]
n=200: P(bad) each h = [0.0048 0.0017 0.0001 0.0016 0.005 ]
       P(any h bad) = 0.0121   union bound = 0.1832
n=265: P(bad) each h = [0.0011 0.0002 0.     0.0001 0.0009]
       P(any h bad) = 0.0022   union bound = 0.0499

আলাদা ব্যর্থতাও ০.০৩৬৬-এর অনেক নিচে, কারণ Hoeffding সবচেয়ে খারাপ ক্ষেত্র R = ০.৫ ধরে নেয়।

PAC — “সম্ভবত প্রায় সঠিক”

১৯৮৪ সালে Leslie Valiant Communications of the ACM-এ “A Theory of the Learnable” প্রবন্ধে শেখার একটি সংজ্ঞা দেন, যা পরে PAC learning (Probably Approximately Correct) নামে পরিচিত হয়। মোটামুটি: একটি class H শেখা যায়, যদি এমন একটি algorithm থাকে যে যেকোনো ε, δ আর যেকোনো D-এর জন্য, যথেষ্ট n (যা ১/ε, ১/δ-এ বহুপদী হারে বাড়ে) উদাহরণ পেলে, অন্তত ১ − δ সম্ভাবনায় (“probably”) এমন h দেয় যার ভুল ε-এর মধ্যে (“approximately correct”). প্রয়োজনীয় ন্যূনতম n-কে বলে sample complexity. সংজ্ঞার খুঁটিনাটি বই ভেদে একটু আলাদা; এখানে মূল ভাবটুকু।

দুটি পরিস্থিতি আলাদা করা দরকার। Realizable ক্ষেত্রে ধরে নেওয়া হয় H-এর কোনো নিয়মের ভুল শূন্য (noise নেই)। তখন যুক্তি সহজ: R(h) > ε এমন একটি “খারাপ” h n-টি উদাহরণের সবগুলোতে ঠিক হওয়ার সম্ভাবনা সর্বোচ্চ (1 − ε)n ≤ e−εn; union bound দিয়ে |H| e−εn ≤ δ, অর্থাৎ n ≥ (ln|H| + ln(1/δ)) / ε. লক্ষ করুন, এখানে ε-এর বর্গ নেই। |H| = ১,০০০, ε = δ = ০.০৫ হলে realizable-এ (6.908 + 2.996) / 0.05 = ১৯৮.১ → ১৯৯, আর agnostic সূত্রে ২,১২০: noise থাকলে প্রায় এগারো গুণ ডেটা।

৫ · কত ডেটা লাগবে — sample-size calculator আর simulation দিয়ে যাচাই

সূত্রটি দিয়ে একটি ছোট calculator, তারপর যাচাই: bound-এর n-এ কি সত্যিই সব নিয়ম একসঙ্গে ε-এর মধ্যে থাকে, আর আসলে কত কম ডেটায় চলে? যাচাইয়ের জন্য H = ২০১টি threshold (০.১ km পরপর), ε = δ = ০.০৫, প্রতিটি n-এ ১,০০০ বার নতুন sample, আর প্রতিবার সব ২০১টি নিয়মের মধ্যে সবচেয়ে বড় |R̂ − R|.

import math
import numpy as np

def n_needed(H, eps, delta):        # Hoeffding + union bound, সসীম H
    return math.ceil((math.log(H) + math.log(2 / delta)) / (2 * eps**2))

print("  eps  delta |   |H|=10  |H|=1000  |H|=10^6")
for eps in (0.1, 0.05, 0.01):
    for delta in (0.05, 0.01):
        row = [n_needed(H, eps, delta) for H in (10, 1000, 10**6)]
        print(f"{eps:5} {delta:6} | " + " ".join(f"{v:>9,}" for v in row))

rng = np.random.default_rng(42)     # যাচাই: |H| = 201 threshold, eps = delta = 0.05
ETA, CUT, EPS = 0.10, 12.0, 0.05
grid = np.linspace(0, 20, 201)
R = ETA + (1 - 2 * ETA) * np.abs(grid - CUT) / 20
def worst_dev(n):                   # সব h-এর মধ্যে সবচেয়ে বড় |Rhat - R|
    x = rng.uniform(0, 20, n); y = (x > CUT).astype(int)
    y = np.where(rng.random(n) < ETA, 1 - y, y)
    xs, ys = x[np.argsort(x)], y[np.argsort(x)]
    ones = np.concatenate([[0], np.cumsum(ys)])
    k = np.searchsorted(xs, grid, side="right")
    Rhat = (ones[k] + (n - k) - (ones[-1] - ones[k])) / n
    return np.max(np.abs(Rhat - R))

print("bound says n >=", n_needed(201, EPS, 0.05))
for n in (100, 200, 400, 800, n_needed(201, EPS, 0.05)):
    devs = np.array([worst_dev(n) for _ in range(1000)])
    print(f"n={n:>5}: P(some h off by >= {EPS}) = {np.mean(devs >= EPS):.3f}")

আসল আউটপুট (ব্রাউজারের Python):

  eps  delta |   |H|=10  |H|=1000  |H|=10^6
  0.1   0.05 |       300       530       876
  0.1   0.01 |       381       611       956
 0.05   0.05 |     1,199     2,120     3,501
 0.05   0.01 |     1,521     2,442     3,823
 0.01   0.05 |    29,958    52,984    87,522
 0.01   0.01 |    38,005    61,031    95,570
bound says n >= 1799
n=  100: P(some h off by >= 0.05) = 0.955
n=  200: P(some h off by >= 0.05) = 0.685
n=  400: P(some h off by >= 0.05) = 0.278
n=  800: P(some h off by >= 0.05) = 0.036
n= 1799: P(some h off by >= 0.05) = 0.000

টেবিল থেকে তিনটি শিক্ষা। (১) |H| এক লাখ গুণ বাড়লেও (১০ থেকে ১০৬) n তিনগুণের কম বাড়ে (৩০০ → ৮৭৬), কারণ |H| ঢোকে লগারিদমে। (২) δ ০.০৫ থেকে ০.০১ করলে n সামান্য বাড়ে (৩০০ → ৩৮১), কারণ δ-ও লগারিদমে। (৩) ε ০.১ থেকে ০.০১ করলে n প্রায় ১০০ গুণ (৩০০ → ২৯,৯৫৮), কারণ ε ঢোকে 1/ε²-এ। নির্ভুলতার দাম সবচেয়ে বেশি। হাতে মেলান: (2.303 + 3.689) / 0.02 = ২৯৯.৬ → ৩০০.

Simulation থেকে: bound বলছে ১,৭৯৯, আর সেখানে ১,০০০ বারে একবারও ব্যর্থতা নেই; প্রতিশ্রুতি (ব্যর্থতা ≤ ৫%) রক্ষা হয়েছে। কিন্তু ৮০০-তেই ব্যর্থতা ৩.৬%, অর্থাৎ এই D-তে আসলে অর্ধেকেরও কম ডেটায় কাজ চলত। Bound-কে সবচেয়ে খারাপ D-তেও সত্য থাকতে হয়, আর union bound ঝুঁকিগুলো আলাদা ধরে যোগ করে; তাই সে রক্ষণশীল।

বাস্তবে এই সংখ্যার ব্যবহার কোথায়? Bound-এর আসল কাজ আকার বোঝানো। একটি সরাসরি প্রয়োগ hyperparameter বাছাই। Validation set-এ ৫০০টি configuration চালিয়ে সেরাটি নিলে আপনি আসলে |H| = ৫০০-এর ওপর ERM করছেন। ১,০০০টি উদাহরণে একক model-এর সীমা ±০.০৪৩, কিন্তু ৫০০টির সেরার জন্য √(ln(2 × 500 / 0.05) / 2000) ≈ ±০.০৭০. এজন্য বাছাইয়ের পর অছোঁয়া test set বা nested cross-validation (AI-এর ভিত্তি কোর্সের পর্ব ৬৬) লাগে। Model তুলনার পরিসংখ্যান আসবে পর্ব ২২ (Model তুলনার পরিসংখ্যান — paired test, McNemar আর একাধিক তুলনা)-এ।

৬ · অসীম class আর VC dimension — shattering-এর ছবি

সব threshold নিলে, অর্থাৎ যেকোনো বাস্তব সংখ্যা t, H অসীম, আর ln|H| = ∞. কিন্তু অংশ ৩-এ ২০১ আর ১,০০১টি threshold-এ প্রায় একই gap এসেছিল। কারণ n-টি বিন্দুতে t কোন দুটি বিন্দুর মাঝে পড়ছে, শুধু তাতেই অনুমান বদলায়, তাই সর্বোচ্চ n + ১ রকম labeling সম্ভব। ডেটার চোখে H-এর কার্যকর আকার হলো n-টি বিন্দুতে সে কত রকম labeling বানাতে পারে। এই সংখ্যাকে বলে growth function.

এই ধারণার সবচেয়ে পরিচিত মাপ VC dimension, Vladimir Vapnik আর Alexey Chervonenkis-এর নামে। মূল কাজটি ১৯৭১ সালের একটি প্রবন্ধে (রুশ থেকে ইংরেজি অনুবাদে) পরিচিতি পায়, যদিও এর সূচনা ১৯৬০-এর দশকের শেষে। সংজ্ঞাটি দুই ধাপে:

  • Shattering: m-টি বিন্দুর একটি সেটকে H “shatter” করে, যদি ওই বিন্দুগুলোর 2m-টি সম্ভাব্য +/− labeling-এর প্রতিটির জন্য H-এ এমন একটি h থাকে যা ঠিক সেই labeling দেয়।
  • VC dimension: সবচেয়ে বড় m, যার জন্য অন্তত একটি m-বিন্দুর সেট আছে যা H shatter করে।

এক মাত্রায় threshold-এর VC dimension ১: একটি বিন্দুকে + বা − দুটোই বানানো যায়, কিন্তু দুটি বিন্দু a < b-তে “a-তে +, b-তে −” কোনো x > t নিয়ম দিতে পারে না। দুই মাত্রায় সরলরেখা দিয়ে ভাগ, অর্থাৎ linear classifier h(x) = sign(w · x + b), কতগুলো বিন্দু shatter করতে পারে?

Shattering three points with lines ABC
  1. (−, −, −). তিনটিই “দেরি নয়”। রেখাটি সব বিন্দুর বাইরে এক কোণে; তিনটি বিন্দুই রেখার একই পাশে, আর সেই পাশকে আমরা − বলি।
  2. (+, −, −). শুধু A আলাদা। A-এর কোণ কেটে একটি তির্যক রেখা: A এক পাশে, B আর C অন্য পাশে।
  3. (−, +, −). শুধু B আলাদা, B-এর কোণ কাটা রেখা।
  4. (−, −, +). শুধু C আলাদা: A আর B-এর ওপর দিয়ে একটি অনুভূমিক রেখা।
  5. (+, +, −). ধাপ ৪-এর একই রেখা, শুধু কোন পাশ + তা উল্টানো (w আর b-এর চিহ্ন উল্টালেই হয়)।
  6. (+, −, +). ধাপ ৩-এর রেখা, পাশ উল্টানো: A আর C একদিকে, B অন্যদিকে।
  7. (−, +, +). ধাপ ২-এর রেখা, পাশ উল্টানো: B আর C একদিকে, A অন্যদিকে।
  8. (+, +, +). ধাপ ১-এর রেখা, পাশ উল্টানো। আটটির আটটিই সম্ভব: রেখা এই তিনটি বিন্দু shatter করে, তাই VC dimension অন্তত ৩. (এক রেখায় তিনটি বিন্দু হলে (+, −, +) অসম্ভব হতো, কিন্তু একটি ভালো সেটই যথেষ্ট।)

চারটি বিন্দু কেন পারে না? সবচেয়ে বিখ্যাত উদাহরণ XOR: একটি বর্গের চার কোণ, কর্ণের দুই প্রান্তে একই label. কোনো রেখাই দুই কর্ণকে আলাদা করতে পারে না। কিন্তু VC dimension ৩ প্রমাণ করতে দেখাতে হয় যে যেকোনো চারটি বিন্দুতেই অন্তত একটি labeling অসম্ভব। দুটি ক্ষেত্র: চারটি বিন্দু উত্তল অবস্থানে (চতুর্ভুজ) থাকলে কর্ণের জোড়া দুটিকে আলাদা করা যায় না; আর একটি বিন্দু বাকি তিনটির ত্রিভুজের ভেতরে থাকলে “ভেতরেরটি +, বাকিরা −” অসম্ভব। এর সাধারণ রূপ Radon-এর উপপাদ্য (১৯২১): d মাত্রায় যেকোনো d + ২টি বিন্দুকে এমন দুই দলে ভাগ করা যায় যাদের উত্তল আবরণ পরস্পরকে ছেদ করে, তাই তাদের কোনো hyperplane আলাদা করতে পারে না।

চারটি বিন্দু: কোনো রেখাই সব labeling দিতে পারে না

Left: XOR layout, diagonals share a label. Right: one point inside the triangle of the others

Four points cannot be shattered by lines ++−− ✗ XOR: ১৬-এর ১৪টি সম্ভব −−−+ ভেতরের বিন্দু: ১৬-এর ১৪টি
ছবি ৩.২ — বাঁয়ে XOR: দুই কর্ণের প্রান্তে একই label হলে যেকোনো রেখা অন্তত একটি বিন্দু ভুল দিকে রাখে। ডানে: ভেতরের বিন্দুকে একা + করা যায় না, কারণ যে অর্ধতলে তিন কোণই −, সেটি উত্তল, আর ভেতরের বিন্দুও সেখানে পড়ে।

ছবিতে চোখে দেখা দাবি এবার কোড দিয়ে যাচাই করি। একটি labeling রেখা দিয়ে আলাদা করা যায় কি না, তা একটি linear programming (LP) প্রশ্ন: এমন w1, w2, b আছে কি, যাতে প্রতিটি বিন্দুতে yi(w · xi + b) ≥ ১? (w আর b-কে ধনাত্মক সংখ্যায় গুণ করা যায় বলে ≥ ১ লেখায় ক্ষতি নেই।) SciPy-র linprog বলে দেয় সমাধান আছে কি না। ব্লকটি পাঁচটি বিন্যাসের সব labeling পরীক্ষা করে।

import itertools
import numpy as np
from scipy.optimize import linprog

def separable(X, y):                # w·x + b দিয়ে কি y (+1/−1) আলাদা করা যায়?
    A = -y[:, None] * np.column_stack([X, np.ones(len(X))])
    res = linprog(np.zeros(3), A_ub=A, b_ub=-np.ones(len(X)),
                  bounds=[(None, None)] * 3, method="highs")
    return res.status == 0          # 0 = সমাধান আছে, 2 = অসম্ভব

def check(name, X):
    X = np.array(X, dtype=float)
    bad = []
    for labels in itertools.product([-1, 1], repeat=len(X)):
        if not separable(X, np.array(labels)):
            bad.append("".join("+" if v > 0 else "-" for v in labels))
    total = 2 ** len(X)
    print(f"{name:<22} {total - len(bad):>2}/{total} labelings separable"
          + (" -> SHATTERED" if not bad else f"; fail: {' '.join(bad)}"))

check("3 points, triangle", [(1, 1), (4, 1), (2.5, 3.5)])
check("3 points, on a line", [(1, 1), (2, 2), (3, 3)])
check("4 points, XOR square", [(0, 0), (1, 1), (0, 1), (1, 0)])
check("4 points, convex kite", [(0, 1), (2, 0), (4, 1), (2, 3)])
check("4 points, one inside", [(0, 0), (4, 0), (2, 3), (2, 1)])

আসল আউটপুট (ব্রাউজারের Python):

3 points, triangle      8/8 labelings separable -> SHATTERED
3 points, on a line     6/8 labelings separable; fail: -+- +-+
4 points, XOR square   14/16 labelings separable; fail: --++ ++--
4 points, convex kite  14/16 labelings separable; fail: -+-+ +-+-
4 points, one inside   14/16 labelings separable; fail: ---+ +++-

ত্রিভুজের আটটিই সম্ভব, stepper-এর সঙ্গে মেলে। এক রেখায় তিনটি বিন্দুতে “মাঝেরটি আলাদা” (−+− আর +−+) অসম্ভব; তবু VC dimension ৩, কারণ ত্রিভুজের সেটটি shatter হয়। XOR-এ ব্যর্থ দুটি labeling হলো (0,0) আর (1,1)-এ এক label, (0,1) আর (1,0)-এ অন্যটি: ঠিক দুই কর্ণ। উত্তল ঘুড়িতেও কর্ণের জোড়া (প্রথম-তৃতীয় বনাম দ্বিতীয়-চতুর্থ) ব্যর্থ, আর ভেতরের বিন্দুর ক্ষেত্রে “শুধু ভেতরেরটি আলাদা”। পাঁচটি উদাহরণ প্রমাণ নয়; প্রমাণ Radon-এর যুক্তি। তাই 2-D-তে রেখার VC dimension ঠিক ৩; d মাত্রায় hyperplane-এর d + ১.

Hypothesis classVC dimensionছোট যুক্তি
এক মাত্রায় threshold, x > t১a < b-তে (+, −) অসম্ভব
এক মাত্রায় interval, a ≤ x ≤ b হলে +২তিন বিন্দুতে (+, −, +) অসম্ভব
2-D-তে রেখা (linear classifier)৩ত্রিভুজ shatter হয়; চার বিন্দু নয় (Radon)
d মাত্রায় hyperplaned + ১parameter d + ১টি, তবে এটি কাকতালীয় মিল (ভাবনার প্রশ্ন ২)
2-D-তে অক্ষ-সমান্তরাল আয়তক্ষেত্র৪হীরার মতো ৪টি বিন্দু shatter হয়; ৫টিতে নয়

VC dimension d সসীম হলে growth function আর 2n-এর মতো বাড়ে না, বড়জোর nd-এর মতো বাড়ে (Sauer–Shelah lemma, ১৯৭২ সালের কাছাকাছি কয়েকজন আলাদাভাবে প্রমাণ করেন)। তখন ln|H|-এর জায়গায় মোটামুটি d · ln n বসে (ধ্রুবক বই ভেদে আলাদা, তাই O দিয়ে):

R(h) ≤ R̂S(h) + O( √( (d · ln(n/d) + ln(1/δ)) / n ) ), সব h ∈ H-এর জন্য একসঙ্গে

Binary classification-এ 0-1 loss-এর ক্ষেত্রে একটি গভীর ফল বলে: H PAC-শেখার যোগ্য ঠিক তখনই, যখন তার VC dimension সসীম (Blumer, Ehrenfeucht, Haussler আর Warmuth-এর ১৯৮৯ সালের কাজের সঙ্গে এই সংযোগ সাধারণত যুক্ত করা হয়; অনেক বই একে “fundamental theorem of statistical learning” বলে)।

৭ · Bias–complexity trade-off, no free lunch আর অন্য মাপকাঠি

H বড় বা নমনীয় হলে approximation error কমে (সেরা নিয়মটি আসলের কাছে আসে), কিন্তু estimation error বাড়ে (√(ln|H|/n) বা √(d/n)-এর মতো)। H ছোট হলে উল্টো। এই টানাপোড়েনকে Shalev-Shwartz আর Ben-David-এর বই Understanding Machine Learning (২০১৪) bias–complexity trade-off বলে। AI-এর ভিত্তি কোর্সের পর্ব ৬১-এর U-আকৃতির validation curve এই একই ছবির অভিজ্ঞতামূলক রূপ।

ছোট H

Estimation error কম, ডেটা অল্প লাগে; কিন্তু H-এর সেরাটিও খারাপ হতে পারে। অংশ ৩-এর |H| = ৩: সেরা সম্ভব ০.১৮, ডেটা বাড়িয়ে লাভ নেই।

underfitting-এর ঝুঁকি

বড় H

সেরা নিয়ম আসলের কাছে, কিন্তু ছোট n-এ ERM সৌভাগ্যবান ভুল নিয়ম বাছে। অংশ ৩-এর B: ১০,০০০টি কয়েন-নিয়মের সেরার train ভুল ০.৩১১, আসল ০.৫.

overfitting-এর ঝুঁকি

মাঝের পথ

Vapnik-এর structural risk minimisation: train ভুল + জটিলতার শাস্তি কমানো; বাস্তবে regularization বা cross-validation.

পর্ব ১৭-এ regularization-এর তত্ত্ব

No free lunch-এর সঙ্গে সংযোগ। AI-এর ভিত্তি কোর্সের পর্ব ৫৫-এ Wolpert-এর (১৯৯৬) no free lunch ফল এসেছে: সব সম্ভাব্য লক্ষ্য-ফাংশনকে সমান ধরলে কোনো learning algorithm গড়ে অন্যটির চেয়ে ভালো নয়। Learning theory এর একটি রূপ দেয়: H যদি সব সম্ভাব্য নিয়ম হয় (অসীম VC dimension), তাহলে কোনো algorithm-ই সব D-তে অল্প ডেটায় নিশ্চয়তা দিতে পারে না; কোনো না কোনো D-তে সে ব্যর্থ হবে। তাই H সীমিত করা, অর্থাৎ inductive bias বেছে নেওয়া, শেখার পূর্বশর্ত। কোন bias ঠিক, তা আসে সমস্যার জ্ঞান থেকে।

নাম জেনে রাখার মতো আরও তিনটি মাপকাঠি (এই কোর্সে বিস্তারিত নেই): Rademacher complexity মাপে একটি class এলোমেলো ±১ label-এর সঙ্গে গড়ে কতটা মিলতে পারে (অংশ ৩-এর কয়েন-নিয়ম পরীক্ষার গাণিতিক রূপ)। Algorithmic stability class নয়, algorithm দেখে: একটি উদাহরণ বদলালে শেখা model কতটা বদলায়; Bousquet আর Elisseeff (২০০২) দেখান স্থিতিশীল algorithm generalise করে। আর PAC-Bayes bound একটি prior বণ্টনের সাপেক্ষে শেখা বণ্টনের দূরত্ব দিয়ে সীমা দেয়। SVM-এর margin-ভিত্তিক যুক্তি পর্ব ২৭ (Support Vector Machine)-এ আসবে।

৮ · বড় model, double descent আর classical গল্পের সীমা

আধুনিক neural network-এ parameter প্রায়ই উদাহরণের চেয়ে বহুগুণ বেশি (overparameterization), train ভুল প্রায় শূন্য, তবু নতুন ডেটায় ভালো করে। ২০১৭ সালে Zhang, Bengio, Hardt, Recht আর Vinyals (ICLR) দেখান, ছবির ডেটাসেটে label পুরো এলোমেলো করে দিলেও বড় network train ভুল প্রায় শূন্যে নামাতে পারে। অর্থাৎ তাদের H এত নমনীয় যে class-ভিত্তিক bound সেখানে ১-এর বেশি হয়ে যায়, কিছুই বলে না। অথচ আসল label-এ একই network ভালো generalise করে। তাহলে পার্থক্য H-এ নয়, ডেটা আর শেখার পদ্ধতিতে।

এর একটি সম্পর্কিত পর্যবেক্ষণ double descent, AI-এর ভিত্তি কোর্সের পর্ব ৬১-এ সংক্ষেপে এসেছে: Belkin, Hsu, Ma আর Mandal (২০১৯, PNAS) দেখান, জটিলতা বাড়ালে test ভুল প্রথমে U-এর মতো চলে, ডেটা ঠিক মুখস্থ করার সীমার কাছে চূড়ায় ওঠে, তারপর আরও বড় model-এ আবার নামতে পারে। আলোচিত ব্যাখ্যাগুলো এখনো সক্রিয় গবেষণার বিষয়:

  • Implicit regularization: gradient descent নিজেই অনেক সম্ভাব্য সমাধানের মধ্যে “সরল” কিছু বাছে, যদিও H বিশাল।
  • Norm বা margin-ভিত্তিক মাপ: parameter-এর সংখ্যা নয়, weight-এর আকার বা margin দিয়ে জটিলতা মাপলে কিছু ক্ষেত্রে অর্থপূর্ণ bound পাওয়া যায়।
  • Benign overfitting: কিছু তাত্ত্বিক মডেলে (Bartlett ও সহকর্মীদের ২০২০ সালের কাজসহ) দেখানো হয়েছে, noise মুখস্থ করেও নির্দিষ্ট শর্তে test ভুল ভালো থাকতে পারে।

এখান থেকে ভুল সিদ্ধান্ত নেবেন না। “যত বড় model তত ভালো” এই পর্যবেক্ষণগুলো প্রমাণ করে না; double descent সব পরিস্থিতিতে দেখা যায় না, আর tabular ডেটায় বড় model প্রায়ই সুবিধা দেয় না (পর্ব ৩৮-এ tabular ডেটায় model বাছাই)। আর classical তত্ত্বের যে অংশ সবচেয়ে কাজের, সেটি পুরোপুরি টিকে আছে: অছোঁয়া test set-এ মাপা একটি নির্দিষ্ট model-এর ভুলের জন্য Hoeffding খাটে, model যত বড়ই হোক।

বাস্তবের শিক্ষা: (১) train ভুল প্রমাণ নয়; (২) একই ডেটায় যত বেশি জিনিস বাছবেন, তত বেশি আশাবাদ; (৩) test set একবারের জন্য, আর তার আকার থেকে ±সীমা হিসাব করুন; (৪) i.i.d. ভাঙলে (সময়ের সঙ্গে বদল, মৌসুম) সব নিশ্চয়তা ভাঙে, আর তখন পর্ব ৫৯ (Distribution shift)-এর কৌশল লাগে।

আরও গভীরে: পাঠ্যবই: Shai Shalev-Shwartz আর Shai Ben-David-এর Understanding Machine Learning: From Theory to Algorithms (Cambridge University Press, ২০১৪). মূল উৎস: Hoeffding (১৯৬৩, JASA), Valiant (১৯৮৪, CACM), Vapnik ও Chervonenkis (১৯৭১, Theory of Probability and Its Applications-এ ইংরেজি অনুবাদ), আর Blumer ও সহকর্মী (১৯৮৯, JACM). আধুনিক বিতর্কের জন্য Zhang ও সহকর্মী (ICLR ২০১৭) আর Belkin ও সহকর্মী (PNAS ২০১৯) পড়ুন।

পরীক্ষা ও ইন্টারভিউতে:

  • Empirical risk আর true risk-এর পার্থক্য? প্রথমটি হাতের sample-এ গোনা গড় loss, দ্বিতীয়টি D-এর ওপর প্রত্যাশিত loss; নির্দিষ্ট h-এ প্রথমটি দ্বিতীয়টির unbiased আন্দাজ।
  • |H| = ১০০, ε = ০.১, δ = ০.০৫ (agnostic) — কত n? (ln 100 + ln 40) / (2 × 0.01) = (4.605 + 3.689) / 0.02 = ৪১৪.৭ → ৪১৫.
  • 2-D-তে রেখার VC dimension কত, কেন ৪ নয়? ৩; ত্রিভুজ shatter হয়, কিন্তু যেকোনো ৪টি বিন্দুতে XOR-ধাঁচের বা ভেতরের-বিন্দুর একটি labeling অসম্ভব।
  • Test set-এ ২০টি model তুলনা করে সেরাটির accuracy রিপোর্ট করলে সমস্যা কী? বাছাই S-নির্ভর, তাই Hoeffding আর খাটে না; ফল আশাবাদী।
  • VC dimension কি parameter-এর সংখ্যা? না; sign(sin(ωx))-এর একটি parameter, কিন্তু VC dimension অসীম।

৯ · AI-এর যুগে — learning theory-র দাবি আর AI-এর হিসাব যাচাই

AI assistant learning theory-র সূত্র আত্মবিশ্বাসের সঙ্গে লেখে, আর চিহ্নগুলো নির্ভুল দেখায় বলে ভুল ধরা কঠিন। ML কোডেও সে এমন ভুল করে যা এই পর্বের তত্ত্বের সরাসরি লঙ্ঘন।

AI প্রায়ই যা করেকেন ভুলকীভাবে ধরবেন
Realizable আর agnostic সূত্র মিশিয়ে ফেলে (1/ε বনাম 1/ε²), বা ln-এর জায়গায় log₂ বসায়n দশগুণ বা তার বেশি ভুল আসেছোট একটি ক্ষেত্রে হাতে বের করুন; অংশ ৫-এর calculator দিয়ে মিলিয়ে নিন
“VC dimension = parameter-এর সংখ্যা” বলেশুধু কিছু class-এ মেলে; sin-এর উদাহরণে ভাঙেসংজ্ঞা থেকে shattering যাচাই করুন
Test set-এ hyperparameter বা threshold বেছে সেই সংখ্যাই চূড়ান্ত বলেবাছাই-নির্ভর h-এ Hoeffding খাটে নাকোডে test ডেটা কতবার ছোঁয়া হলো গুনুন; একবারের বেশি হলে আলাদা test set
Train ভুল বা একটি split-এর ফলকে চূড়ান্ত দাবি করেEstimation error আর split-এর এলোমেলোতা উপেক্ষিতকয়েকটি seed বা fold, আর সরল baseline-এর সঙ্গে তুলনা
পুরোনো বা বানানো API দেয়আপনার version-এ চলবে নানিজের version-এর অফিসিয়াল docs পড়ুন

সূত্রের সঙ্গে শর্ত, ছোট উদাহরণ আর যাচাইয়ের কোড চেয়ে নিন; শেষ দুটি লাইন সবচেয়ে জরুরি।

আমি বাইনারি classification-এ ৫০০টি hyperparameter configuration তুলনা করছি, validation set-এ ২,০০০টি উদাহরণ, 0-1 loss. ১. সসীম hypothesis class-এর Hoeffding + union bound দিয়ে বলো: ৯৫% নিশ্চয়তায় সেরা configuration-এর validation ভুল আর আসল ভুলের ফাঁক সর্বোচ্চ কত হতে পারে। সূত্র, প্রতিটি চিহ্নের মানে আর ধাপে ধাপে হিসাব দাও। ২. এই সূত্র কোন শর্তে খাটে (i.i.d., h আগে থেকে ঠিক, loss-এর সীমা) — প্রতিটি শর্ত আলাদা করে লেখো। ৩. Realizable আর agnostic সূত্রের পার্থক্য এক লাইনে বলো, আর আমার ক্ষেত্রে কোনটি খাটে। ৪. একটি ছোট NumPy simulation লেখো (seed দিয়ে) যাতে আমি দেখতে পারি bound-টি সত্য কি না। ৫. তোমার উত্তরে কোথায় ভুল হওয়ার সম্ভাবনা বেশি, সেটিও বলো।

AI-এর দেওয়া তত্ত্ব আর কোড হাতে পেলে — যাচাইয়ের চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।

প্র ০১PAC-এর সংজ্ঞায় ε আর δ দুটিই কেন লাগে? একটি দিয়ে কি চলত না?

দুটি আলাদা ধরনের অনিশ্চয়তা আছে, তাই দুটি সংখ্যা। ε হলো নির্ভুলতার সহনশীলতা: শেখা নিয়মের ভুল সেরার চেয়ে কতটা বেশি হলে মেনে নেব। δ হলো দুর্ভাগ্যের সহনশীলতা: হাতের sample কতটা সম্ভাবনায় এতটাই অপ্রতিনিধিত্বমূলক হতে পারে যে কোনো algorithm-ই কিছু করতে পারবে না।

δ = ০ চাওয়া অসম্ভব। বাজারঘরের উদাহরণে n = ১০০০ হলেও একটি অতি দুর্লভ sample থাকতে পারে যেখানে সব অর্ডার ৫ km-এর কম দূরত্বের; সেখান থেকে ১২ km-এর সীমা শেখা যায় না। এমন sample-এর সম্ভাবনা অতি ক্ষুদ্র, কিন্তু শূন্য নয়। তাই “নিশ্চিতভাবে” নয়, “সম্ভবত” (probably). আবার ε = ০ চাওয়াও অসম্ভব: সসীম ডেটায় সীমাটি ১২.০০০-এ না ১২.০০১-এ, তা কখনো নিশ্চিত হওয়া যায় না। তাই “সঠিক” নয়, “প্রায় সঠিক” (approximately).

দুটির দাম আলাদা, আর অংশ ৫-এর টেবিল তা দেখায়: δ ঢোকে ln(1/δ)-এ, তাই ০.০৫ থেকে ০.০১ করলে n সামান্য বাড়ে (৩০০ → ৩৮১); ε ঢোকে 1/ε²-এ, তাই ০.১ থেকে ০.০১ করলে n একশ গুণ। প্রকৌশলের ভাষায় নিশ্চয়তা সস্তা, নির্ভুলতা দামি।

Valiant ১৯৮৪ সালের প্রবন্ধে এই কাঠামো দেন, আর সেখানে algorithm-এর গণনার সময়ও বহুপদী হওয়ার শর্ত ছিল: শুধু তথ্যগতভাবে শেখা সম্ভব হলেই হবে না, যুক্তিসঙ্গত সময়েও হতে হবে। এই কাজসহ গণনার তত্ত্বে অবদানের জন্য তিনি ২০১০ সালের Turing Award পান। পরের গবেষণায় দেখা যায় কিছু class তথ্যগতভাবে শেখা যায় কিন্তু দক্ষভাবে শেখা কঠিন বলে বিশ্বাস করা হয়, যা cryptography-র অনুমানের সঙ্গে যুক্ত।

মূল উপলব্ধি: ভালো নিশ্চয়তার বিবৃতি সবসময় দুটি কথা বলে: “কতটা কাছে” আর “কত সম্ভাবনায়”। কোনো রিপোর্টে শুধু একটি সংখ্যা থাকলে, অন্যটি জিজ্ঞেস করুন।

প্র ০২VC dimension কি আসলে parameter-এর সংখ্যা? যদি না হয়, তবে প্রায়ই মিলে যায় কেন?

না। d মাত্রায় hyperplane-এর parameter d + ১টি (w-এর d-টি আর b), VC dimension-ও d + ১: এই মিল দেখে অনেকে সাধারণ নিয়ম ধরে নেন। কিন্তু দুই দিকেই এর ব্যতিক্রম আছে।

কম parameter, অসীম VC dimension: এক মাত্রায় hω(x) = sign(sin(ωx)), parameter শুধু একটি, ω. পাঠ্যবইয়ের একটি পরিচিত নির্মাণ দেখায়, xi = 10−i বিন্দুগুলোর যেকোনো labeling-এর জন্য এমন ω বেছে নেওয়া যায় যা ঠিক সেটি দেয়, যত বিন্দুই হোক। কারণ খুব বড় ω-তে sin অতি দ্রুত দোলে, আর ω-এর দশমিক অঙ্কগুলোতে labeling “লিখে রাখা” যায়। এক parameter-এ অসীম তথ্য রাখা যায়, কারণ বাস্তব সংখ্যার নির্ভুলতা অসীম।

অনেক parameter, ছোট VC dimension: উল্টোটিও হয়। একটি linear model-এ একই feature-কে একশবার কপি করলে parameter একশ গুণ, কিন্তু নিয়মের সেট বদলায় না, তাই VC dimension একই থাকে। Parameter গোনা মানে নিয়ম লেখার ভাষা গোনা; VC dimension মাপে নিয়মগুলো আসলে কত রকম আচরণ করতে পারে।

তবু অনেক “স্বাভাবিক” class-এ দুটি কাছাকাছি থাকে। Neural network-এর জন্য VC dimension-এর উপরের ও নিচের সীমা parameter আর layer-এর সংখ্যার সঙ্গে যুক্ত করে প্রমাণ করা হয়েছে (যেমন Bartlett ও সহকর্মীদের কাজ), তবে সেগুলো parameter-এর সংখ্যার চেয়েও বড় হতে পারে, আর এজন্যই বড় network-এ VC bound প্রায় কিছু বলে না (অংশ ৮)।

ইন্টারভিউতে এই প্রশ্ন জনপ্রিয়, কারণ উত্তরটি দেখায় আপনি সংজ্ঞা থেকে চিন্তা করেন কি না। সঠিক পথ: সংজ্ঞায় ফিরুন, shattering-এর একটি সেট খুঁজুন বা অসম্ভবতা প্রমাণ করুন।

মূল উপলব্ধি: জটিলতা parameter-এ নয়, আচরণে। যেকোনো জটিলতার মাপ (VC, norm, Rademacher) আসলে প্রশ্ন করে: এই class কত রকম labeling বানাতে পারে, অর্থাৎ কতটা মুখস্থ করতে পারে।

প্র ০৩এলোমেলো label-এ train ভুল শূন্য করতে পারে এমন network আসল label-এ generalise করে কেন? classical তত্ত্ব কি ভুল?

Classical তত্ত্ব ভুল নয়; প্রশ্নটি ভিন্ন। ২০১৭ সালে Zhang, Bengio, Hardt, Recht আর Vinyals-এর পরীক্ষায় (ICLR) ছবির ডেটাসেটে label এলোমেলো করেও বড় network train ভুল প্রায় শূন্যে নামাতে পেরেছিল। এর অর্থ: সেই H-এর VC dimension বা Rademacher complexity এত বড় যে n-টি উদাহরণে uniform convergence-এর নিশ্চয়তা দেওয়া যায় না। VC bound “সব h-এর জন্য একসঙ্গে” সত্য, আর এমন h-ও আছে যা train-এ নিখুঁত কিন্তু test-এ কয়েন ছোড়ার সমান। bound সেই সবচেয়ে খারাপ h-কে হিসাবে ধরে।

কিন্তু gradient descent সব h-এর মধ্যে এলোমেলো একটি বাছে না। আসল label-এ ডেটার নিজের গঠন আছে (কাছাকাছি ছবি একই শ্রেণির), আর প্রশিক্ষণ পদ্ধতি সেই গঠনের সঙ্গে মেলে এমন “সরল” সমাধানের দিকে ঝোঁকে। তাই প্রশ্নটি দাঁড়ায়: H নয়, algorithm আর ডেটার জুটি কেন ভালো করে? এর উত্তরে algorithm-নির্ভর ও ডেটা-নির্ভর তত্ত্ব আসে: stability, norm-ভিত্তিক bound, PAC-Bayes, আর implicit regularization-এর বিশ্লেষণ। ২০১৯ সালে Nagarajan আর Kolter একটি প্রবন্ধে যুক্তি দেন যে কিছু পরিস্থিতিতে uniform convergence-ভিত্তিক যেকোনো bound-ই এই ঘটনা ব্যাখ্যা করতে পারবে না বলে মনে হয়; বিষয়টি এখনো বিতর্কিত।

একটি জিনিস কিন্তু বিতর্কের বাইরে: train শেষ হওয়ার পর একটি নির্দিষ্ট network-এর ভুল একটি অছোঁয়া test set-এ মাপলে Hoeffding খাটে, network যত বড়ই হোক। অর্থাৎ “কেন ভালো করে” তার ব্যাখ্যা অসম্পূর্ণ হলেও “কতটা ভালো করে” মাপার পদ্ধতি নির্ভরযোগ্য। এজন্যই আধুনিক deep learning চর্চায় test set-এর পবিত্রতা আরও গুরুত্বপূর্ণ হয়েছে। এই বিষয়গুলো পরে Deep Learning কোর্সে বিস্তারিত আসবে।

বাজারঘরের মতো tabular সমস্যায় এই পার্থক্য এখনো কম প্রাসঙ্গিক: সেখানে gradient boosting-এর মতো model-এ regularization আর cross-validation দিয়ে classical দৃষ্টিভঙ্গিই সাধারণত ভালো দিকনির্দেশ দেয়।

মূল উপলব্ধি: তত্ত্বের একটি bound যখন কিছু বলে না, তখন তার মানে “এখানে এই যুক্তি যথেষ্ট নয়”, “এখানে কিছুই নিশ্চিত নয়” নয়। মাপার সৎ পদ্ধতি টিকে থাকে।

প্র ০৪একই test set বারবার ব্যবহার করলে তত্ত্বের দিক থেকে ঠিক কী ভাঙে? Kaggle-এর public leaderboard কি এর উদাহরণ?

Hoeffding বলে: আগে থেকে ঠিক করা একটি h-এর জন্য test ভুল আসলের কাছে। যখনই test-এর ফল দেখে model বদলান (feature যোগ, threshold সরানো), পরের model আর test set থেকে স্বাধীন নয়; সে test set-এর তথ্য দিয়ে বাছাই করা। তখন আপনি অজান্তে test set-এর ওপর ERM করছেন, আর বারবার করলে |H| ক্রমে বাড়ে। এর নাম adaptive data analysis-এর সমস্যা। এর সরল রূপে প্রতিটি নতুন তুলনা union bound-এ একটি পদ যোগ করে; কিন্তু তুলনাগুলো আগের ফলের ওপর নির্ভর করলে ক্ষতি আরও বাড়তে পারে, কারণ বাছাইয়ের পথটাই ডেটা-নির্ভর।

Kaggle-এর মতো প্রতিযোগিতায় public leaderboard একটি অংশের test ডেটায় স্কোর দেখায়, আর চূড়ান্ত ফল আসে লুকানো private অংশ থেকে। অনেক প্রতিযোগিতায় দেখা গেছে public-এ ওপরে থাকা কিছু দল private-এ অনেক নিচে নেমে যায়, যাকে সম্প্রদায় leaderboard-এ overfit বলে। এর একটি অংশ ঠিক এই বারবার বাছাইয়ের ফল। ২০১৫ সালে Dwork ও সহকর্মীরা (Science) “reusable holdout”-এর একটি পদ্ধতি প্রস্তাব করেন, যেখানে holdout-এর উত্তর ইচ্ছাকৃতভাবে একটু noise-সহ দেওয়া হয় যাতে অনেকবার ব্যবহারেও আশাবাদ সীমিত থাকে। আবার কিছু গবেষণা দেখিয়েছে, বহুবার ব্যবহৃত জনপ্রিয় benchmark-এ অভিযোজিত overfitting প্রত্যাশার চেয়ে কম হতে পারে। তাই ক্ষতির পরিমাণ পরিস্থিতিভেদে আলাদা।

বাজারঘরের দলের জন্য ব্যবহারিক নিয়ম: (১) উন্নয়নের সব সিদ্ধান্ত validation বা cross-validation-এ; (২) test set একবার, একদম শেষে; (৩) test-এর ফল দেখে কিছু বদলালে তা রিপোর্টে লিখুন আর নতুন test ডেটা জোগাড় করুন, যেমন পরের মাসের অর্ডার; (৪) কতগুলো জিনিস তুলনা করা হয়েছে তার হিসাব রাখুন। পরিসংখ্যানে একাধিক তুলনার সংশোধন (multiple comparisons) পর্ব ২২-এ আসবে, আর experiment-এর লগ রাখার অভ্যাস পরের পর্বে (পর্ব ০৪)।

মূল উপলব্ধি: test set একটি সীমিত সম্পদ। প্রতিটি দেখা কিছুটা খরচ করে; হিসাব না রাখলে আপনি না জেনেই আশাবাদ কিনছেন।

প্র ০৫i.i.d. শর্ত না থাকলে, যেমন বাজারঘরের ঈদের মৌসুম বা নতুন জেলায় সেবা চালু হলে, এই পর্বের কোন নিশ্চয়তা টিকে থাকে?

প্রায় কিছুই টেকে না, যদি না বাড়তি অনুমান যোগ করেন। Hoeffding-এর শর্ত দুটি: উদাহরণগুলো স্বাধীন, আর train ও ভবিষ্যতের ডেটা একই D থেকে। ঈদের আগের সপ্তাহে অর্ডারের ধরন বদলায় (দূরত্ব, পণ্য, রাইডারের চাপ), তাই নভেম্বরের D-তে শেখা নিয়মের true risk রমজানের D-তে আলাদা সংখ্যা। Test set যদি নভেম্বরেরই হয়, তাহলে Hoeffding নভেম্বরের risk-এর নিশ্চয়তা দেয়, রমজানের নয়। আবার একই গ্রাহকের অনেক অর্ডার train আর test দুই দিকে থাকলে স্বাধীনতাও ভাঙে, আর ফল আশাবাদী হয়; AI-এর ভিত্তি কোর্সের পর্ব ৫৬-এর group split এই কারণেই।

তত্ত্ব এখানে কয়েকটি পথ দেয়, প্রতিটির নিজস্ব অনুমান। Domain adaptation-এর তত্ত্ব (যেমন Ben-David ও সহকর্মীদের ২০১০ সালের কাজ) নতুন D-এর ভুলকে পুরোনো D-এর ভুল আর দুই D-এর দূরত্বের একটি মাপ দিয়ে সীমাবদ্ধ করে; দূরত্ব বড় হলে নিশ্চয়তা দুর্বল। Covariate shift-এ (শুধু x-এর বণ্টন বদলায়, x থেকে y-এর নিয়ম একই) importance weighting দিয়ে পুরোনো ডেটাকে নতুন অনুপাতে ওজন দেওয়া যায়। আর conformal prediction (পর্ব ৫৮) i.i.d.-এর চেয়ে দুর্বল একটি শর্ত, exchangeability, চায়, তবু সেটিও সময়ের সঙ্গে বদলে যাওয়া ডেটায় ভাঙতে পারে।

ব্যবহারিক দিক থেকে উত্তরটি পর্যবেক্ষণ: deploy-এর পর নতুন label আসলে আবার মাপুন, input-এর বণ্টন নজরে রাখুন, আর সময় অনুযায়ী split করে (পুরোনো দিয়ে শিখে নতুনে মেপে) দেখুন model সময়ের সঙ্গে কতটা খারাপ হয়। Distribution shift ধরা আর সামলানো পর্ব ৫৯-এ, আর production-এ নজরদারি পর্ব ৬৯-এ আসবে।

একটি সূক্ষ্ম কথা: label noise-এর হার নিজেও বদলাতে পারে। বর্ষায় দেরির “কারণ” বেশি এলোমেলো হলে Bayes error নিজেই বাড়ে; তখন কোনো model-ই আগের মতো ভালো করবে না, আর সেটি model-এর দোষ নয়।

মূল উপলব্ধি: learning theory-র প্রতিটি নিশ্চয়তা একটি শর্তসাপেক্ষ চুক্তি। শর্তটি (i.i.d.) আপনার ডেটায় সত্য কি না, সেটি যাচাই করা তত্ত্বের কাজ নয়, আপনার কাজ।

অনুশীলন

হিসাবগুলো খাতায় করুন, তারপর উত্তর মেলান। একটির জন্য কোড চালানো ঐচ্ছিক।

  1. Sample size-এর numerical: একটি hypothesis class-এর প্রতিটি নিয়ম ২০টি bit দিয়ে লেখা যায়, তাই |H| = 220. ε = ০.০৫, δ = ০.০১ ধরে (ক) agnostic আর (খ) realizable ক্ষেত্রে যথেষ্ট n বের করুন। (গ) ERM-এর আসল ভুল H-এর সেরার চেয়ে ০.০৫-এর বেশি খারাপ না হওয়ার নিশ্চয়তা চাইলে agnostic-এ কত n?

    ln(220) = 20 × 0.6931 = 13.863. (ক) ln(2/0.01) = ln 200 = 5.298. n ≥ (13.863 + 5.298) / (2 × 0.0025) = 19.161 / 0.005 = ৩,৮৩২.৩ → ৩,৮৩৩. (খ) ln(1/0.01) = ln 100 = 4.605. n ≥ (13.863 + 4.605) / 0.05 = 18.468 / 0.05 = ৩৬৯.৪ → ৩৭০. (গ) ERM-এর নিশ্চয়তা 2ε, তাই ε = ০.০২৫ বসাতে হবে: n ≥ 19.161 / (2 × 0.000625) = 19.161 / 0.00125 = ১৫,৩২৮.৯ → ১৫,৩২৯, (ক)-এর প্রায় চারগুণ।

  2. সমালোচনা ও নকশা: বাজারঘরের একজন বিশ্লেষক churn model-এর জন্য ১২টি algorithm আর প্রতিটির ৪০টি hyperparameter সেট (মোট ৪৮০টি) একটি ১,০০০ সারির validation set-এ চালিয়ে সেরাটির accuracy ৮৭.৪% রিপোর্ট করলেন, আর বললেন “নতুন গ্রাহকেও ৮৭% পাব।” এই দাবির দুর্বলতা কী, কতটা আশাবাদ থাকতে পারে, আর আপনি প্রক্রিয়াটি কীভাবে নতুন করে সাজাবেন?

    দুর্বলতা: ৮৭.৪% একটি বাছাই-করা সংখ্যা। ৪৮০টির মধ্যে সেরাটি validation দেখে বাছা, তাই এটি |H| = ৪৮০-এর ওপর ERM, আর একক model-এর Hoeffding খাটে না। পরিমাণ: union bound দিয়ে ৯৫% নিশ্চয়তায় সর্বোচ্চ ফাঁক √((ln 480 + ln 40) / 2000) = √((6.174 + 3.689) / 2000) = √0.004931 ≈ ০.০৭০, অর্থাৎ ±৭ শতাংশ বিন্দু; একক আগে-ঠিক-করা model-এ হতো ±৪.৩. এটি সবচেয়ে খারাপ ক্ষেত্রের সীমা; আসল আশাবাদ সাধারণত কম, তবে শূন্য নয়। আর নতুন গ্রাহক যদি অন্য সময়ের হন, i.i.d. শর্তও প্রশ্নবিদ্ধ।

    নতুন নকশা: (১) শুরুতেই একটি test set আলাদা করে তালা দিন, যেমন শেষ মাসের গ্রাহক। (২) বাছাই হোক cross-validation-এ, সম্ভব হলে nested CV. (৩) কতগুলো configuration দেখা হলো তা লগে লিখুন। (৪) চূড়ান্ত model test set-এ একবার মাপুন, আর Hoeffding বা পর্ব ২১-এর bootstrap দিয়ে অনিশ্চয়তার পরিসর দিন। (৫) একটি সরল baseline (যেমন majority class বা logistic regression)-এর সঙ্গে তুলনা দেখান; churn-এ class imbalance থাকলে accuracy-র সঙ্গে precision/recall-ও দিন।

  3. আউটপুট অনুমান করুন: চালানোর আগে লিখে ফেলুন নিচের কোড কী ছাপবে (empirical risk তিন দশমিকে, আর ERM কোন t বাছবে)।
    import numpy as np
    x = np.array([2, 5, 7, 9, 11, 14])
    y = np.array([0, 0, 1, 0, 1, 1])
    H = np.array([4, 6, 8, 10, 12])
    risk = np.array([np.mean((x > t).astype(int) != y) for t in H])
    print(np.round(risk, 3))
    print("ERM picks t =", H[np.argmin(risk)])
    [0.333 0.167 0.333 0.167 0.333]
    ERM picks t = 6

    প্রতিটি t-এর জন্য অনুমান x > t: t = ৪-এ ৫ আর ৯ নম্বর দূরত্বের অর্ডার ভুল (২/৬); t = ৬-এ শুধু ৯ ভুল (১/৬); t = ৮-এ ৭ আর ৯ (২/৬); t = ১০-এ শুধু ৭ (১/৬); t = ১২-এ ৭ আর ১১ (২/৬)। t = ৬ আর t = ১০ দুটিতেই সর্বনিম্ন ১/৬ = ০.১৬৭; np.argmin সমান মানের মধ্যে প্রথমটির index দেয়, তাই t = 6. ERM-এর tie-breaking-এর নীরব সিদ্ধান্ত। ৭ km-এ দেরি আর ৯ km-এ দেরি নেই, তাই কোনো threshold নিখুঁত নয়: ডেটাটি realizable নয়।

  4. VC dimension নিজে বের করুন: এক মাত্রায় interval class: ha,b(x) = + যদি a ≤ x ≤ b, নইলে −. দেখান এর VC dimension ঠিক ২. তারপর বলুন: বাজারঘরের একজন বিশ্লেষক “দূরত্ব ৮ থেকে ১৪ km-এর মধ্যে হলে ফেরত বেশি” এমন নিয়ম খুঁজছেন; threshold-এর বদলে interval নিলে অংশ ৪-এর bound-এ কী বদলায়?

    VC ≥ ২: দুটি বিন্দু ১ আর ৩ নিন। (−, −): interval [৫, ৬]. (+, −): [০, ২]. (−, +): [২, ৪]. (+, +): [০, ৪]. চারটিই সম্ভব, তাই shatter হয়। VC < ৩: যেকোনো তিনটি বিন্দু x1 < x2 < x3-এ (+, −, +) অসম্ভব: interval x1 আর x3-কে ধারণ করলে মাঝের x2-কেও ধারণ করে, কারণ interval একটানা। তাই VC dimension ঠিক ২.

    Bound-এ প্রভাব: n-টি বিন্দুতে threshold সর্বোচ্চ n + ১ রকম labeling দেয়, interval প্রায় n²/2 রকম (a আর b দুটিই বিন্দুগুলোর মাঝের ফাঁকে বসে)। তাই ln(কার্যকর আকার) প্রায় ln n থেকে প্রায় 2 ln n হয়: একই ε আর δ-তে আরও কিছু ডেটা লাগবে, কিন্তু দ্বিগুণের বেশি নয়। বিনিময়ে approximation error কমতে পারে, যদি আসল নিয়ম সত্যিই একটি মাঝের এলাকা হয়। এটিই bias–complexity trade-off.

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমসসীম H-এর জন্য ERM-এর নিশ্চয়তা প্রমাণের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. একটি নির্দিষ্ট h ধরে Hoeffding: P(|R̂ − R| ≥ ε) ≤ 2e−2nε²
  2. Union bound দিয়ে H-এর সব h একসঙ্গে: ব্যর্থতা ≤ |H| · 2e−2nε²
  3. এই যোগফল ≤ δ ধরে n-এর জন্য সমাধান: n ≥ (ln|H| + ln(2/δ)) / (2ε²)
  4. Uniform convergence থেকে: R(ĥ) ≤ R̂(ĥ) + ε ≤ R̂(h*) + ε
  5. উপসংহার: R(ĥ) ≤ R(h*) + 2ε, অন্তত ১ − δ সম্ভাবনায়

একটি classifier আগে থেকে ঠিক করা, আর একটি অছোঁয়া test set-এ n = ২০০০ উদাহরণে তার ভুল মাপা হলো। Hoeffding অনুযায়ী ৯৫% নিশ্চয়তায় (δ = ০.০৫) মাপা ভুল আর আসল ভুলের ফাঁকের সর্বোচ্চ সীমা প্রায় কত? (ln 40 ≈ 3.689)

  • ০.০৪৩
  • ০.০৩০
  • ০.০২২
  • ০.০০০৯

ERM দিয়ে বাছা নিয়ম ĥ-এর train ভুল R̂(ĥ) সাধারণত তার আসল ভুল R(ĥ)-এর তুলনায় কেমন হয়, আর কেন?

  • গড়ে সমান, কারণ empirical risk একটি unbiased আন্দাজ
  • সাধারণত বেশি, কারণ train ডেটায় noise থাকে
  • সাধারণত কম, কারণ ĥ বাছা হয়েছে এই sample-এ কম ভুলের জন্য
  • সবসময় হুবহু সমান, যদি H সসীম হয়

সসীম H-এর agnostic bound n ≥ (ln|H| + ln(2/δ)) / (2ε²)-এ কোন পরিবর্তন প্রয়োজনীয় n-কে সবচেয়ে বেশি বাড়ায়?

  • |H| ১০ থেকে ১০০০ করা
  • δ ০.০৫ থেকে ০.০১ করা
  • Distribution D বদলানো
  • ε ০.১ থেকে ০.০২ করা

একটি hypothesis class H কোনো m-বিন্দুর সেটকে “shatter” করে — কথাটির সঠিক অর্থ কোনটি?

  • ওই m-টি বিন্দুর 2m-টি সম্ভাব্য labeling-এর প্রতিটি H-এর কোনো না কোনো h দিতে পারে
  • H-এর একটি h বিন্দুগুলোর আসল label ঠিক দেয়
  • যেকোনো m-টি বিন্দুর সব সেটে সব labeling সম্ভব
  • H-এর ERM ওই বিন্দুগুলোতে train ভুল শূন্য করে

দুই মাত্রায় সরলরেখা দিয়ে ভাগ করা linear classifier (h(x) = sign(w·x + b))-এর VC dimension কত?

  • ২
  • ৩
  • ৪
  • অসীম

একটি বড় neural network এলোমেলো label-এও train ভুল প্রায় শূন্য করতে পারে, আবার আসল label-এ ভালো generalise করে। এ থেকে কোন সিদ্ধান্তটি সবচেয়ে যুক্তিসঙ্গত?

  • Classical learning theory ভুল প্রমাণিত হয়েছে
  • Train ভুল শূন্য হলেই model ভালো generalise করে
  • শুধু H-এর জটিলতা দিয়ে generalisation ব্যাখ্যা যথেষ্ট নয়; algorithm আর ডেটাও ভূমিকা রাখে
  • বড় model-এ test set দরকার নেই

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. R(h) = D-এর ওপর প্রত্যাশিত loss (অদেখা), R̂S(h) = sample-এ গড় loss; পার্থক্যই generalisation gap, আর সব কিছু i.i.d. শর্তের ওপর দাঁড়িয়ে।
  2. আগে থেকে ঠিক করা h-এ Hoeffding: ফাঁক ≤ √(ln(2/δ) / 2n), অন্তত ১ − δ সম্ভাবনায়; n = ১০০০, δ = ০.০৫-এ ±০.০৪৩.
  3. ERM ডেটা দেখে বাছে, তাই train ভুল আশাবাদী; বাড়তি ভুল = approximation + estimation error.
  4. সসীম H: n ≥ (ln|H| + ln(2/δ)) / (2ε²) (agnostic), (ln|H| + ln(1/δ)) / ε (realizable); ERM-এর নিশ্চয়তা R(h*) + 2ε. Bound সত্য কিন্তু রক্ষণশীল।
  5. অসীম H-এ VC dimension: সবচেয়ে বড় shatter-যোগ্য সেটের আকার; 2-D-তে রেখার ৩. বড় network-এ class-ভিত্তিক bound প্রায় কিছু বলে না, কিন্তু অছোঁয়া test set-এর মাপ নির্ভরযোগ্য থাকে।

পরের পর্বে: এই পর্ব দেখাল প্রতিটি বাছাই আশাবাদ ঢোকায়। পর্ব ০৪ (পুনরুৎপাদনযোগ্য ML experiment — seed, config, tracking আর তুলনা) দেখাবে কীভাবে প্রতিটি run, প্রতিটি বাছাই আর প্রতিটি সংখ্যা লিখে রাখলে সেই আশাবাদ চোখের সামনে থাকে, আর ফল অন্যরা হুবহু আবার পায়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান