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

যন্ত্র কীভাবে শেখে — supervised, unsupervised আর reinforcement

How Machines Learn — Rules from Data, the Vocabulary of ML, Three Kinds of Learning, Inductive Bias and Generalisation

Taught in Bangla, this lesson compares a hand-written rule with a model learned from fictional delivery data, frames problems with Mitchell's task, experience and performance, defines datasets, features, labels, X and y, parameters and hyperparameters, explains supervised, unsupervised, reinforcement and self-supervised learning, the learning pipeline, hypothesis space, inductive bias, overfitting and the no free lunch result.

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

  • হাতে লেখা নিয়ম আর ডেটা থেকে শেখা নিয়মের পার্থক্য, একই ডেটায় মেপে
  • Mitchell-এর T, E, P দিয়ে যেকোনো শেখার সমস্যা স্পষ্ট করে লেখা
  • Dataset, feature, label, X আর y, parameter ও hyperparameter, training ও inference-এর সঠিক অর্থ
  • Supervised, unsupervised, reinforcement আর self-supervised শেখার পার্থক্য ও ব্যবহার
  • Learning pipeline, hypothesis space, inductive bias, generalisation, no free lunch আর ML-এর সৎ সীমা

এই পর্ব মডিউল ১০ (ডেটা থেকে শেখা) খোলে। পর্ব ৪-এ machine learning-এর সংজ্ঞা আর শেখার তিন ধরনের প্রথম পরিচয় পেয়েছেন, আর পর্ব ৫-এ দেখেছেন আউটপুটের আকার কীভাবে সমস্যার ধরন ঠিক করে। এখানে সেগুলো আবার বলব না; বরং নিচে নামব: শেখা আসলে কোন হিসাব, তার শব্দভান্ডার কী, আর কেন training-এ ভালো করা যথেষ্ট নয়। চালানো যায় এমন ব্লকগুলো পাতাতেই চলে (ব্রাউজারের Python: NumPy 2.4.6, scikit-learn 1.8.0, matplotlib 3.10.8). scikit-learn প্রথমবার নামতে প্রায় ১০ সেকেন্ড লাগে; পরের run দ্রুত।

১ · হাতে লেখা নিয়ম, নাকি ডেটা থেকে শেখা নিয়ম

বাজারঘর (এই কোর্সের কাল্পনিক অনলাইন দোকান) চায় অর্ডার দেওয়ার মুহূর্তেই গ্রাহককে বলতে, “আপনার পার্সেল আনুমানিক ৫৫ মিনিটে পৌঁছাবে”. হাতে আছে দুটি তথ্য: গুদাম থেকে ঠিকানার দূরত্ব (km) আর পার্সেলের ওজন (kg). দুই রকম পথে এগোনো যায়।

পথ ১, অভিজ্ঞ মানুষের নিয়ম। পর্ব ৪৭-এ বাজারঘরের ফেরত-নীতি যেভাবে production rule-এ লেখা হয়েছিল, সেভাবে ডেলিভারি দলের প্রধান লিখলেন: “৫ km পর্যন্ত ৪০ মিনিট, ১০ km পর্যন্ত ৬০, তার বেশি হলে ৮০; পার্সেল ৫ kg-এর বেশি হলে আরও ১০ মিনিট”. নিয়মটি পড়া যায়, ব্যাখ্যা করা যায়, আর কাল থেকেই চালু করা যায়। কিন্তু সংখ্যাগুলো (৪০, ৬০, ৮০, ১০) এসেছে একজন মানুষের স্মৃতি আর আন্দাজ থেকে।

পথ ২, ডেটা থেকে শেখা। আমরা শুধু নিয়মের কাঠামো বেছে দিই: “মিনিট ≈ b0 + b1 × km + b2 × kg”, অর্থাৎ একটি সরল রেখা (দুই feature-এ আসলে একটি সমতল)। b0, b1, b2-এর মান কেউ লেখেন না; পুরোনো অর্ডারের আসল সময় দেখে এমন মান বেছে নেওয়া হয়, যাতে পুরোনো অর্ডারে ভুলের বর্গের যোগফল সবচেয়ে কম হয়। এটিই least squares, যা পর্ব ১৭-এ np.linalg.lstsq দিয়ে করেছেন। এই কাঠামো আর তার শেখা সংখ্যাগুলো মিলে হলো একটি model.

চায়ের দোকানের মালিক প্রথমে আন্দাজে ঠিক করেন সকালে ৫ লিটার দুধ লাগবে; এক মাস হিসাব খাতা রেখে দেখেন শুক্রবারে বেশি, বৃষ্টির দিনে কম, আর আন্দাজ বদলান। প্রথমটি হাতে লেখা নিয়ম; দ্বিতীয়টি ডেটা থেকে শেখা। Machine learning হলো দ্বিতীয় অভ্যাসটিকে নিয়মিত, মাপা আর স্বয়ংক্রিয় করা।

নিচের ব্লক ৬০টি কাল্পনিক অর্ডার বানায়। সম্পর্কটি আমরাই ঠিক করেছি: মিনিট = ২০ + ৪ × km + ১.৫ × kg + এলোমেলো গোলমাল (গড় ০, standard deviation ৬ মিনিট)। বাস্তবের ডেলিভারি এত সরল নয়; এখানে সত্য জানা আছে বলেই যাচাই করা যায় শেখা model সত্যের কত কাছে পৌঁছাল। প্রথম ৪০টি অর্ডার “পুরোনো” (শেখার জন্য), শেষ ২০টি “নতুন” (মাপার জন্য); দুই পথই নতুন ২০টিতে মাপা হয়, আর মাপ হলো MAE, অর্থাৎ অনুমান আর আসল সময়ের পার্থক্যের গড় (মিনিটে)।

import numpy as np

# বাজারঘরের কাল্পনিক ডেলিভারি: সম্পর্কটি আমরাই বানিয়েছি
rng = np.random.default_rng(42)
n = 60
km = rng.uniform(1, 15, n).round(1)          # দূরত্ব
kg = rng.uniform(0.5, 10, n).round(1)        # ওজন
minutes = 20 + 4.0 * km + 1.5 * kg + rng.normal(0, 6, n)

old, new = slice(0, 40), slice(40, 60)       # ৪০টি পুরোনো, ২০টি নতুন অর্ডার

def hand_rule(d, w):                         # পর্ব ৪৭-এর ধাঁচে হাতে লেখা নিয়ম
    if d <= 5:
        t = 40
    elif d <= 10:
        t = 60
    else:
        t = 80
    return t + (10 if w > 5 else 0)          # ভারী পার্সেলে ১০ মিনিট বেশি

rule_pred = np.array([hand_rule(d, w) for d, w in zip(km[new], kg[new])])

# ডেটা থেকে শেখা: minutes ≈ b0 + b1*km + b2*kg, least squares (পর্ব ১৭)
X = np.column_stack([np.ones(n), km, kg])
b, *_ = np.linalg.lstsq(X[old], minutes[old], rcond=None)
fit_pred = X[new] @ b

mae = lambda p: np.mean(np.abs(p - minutes[new]))
print("শেখা parameter b0, b1, b2:", b.round(2))
print("নতুন ২০টি অর্ডারে গড় ভুল (MAE, মিনিট)")
print("  হাতের নিয়ম:", round(mae(rule_pred), 1))
print("  শেখা রেখা :", round(mae(fit_pred), 1))
print("প্রথম ৩টি নতুন অর্ডার:", km[new][:3], kg[new][:3])
print("  আসল:", minutes[new][:3].round(0), "নিয়ম:", rule_pred[:3], "রেখা:", fit_pred[:3].round(0))

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

শেখা parameter b0, b1, b2: [17.97  4.03  1.89]
নতুন ২০টি অর্ডারে গড় ভুল (MAE, মিনিট)
  হাতের নিয়ম: 10.4
  শেখা রেখা : 4.8
প্রথম ৩টি নতুন অর্ডার: [ 7.1 12.7 10.8] [9.1 7.1 3. ]
  আসল: [59. 74. 62.] নিয়ম: [70 90 80] রেখা: [64. 83. 67.]

৪০টি পুরোনো অর্ডার দেখে শেখা সংখ্যাগুলো (১৭.৯৭, ৪.০৩, ১.৮৯) আমাদের লুকানো সত্যের (২০, ৪, ১.৫) বেশ কাছে, যদিও হুবহু নয়: গোলমালের কারণে ৪০টি উদাহরণ থেকে নিখুঁত উত্তর পাওয়া যায় না। নতুন অর্ডারে হাতের নিয়মের গড় ভুল ১০.৪ মিনিট, শেখা রেখার ৪.৮. গোলমালের নিজের standard deviation ৬ মিনিট, তাই প্রায় ৪.৮ মিনিটের গড় ভুল এই ডেটায় যতটা ভালো সম্ভব, তার কাছাকাছি। প্রথম তিনটি নতুন অর্ডারে রেখাও ৫ থেকে ৯ মিনিট ভুল করেছে; শেখা model নিখুঁত নয়, শুধু গড়ে কম ভুল করে।

তবু হাতের নিয়ম সবসময় হারে না: ডেটা ছাড়াই চালু করা যায়, প্রতিটি সিদ্ধান্ত ব্যাখ্যা করা যায়, আর নীতি সরাসরি লেখা যায় (ভাবনার প্রশ্ন ১)। মডিউল ৮-এর knowledge acquisition bottleneck (বিশেষজ্ঞের মাথা থেকে নিয়ম বের করার কষ্ট) ছিল ডেটা থেকে শেখার দিকে ঝোঁকার একটি বড় ঐতিহাসিক কারণ।

২ · Mitchell-এর T, E, P — তিনটি দোকানি সমস্যায়

পর্ব ৪-এ Tom M. Mitchell-এর ১৯৯৭ সালের পাঠ্যবই Machine Learning-এর সংজ্ঞাটি দেখেছেন: একটি প্রোগ্রাম কাজ T-এর ব্যাপারে, মাপ P অনুযায়ী, অভিজ্ঞতা E থেকে শেখে, যদি E বাড়ার সঙ্গে P দিয়ে মাপা T-এর ফল ভালো হয়। এখানে সংজ্ঞাটিকে একটি হাতিয়ার হিসেবে ব্যবহার করব: কোনো সমস্যায় T, E আর P স্পষ্ট করে লিখতে না পারলে সমস্যাটি এখনো শেখার উপযোগী করে সাজানো হয়নি।

সমস্যাT (কাজ)E (অভিজ্ঞতা)P (মাপ)
ডেলিভারির সময়অর্ডারের মুহূর্তে km আর kg দেখে মিনিট বলাআসল ডেলিভারি-সময়সহ পুরোনো অর্ডারনতুন অর্ডারে MAE (কম হলে ভালো)
অর্ডার ফেরত আসবে কি নাপাঠানোর আগে “ফেরতের ঝুঁকি বেশি” চিহ্ন দেওয়াফেরত এসেছে কি না জানা পুরোনো অর্ডারআসল ফেরতের কত ভাগ আগে ধরা গেল, আর কতগুলো ভুল সতর্কতা
ছাড়ের হার ঠিক করাপ্রতি সপ্তাহে কোন পণ্যে কত % ছাড় দেওয়া হবেদোকানের নিজের চেষ্টা: ছাড় দিয়ে বিক্রি আর লাভ দেখাকয়েক মাসে মোট লাভ

তিনটি সারি তিন রকম শেখা। প্রথমটিতে উত্তর একটি সংখ্যা (regression), দ্বিতীয়টিতে একটি শ্রেণি (classification); দুটিতেই E-তে সঠিক উত্তর লেখা আছে, তাই এরা supervised learning. তৃতীয়টিতে কেউ বলে দেয় না “এই সপ্তাহে ১০% ঠিক ছিল”; দোকান নিজে চেষ্টা করে আর ফল দেখে শেখে, তাই এটি reinforcement learning-এর কাছাকাছি (অংশ ৫)। দ্বিতীয় সারির P দুটি সংখ্যা, আর কোনটি জরুরি তা ব্যবসার প্রশ্ন; শুধু accuracy বাছলে ভুল জিনিস ভালো হতে পারে (পর্ব ৬০, মূল্যায়ন — accuracy, precision, recall, F1 আর ROC).

নিচের stepper প্রথম সমস্যাটি ধাপে ধাপে সাজায়, আর অংশ ১-এর একই ৬০টি অর্ডারে দেখায় E বাড়লে P সত্যিই ভালো হয় কি না। প্রতিবার পুরোনো অর্ডারের প্রথম m টি দিয়ে রেখা শেখা হয়েছে, আর একই ২০টি নতুন অর্ডারে MAE মাপা হয়েছে (সংখ্যাগুলো একটি scratch script-এ হিসাব করা, একই seed).

বাজারঘর · ডেলিভারির মিনিট অনুমান
এই ধাপে
T
E-এর নমুনা
শেখা b0, b1, b2
P: নতুন ২০টিতে MAE
  1. T, কাজ। ইনপুট দুটি সংখ্যা (km, kg), আউটপুট একটি সংখ্যা (মিনিট)। কাজটি অর্ডারের মুহূর্তে করতে হবে, তাই রাইডারের আসল রুট বা রাস্তার জ্যামের মতো পরে জানা তথ্য ইনপুটে রাখা যাবে না।
  2. E, অভিজ্ঞতা। প্রতিটি পুরোনো অর্ডার একটি উদাহরণ: ইনপুট আর তার আসল উত্তর। প্রথম অর্ডার ১১.৮ km, ৬.৮ kg, লেগেছিল ৮৭.০ মিনিট।
  3. P, মাপ। শেখায় কখনো না দেখা ২০টি নতুন অর্ডারে MAE. তুলনার জন্য দুটি সহজ পথ: সবসময় পুরোনো অর্ডারের গড় সময় বলা (MAE ১২.৮১), আর হাতের নিয়ম (১০.৪)। শেখা model-কে অন্তত এদের হারাতে হবে।
  4. মাত্র ৩টি উদাহরণ। তিনটি অজানা সংখ্যা, তিনটি সমীকরণ: রেখা তিনটি বিন্দু দিয়ে হুবহু যায়, কিন্তু parameter অদ্ভুত (b0 = −২৯.২৮, kg-এর ওজন ১৫.১৬). নতুন অর্ডারে MAE ৩০.৭১, গড় বলার চেয়েও খারাপ। অল্প অভিজ্ঞতায় শেখা মানে গোলমাল মুখস্থ করা।
  5. ৫ আর ১০টি। MAE নেমে ৭.৫৪, তারপর ৫.১৫. Parameter সত্যের (২০, ৪, ১.৫) দিকে সরছে। এখানেই Mitchell-এর অর্থে শেখা: E বেড়েছে, একই T-এ P ভালো হয়েছে।
  6. ২০ আর ৪০টি। ৪.৭৬, তারপর ৪.৮৩: সামান্য খারাপ! উন্নতি এখন গোলমালের সীমার কাছে থেমে গেছে, আর মাত্র ২০টি নতুন অর্ডারের মাপ নিজেও নড়বড়ে। সংজ্ঞার “ভালো হয়” কথাটি গড় প্রবণতা বোঝায়, প্রতিটি ধাপে নিশ্চিত উন্নতি নয়।
মূল ধারণা

P সবসময় নতুন ডেটায় মাপা হয়। পুরোনো ৩টি অর্ডারে রেখার ভুল ছিল শূন্য, অথচ নতুন অর্ডারে সবচেয়ে খারাপ। শেখার ফল বিচার করা হয় এমন উদাহরণে, যা শেখার সময় দেখা হয়নি।

৩ · শেখার ভাষা — dataset, feature, label, X আর y

ML-এর কয়েকটি শব্দ বারবার আসে, একেক বইয়ে ভিন্ন নামে। অংশ ১-এর ডেটা দিয়ে সবগুলো বাঁধা যাক।

  • Dataset: উদাহরণের পুরো সংগ্রহ, এখানে ৬০টি অর্ডার। সাধারণত একটি টেবিল।
  • উদাহরণ (example, instance, sample): টেবিলের একটি সারি, একটি অর্ডার। Statistics-এ “sample” শব্দটি পুরো নমুনা-সংগ্রহও বোঝায়, তাই প্রসঙ্গ দেখে পড়তে হয়।
  • Feature (input variable, attribute, predictor): model-কে দেওয়া ইনপুটের একটি কলাম, এখানে km আর kg.
  • Label বা target: যা অনুমান করতে হবে, এখানে আসল মিনিট। Regression-এ সংখ্যা, classification-এ শ্রেণি।
  • Feature vector: একটি উদাহরণের সব feature একই ক্রমে, যেমন (১১.৮, ৬.৮). পর্ব ৩৩-এ দেখেছেন এমন সারিকে vector ধরলে দূরত্ব আর similarity মাপা যায়, আর scaling না করলে বড় এককের কলাম দূরত্ব দখল করে।
  • Design matrix X: সব feature vector সারি হিসেবে সাজানো একটি matrix, আকার n × d (n = উদাহরণ, d = feature). সঙ্গে y, n ঘরের একটি vector, প্রতিটি সারির label.

X আর y: সারি মানে উদাহরণ, কলাম মানে feature

The design matrix X (n × d) and the label vector y (n)

Design matrix X with shape (60, 2) and label vector y with shape (60,) km kg মিনিট 11.86.887.0 7.15.054.5 13.05.974.7 ⋮⋮⋮ 2.66.541.1 সারি ১ সারি ৬০ n = ৬০ হলুদ সারি = feature vector নীল কলাম = একটি feature y = label X: (60, 2) y: (60,)

এই আকারের নিয়মটি scikit-learn সহ প্রায় সব library মানে: fit(X, y)-এ X দুই-মাত্রার (n, d), y এক-মাত্রার (n,). একটিমাত্র feature থাকলেও X-কে (n, 1) আকারে দিতে হয়; এক-মাত্রার array দিলে scikit-learn error দেয়। আকারের ভুল ML কোডের সবচেয়ে সাধারণ ভুলগুলোর একটি, তাই প্রতিটি ধাপে .shape ছাপানো ভালো অভ্যাস (পর্ব ১৩)।

Model, parameter আর hyperparameter

Model হলো ইনপুট থেকে আউটপুটে যাওয়ার একটি ফাংশন, যার কিছু অংশ ডেটা থেকে ঠিক হয়। যে সংখ্যাগুলো training-এ ডেটা থেকে শেখা হয়, তারা parameter: অংশ ১-এর b0, b1, b2. আর যে সিদ্ধান্তগুলো শেখার আগে মানুষ নেন, তারা hyperparameter: রেখা নেব না বাঁকা রেখা (বহুপদীর degree), কতগুলো প্রতিবেশী দেখব (পর্ব ৫৭-এর k), পর্ব ৩৪-এর learning rate, Naive Bayes-এর smoothing α (পর্ব ৫১)। একটি সহজ পরীক্ষা: সংখ্যাটি কি fit() নিজে বদলায়? বদলালে parameter, না বদলালে hyperparameter. Hyperparameter বাছাই করতে আলাদা validation ডেটা লাগে; কেন, তা পরের পর্বে।

Training আর inference

Training (প্রশিক্ষণ, fitting) মানে E থেকে parameter ঠিক করা; সাধারণত একটি loss function (যেমন ভুলের বর্গের গড়, MSE) সবচেয়ে কম করা। Inference বা prediction মানে শেখা parameter দিয়ে নতুন ইনপুটের উত্তর বলা, প্রতিটি নতুন অর্ডারে, দ্রুত। scikit-learn-এ প্রথমটি fit, দ্বিতীয়টি predict. মডিউল ৮-এর logic-এ “inference” শব্দের অর্থ ছিল নিয়ম মেনে নতুন বাক্য বের করা; ML-এ একই শব্দ শেখা model চালানো বোঝায়, তাই প্রসঙ্গ দেখে পড়বেন।

৪ · Supervised learning — সংখ্যা বলা আর শ্রেণি বলা

Supervised শব্দের মানে “তত্ত্বাবধানে”: প্রতিটি উদাহরণের পাশে একজন শিক্ষক সঠিক উত্তর লিখে দিয়েছেন। গণিতের ভাষায়, অজানা একটি ফাংশন f আছে যাতে y ≈ f(x); আমরা দেখি কিছু জোড়া (xi, yi), আর এমন একটি ফাংশন h খুঁজি, যা নতুন x-এও f-এর কাছাকাছি উত্তর দেয়। h-কে বলা হয় hypothesis; শব্দটি অংশ ৭-এ আবার আসবে।

📏 Regression

y একটি সংখ্যা: ডেলিভারির মিনিট, চালের চাহিদা, দাম। ভুল মাপা হয় MAE বা MSE দিয়ে। পূর্ণ গণিত পর্ব ৫৮ (Linear regression)-এ।

y ∈ সংখ্যা

🏷️ Classification

y কয়েকটি শ্রেণির একটি: অর্ডার ফেরত আসবে (১) কি না (০), SMS spam না ham. অনেক model শ্রেণির সম্ভাবনাও দেয়। একটি প্রধান পদ্ধতি পর্ব ৫৯ (Logistic regression)-এ।

y ∈ {০, ১, …}

পার্থক্যটি আউটপুটে, ইনপুটে নয়: একই km আর kg থেকে মিনিট বলা regression, আর “৬০ মিনিটের বেশি লাগবে কি না” বলা classification. নিচের ব্লক দুই রকম কাল্পনিক ডেটা বানিয়ে পাশাপাশি আঁকে। ফেরতের ডেটায় সম্পর্কটি আমরা বানিয়েছি এভাবে: দেরি যত বেশি আর দাম যত বেশি, ফেরতের সম্ভাবনা তত বেশি (একটি sigmoid দিয়ে, পর্ব ৫৯-এ এর ব্যাখ্যা), তারপর সেই সম্ভাবনায় মুদ্রা ছুড়ে ০ বা ১. তাই একই রকম অর্ডারের কিছু ফেরত আসে, কিছু আসে না; বাস্তবের মতোই।

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(42)
n = 60
# Regression: label একটি সংখ্যা (ডেলিভারির মিনিট)
km = rng.uniform(1, 15, n).round(1)
kg = rng.uniform(0.5, 10, n).round(1)
minutes = 20 + 4.0 * km + 1.5 * kg + rng.normal(0, 6, n)
X_reg = np.column_stack([km, kg])                 # design matrix, n × d

# Classification: label একটি শ্রেণি (অর্ডার ফেরত এল কি না, 1/0)
late = rng.integers(0, 6, n)                      # কত দিন দেরি
price = rng.uniform(0.2, 8, n).round(1)           # দাম, হাজার টাকায়
p = 1 / (1 + np.exp(-(-3 + 0.9 * late + 0.3 * price)))   # বানানো সম্পর্ক
returned = (rng.random(n) < p).astype(int)
X_clf = np.column_stack([late, price])

print("regression    : X", X_reg.shape, "y", minutes.shape, "প্রথম সারি", X_reg[0], round(minutes[0], 1))
print("classification: X", X_clf.shape, "y", returned.shape, "প্রথম সারি", X_clf[0], returned[0])
print("ফেরত (1) কতটি:", returned.sum(), "| ফেরত হয়নি (0):", n - returned.sum())

fig, (a1, a2) = plt.subplots(1, 2, figsize=(9, 3.6))
a1.scatter(km, minutes, c=kg, cmap="viridis", s=22)
a1.set(xlabel="distance (km)", ylabel="delivery time (min)", title="Regression: predict a number")
for c, m, lab in [(0, "o", "kept (0)"), (1, "x", "returned (1)")]:
    s = returned == c
    a2.scatter(late[s] + rng.uniform(-0.15, 0.15, s.sum()), price[s], marker=m, label=lab)
a2.set(xlabel="days late", ylabel="price (thousand taka)", title="Classification: predict a class")
a2.legend(loc="upper left", fontsize=8)
fig.subplots_adjust(wspace=0.3, bottom=0.15)
plt.show()

আসল আউটপুট (ব্রাউজারের Python, NumPy 2.4.6, matplotlib 3.10.8; ছবিটি ব্লক চালালে নিচে আসে):

regression    : X (60, 2) y (60,) প্রথম সারি [11.8  6.8] 87.0
classification: X (60, 2) y (60,) প্রথম সারি [1.  4.7] 1
ফেরত (1) কতটি: 31 | ফেরত হয়নি (0): 29

দুই ডেটাতেই X (৬০, ২) আর y (৬০,): আকারে পার্থক্য নেই, পার্থক্য y-এর মানে। Regression-এর y যেকোনো সংখ্যা, classification-এর y শুধু ০ বা ১. (পূর্ণসংখ্যা আর দশমিক এক array-তে যাওয়ায় NumPy সব float বানিয়েছে, তাই “1.”) বাঁয়ের ছবিতে বিন্দু ডানদিকে ওঠে, আর রং বলে ভারী পার্সেল একটু ওপরে। ডানের ছবিতে ✕ (ফেরত) বেশি ডানে আর ওপরে, কিন্তু ○ আর ✕ মিশে আছে, কারণ ফল নিজেই এলোমেলো; কোনো সীমারেখা এদের পুরো আলাদা করবে না। Classification-এর কাজ তাই এমন একটি decision boundary আঁকা, যা গড়ে সবচেয়ে কম ভুল করে।

৫ · উত্তর ছাড়া, পুরস্কার থেকে, আর লেখার ভেতর থেকে শেখা

Unsupervised learning — গঠন খোঁজা

Unsupervised learning-এ শুধু X আছে, y নেই। প্রশ্ন বদলে যায়: “উত্তর কী” নয়, “ডেটার ভেতরে কী গঠন আছে”. দুটি প্রধান ধারণা:

  • Clustering: একই রকম উদাহরণকে এক দলে রাখা। বাজারঘরের গ্রাহকদের মাসে কতবার অর্ডার আর গড় বিল দেখে হয়তো তিনটি দল মেলে: মাঝে মাঝে ছোট কেনাকাটা, ঘন ঘন ছোট কেনাকাটা, আর কম কিন্তু বড় কেনাকাটা। কেউ আগে এই দলগুলোর নাম বলে দেয়নি; দলের অর্থ পরে মানুষকেই বিচার করতে হয়। অংশ ৮-এর ব্লকের শেষ অংশে AgglomerativeClustering দিয়ে এমন একটি সত্যিকারের run আছে। এই পদ্ধতি শুরুতে প্রতিটি বিন্দুকে আলাদা দল ধরে, তারপর বারবার সবচেয়ে কাছের দুই দল জোড়া লাগায়, যতক্ষণ না চাওয়া সংখ্যক দল থাকে।
  • Dimensionality reduction: অনেক কলামকে যতটা সম্ভব তথ্য রেখে কম কলামে আনা, যেমন ৬৪ pixel-এর একটি অঙ্কের ছবিকে দুটি সংখ্যায়, যাতে ছবি আঁকা যায় বা পরের model দ্রুত চলে।

Unsupervised ফলের সবচেয়ে বড় সমস্যা মাপ: “সঠিক” দল নেই বলে P ঠিক করা কঠিন। একই ডেটায় ভিন্ন পদ্ধতি বা ভিন্ন scaling ভিন্ন দল দেয় (পর্ব ৩৩-এ দেখেছেন scaling দূরত্ব বদলায়)। দুই ধারণার পদ্ধতি, k-means, hierarchical clustering আর PCA বিস্তারিত পর্ব ৬৫ (Clustering আর PCA — label ছাড়া গঠন খোঁজা)-এ।

Reinforcement learning — চেষ্টা, ফল আর পুরস্কার

পর্ব ৫৪-এ MDP দেখেছেন: state, action, transition probability আর reward জানা থাকলে value iteration দিয়ে সেরা policy হিসাব করা যায়। Reinforcement learning একই লক্ষ্য রাখে, কিন্তু transition আর reward আগে থেকে জানা থাকে না; agent কাজ করে, ফল দেখে, আর অভিজ্ঞতা থেকে policy শেখে। এখানে E হলো agent-এর নিজের চেষ্টার ইতিহাস, কোনো শিক্ষকের লেখা উত্তর নয়, আর reward প্রায়ই দেরিতে আসে: ছাড়ের সিদ্ধান্তটি ভালো ছিল কি না, তা হয়তো মাস শেষে লাভ দেখে বোঝা যায়। দুটি নতুন সমস্যা তৈরি হয়: নতুন কিছু চেষ্টা বনাম জানা ভালো পথে থাকা (exploration–exploitation), আর দেরিতে আসা ফলের দায় কোন আগের সিদ্ধান্তের, তা ঠিক করা। দোকানের মতো আসল ব্যবসায় এলোমেলো চেষ্টার দাম আসল টাকা, তাই RL প্রায়ই simulation বা খেলায় বেশি সফল হয়েছে। গভীর আলোচনা একটি পরের কোর্সে।

Self-supervised আর semi-supervised — দুটি নোট

Self-supervised learning-এ label মানুষ লেখেন না, ডেটার ভেতর থেকেই বানানো হয়: একটি বাক্যের একটি অংশ লুকিয়ে বাকিটা থেকে সেটি অনুমান করা। আজকের large language model-এর pretraining মোটামুটি এভাবে বর্ণনা করা হয়: বিপুল লেখায় আগের tokenগুলো দেখে পরের token অনুমান করা (next-token prediction). “বাজারঘর থেকে আজ আমার পার্সেল” লেখার পর “এসেছে” শব্দটিই label, আর তা লেখার ভেতরেই ছিল। কাঠামোতে এটি supervised, কিন্তু label-এর খরচ নেই বলে কোটি কোটি উদাহরণ মেলে। পরে সাধারণত মানুষের উদাহরণ ও পছন্দ দিয়ে আরও প্রশিক্ষণ হয়; বিস্তারিত প্রায়ই পুরো প্রকাশিত নয়। এই প্রক্রিয়ার ধাপ আর সীমা পর্ব ৭০ (LLM কীভাবে কাজ করে — token, পরের শব্দের অনুমান আর সীমা)-এ।

Semi-supervised learning মাঝামাঝি: অল্প কিছু উদাহরণে label আছে, অনেকগুলোতে নেই, আর label-ছাড়া ডেটার গঠন শেখায় সাহায্য করে। যেমন লাখো রিভিউয়ের মাত্র দুই হাজারটিতে “অভিযোগ” বা “প্রশংসা” চিহ্ন আছে।

৬ · প্রশ্ন থেকে deploy — learning pipeline

বাস্তবে model-এর fit পুরো কাজের ছোট একটি অংশ। একটি ML প্রকল্প কয়েকটি ধাপের একটি চক্র, যাকে বলে learning pipeline (কেউ কেউ বলেন ML workflow). নিচের ছবিতে আটটি ধাপ, আর দুটি ড্যাশ দেওয়া তীর: ফল ভালো না হলে প্রস্তুতিতে ফেরা, আর বাস্তবের ডেটা বদলালে আবার শুরু থেকে।

Learning pipeline: একটি সরলরেখা নয়, একটি চক্র

From a question to a monitored model in production

Learning pipeline: question, data, preparation, split, train, evaluate, deploy, monitor, with feedback loops ১ প্রশ্ন২ ডেটা৩ প্রস্তুতি৪ ভাগ ৫ train৬ মূল্যায়ন৭ deploy৮ নজরদারি T, E, P ঠিকসংগ্রহ, labelপরিষ্কার, X, ytrain / test parameter শেখাtest, baselineঅনুমান দেওয়াভুল, drift মাপা ভালো না হলে ডেটা বদলালে test set শুধু ধাপ ৬-এ, একবার ড্যাশ দেওয়া তীর = আগের ধাপে ফেরা

নিচের stepper একই চক্র বাজারঘরের প্রকল্পে চালায়, প্রতিটি ধাপে একটি সাধারণ ফাঁদসহ।

  1. প্রশ্নT, E, P
  2. ডেটাসংগ্রহ
  3. প্রস্তুতিX আর y
  4. ভাগ ও trainfit
  5. মূল্যায়নtest
  6. Deployনজরদারি
এই ধাপে বাজারঘরে
কাজ
সাধারণ ফাঁদ
  1. প্রশ্ন। অংশ ২-এর T, E, P এখানেই লেখা হয়। সঙ্গে ঠিক করতে হয় সাফল্য কী: “গড় বলার baseline-এর চেয়ে স্পষ্টভাবে ভালো, আর গড় ভুল ১০ মিনিটের কম”. পরে জানা তথ্য (রাইডারের আসল রুট) ইনপুটে রাখলে model কাগজে দারুণ, ব্যবহারে অচল; পর্ব ৫-এর target leakage-এর ফাঁদ।
  2. ডেটা। উদাহরণগুলো যেন সেই পরিস্থিতির প্রতিনিধি হয় যেখানে model চলবে। শুধু ঢাকার অর্ডারে শেখা model সিলেটের পাহাড়ি রাস্তায় ভুল করবে, আর ডেটা দেখে তা বোঝা যাবে না।
  3. প্রস্তুতি। পরিষ্কার করা (পর্ব ২৩), feature বানানো আর X ও y সাজানো। পুরো ডেটার গড় বা scale ভাগের আগে হিসাব করলে test-এর তথ্য train-এ চুঁইয়ে ঢোকে; ঠিক ক্রমটি পরের পর্বে।
  4. ভাগ ও train. আগে ভাগ, তারপর শুধু train অংশে fit. Test অংশ তালাবন্ধ থাকে। একই test-এ বারবার দেখে model বদলালে test নিজেই training-এর অংশ হয়ে যায়।
  5. মূল্যায়ন। নতুন ২০টি অর্ডারে MAE ৪.৮, baseline ১২.৮১ আর হাতের নিয়ম ১০.৪-এর পাশে লেখা। Training set-এর সংখ্যা রিপোর্ট করলে প্রায় সবসময় বেশি আশাবাদী ছবি আসে। ফল ভালো না হলে প্রস্তুতি বা প্রশ্নে ফেরা।
  6. Deploy ও নজরদারি। Deploy মানে model-কে আসল ব্যবস্থায় বসানো, যাতে অ্যাপ প্রতিটি অর্ডারে অনুমান পায়। তারপর আসল ডেলিভারি-সময় এলে ভুল মাপতে থাকা: বর্ষায়, ঈদের ভিড়ে বা নতুন গুদামে সম্পর্ক বদলায় (distribution shift). ভুল বাড়লে চক্র আবার শুরু।

পুরো জীবনচক্র, maintenance সহ, পর্ব ৭৪ (AI প্রকল্পের জীবনচক্র — সমস্যা বাছাই থেকে maintenance আর পরের পথ)-এ আসবে।

৭ · Hypothesis space, inductive bias আর generalisation

অংশ ১-এ আমরা model-কে বলেছিলাম “একটি রেখা খোঁজো”. কেন রেখা? কেন বাঁকা রেখা বা সিঁড়ির মতো ফাংশন নয়? এই প্রশ্নটিই শেখার সবচেয়ে মৌলিক সিদ্ধান্ত। Learning algorithm যত ফাংশনের মধ্য থেকে বাছতে পারে, তাদের সংগ্রহকে বলে hypothesis space (H): সব রেখা, বা সব degree 9 বহুপদী, বা ১০টি স্তরের সব সিদ্ধান্ত-গাছ। আর H-এর ভেতরে কোনটিকে পছন্দ করা হবে, আর H-ই বা কেন এটি, এই আগে থেকে নেওয়া অনুমানগুলো মিলে inductive bias. “Bias” এখানে খারাপ অর্থে নয়; এটি শেখার পূর্বশর্ত।

ক্রিকেটের স্কোরকার্ড দেখে একজন বলেন, “১০ ওভারে ৪০, তাই ২০ ওভারে মোটামুটি ৮০”: তিনি ধরে নিয়েছেন রান সমান হারে বাড়ে, একটি inductive bias. আরেকজন আগের ৬০ বলের প্রতিটি রান মুখস্থ রাখেন; পরের ওভার নিয়ে তাঁর কিছুই বলার নেই।

এবার একই ১০টি কাল্পনিক অর্ডারে তিনটি hypothesis space তুলনা করি, শুধু দূরত্ব দিয়ে মিনিট: (ক) degree 0, একটি ধ্রুবক, সবসময় একই উত্তর; (খ) degree 1, একটি রেখা; (গ) degree 9, একটি বহুপদী (polynomial regression) যার ১০টি সহগ। দূরত্ব ১ থেকে ১৫ km-এ সমান ফাঁকে, আসল প্রক্রিয়া মিনিট = ৩০ + ৪ × km + গোলমাল (standard deviation ৬); একই প্রক্রিয়ার ২০০টি নতুন অর্ডারে মাপা হবে। Polynomial.fit ভেতরে x-কে [−1, 1]-এ এনে হিসাব করে, তাই degree 9-এও হিসাব স্থির থাকে।

import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial import Polynomial

rng = np.random.default_rng(42)
x = np.linspace(1, 15, 10)                       # ১০টি অর্ডার, সমান ফাঁকে km
y = 30 + 4.0 * x + rng.normal(0, 6, 10)          # বানানো সত্য + গোলমাল
x_new = rng.uniform(1, 15, 200)                  # পরে আসা ২০০টি নতুন অর্ডার
y_new = 30 + 4.0 * x_new + rng.normal(0, 6, 200)
mse = lambda f, a, b: np.mean((f(a) - b) ** 2)

grid = np.linspace(1, 15, 300)
fig, ax = plt.subplots(figsize=(7, 4))
ax.scatter(x_new, y_new, s=8, c="lightgray", label="200 new orders")
ax.scatter(x, y, s=40, c="black", zorder=3, label="10 training orders")
for deg in (0, 1, 9):
    f = Polynomial.fit(x, y, deg)                # hypothesis space: degree-deg বহুপদী
    print(f"degree {deg}: train MSE {mse(f, x, y):7.2f} | new-data MSE {mse(f, x_new, y_new):7.2f}")
    ax.plot(grid, f(grid), label=f"degree {deg}")
print("শুধু গোলমালের variance (কোনো model এর নিচে যেতে পারে না): 36")
ax.set(xlabel="distance (km)", ylabel="delivery time (min)",
       title="Same 10 points, three hypothesis spaces")
ax.legend(fontsize=8, loc="upper left")
plt.show()

আসল আউটপুট (ব্রাউজারের Python, NumPy 2.4.6; ছবিটি ব্লক চালালে আসে):

degree 0: train MSE  308.89 | new-data MSE  317.54
degree 1: train MSE   27.06 | new-data MSE   43.34
degree 9: train MSE    0.00 | new-data MSE  101.69
শুধু গোলমালের variance (কোনো model এর নিচে যেতে পারে না): 36

তিনটি গল্প। ধ্রুবক দুই জায়গাতেই খারাপ (৩০৯ আর ৩১৭): H এত ছোট যে সত্যের কাছাকাছি কিছুই তাতে নেই; একে বলে underfitting. রেখার training ভুল ২৭.০৬, নতুন ডেটায় ৪৩.৩৪, গোলমালের সীমা ৩৬-এর কাছে। Degree 9-এর training ভুল শূন্য (০.০০), অথচ নতুন ডেটায় ১০১.৬৯, রেখার দ্বিগুণের বেশি। Training-এ সেরা, নতুন ডেটায় খারাপ: এটিই overfitting. ছবিতে degree 9 প্রতিটি কালো বিন্দু ছুঁয়ে যায়, কিন্তু বিন্দুগুলোর মাঝে, বিশেষ করে দুই প্রান্তের কাছে, ঢেউ খেলে ধূসর নতুন বিন্দু থেকে সরে যায়।

নিচের stepper একই সংখ্যা দিয়ে ধাপে ধাপে দেখায় degree 9 কীভাবে বিন্দু মুখস্থ করে। ছবির রেখাগুলো ওপরের ব্লকের একই seed আর একই fit থেকে আঁকা।

Ten training points fitted by degree 0, 1 and 9 polynomials, with new orders 051015 205080110 দূরত্ব (km) 1.5 km: 56 বনাম ~36 ১০টি training অর্ডার degree 0: সবসময় 60.0 degree 1: একটি রেখা degree 9: সব বিন্দু ছুঁয়ে যায় ধূসর: নতুন অর্ডার
একই ১০টি বিন্দু, ভিন্ন hypothesis space
দেখানো হচ্ছে
train MSE
নতুন ২০০টিতে MSE
  1. ১০টি অর্ডার। ১ থেকে ১৫ km-এ সমান ফাঁকে। বিন্দুগুলো মোটামুটি ওপরে ওঠে, কিন্তু গোলমালের কারণে সোজা সারিতে নেই: ৭.২ km-এর অর্ডারটি তার আগেরটির চেয়েও কম সময় নিয়েছে।
  2. Degree 0. সেরা ধ্রুবক হলো গড়, ৬০.০ মিনিট। দূরত্ব যা-ই হোক একই উত্তর। Training MSE ৩০৮.৮৯: H-এ এর চেয়ে ভালো কিছু নেই। এটি underfitting.
  3. Degree 1. রেখাটি প্রবণতা ধরে, কিন্তু প্রতিটি বিন্দু ছোঁয় না। Training MSE ২৭.০৬, শূন্য নয়, আর সেটাই ঠিক: বাকি অংশটি গোলমাল, যা শেখার কিছু নয়।
  4. Degree 9. ১০টি সহগ, ১০টি বিন্দু: রেখাটি প্রতিটি বিন্দু দিয়ে যায়, training MSE ০.০০. প্রথম দুই বিন্দুর মাঝে সে ওপরে লাফিয়ে আবার নামে, যাতে দুটিকেই ছুঁতে পারে। এটি নিয়ম শেখা নয়, প্রতিটি উত্তর মনে রাখা (memorization).
  5. নতুন অর্ডার আসে। ধূসর বিন্দুগুলো একই প্রক্রিয়ার। রেখা তাদের মাঝ দিয়ে যায়: MSE ৪৩.৩৪. Degree 9-এর ঢেউ ধূসর মেঘ থেকে বেরিয়ে যায়: ১০১.৬৯, training-এ সেরা হয়েও নতুন ডেটায় রেখার দ্বিগুণের বেশি খারাপ।
  6. এক জায়গায় ভুলটা। ১.৫ km-এর একটি নতুন অর্ডারে degree 9 বলে প্রায় ৫৬ মিনিট, অথচ আসল প্রক্রিয়ার গড় ৩৬ (৩০ + ৪ × ১.৫); রেখা বলে প্রায় ৩৬. গোলমালের variance ৩৬, তাই নতুন ডেটায় কোনো model-এর গড় MSE এর নিচে যেতে পারে না; রেখা ৪৩.৩৪-এ সেই সীমার কাছে।

একটি seed-এর ফল কাকতালীয় হতে পারে, তাই ডেস্কটপে ২০টি ভিন্ন seed-এ একই পরীক্ষা চালানো হয়েছে, আর একবার সমান ফাঁকের বদলে এলোমেলো দূরত্বে (কোড scratch ফোল্ডারে, মূল অংশ ওপরের ব্লকের মতো)। সত্যিকারের run (ডেস্কটপ, Python 3.14.4, NumPy 2.5.4):

~/bazarghar-ai$ python seeds.py
numpy 2.5.4 | 20 seeds, new-data MSE (noise variance = 36)
evenly spaced km | median deg0 293.5  deg1 41.4  deg9 201.6 | deg9 worse than line in 20/20
random km        | median deg0 313.3  deg1 42.5  deg9 108438537.9 | deg9 worse than line in 20/20

২০টির ২০টিতেই degree 9 রেখার চেয়ে খারাপ। এলোমেলো দূরত্বে দুটি বিন্দু খুব কাছাকাছি পড়লে বহুপদীকে দুটিকেই ছুঁতে বিশাল লাফ দিতে হয়, তাই মধ্যমা MSE প্রায় দশ কোটি: অর্থহীন উত্তর। সমান ফাঁকের ছবিটি তাই degree 9-এর প্রতি বরং নরম। কেন বেশি জটিল model বেশি নড়বড়ে, তার ভাষা (bias আর variance) আর প্রতিকার (regularization, বেশি ডেটা) পর্ব ৬১ (Overfitting, bias আর variance — regularization আর learning curve)-এ।

Generalisation-ই আসল লক্ষ্য

শেখার লক্ষ্য generalisation: না-দেখা উদাহরণে ভালো করা। দুটি সংখ্যা আলাদা রাখুন: training error (যে ডেটায় parameter বসানো হয়েছে, তাতে ভুল) আর নতুন ডেটার error, যা held-out ডেটা দিয়ে আন্দাজ করা হয়। প্রথমটি প্রায় সবসময় দ্বিতীয়টির চেয়ে কম, কারণ parameter ঠিক সেই ডেটার জন্যই বাছা। দুইয়ের ফারাক যত বড়, model তত মুখস্থ করেছে। আর কোনো model-ই গোলমালের সীমা (এখানে ৩৬) পেরোতে পারে না; সেই অংশটিকে বলে irreducible error. Training error শূন্য দেখলে তাই আনন্দের বদলে সন্দেহ করা উচিত।

No free lunch — কোনো পদ্ধতি সব জায়গায় সেরা নয়

তাহলে কি রেখাই “সেরা” পদ্ধতি? না। এখানে রেখা জিতেছে কারণ আমরা সত্যটি রেখা হিসেবেই বানিয়েছিলাম; inductive bias সত্যের সঙ্গে মিলে গেছে। সত্যটি বাঁকা হলে রেখা underfit করত। David Wolpert ১৯৯৬ সালে Neural Computation জার্নালে (“The Lack of A Priori Distinctions Between Learning Algorithms”) এই অন্তর্দৃষ্টির একটি গাণিতিক রূপ দেন, যা no free lunch ফল নামে পরিচিত। মোটামুটি বললে: যদি সব সম্ভাব্য লক্ষ্য-ফাংশনকে সমান সম্ভাব্য ধরা হয়, তাহলে training-এ না দেখা উদাহরণে গড় ভুলের হিসাবে কোনো learning algorithm অন্য কোনোটির চেয়ে ভালো নয়, এমনকি এলোমেলো অনুমানের চেয়েও নয়। পর্ব ৪৪-এ optimisation-এর জন্য একই নামের একটি ফল (Wolpert ও Macready, ১৯৯৭) দেখেছেন; এটি শেখার সংস্করণ।

ফলটি সাবধানে পড়তে হয়। এটি বলে না যে বাস্তবে সব পদ্ধতি সমান; বাস্তবের সমস্যা “সব সম্ভাব্য ফাংশনের” সমান মিশ্রণ নয়, তাতে মসৃণতা, কাছাকাছি জিনিসের মিল, সরলতার মতো কাঠামো থাকে। এটি বলে, সুবিধা আসে inductive bias সমস্যার কাঠামোর সঙ্গে মেলা থেকে। ব্যবহারিক শিক্ষা: কয়েকটি পদ্ধতি একটি baseline-সহ একই held-out ডেটায় তুলনা করুন, আর “এই algorithm সবসময় সেরা” দাবিতে সন্দেহ করুন।

৮ · ছোট্ট একটি পূর্ণ উদাহরণ — fit, predict, মাপ; আর label ছাড়া দল

এ পর্যন্ত NumPy দিয়ে নিজের হাতে করেছি। এবার একই কাজ scikit-learn-এ, যেখানে প্রায় সব model একই তিনটি ক্রিয়া মানে: fit(X, y), predict(X), score(X, y). ডেটা অংশ ১-এর মতো, তবে ২০০টি অর্ডার। train_test_split এলোমেলোভাবে ২৫% আলাদা রাখে (train-test split), LinearRegression অংশ ১-এর least squares-ই করে। score দেয় R²: ১ মানে নিখুঁত, ০ মানে সবসময় গড় বলার সমান। ভাগের নিয়ম, stratification আর সবচেয়ে বিপজ্জনক ভুল data leakage পর্ব ৫৬ (Train, validation আর test — data leakage-এর ফাঁদ)-এ বিস্তারিত।

ব্লকের দ্বিতীয় অংশ unsupervised: ৩০ জন কাল্পনিক গ্রাহক, প্রত্যেকের দুটি সংখ্যা (মাসে অর্ডার, গড় বিল হাজার টাকায়), তিনটি লুকানো দল থেকে বানানো, কিন্তু model-কে কোনো দলের নাম দেওয়া হয় না। AgglomerativeClustering নিজে তিনটি দল খোঁজে। (বেশি পরিচিত KMeans এই ব্রাউজারের Python-এ একটি অপ্রাসঙ্গিক warning ছাপে, তাই এখানে এটি; দুটির তুলনা পর্ব ৬৫-এ।)

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
from sklearn.cluster import AgglomerativeClustering

rng = np.random.default_rng(42)
X = np.column_stack([rng.uniform(1, 15, 200), rng.uniform(0.5, 10, 200)])  # km, kg
y = 20 + 4.0 * X[:, 0] + 1.5 * X[:, 1] + rng.normal(0, 6, 200)              # মিনিট

# supervised, পুরো কাজ ছয় লাইনে
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.25, random_state=42)
model = LinearRegression().fit(X_tr, y_tr)          # training
pred = model.predict(X_te)                          # prediction (inference)
print("parameter:", model.intercept_.round(2), model.coef_.round(2))
print("held-out MAE:", round(mean_absolute_error(y_te, pred), 2), "মিনিট")
print("held-out R²:", round(model.score(X_te, y_te), 3), "| train R²:", round(model.score(X_tr, y_tr), 3))

# unsupervised: label ছাড়া ৩০ জন গ্রাহক (মাসে অর্ডার, গড় বিল হাজার টাকায়)
centers = np.array([[2, 1.0], [8, 1.5], [3, 6.0]])           # বানানো তিন দল
C = np.vstack([c + rng.normal(0, 0.6, (10, 2)) for c in centers])
groups = AgglomerativeClustering(n_clusters=3).fit_predict(C)
for g in range(3):
    m = C[groups == g].mean(axis=0)
    print(f"দল {g}: {np.sum(groups == g)} জন, গড় অর্ডার {m[0]:.1f}, গড় বিল {m[1]:.1f}")
print("প্রথম ১০ জনের দল:", groups[:10], "| পরের ১০ জন:", groups[10:20])

আসল আউটপুট (ব্রাউজারের Python, scikit-learn 1.8.0):

parameter: 18.46 [4.12 1.51]
held-out MAE: 4.99 মিনিট
held-out R²: 0.878 | train R²: 0.892
দল 0: 10 জন, গড় অর্ডার 3.0, গড় বিল 6.0
দল 1: 10 জন, গড় অর্ডার 7.8, গড় বিল 1.6
দল 2: 10 জন, গড় অর্ডার 2.0, গড় বিল 0.8
প্রথম ১০ জনের দল: [2 2 2 2 2 2 2 2 2 2] | পরের ১০ জন: [1 1 1 1 1 1 1 1 1 1]

১৫০টি অর্ডারে শেখা parameter (১৮.৪৬, ৪.১২, ১.৫১) সত্যের (২০, ৪, ১.৫) কাছে। Held-out ৫০টি অর্ডারে গড় ভুল প্রায় ৫ মিনিট, R² ০.৮৭৮; training-এর R² সামান্য বেশি (০.৮৯২), যা স্বাভাবিক, আর ফারাক ছোট বলে রেখাটি মুখস্থ করছে না। Clustering ৩০ জনকে ঠিক ১০ জন করে তিন দলে ভাগ করেছে, আর দলের গড় আমাদের লুকানো কেন্দ্রের (২, ১.০), (৮, ১.৫), (৩, ৬.০) কাছে। আমাদের প্রথম দল পেয়েছে নম্বর “2”, দ্বিতীয়টি “1”: নম্বরগুলো শুধু নাম, অর্থ মানুষকে দিতে হয়। বাস্তবের গ্রাহকেরা এমন পরিষ্কার দলে থাকেন না।

সৎ সতর্কতা: এই পর্বের সব ডেটা বানানো, সম্পর্ক সরল, তাই সংখ্যাগুলো বাস্তবের চেয়ে অনেক ভালো দেখায়। বাস্তবের ডেলিভারিতে জ্যাম, বৃষ্টি আর হারানো ঠিকানা থাকে; সেখানে R² ০.৮৮ পেলে আগে খুঁজুন কোথাও ভুল তথ্য ঢুকেছে কি না।

৯ · ML কী পারে না — আর একটু ইতিহাস

ML-এর সাফল্যের গল্প অনেক; সীমাগুলো কম শোনা যায়। তিনটি সীমা প্রায় সব model-এ খাটে, যত বড় বা আধুনিকই হোক।

  1. ডেটা প্রতিনিধিত্বমূলক হতে হবে। Model শুধু তার দেখা পরিস্থিতির মতো পরিস্থিতিতে ভরসাযোগ্য। অংশ ১-এর ডেটায় দূরত্ব ১ থেকে ১৫ km; ৪০ km-এর একটি অর্ডারে রেখা একটি সংখ্যা দেবে, কিন্তু সেই সংখ্যার পেছনে কোনো প্রমাণ নেই (extrapolation). শুধু শীতকালের অর্ডারে শেখা model বর্ষার ঢাকা চেনে না।
  2. সম্পর্ক শেখে, কারণ নয়। ধরুন ডেটায় দেখা গেল যে গ্রাহকেরা কুপন পান, তাঁরা বেশি কেনেন। হয়তো কুপন কারণ; হয়তো দোকান আগে থেকেই নিয়মিত ক্রেতাদের কুপন দিত। Model দুটি ক্ষেত্রেই একই সম্পর্ক শিখবে। পর্ব ৫২-এ দেখেছেন তীরের দিক আর confounding এই পার্থক্য গড়ে; “কুপন দিলে কী হবে”-র উত্তরে পরীক্ষা (A/B test) বা কারণের model লাগে (ভাবনার প্রশ্ন ৩)। Spurious correlation-এ ভর করা model পরিস্থিতি বদলালেই ভেঙে পড়ে।
  3. ডেটার পক্ষপাত শিখে নেয়। E যদি অতীতের মানুষের সিদ্ধান্ত হয়, তাহলে model সেই সিদ্ধান্তের অন্যায্যতাও শেখে। যদি অতীতে কিছু এলাকায় রাইডার কম পাঠানো হতো, তাহলে সেখানে ডেলিভারি ধীর ছিল, model শিখবে “ওই এলাকা ধীর”, আর সেই অনুমানে আবার কম অগ্রাধিকার পেলে চক্রটি নিজেকে শক্ত করে (feedback loop). Bias যাচাই, দলভিত্তিক ভুলের হার আর নথিপত্রের অভ্যাস পর্ব ৭২ (দায়িত্বশীল AI-এর অভ্যাস — bias যাচাই, গোপনীয়তা আর নথিপত্র)-এ।

সংক্ষিপ্ত ইতিহাস। ১৯৫৮ সালে Frank Rosenblatt perceptron প্রকাশ করেন: ভুল হলে weight শোধরানো একটি নিয়ম, ডেটা থেকে শেখা যন্ত্রের প্রথম দিকের জনপ্রিয় উদাহরণ। ১৯৫৯ সালে IBM-এর Arthur Samuel IBM Journal of Research and Development-এ checkers খেলার একটি শেখা প্রোগ্রাম নিয়ে লেখেন, যার শিরোনামেই “machine learning” শব্দ দুটি ছিল; শব্দটি জনপ্রিয় করার কৃতিত্ব সাধারণত তাঁকেই দেওয়া হয়, যদিও একই রকম শব্দ আগে কেউ ব্যবহার করেছিলেন কি না, তা নিয়ে নিশ্চিত হওয়া কঠিন। ১৯৬০ ও ৭০-এর দশকে Vladimir Vapnik আর Alexey Chervonenkis শেখাকে পরিসংখ্যানের প্রশ্ন হিসেবে দেখার তত্ত্ব গড়েন (কত ডেটায় training ভুল নতুন ডেটার ভুলের কাছে আসে), আর ১৯৮৪ সালে Leslie Valiant দেন PAC learning. এই “statistical learning” দৃষ্টিভঙ্গি আজও ML-এর মূল ভাষা।

১০ · AI-এর যুগে — AI assistant-এর লেখা ML কোড যাচাই

“একটা ML model বানিয়ে দাও” বললে AI assistant কয়েক সেকেন্ডে চলনসই কোড আর একটি সুন্দর সংখ্যা দেয়। ভুলগুলো সাধারণত সংখ্যার পেছনে লুকানো থাকে, কারণ কোড চলে।

AI যা প্রায়ই করেকীভাবে ধরবেন
Training ডেটাতেই accuracy বা R² রিপোর্ট করেআলাদা held-out ডেটার সংখ্যা চান, training-এর পাশাপাশি
ভাগের আগে পুরো ডেটায় scaling বা feature হিসাব করে (data leakage)আগে ভাগ, তারপর শুধু train-এ fit; প্রতিটি fit কোন ডেটায়, তা খুঁজে দেখুন
Baseline ছাড়া ফল দেয়: “MAE ৫ মিনিট, দারুণ!”গড় বলা বা সবচেয়ে বেশি শ্রেণি বলার baseline-এর সঙ্গে তুলনা
পুরোনো বা বানানো API দেয়, যেমন np.float, pandas-এর append, বা নেই এমন parameterনিজের version-এর অফিসিয়াল docs; কোড চালিয়ে দেখা
Warning লুকায় (warnings.filterwarnings("ignore")) বা ভুল আকারের X চুপচাপ reshape করেসব warning পড়ুন, প্রতিটি ধাপে .shape আর কয়েকটি সারি ছাপান
সম্পর্ককে কারণ বলে: “কুপন বিক্রি বাড়ায়”ডেটা কীভাবে তৈরি হয়েছিল, জিজ্ঞেস করুন; কারণের দাবিতে পরীক্ষা চান

নির্দিষ্ট করে চান, আর এমন আউটপুট চান যা আপনি নিজে যাচাই করতে পারবেন। গ্রাহকের নাম, ফোন নম্বর বা ঠিকানার মতো আসল ডেটা কখনো পেস্ট করবেন না; কলামের নাম আর কয়েকটি বানানো সারিই যথেষ্ট।

আমার একটি টেবিল আছে: কলাম km, kg আর minutes (ডেলিভারির আসল সময়), প্রায় ২০০০ সারি। Python 3.14, NumPy 2 আর scikit-learn 1.8 দিয়ে কোড লেখো যা: ১. প্রথমেই train_test_split(test_size=0.25, random_state=42) দিয়ে ভাগ করবে, আর X ও y-এর shape ছাপাবে। ২. DummyRegressor(strategy="mean") baseline আর LinearRegression দুটিই শুধু train অংশে fit করবে। ৩. দুটির train আর test MAE পাশাপাশি ছাপাবে, যাতে আমি ফারাক দেখতে পারি। ৪. শেখা coefficient ছাপাবে, আর comment-এ লিখবে এগুলো সম্পর্ক, কারণ নয়। ৫. কোনো warning চাপা দেবে না আর কোনো deprecated API ব্যবহার করবে না; প্রতিটি function-এর docs লিংক comment-এ দেবে।

AI-এর লেখা ML কোড হাতে পেলে — যাচাইয়ের চেকলিস্ট

আরও গভীরে: Generalisation-এর তত্ত্বে দুটি পরিচিত ফ্রেম হলো Valiant-এর (১৯৮৪) PAC learning আর Vapnik ও Chervonenkis-এর VC dimension, যা একটি hypothesis space কতটা “নমনীয়” তা মাপে এবং কত ডেটায় training ভুল নতুন ডেটার ভুলের কাছে আসবে, তার সীমা দেয়। Inductive bias শব্দটি Mitchell-এর ১৯৮০ সালের একটি প্রতিবেদন “The Need for Biases in Learning Generalizations”-এর সঙ্গে জড়িত। একটি সহজপাঠ্য প্রবন্ধ: Pedro Domingos, “A Few Useful Things to Know About Machine Learning”, Communications of the ACM, ২০১২.

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

  • Mitchell-এর সংজ্ঞায় T, E, P কী? কাজ, অভিজ্ঞতা আর মাপ; E বাড়ার সঙ্গে P দিয়ে মাপা T-এর ফল ভালো হলে প্রোগ্রামটি শেখে।
  • Parameter আর hyperparameter-এর পার্থক্য? Parameter training-এ ডেটা থেকে শেখা হয় (রেখার ঢাল); hyperparameter শেখার আগে বাছা হয় (বহুপদীর degree, k, learning rate).
  • ৫০০টি উদাহরণ, ৮টি feature: X আর y-এর আকার? X (৫০০, ৮), y (৫০০,).
  • Training error ০ কিন্তু test error বড়: কী হয়েছে? Overfitting: model training ডেটা মুখস্থ করেছে, generalise করেনি।
  • Clustering supervised না unsupervised? Unsupervised: label নেই, model শুধু X থেকে দল খোঁজে।

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

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

প্র ০১Expert system-এর যুগে নিয়ম মানুষ লিখতেন, আজ বেশিরভাগ ক্ষেত্রে ডেটা থেকে শেখা হয়। এই পরিবর্তন কেন এল, আর কোথায় হাতে লেখা নিয়ম এখনো ভালো পথ?

১৯৭০ আর ৮০-এর দশকে AI-এর প্রধান বাণিজ্যিক সাফল্য ছিল expert system: MYCIN-এর মতো চিকিৎসা-পরামর্শ বা XCON-এর মতো কম্পিউটার সাজানোর ব্যবস্থা, যেখানে বিশেষজ্ঞের জ্ঞান শত শত বা হাজার নিয়মে লেখা হতো। Edward Feigenbaum ও সহকর্মীরা যে কষ্টকে knowledge acquisition bottleneck বলেছিলেন, সেটিই বড় বাধা হয়ে দাঁড়ায়: বিশেষজ্ঞ নিজেও অনেক সময় জানেন না তিনি কীভাবে সিদ্ধান্ত নেন, নিয়মগুলো একে অন্যের সঙ্গে সংঘর্ষে যায়, আর পৃথিবী বদলালে হাজার নিয়ম হাতে হালনাগাদ করতে হয় (পর্ব ৪৭)। আরও মৌলিক সমস্যা ছিল প্রত্যক্ষণের কাজ: একটি হাতে লেখা “৭” চেনার নিয়ম কেউ লিখে দিতে পারেন না, অথচ হাজার উদাহরণ জোগাড় করা সহজ।

১৯৯০-এর দশক থেকে ডিজিটাল ডেটা, হিসাবের শক্তি আর পরিসংখ্যানভিত্তিক তত্ত্ব একসঙ্গে বাড়ে, আর spam ছাঁকা বা বক্তৃতা চেনার মতো কাজে শেখা model হাতের নিয়মকে পেছনে ফেলে। তবু নিয়ম মরেনি। যেখানে সিদ্ধান্ত আইন বা নীতির, যেখানে প্রতিটি সিদ্ধান্তের ব্যাখ্যা বাধ্যতামূলক, যেখানে ডেটা প্রায় নেই, বা যেখানে একটি সীমা কখনো পেরোনো যাবে না, সেখানে নিয়ম ভালো বা অপরিহার্য। ভালো নকশা প্রায়ই মিশ্র: শেখা model অনুমান দেয়, আর তার চারপাশে হাতে লেখা নিয়ম সীমা টানে, যেমন “অনুমান কখনো ২০ মিনিটের কম দেখানো হবে না”; ভাষা model-এর guardrail-ও এই ধারণার রূপ।

মূল উপলব্ধি: নিয়ম বনাম শেখা কোনো যুদ্ধ নয়; সম্পর্ক যেখানে সংখ্যার, জটিল আর ডেটায় ধরা, সেখানে শেখা জেতে, আর যেখানে নীতি, ব্যাখ্যা বা কঠোর সীমা দরকার, সেখানে নিয়ম; ভালো ব্যবস্থা দুটিকে জায়গামতো বসায়।

প্র ০২“Bias ছাড়া শেখা অসম্ভব” কথাটির মানে কী? Inductive bias আর no free lunch ফল একসঙ্গে আমাদের কী শেখায়?

ধরুন ১০টি অর্ডারের দূরত্ব আর সময় জানা, আর ১১তম অর্ডারের দূরত্ব ৭.৫ km. কোনো অনুমান ছাড়া এর সময় সম্পর্কে কিছুই বলা যায় না: যে ফাংশনগুলো ১০টি বিন্দু দিয়ে হুবহু যায়, তাদের সংখ্যা অসীম, আর তারা ৭.৫ km-এ যেকোনো উত্তর দিতে পারে। ডেটা একা কোনো একটিকে বেছে নিতে পারে না। দার্শনিক David Hume অষ্টাদশ শতকে এই সমস্যাটি তোলেন, যা problem of induction নামে পরিচিত: অতীতের পর্যবেক্ষণ থেকে ভবিষ্যৎ সম্পর্কে সিদ্ধান্তের যুক্তিগত নিশ্চয়তা নেই। Mitchell ১৯৮০ সালের একটি প্রতিবেদনে ML-এর ভাষায় একই কথা বলেন: কোনো পূর্ব-অনুমান (bias) ছাড়া একটি learner দেখা উদাহরণের বাইরে কিছুই বলতে পারে না; শুধু মুখস্থ করতে পারে।

তাই প্রতিটি পদ্ধতি একটি bias আনে: রেখা ধরে নেয় সম্পর্ক সরল, k-NN ধরে নেয় কাছাকাছি ইনপুটের কাছাকাছি উত্তর, Naive Bayes ধরে নেয় শ্রেণি জানা থাকলে feature স্বাধীন। Wolpert-এর ১৯৯৬ সালের no free lunch ফল এর উল্টো দিকটি দেখায়: সব সম্ভাব্য লক্ষ্য-ফাংশনকে সমান ধরলে কোনো bias গড়ে অন্যটির চেয়ে ভালো নয়। একটি bias কোনো সমস্যায় যতটা সুবিধা দেয়, অন্য কোনো সমস্যায় ঠিক ততটা ক্ষতি করে।

দুটি মিলিয়ে শিক্ষাটি ব্যবহারিক: আমাদের পৃথিবীর সমস্যাগুলো এলোমেলো ফাংশন নয়, তাদের কাঠামো আছে, আর ML-এর সাফল্য মানে সেই কাঠামোর সঙ্গে মেলে এমন bias বাছা। এই পর্বে রেখা জিতেছে কারণ সত্যটি রেখা ছিল; ছবির জন্য convolution-এর bias (কাছের pixel একসঙ্গে অর্থ বহন করে) জেতে, ভাষার জন্য অন্য কিছু। Bias বাছাইয়ের উপায় হলো ডোমেইনের জ্ঞান আর held-out ডেটায় সৎ তুলনা।

মূল উপলব্ধি: শেখা মানে ডেটা আর পূর্ব-অনুমানের মিলন; ডেটা ছাড়া অনুমান অন্ধ, অনুমান ছাড়া ডেটা নীরব, আর কোন অনুমান কাজ করবে তা সমস্যার কাঠামো ঠিক করে, কোনো সর্বজনীন সেরা পদ্ধতি নয়।

প্র ০৩বাজারঘরের ডেটায় দেখা গেল, যে গ্রাহকেরা অ্যাপে notification চালু রাখেন, তাঁরা বেশি কেনেন। একটি model এই সম্পর্ক শিখল। এখন কি সবাইকে notification চালু করতে বাধ্য করলে বিক্রি বাড়বে?

Model যা শিখেছে তা একটি সম্পর্ক: notification চালু থাকলে বেশি কেনার সম্ভাবনা বেশি। এটি অনুমানের জন্য কাজের; কোন গ্রাহক বেশি কিনবেন, তা আগে বলতে model এই feature ভালোভাবে ব্যবহার করতে পারে। কিন্তু প্রশ্নটি অনুমানের নয়, হস্তক্ষেপের: “আমি যদি notification চালু করাই, তাহলে কী হবে?” এই দুটি প্রশ্নের উত্তর এক না-ও হতে পারে।

সম্ভাব্য গল্প অন্তত তিনটি। এক, notification সত্যিই মনে করিয়ে দেয়, তাই বিক্রি বাড়ায় (কারণ)। দুই, যাঁরা আগে থেকেই বাজারঘর পছন্দ করেন, তাঁরাই notification চালু রাখেন; পছন্দই দুটির কারণ (পর্ব ৫২-এর ভাষায় একটি fork, একটি confounding variable). তিন, বেশি কেনা গ্রাহকেরা অর্ডারের খবর পেতে notification চালু করেন; তীর উল্টো দিকে। দ্বিতীয় বা তৃতীয় গল্প সত্য হলে জোর করে notification চালু করালে বিক্রি বাড়বে না, বরং বিরক্ত গ্রাহক অ্যাপ মুছে দিতে পারেন। শুধু দেখা ডেটা থেকে, যত বেশিই হোক, এই গল্পগুলো আলাদা করা সাধারণত সম্ভব নয়।

উত্তরের পথ হলো পরীক্ষা: এলোমেলোভাবে বাছা অর্ধেক নতুন গ্রাহককে notification-এর আমন্ত্রণ দেখানো, বাকি অর্ধেককে নয়, তারপর দুই দলের বিক্রি তুলনা (A/B test). এলোমেলো ভাগের কারণে পছন্দের মতো লুকানো কারণ দুই দলে গড়ে সমান থাকে, তাই পার্থক্যটি হস্তক্ষেপের ফল বলে ধরা যায়। Judea Pearl-এর মতো গবেষকেরা কারণ নিয়ে যুক্তির একটি গাণিতিক ভাষা (do-operator, causal graph) গড়েছেন, যা দেখায় কখন দেখা ডেটা থেকেও কারণের উত্তর মেলে।

মূল উপলব্ধি: ML-এর শেখা সম্পর্ক অনুমানে কাজে লাগে, কিন্তু “আমি এটা করলে কী হবে” প্রশ্নের উত্তর দেয় না; সিদ্ধান্তের আগে ডেটা কীভাবে তৈরি হয়েছিল তা ভাবুন, আর সম্ভব হলে পরীক্ষা করুন।

প্র ০৪একটি বড় ভাষা model-এর pretraining-কে Mitchell-এর T, E, P দিয়ে লিখুন। এই কাঠামো ভাষা model-এর শক্তি আর দুর্বলতা সম্পর্কে কী বলে?

Pretraining-এর T মোটামুটি এই: আগের token দেখে পরের token-এর সম্ভাবনা বলা। E হলো বিপুল পরিমাণ লেখা, ওয়েব পাতা, বই, কোড; প্রতিটি অবস্থানে পরের token-টিই label, তাই কাজটি self-supervised. P সাধারণত cross-entropy বা perplexity: আসল পরের token-কে model কত সম্ভাবনা দিয়েছিল, তার log-এর গড় (পর্ব ৩৮)। E বাড়লে আর model বড় হলে এই P নিয়মিতভাবে ভালো হয়, এমন পর্যবেক্ষণ ২০১০-এর দশকের শেষ থেকে বিভিন্ন গবেষণায় প্রকাশিত হয়েছে; এই অর্থে কাঠামোটি Mitchell-এর সংজ্ঞায় পুরো খাপ খায়।

শক্তিটি এখান থেকেই: পরের শব্দ ভালোভাবে অনুমান করতে model-কে ব্যাকরণ, তথ্য, লেখার ধরন, এমনকি কোডের গঠনের পরিসংখ্যানগত ছাপ ধরতে হয়, আর label-এর খরচ নেই বলে E প্রায় সীমাহীন। কিন্তু কাঠামোটি দুর্বলতাও ব্যাখ্যা করে। P মাপে “লেখাটি কতটা সম্ভাব্য”, “লেখাটি কতটা সত্য” নয়; তাই model সাবলীল কিন্তু ভুল বাক্য বানাতে পারে (hallucination). E-তে যা বেশি আছে, model তা বেশি শেখে; বাংলার মতো তুলনামূলক কম লেখার ভাষায় মান প্রায়ই কম বলে জানা যায়, আর লেখায় থাকা পক্ষপাতও শেখে। আর আমরা ব্যবহারকারীরা যা চাই (সহায়ক, সত্য, নিরাপদ উত্তর), তা P-এর সঙ্গে হুবহু মেলে না; এ কারণেই pretraining-এর পরে মানুষের উদাহরণ আর পছন্দ দিয়ে আরও প্রশিক্ষণ দেওয়া হয়, যার একটি রূপে reinforcement learning-এর ধারণা ব্যবহৃত হয়েছে।

সাবধানতা: কাঠামোটি প্রশিক্ষণের লক্ষ্য বলে, ভেতরে কী ঘটছে তা নয়; model “বোঝে” কি না, সেই প্রশ্নে গবেষকেরা একমত নন। বিস্তারিত পর্ব ৭০-এ।

মূল উপলব্ধি: T, E, P লিখলেই দেখা যায় একটি model আসলে কী ভালো করার জন্য প্রশিক্ষিত; ভাষা model-এর P সম্ভাব্যতা মাপে, সত্য নয়, তাই তার সাবলীলতাকে নির্ভুলতা ধরে নেওয়া যায় না।

প্র ০৫“ডেটা যত বেশি, model তত ভালো” কথাটি কখন ভুল? প্রতিনিধিত্বহীন বা পক্ষপাতদুষ্ট ডেটার কয়েকটি বাস্তব ধরন আর তার প্রতিকার আলোচনা করুন।

বেশি ডেটা গোলমালের প্রভাব কমায়: অংশ ২-এর stepper-এ ৩টি থেকে ৪০টি অর্ডারে MAE ৩০.৭১ থেকে ৪.৮৩-এ নেমেছে। কিন্তু ডেটা যদি ভুল জনগোষ্ঠী থেকে আসে, বেশি ডেটা শুধু ভুলটিকে আরও আত্মবিশ্বাসী করে। পরিসংখ্যানের ইতিহাসে পরিচিত উদাহরণ ১৯৩৬ সালের মার্কিন নির্বাচনে Literary Digest-এর জরিপ: বিশাল সংখ্যক উত্তর সত্ত্বেও ভুল ফল, কারণ নমুনা এসেছিল এমন তালিকা থেকে যা ভোটারদের প্রতিনিধি ছিল না, আর উত্তর দেওয়াও ছিল স্বেচ্ছায় (পর্ব ৩৬-এর sampling bias).

ML-এ এর কয়েকটি রূপ। এক, পরিস্থিতির ফাঁক: বাজারঘরের ডেটা যদি ঢাকার শহুরে অর্ডারে ভরা থাকে, তাহলে লাখো অর্ডারও পাহাড়ি জেলার রাস্তা শেখাবে না। দুই, সময়ের বদল: মহামারির আগের কেনাকাটার ধরন পরের বছরে খাটেনি, এমন খবর অনেক খাতে এসেছিল। তিন, ঐতিহাসিক পক্ষপাত: label যদি মানুষের অতীত সিদ্ধান্ত হয়, model সেই সিদ্ধান্তের অন্যায্যতা শেখে। Reuters ২০১৮ সালে জানায় যে একটি বড় প্রযুক্তি প্রতিষ্ঠান পরীক্ষামূলক একটি নিয়োগ-বাছাই model বাতিল করেছিল, কারণ অতীতের নিয়োগের ডেটা থেকে এটি নারী প্রার্থীদের প্রতি পক্ষপাত শিখছিল বলে পাওয়া গিয়েছিল; প্রতিবেদন অনুযায়ী model-টি চূড়ান্ত সিদ্ধান্তে ব্যবহৃত হয়নি। চার, label-এর নিজের পক্ষপাত: কোন অর্ডারকে “সমস্যা” বলা হবে, তা যদি কর্মীর মনোযোগের ওপর নির্ভর করে, তাহলে কম নজর পাওয়া এলাকার সমস্যা কম দেখা যায়।

প্রতিকারের শুরু প্রশ্ন দিয়ে: model কাদের জন্য চলবে, আর ডেটা কি সবাইকে ধরে? তারপর জেলা বা গ্রাহক-দলভিত্তিক আলাদা ভুলের মাপ, ডেটার উৎসের নথি, deploy-এর পর নজরদারি, আর কিছু ক্ষেত্রে স্বীকার করা যে এই সিদ্ধান্ত model-কে দেওয়া উচিত নয় (পর্ব ৭২-এর বিষয়)।

মূল উপলব্ধি: ডেটার পরিমাণ গোলমাল কমায়, কিন্তু প্রতিনিধিত্বের অভাব বা পক্ষপাত সারায় না; কার ডেটা, কোন সময়ের আর কোন সিদ্ধান্তের ছাপ নিয়ে এসেছে, তা না জেনে বেশি ডেটা শুধু বেশি আত্মবিশ্বাস দেয়।

অনুশীলন

হাতে হিসাব, আউটপুট অনুমান, সমালোচনা আর কোড; প্রতিটির উত্তর নিচে লুকানো আছে।

  1. হাতে হিসাব: তিনটি নতুন অর্ডার (km, kg, আসল মিনিট): (৪, ২, ৪০), (৮, ৬, ৬৫), (১২, ১, ৭৫). (ক) হাতের নিয়ম: ৫ km পর্যন্ত ৪০ মিনিট, ১০ km পর্যন্ত ৬০, তার বেশি ৮০, আর ৫ kg-এর বেশি হলে আরও ১০. (খ) শেখা রেখা: মিনিট = ২০ + ৪ × km + ১.৫ × kg. দুটির MAE বের করুন। (গ) এই তিনটি অর্ডারের design matrix (ধ্রুবকের কলামসহ) আর y-এর আকার কী, আর রেখার কয়টি parameter?
    • (ক) নিয়ম: ৪ km → ৪০ (ভুল ০); ৮ km, ৬ kg → ৬০ + ১০ = ৭০ (ভুল ৫); ১২ km → ৮০ (ভুল ৫). MAE = (০ + ৫ + ৫)/৩ ≈ ৩.৩৩ মিনিট।
    • (খ) রেখা: ২০ + ১৬ + ৩ = ৩৯ (ভুল ১); ২০ + ৩২ + ৯ = ৬১ (ভুল ৪); ২০ + ৪৮ + ১.৫ = ৬৯.৫ (ভুল ৫.৫). MAE = ১০.৫/৩ = ৩.৫০ মিনিট।
    • (গ) X (৩, ৩): প্রতিটি সারি [১, km, kg]; y (৩,). Parameter ৩টি: b0, b1, b2.

    মজার ফল: এই তিনটি অর্ডারে হাতের নিয়ম সামান্য জিতেছে! অংশ ১-এ ২০টি অর্ডারে উল্টো ছিল (১০.৪ বনাম ৪.৮)। তিনটি উদাহরণে তুলনা প্রায় অর্থহীন; সিদ্ধান্তের জন্য যথেষ্ট বড় held-out ডেটা লাগে।

  2. আউটপুট অনুমান: নিচের কোড কী ছাপবে? প্রতিটি লাইনের সংখ্যা হাতে বের করুন।
    import numpy as np
    from numpy.polynomial import Polynomial
    
    x = np.array([1.0, 2.0, 3.0])
    y = np.array([2.0, 4.0, 7.0])
    X = np.column_stack([np.ones(3), x])
    print(X.shape, y.shape)
    for d in (0, 1, 2):
        f = Polynomial.fit(x, y, d)
        print(d, round(float(np.mean((f(x) - y) ** 2)), 3), round(float(f(4.0)), 2))

    সত্যিকারের run (ডেস্কটপ, Python 3.14.4, NumPy 2.5.4):

    (3, 2) (3,)
    0 4.222 4.33
    1 0.056 9.33
    2 0.0 11.0
    • Degree 0: সেরা ধ্রুবক গড়, ১৩/৩ ≈ ৪.৩৩; ভুলের বর্গ (২.৩৩)২ + (০.৩৩)২ + (২.৬৭)২ = ৫.৪৪ + ০.১১ + ৭.১১ = ১২.৬৭, গড় ৪.২২২. x = ৪-এও ৪.৩৩.
    • Degree 1: least squares ঢাল = ∑(x − x̄)(y − ȳ)/∑(x − x̄)২ = (−১ × −২.৩৩ + ০ + ১ × ২.৬৭)/২ = ২.৫; ছেদ = ৪.৩৩ − ২.৫ × ২ = −০.৬৭. অনুমান ১.৮৩, ৪.৩৩, ৬.৮৩; ভুল ০.১৭, −০.৩৩, ০.১৭; MSE = ০.১৬৭/৩ ≈ ০.০৫৬. x = ৪-এ ৯.৩৩.
    • Degree 2: তিনটি বিন্দু, তিনটি সহগ, তাই হুবহু মেলে: y = ০.৫x২ + ০.৫x + ১, MSE ০. x = ৪-এ ১১.

    শিক্ষা: সহগের সংখ্যা বিন্দুর সমান হলে training ভুল শূন্য, কিন্তু x = ৪-এ তিন model-এর উত্তর ৪.৩৩, ৯.৩৩ আর ১১: কোনটি ঠিক, তা ডেটা একা বলতে পারে না, বলে inductive bias আর নতুন ডেটা।

  3. সমালোচনা ও নকশা: একজন সহকর্মী লিখেছেন: “আমি বাজারঘরের সব ৫০০০ অর্ডার দিয়ে degree 15 বহুপদী fit করেছি। Training R² ০.৯৯৯, তাই এটি সব জেলায় ডেলিভারির সময় নির্ভুল বলবে। ডেটা থেকে দেখা যাচ্ছে বিকেলের অর্ডার দেরিতে পৌঁছায়, তাই বিকেলে অর্ডার নেওয়া বন্ধ করলে গড় সময় কমবে।” কী কী ভুল, আর আপনি T, E, P সহ কীভাবে নতুন করে সাজাবেন?
    • Training সংখ্যা: R² ০.৯৯৯ যে ডেটায় fit, তাতেই মাপা; degree 15 সহজেই মুখস্থ করে। Held-out ডেটা আর একটি baseline লাগবে।
    • Hypothesis space বাছাই: degree 15 কোনো যুক্তি ছাড়া বাছা hyperparameter; validation ডেটায় কয়েকটি degree বা অন্য model তুলনা করতে হবে।
    • “সব জেলায়”: ডেটায় কোন জেলা কতটা আছে, না জেনে এই দাবি করা যায় না; প্রতিটি জেলার আলাদা ভুল দেখতে হবে।
    • কারণের দাবি: বিকেলের দেরি হয়তো জ্যামের কারণে; বিকেলে অর্ডার বন্ধ করলে জ্যাম কমবে না, বিক্রি কমবে। এটি সম্পর্ক, কারণ নয়; সিদ্ধান্তের জন্য পরীক্ষা বা কারণের বিশ্লেষণ লাগবে।

    নতুন নকশা: T = অর্ডারের মুহূর্তে জানা তথ্য থেকে মিনিট বলা; E = পুরোনো অর্ডার, পুরোনো মাসে train আর সাম্প্রতিক মাসে test; P = test-এ মোট ও জেলাভিত্তিক MAE, baseline-এর পাশে।

  4. কোড: অংশ ৮-এর ব্লক বদলে sklearn.dummy.DummyRegressor দিয়ে দুটি baseline (সবসময় train-এর গড়, আর মধ্যমা বলা) যোগ করুন, আর একই test অংশে তিনটির MAE ছাপান। Linear regression baseline-এর চেয়ে কতটা ভালো?
    from sklearn.dummy import DummyRegressor
    
    for name, m in [("mean baseline", DummyRegressor(strategy="mean")),
                    ("median baseline", DummyRegressor(strategy="median")),
                    ("linear regression", LinearRegression())]:
        m.fit(X_tr, y_tr)
        print(f"{name:<18} held-out MAE {mean_absolute_error(y_te, m.predict(X_te)):5.2f}")

    সত্যিকারের run (ডেস্কটপ, Python 3.14.4, scikit-learn 1.9.1; একই seed আর ভাগ):

    mean baseline      held-out MAE 14.74
    median baseline    held-out MAE 14.60
    linear regression  held-out MAE  4.99

    রেখার ভুল baseline-এর প্রায় এক-তৃতীয়াংশ, তাই km আর kg সত্যিই তথ্য বহন করে। Baseline-গুলো X দেখেই না; ১৪.৭ মিনিট হলো “কিছু না জেনে” কতটা ভুল হয়। এমন তুলনা ছাড়া “MAE ৫ মিনিট” ভালো না খারাপ, বলা যায় না। (ডেস্কটপের scikit-learn 1.9.1 আর পাতার 1.8.0-তে এই সরল হিসাবের ফল একই আসার কথা।)

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

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

ক্রমএকটি supervised learning প্রকল্পের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. T, E আর P লিখে প্রশ্নটি স্পষ্ট করা
  2. প্রতিনিধিত্বমূলক উদাহরণ আর label সংগ্রহ
  3. ডেটা ভাগ করে test অংশ আলাদা রাখা
  4. শুধু train অংশে model fit করা
  5. Held-out test অংশে মাপা আর baseline-এর সঙ্গে তুলনা
  6. Deploy করে বাস্তবের ভুল নজরে রাখা

একটি দোকান পুরোনো অর্ডার দেখে নতুন অর্ডারের ডেলিভারির মিনিট অনুমান করতে চায়। Mitchell-এর সংজ্ঞায় P (performance measure) কোনটি?

  • অর্ডারের দূরত্ব আর ওজন থেকে মিনিট বলা
  • আসল ডেলিভারি-সময়সহ পুরোনো অর্ডার
  • নতুন অর্ডারে অনুমান আর আসল সময়ের গড় পার্থক্য
  • Model-এ কতগুলো parameter আছে

একটি বহুপদী regression model-এ নিচের কোনটি hyperparameter?

  • বহুপদীর সহগগুলো
  • বহুপদীর degree
  • Training ডেটার MSE
  • প্রতিটি উদাহরণের label

একটি ডেটাসেটে ৫০০টি অর্ডার, প্রতিটিতে ৪টি feature আর একটি label (ডেলিভারির মিনিট)। scikit-learn-এর fit(X, y)-এ X আর y-এর আকার কী হবে?

  • X (500, 4), y (500,)
  • X (4, 500), y (500,)
  • X (500, 5), y (500,)
  • X (500, 4), y (4,)

১০টি বিন্দুতে degree 9 বহুপদী fit করে training MSE 0.00 আর নতুন ডেটায় MSE 101.7 পাওয়া গেল; একই বিন্দুতে সরল রেখার training MSE 27.1, নতুন ডেটায় 43.3. সবচেয়ে ঠিক ব্যাখ্যা কোনটি?

  • Degree 9 ভালো, কারণ training ভুল শূন্য
  • Degree 9 underfit করেছে
  • নতুন ডেটা ভুলভাবে বানানো
  • Degree 9 গোলমালসহ বিন্দুগুলো মুখস্থ করেছে, অর্থাৎ overfitting

একটি ভাষা model-এর pretraining-এ বাক্য “বাজারঘর থেকে আজ আমার পার্সেল এসেছে” থেকে “এসেছে” অনুমানের কাজ দেওয়া হলো। এখানে label কোথা থেকে আসে, আর এই শেখার নাম কী?

  • মানুষ প্রতিটি বাক্যের পাশে label লেখেন; supervised
  • পরিবেশ থেকে reward; reinforcement
  • লেখার ভেতর থেকেই, পরের শব্দটিই label; self-supervised
  • কোনো label নেই; clustering

শেখার no free lunch ফল (Wolpert, ১৯৯৬) সম্পর্কে কোন কথাটি সবচেয়ে সঠিক?

  • বাস্তবের সব সমস্যায় সব learning algorithm সমান ভালো
  • সব সম্ভাব্য লক্ষ্য-ফাংশনের গড়ে না-দেখা উদাহরণে কোনো algorithm অন্যটির চেয়ে ভালো নয়
  • বেশি ডেটা কখনো model-কে ভালো করে না
  • Deep learning সব সমস্যায় সেরা, তা প্রমাণ করে

শব্দকোষ

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

মনে রাখুন

  1. নিয়ম বনাম শেখা: ML-এ মানুষ কাঠামো বাছেন, সংখ্যা আসে ডেটা থেকে। ২০টি নতুন অর্ডারে হাতের নিয়ম ১০.৪, শেখা রেখা ৪.৮ মিনিট গড় ভুল; নীতি, ব্যাখ্যা আর কঠোর সীমায় নিয়ম এখনো কাজের।
  2. T, E, P আর শব্দভান্ডার: X (n × d)-এর সারি উদাহরণ, কলাম feature; y label. Parameter fit-এ শেখা, hyperparameter আগে বাছা; training-এ শেখা, inference-এ অনুমান।
  3. শেখার ধরন: supervised (regression, classification), unsupervised (clustering, dimensionality reduction), reinforcement (action আর reward), self-supervised (ভাষা model-এর পরের token), semi-supervised.
  4. Generalisation: hypothesis space আর inductive bias বাছাই মূল সিদ্ধান্ত। Degree 9: training MSE ০, নতুন ডেটায় ১০১.৬৯; রেখা ২৭.০৬ আর ৪৩.৩৪, গোলমালের সীমা ৩৬. No free lunch: সর্বজনীন সেরা পদ্ধতি নেই।
  5. সীমা: প্রতিনিধিত্বমূলক ডেটা লাগে, model সম্পর্ক শেখে কারণ নয়, আর ডেটার পক্ষপাত শেখে। সবসময় held-out ডেটা আর baseline-এর সঙ্গে মাপুন।

পরের পর্বে: এই পর্বে বারবার “নতুন ডেটা” বলেছি। পর্ব ৫৬ (Train, validation আর test — data leakage-এর ফাঁদ)-এ দেখবেন কীভাবে ডেটা সৎভাবে ভাগ করতে হয়, validation কেন আলাদা, সময় আর দলভিত্তিক ভাগ, আর test-এর তথ্য চুপিচুপি training-এ ঢোকার নানা পথ।

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

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