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

বাস্তবে AI — কোথায় কাজ করে, কোথায় ভুল করে আর দায় কার

AI in Practice — Where It Works, How It Fails, and Who Is Responsible

Taught in Bangla, this lesson explains where today's AI works reliably and how it fails: distribution shift, shortcut learning, adversarial examples, hallucination and feedback loops, each reproduced in small seeded in-browser Python runs. It covers automation bias and real human-in-the-loop design, Bangla and code-mixed text, per-group false positive and false negative rates, privacy basics and a pre-launch accountability checklist.

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

  • কোন ধরনের কাজে AI আজ নির্ভরযোগ্যভাবে কাজ করে, আর তার পেছনের তিনটি শর্ত
  • AI কীভাবে ব্যর্থ হয়: distribution shift, shortcut, adversarial example, hallucination, feedback loop
  • Python দিয়ে নিজের হাতে এই ব্যর্থতাগুলো ঘটিয়ে দেখা — accuracy কীভাবে হঠাৎ নামে
  • বাংলা ভাষার AI-এ বাড়তি সমস্যা, আর fairness ও গোপনীয়তার প্রাথমিক প্রশ্ন
  • কোনো AI feature চালু করার আগে একটি ব্যবহারিক চেকলিস্ট, আর দায় কার — সেই প্রশ্নের কাঠামো

১ · AI কোথায় ভালো কাজ করে — আর কেন

আগের পর্বগুলোতে আপনি দেখেছেন AI কী, এর ইতিহাস কেমন, আর AI কোন ধরনের সমস্যা সমাধান করে। এবার মাটিতে নামার পালা। প্রশ্নটা সোজা: আজকের AI আসলে কোথায় নির্ভর করার মতো, আর কোথায় নয়?

আপনার ফোনে বা কম্পিউটারে প্রতিদিন কয়েকটি AI চুপচাপ কাজ করে। ইমেইলের spam folder-এ যে বিজ্ঞাপন জমা হয়, সেটি একটি classifier বাছাই করেছে। ফোনে কথা বললে যে লেখা আসে, তার পেছনে আছে speech recognition. কোনো অনলাইন দোকানে “আপনার পছন্দ হতে পারে” তালিকা দেখায় একটি recommender system. ব্যাংক বা মোবাইল ওয়ালেটে অস্বাভাবিক লেনদেন হলে যে সতর্কবার্তা আসে, সেটিও প্রায়ই একটি model-এর সিদ্ধান্ত। স্ক্যান করা কাগজ থেকে লেখা তুলে আনে OCR.

এই কাজগুলোর মধ্যে মিল কোথায়? তিনটি শর্ত প্রায় সবখানে আছে।

📦 প্রচুর উদাহরণ

লক্ষ লক্ষ ইমেইল, ঘণ্টার পর ঘণ্টা রেকর্ড করা কথা, অসংখ্য অনুবাদ করা বাক্য। Model শেখে উদাহরণ থেকে, তাই উদাহরণ যত বেশি ও বৈচিত্র্যময়, শেখা তত মজবুত।

training data

🎯 সরু, স্পষ্ট কাজ

“এই ইমেইল spam কি না” — প্রশ্নটি ছোট আর উত্তর মাপা যায়। “এই কোম্পানির ভবিষ্যৎ কেমন” — এমন খোলা প্রশ্নে AI অনেক কম নির্ভরযোগ্য।

narrow task

🔁 দ্রুত ফিডব্যাক

ব্যবহারকারী “spam নয়” চাপলে বা অনুবাদ ঠিক করে দিলে সিস্টেম ভুলটি জানতে পারে। ভুল দ্রুত ধরা পড়লে দ্রুত সারানো যায়।

feedback

পাড়ার অভিজ্ঞ মাছওয়ালার কথা ভাবুন। তিরিশ বছর ধরে প্রতিদিন শত শত মাছ দেখেছেন (প্রচুর উদাহরণ)। তাঁর কাজ একটাই — মাছ তাজা কি না বলা (সরু কাজ)। ভুল বললে পরদিনই খদ্দের ফেরত আসে (দ্রুত ফিডব্যাক)। এই তিনটি থাকায় তিনি এক নজরে প্রায় নির্ভুল। কিন্তু তাঁকে যদি হঠাৎ জিজ্ঞেস করেন “এই শেয়ারের দাম বাড়বে কি না”, তাঁর অভিজ্ঞতা কোনো কাজে আসবে না। AI-এর ক্ষেত্রেও ঠিক তাই — দক্ষতা কাজের সীমার ভেতরেই।

একটি সতর্কতা শুরুতেই রাখি। “AI ভালো কাজ করে” কথাটি সবসময় শর্তসাপেক্ষ: কোন ডেটায়, কোন মাপকাঠিতে, কাদের জন্য। কোনো model-এর accuracy ৯৫% শুনলে প্রথম প্রশ্ন হওয়া উচিত — কোন ডেটায় মাপা হয়েছে? সেই ডেটা কি আপনার বাস্তব ব্যবহারকারীদের মতো? এই পর্বের বাকিটা মূলত এই প্রশ্নেরই বিস্তার। Accuracy, precision আর recall-এর মতো মাপকাঠি বিস্তারিত আসবে পর্ব ৬০-এ।

মূল ধারণা

Model যা শেখে, তা তার training data-র একটি সারাংশ। Training data যে জগৎ থেকে এসেছে, model শুধু সেই জগতের জন্যই ভালোভাবে কাজ করবে বলে আশা করা যায়। জগৎ বদলালে প্রতিশ্রুতিও আর থাকে না।

২ · Distribution shift — অন্য জেলা, অন্য ঋতু

এই কোর্সের চলমান উদাহরণ “বাজারঘর”, একটি কাল্পনিক অনলাইন দোকান। ধরুন বাজারঘর একটি model বানাল, যা আগে থেকে বলে দেবে কোন ডেলিভারি দেরিতে পৌঁছাবে। Model শেখানো হলো একটি কাল্পনিক জেলা “নতুনপুর”-এর ডেটায়। নতুনপুর নিচু এলাকা — বৃষ্টি হলেই রাস্তায় পানি জমে, তাই সেখানে দূরত্ব আর বৃষ্টি দুটোই দেরির কারণ।

Model ভালো চলল। তারপর বাজারঘর ব্যবসা বাড়াল আরেক কাল্পনিক জেলা “পাহাড়গঞ্জ”-এ। সেখানে পানি নিষ্কাশন ভালো, বৃষ্টিতে রাস্তা প্রায় আটকায় না। কিন্তু model তো জানে “বৃষ্টি মানেই দেরি”! ফলে পাহাড়গঞ্জে বৃষ্টির দিনে সে একের পর এক ভুল সতর্কবার্তা দিতে লাগল।

এটিই distribution shift: যে ডেটায় model শিখেছে আর যে ডেটায় সে কাজ করছে, তাদের পরিসংখ্যানগত চেহারা আলাদা। এর তিনটি সাধারণ রূপ আছে:

ধরনকী বদলায়বাজারঘরের উদাহরণ
Covariate shiftInput-এর বণ্টন বদলায়, কিন্তু input থেকে উত্তরের নিয়ম একই থাকেনতুন জেলায় অর্ডারগুলো গড়ে অনেক বেশি দূরের
Concept driftInput থেকে উত্তরের সম্পর্কটাই বদলে যায়পাহাড়গঞ্জে বৃষ্টি আর দেরির কারণ নয়
Label shiftউত্তরগুলোর অনুপাত বদলায়ঈদের আগে দেরির হার হঠাৎ অনেক বেড়ে যায়

এবার এটি নিজের চোখে দেখা যাক। নিচের কোডে seed দেওয়া কাল্পনিক ডেটা তৈরি হয়, তাই প্রতিবার একই সংখ্যা আসবে। প্রতিটি অর্ডারের দুটি feature: দূরত্ব (কিলোমিটার) আর বৃষ্টি (মিলিমিটার)। নতুনপুরে দেরির “আসল নিয়ম” হলো 0.3×দূরত্ব + 0.08×বৃষ্টি + noise > 5; পাহাড়গঞ্জে বৃষ্টির ওজন শূন্য। Model হিসেবে নেওয়া হয়েছে scikit-learn-এর logistic regression — এর ভেতরের গণিত পর্ব ৫৯-এ আসবে, এখন শুধু জানুন এটি দুটি feature-কে ওজন দিয়ে যোগ করে “দেরি/সময়মতো” বলে।

এই পাতার কোড আপনার ব্রাউজারেই চলে (Pyodide). প্রথমবার “চালান” চাপলে Python আর scikit-learn লোড হতে প্রায় ১০ সেকেন্ড লাগতে পারে; পরের বার অনেক দ্রুত।

import numpy as np
from sklearn.linear_model import LogisticRegression

rng = np.random.default_rng(42)

def district(n, rain_w):
    dist = rng.uniform(1, 20, n)            # km
    rain = rng.uniform(0, 60, n)            # mm
    score = 0.3 * dist + rain_w * rain + rng.normal(0, 1, n)
    late = (score > 5).astype(int)          # 1 = late delivery
    return np.column_stack([dist, rain]), late

# Notun-pur: low land, rain floods roads
X_tr, y_tr = district(800, rain_w=0.08)
X_te, y_te = district(400, rain_w=0.08)
# Pahar-ganj: good drainage, rain barely matters
X_new, y_new = district(400, rain_w=0.0)

model = LogisticRegression().fit(X_tr, y_tr)
w = model.coef_[0]
print("weights  dist=%.2f  rain=%.2f" % (w[0], w[1]))
print("late rate  A=%.2f  B=%.2f" % (y_te.mean(), y_new.mean()))
print("accuracy, District A test:", round(model.score(X_te, y_te), 3))
print("accuracy, District B     :", round(model.score(X_new, y_new), 3))

pred_B = model.predict(X_new)
false_late = ((pred_B == 1) & (y_new == 0)).sum()
print("B: predicted late but on time:", false_late, "of", len(y_new))

আসল আউটপুট:

weights  dist=0.54  rain=0.15
late rate  A=0.60  B=0.20
accuracy, District A test: 0.873
accuracy, District B     : 0.618
B: predicted late but on time: 147 of 400

Model বৃষ্টিকে ধনাত্মক ওজন (0.15) দিয়েছে — নতুনপুরের জন্য সেটি ঠিক। নতুনপুরের নতুন অর্ডারে (test) accuracy 0.873, অর্থাৎ প্রায় ৮৭%. কিন্তু পাহাড়গঞ্জে একই model-এর accuracy নেমে এলো প্রায় ৬২%-এ। ৪০০ অর্ডারের মধ্যে ১৪৭টিকে সে “দেরি হবে” বলেছে, যা আসলে সময়মতো পৌঁছেছে। Model-এর কোডে কোনো বাগ নেই; বদলেছে শুধু জগৎ। লক্ষ করুন, পাহাড়গঞ্জে দেরির আসল হার মাত্র ২০%, অথচ model নতুনপুরের ৬০% হারের অভ্যাস নিয়ে এসেছে। এখানে label shift আর concept drift একসঙ্গে ঘটছে।

নিচের ডায়াগ্রামে একই ঘটনা ধাপে ধাপে দেখুন। প্রতিটি সংখ্যা উপরের কোডের আসল run (আর একই seed-এ একটি বাড়তি local হিসাব) থেকে নেওয়া।

  1. শেখানতুনপুর৮০০ অর্ডার
  2. যাচাই87%একই জেলা
  3. নতুন জেলা62%পাহাড়গঞ্জ
  4. সারানোনতুন ডেটাmonitor + retrain
নতুনপুরশেখার ডেটা
দেরির হার = 0.60
ওজন: dist = 0.54
     rain = 0.15
← বৃষ্টি মানে দেরি
নতুনপুর test৪০০টি নতুন অর্ডার
accuracy = 0.873
একই জেলা, একই নিয়ম → model ভালো
পাহাড়গঞ্জ৪০০টি অর্ডার
দেরির হার = 0.20
accuracy  = 0.618
বৃষ্টির ওজন এখানে আসলে 0
একটি অর্ডার৮ কিমি, ৪০ মিমি বৃষ্টি
model: P(দেরি) ≈ 0.75
       → "দেরি হবে"
নতুনপুরের নিয়মে:
  0.3×8 + 0.08×40 = 5.6 > 5
পাহাড়গঞ্জের নিয়মে:
  0.3×8 + 0 = 2.4 < 5
noise বাদে: সময়মতো
সমাধানের পথএকই seed-এ local হিসাব
পাহাড়গঞ্জের ২০০টি নতুন অর্ডারে
আলাদা model শেখালে, পাহাড়গঞ্জে
accuracy ≈ 0.865
  1. শেখা। নতুনপুরের ৮০০ অর্ডারে model শিখল। সেখানে ৬০% অর্ডার দেরিতে যায়, আর model বৃষ্টিকে ধনাত্মক ওজন (0.15) দিল — কারণ নতুনপুরে বৃষ্টি সত্যিই দেরি ঘটায়।
  2. একই জেলায় যাচাই। নতুনপুরের নতুন ৪০০ অর্ডারে accuracy প্রায় ৮৭%. এই সংখ্যা দেখে সবাই খুশি — কিন্তু এটি শুধু নতুনপুরের প্রতিশ্রুতি।
  3. নতুন জেলায় চালু। পাহাড়গঞ্জে accuracy নেমে প্রায় ৬২%. সেখানে দেরির হার মাত্র ২০%, আর বৃষ্টির কোনো প্রভাব নেই। Model পুরোনো জগতের নিয়ম বয়ে এনেছে।
  4. একটি অর্ডারের ভেতরে। ৮ কিমি দূরের একটি অর্ডার, ৪০ মিমি বৃষ্টি। Model বলছে দেরির সম্ভাবনা প্রায় ০.৭৫। নতুনপুরের নিয়মে স্কোর ৫.৬ (দেরি), কিন্তু পাহাড়গঞ্জের নিয়মে মাত্র ২.৪ (সময়মতো)। ভুলটা ঠিক বৃষ্টির ওজনেই।
  5. সারানো। একই seed ধরে একটি বাড়তি local হিসাবে পাহাড়গঞ্জের ২০০টি নতুন অর্ডারে আলাদা model শেখানো হলো; পাহাড়গঞ্জে তার accuracy প্রায় ৮৬.৫%. শিক্ষা: নতুন জায়গায় চালুর পর সেখানকার ডেটা জমিয়ে নজর রাখা (monitoring) আর দরকারে আবার শেখানো।

Distribution shift-এর সবচেয়ে বিপজ্জনক দিক হলো, model নিজে টের পায় না। সে আগের মতোই আত্মবিশ্বাসী সম্ভাবনা দেয় (উপরের ০.৭৫)। তাই শুধু model-এর নিজের “confidence” দেখে বিপদ ধরা যায় না; বাস্তব ফলাফল জমিয়ে মিলিয়ে দেখতে হয়।

বাস্তবে shift আসে নানা দিক থেকে: ঋতু বদল (বর্ষা বনাম শীত), উৎসব (ঈদের আগের কেনাকাটা), নতুন ফোন বা ক্যামেরা, নতুন আইন, এমনকি মহামারির মতো বড় ঘটনা। আবহাওয়ার পূর্বাভাসের মডেলও পুরোনো বছরের ডেটায় শেখে, তাই অস্বাভাবিক বছরে তার ভুল বাড়ে। কোনো model চালু করার পর “একবার বানালাম, চিরকাল চলবে” — এই ধারণাটিই সবচেয়ে বড় ভুল। Train, validation আর test ভাগ করার সঠিক নিয়ম পর্ব ৫৬-এ বিস্তারিত দেখবেন।

৩ · Shortcut learning — বরফ দেখে “তাজা মাছ”

Distribution shift-এর একটি বিশেষ, চতুর রূপ আছে। Model অনেক সময় আসল কারণ না শিখে এমন কিছু শেখে, যা training data-তে কাকতালীয়ভাবে উত্তরের সঙ্গে মিলে যায়। একে বলে spurious correlation (ভুয়া সম্পর্ক), আর model-এর এই সহজ পথ বেছে নেওয়াকে বলে shortcut learning.

সবচেয়ে পরিচিত উদাহরণটি এসেছে ২০১৬ সালের একটি গবেষণাপত্র থেকে: Ribeiro, Singh ও Guestrin-এর “Why Should I Trust You?”, যেখানে তাঁরা LIME নামে একটি ব্যাখ্যা-পদ্ধতি দেখান। সেখানে লেখকেরা ইচ্ছে করেই একটি ছোট ছবি-classifier বানান, যার training ছবিতে প্রায় সব নেকড়ের (wolf) পেছনে বরফ ছিল, আর husky কুকুরের পেছনে ছিল না। Classifier আসলে শিখে ফেলেছিল “পেছনে বরফ থাকলে নেকড়ে”। ব্যাখ্যা-পদ্ধতি সেটি ধরিয়ে দেয়। উদাহরণটি ছিল একটি পরিকল্পিত পরীক্ষা, কোনো চালু পণ্যের ঘটনা নয় — কিন্তু সমস্যাটি যে বাস্তব, তা পরে বহু গবেষণায় দেখা গেছে। ২০২০ সালে Geirhos ও সহকর্মীরা “Shortcut learning in deep neural networks” প্রবন্ধে এমন অনেক উদাহরণ একসঙ্গে আলোচনা করেন।

বাংলাদেশি একটি উপমা নিন। বাজারঘর মাছের ছবি দেখে “তাজা/বাসি” বলার একটি model বানাতে চায়। Training ছবিগুলো এসেছে কয়েকজন পুরোনো বিক্রেতার কাছ থেকে, যাঁরা তাজা মাছ সবসময় বরফের ওপর রেখে ছবি তোলেন। Model দেখল: বরফ থাকলেই প্রায় সবসময় “তাজা”। কানকোর রঙ (আসল লক্ষণ) দেখার চেয়ে বরফ দেখা অনেক সহজ! তারপর নতুন বিক্রেতারা এলেন, যাঁদের কেউ বাসি মাছও বরফে রাখেন।

নিচের খেলনা-উদাহরণে দুটি feature: gill (কানকোর লালচে ভাব — আসল কিন্তু noise-ভরা সংকেত) আর ice (ছবিতে বরফ আছে কি না)। Training-এ বরফ ৯৫% ক্ষেত্রে উত্তরের সঙ্গে মেলে; নতুন বিক্রেতাদের ছবিতে মাত্র ৫০% — অর্থাৎ এলোমেলো।

import numpy as np
from sklearn.linear_model import LogisticRegression

rng = np.random.default_rng(7)

def photos(n, ice_match):
    fresh = rng.integers(0, 2, n)                  # 1 = fresh fish
    gill = fresh * 1.0 + rng.normal(0, 0.8, n)     # real but noisy signal
    same = rng.random(n) < ice_match               # does ice follow the label?
    ice = np.where(same, fresh, 1 - fresh)         # 1 = ice in the photo
    return np.column_stack([gill, ice]), fresh

X_tr, y_tr = photos(1000, ice_match=0.95)   # sellers of fresh fish used ice
X_te, y_te = photos(1000, ice_match=0.50)   # new sellers: ice is random

model = LogisticRegression().fit(X_tr, y_tr)
print("weights  gill=%.2f  ice=%.2f" % tuple(model.coef_[0]))
print("train accuracy:", round(model.score(X_tr, y_tr), 3))
print("test accuracy :", round(model.score(X_te, y_te), 3))

gill_only = LogisticRegression().fit(X_tr[:, :1], y_tr)
print("gill-only model, test:", round(gill_only.score(X_te[:, :1], y_te), 3))

stale_on_ice = (y_te == 0) & (X_te[:, 1] == 1)
fooled = (model.predict(X_te)[stale_on_ice] == 1).mean()
print("stale fish on ice called fresh: %.0f%%" % (100 * fooled))

আসল আউটপুট:

weights  gill=1.26  ice=5.63
train accuracy: 0.958
test accuracy : 0.547
gill-only model, test: 0.743
stale fish on ice called fresh: 98%

বরফের ওজন (5.63) কানকোর ওজনের (1.26) চার গুণেরও বেশি — model প্রায় পুরোপুরি বরফের ওপর ভরসা করছে। Training-এ accuracy প্রায় ৯৬%, কিন্তু নতুন বিক্রেতাদের ছবিতে মাত্র প্রায় ৫৫% — মুদ্রা ছুড়ে বলার চেয়ে সামান্য ভালো। মজার ব্যাপার, শুধু কানকো দেখে শেখা “দুর্বল” model নতুন ছবিতে বেশি ভালো (প্রায় ৭৪%). আর বরফের ওপর রাখা বাসি মাছের ৯৮%-কেই model “তাজা” বলেছে। Training accuracy দেখে এর কিছুই বোঝা যেত না।

🐟 তাজা + 🧊 বরফtraining-এ প্রায় সবসময়
🐟 বাসি + বরফ নেইtraining-এ প্রায় সবসময়
ওজন: ice = 5.63সহজ সংকেত
ওজন: gill = 1.26আসল সংকেত
train: 0.958দেখে মনে হয় দারুণ
test: 0.547নতুন বিক্রেতা
বরফে বাসি মাছ → 98% “তাজা”বোকা বনল
  1. Training ছবি। পুরোনো বিক্রেতারা তাজা মাছ বরফে রেখে ছবি তোলেন। ফলে training-এ ৯৫% ক্ষেত্রে “বরফ আছে” আর “তাজা” একসঙ্গে আসে। এটি মাছের গুণ নয়, ছবি তোলার অভ্যাস।
  2. Model সহজ পথ নিল। বরফের ওজন 5.63, কানকোর 1.26. কানকোর রঙে noise বেশি, বরফ প্রায় নিখুঁত সংকেত — তাই loss কমানোর সবচেয়ে সহজ উপায় বরফ দেখা।
  3. Training accuracy প্রায় ৯৬%. এই সংখ্যা দেখে কেউ সমস্যা টের পাবে না। ভুয়া সম্পর্কটি training-এ সত্যিই কাজ করছে।
  4. নতুন বিক্রেতাদের ছবিতে প্রায় ৫৫%. এখানে বরফ এলোমেলো (৫০%). যে সংকেতে model ভরসা করেছিল, সেটি আর কিছু বলে না।
  5. সবচেয়ে বড় ক্ষতি। বরফে রাখা বাসি মাছের ৯৮%-কে model “তাজা” বলল। কোনো অসৎ বিক্রেতা এটি বুঝে ফেললে ইচ্ছে করেই বাসি মাছ বরফে রেখে ছবি দেবেন — shortcut তখন নিরাপত্তার ফাঁকও।

বাস্তবে shortcut চেনার উপায় কী? এক, model কোন feature-এ ভর দিচ্ছে তা দেখা (ব্যাখ্যা-পদ্ধতি, feature-এর ওজন)। দুই, ভিন্ন উৎসের ডেটায় যাচাই — অন্য বিক্রেতা, অন্য হাসপাতাল, অন্য জেলা। তিন, ডোমেইন বিশেষজ্ঞকে জিজ্ঞেস করা: “এই feature কি সত্যিই কারণ, নাকি শুধু সঙ্গী?” ডাক্তার যেমন রোগনির্ণয়ে লক্ষণ দেখেন, রোগী কোন হাসপাতালের কাগজে রিপোর্ট এনেছেন তা দেখে নয়।

৪ · আরও তিন রকম ভুল — adversarial, hallucination আর feedback loop

Adversarial example — চোখে না পড়া কারসাজি

Adversarial example হলো এমন input, যাতে ইচ্ছে করে খুব সামান্য পরিবর্তন করা হয়েছে, যাতে model ভুল করে — অথচ মানুষের চোখে প্রায় কোনো পার্থক্যই নেই। ২০১৩–১৪ সালে Szegedy ও সহকর্মীদের “Intriguing properties of neural networks” এবং পরে Goodfellow ও সহকর্মীদের কাজ এই ঘটনাকে ব্যাপকভাবে পরিচিত করে। Goodfellow-দের প্রবন্ধের একটি প্রায়ই উদ্ধৃত ছবিতে, একটি panda-র ছবিতে অদৃশ্যপ্রায় noise যোগ করার পর classifier সেটিকে উচ্চ আত্মবিশ্বাসে অন্য প্রাণী বলে। বাস্তব জগতে এমন আক্রমণ কতটা সহজ, তা পরিস্থিতিভেদে অনেক আলাদা — গবেষণায় যা দেখা যায়, মাঠে সবসময় তা হুবহু ঘটে না। তবু শিক্ষাটা স্পষ্ট: model-এর “দেখা” মানুষের দেখার মতো নয়। এর রক্ষণাত্মক দিক নিয়ে ABCL TECH-এর Cybersecurity কোর্স-এ আলোচনা আছে।

Hallucination — আত্মবিশ্বাসী, সাবলীল, কিন্তু ভুল

ChatGPT-এর মতো বড় ভাষা-model (LLM) মূলত শেখে “এর পরে কোন শব্দ আসার সম্ভাবনা বেশি”। তাই সে এমন বাক্য বানাতে পারে, যা শুনতে নিখুঁত কিন্তু তথ্যগতভাবে ভুল — অস্তিত্বহীন বই, ভুল সাল, বানানো উদ্ধৃতি। একে বলা হয় hallucination. শব্দটি নিয়ে বিতর্কও আছে, কারণ এটি model-কে মানুষের মতো “দেখা”র গুণ দেয়; কেউ কেউ “confabulation” বা সোজা “বানানো উত্তর” বলতে পছন্দ করেন। কারণ যা-ই বলুন, বাস্তব ঝুঁকি হলো: সাবলীল ভাষা পাঠককে বিশ্বাস করতে প্ররোচিত করে। পরীক্ষার খাতায় আত্মবিশ্বাসী হাতের লেখা দেখে নম্বর দেওয়া যায় না — উত্তর মিলিয়ে দেখতে হয়। LLM কীভাবে কাজ করে আর কেন এমন হয়, তা পর্ব ৭০-এ দেখবেন।

Feedback loop — নিজের ভুলকে নিজেই বাড়িয়ে তোলা

কিছু AI-এর সিদ্ধান্ত ভবিষ্যতের training data-কেই বদলে দেয়। বাজারঘরের recommender যদি শুধু সেই পণ্যগুলো দেখায়, যেগুলো আগে বেশি click পেয়েছে, তাহলে যা দেখানো হয় না, তা কখনো click পায় না — আর click না পেলে আবারও দেখানো হয় না। একে বলে feedback loop. প্রথম দিনের সামান্য কাকতালীয় পার্থক্য কয়েক সপ্তাহে স্থায়ী “সত্য” হয়ে যায়।

নিচের simulation-এ পাঁচটি category. প্রতিটির একটি “আসল” click-সম্ভাবনা আছে — Phone সবচেয়ে জনপ্রিয় (০.৩০)। প্রথম round-এ সব category ২০ বার করে দেখানো হয়; তারপর থেকে শুধু মোট click-এ এগিয়ে থাকা দুটি category ৫০ বার করে।

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(1)
cats = ["Saree", "Books", "Phone", "Spice", "Toys"]
like = np.array([0.22, 0.20, 0.30, 0.24, 0.21])  # true click chance
clicks = np.zeros(5)
share = []

for rnd in range(30):
    if rnd == 0:
        shown = np.full(5, 20)                    # round 1: show all
    else:
        top = np.argsort(-clicks)[:2]             # then only the top 2
        shown = np.zeros(5, dtype=int)
        shown[top] = 50
    clicks += rng.binomial(shown, like)
    share.append(clicks / clicks.sum())

share = np.array(share)
for r in [0, 1, 4, 29]:
    print("round %2d share:" % (r + 1), np.round(share[r], 2))
print("best-liked item is", cats[like.argmax()],
      "| top-2 at the end:", [cats[i] for i in np.argsort(-clicks)[:2]])

fig, ax = plt.subplots(figsize=(6, 3.2))
for i, c in enumerate(cats):
    ax.plot(range(1, 31), share[:, i], label=c)
ax.set_xlabel("Round")
ax.set_ylabel("Share of all clicks")
ax.set_title("Feedback loop: what is shown gets clicked")
ax.legend(fontsize=8)
plt.tight_layout()
plt.show()

আসল আউটপুট (সঙ্গে একটি chart):

round  1 share: [0.15 0.27 0.15 0.31 0.12]
round  2 share: [0.08 0.32 0.08 0.46 0.06]
round  5 share: [0.04 0.36 0.04 0.54 0.03]
round 30 share: [0.01 0.45 0.01 0.53 0.  ]
best-liked item is Phone | top-2 at the end: ['Spice', 'Books']

প্রথম round-এ কাকতালীয়ভাবে Spice (৮ click) আর Books (৭ click) এগিয়ে গেল; Phone পেল মাত্র ৪টি। তারপর থেকে Phone আর কখনো দেখানোই হয়নি। ৩০ round পরে মোট click-এর প্রায় ৯৮% Spice আর Books-এর — অথচ ব্যবহারকারীরা আসলে Phone-ই সবচেয়ে বেশি পছন্দ করেন। Chart-এ দেখবেন তিনটি রেখা শূন্যের দিকে নেমে গেছে। একই কোড seed ০ থেকে ১১ দিয়ে একটি local পরীক্ষায় চালিয়ে দেখা গেছে, ১২ বারের ৪ বার Phone প্রথম round-এই বাদ পড়ে — অর্থাৎ ফল নির্ভর করে ভাগ্যের ওপর, পছন্দের ওপর নয়। এটি একটি খেলনা simulation, কোনো বাস্তব সিস্টেমের মাপ নয়।

মোট click (round শেষে) · দেখানো হয়েছে কি না
Saree (০.২২)
Books (০.২০)
Phone (০.৩০)
Spice (০.২৪)
Toys (০.২১)
  1. Round ১ — সবাইকে সুযোগ। প্রতিটি category ২০ বার দেখানো হলো। Click এলো ৪, ৭, ৪, ৮, ৩। Phone-এর আসল পছন্দ সবচেয়ে বেশি (০.৩০), কিন্তু এই ২০ বারে ভাগ্য তার পক্ষে ছিল না — পেল মাত্র ৪।
  2. Round ২ — শুধু সেরা দুই। মোট click-এ এগিয়ে Spice (৮) আর Books (৭)। এবার শুধু এরা ৫০ বার করে দেখানো হলো: Spice পেল ১৫, Books ৯। বাকি তিনটি একটিও নতুন click পেল না, কারণ কেউ এদের দেখেইনি।
  3. Round ৩। Spice ৩৫, Books ২৫। ব্যবধান বাড়ছে, আর Phone, Saree, Toys আটকে আছে আগের সংখ্যায়।
  4. Round ৫। Spice ৬০, Books ৪০। মোট click-এর ৯০% এই দুটির। ডেটা দেখে মনে হবে “ক্রেতারা শুধু মসলা আর বই চান” — অথচ এই ডেটা সিস্টেম নিজেই তৈরি করেছে।
  5. Round ১০। Spice ১১৪, Books ৮৭। Phone এখনো ৪। এই ডেটায় নতুন করে model শেখালে সে আরও জোর দিয়ে একই ভুল শিখবে।
  6. Round ৩০। Spice ৩৫৭, Books ৩০১, Phone ৪। সমাধান: কিছু জায়গা নতুন বা কম-দেখা জিনিসের জন্য রাখা (exploration), আর “কী দেখানো হয়েছিল” তাও ডেটায় লিখে রাখা — যাতে “দেখানো হয়নি” আর “পছন্দ হয়নি” আলাদা করা যায়।

Feedback loop শুধু দোকানে নয়। যেখানে AI-এর সিদ্ধান্ত ঠিক করে কোথায় নজর দেওয়া হবে — কোন এলাকায় পরিদর্শন, কোন লেনদেন পরীক্ষা, কোন আবেদন আগে দেখা — সেখানে নজর বেশি পড়লে “সমস্যা” বেশি ধরা পড়ে, আর সেই ডেটা আবার নজর বাড়ায়। ২০১৮ সালে Ensign ও সহকর্মীরা “Runaway Feedback Loops in Predictive Policing” প্রবন্ধে গাণিতিকভাবে এমন একটি চক্র বিশ্লেষণ করেন।

৫ · মানুষের দিকের ভুল — automation bias আর human-in-the-loop

এতক্ষণ যন্ত্রের ভুল দেখলাম। কিন্তু অনেক দুর্ঘটনায় শেষ ধাপটি মানুষের। Automation bias হলো যন্ত্রের পরামর্শকে যাচাই না করে মেনে নেওয়ার প্রবণতা — যন্ত্র ভুল বললেও, এমনকি নিজের চোখের সামনের প্রমাণ উল্টো বললেও। বিমান চালনা আর চিকিৎসার মানব-কারণ (human factors) গবেষণায় বিষয়টি বহু বছর ধরে আলোচিত; ২০১০ সালে Parasuraman ও Manzey-র একটি বহুল উদ্ধৃত পর্যালোচনা এই প্রবণতা আর “নিশ্চিন্ত হয়ে যাওয়া” (complacency)-কে একসঙ্গে বিশ্লেষণ করে।

GPS অ্যাপ বলল “ডানে মোড় নিন”, আর রিকশাওয়ালা মামা বললেন “ওই গলিতে বর্ষায় হাঁটুপানি”। অনেকেই তবু অ্যাপের কথা শোনেন — কারণ অ্যাপ সাধারণত ঠিক বলে। “সাধারণত ঠিক” হওয়াটাই বিপদ: যন্ত্র যত বেশি ঠিক থাকে, তার বিরল ভুলের সময় মানুষ তত কম সতর্ক থাকে।

এর বিপরীতে প্রায়ই বলা হয় human-in-the-loop — চূড়ান্ত সিদ্ধান্তের আগে একজন মানুষ যাচাই করবেন। ধারণাটি ভালো, কিন্তু শুধু নাম দিলেই কাজ হয় না। একজন কর্মীকে যদি ঘণ্টায় ৫০০টি সতর্কবার্তা “অনুমোদন” করতে হয়, তিনি কার্যত রাবার স্ট্যাম্প। কার্যকর human-in-the-loop-এর জন্য দরকার:

  • সময় ও সংখ্যা: যাচাইকারী যেন সত্যিই যাচাই করতে পারেন — কাজের চাপ বাস্তবসম্মত।
  • তথ্য: শুধু “model বলছে ঝুঁকিপূর্ণ” নয়; কেন বলছে, কোন feature কাজ করেছে, model কতটা অনিশ্চিত।
  • ক্ষমতা: model-এর বিরুদ্ধে গেলে যাচাইকারী যেন শাস্তি বা জবাবদিহির ভয় না পান।
  • ফিডব্যাক: মানুষের সংশোধন যেন রেকর্ড হয় আর পরের model উন্নত করতে কাজে লাগে।
  • আপিলের পথ: যাঁর ওপর সিদ্ধান্ত পড়ল, তিনি যেন জানতে ও আপত্তি জানাতে পারেন।
মূল ধারণা

AI সিস্টেম = model + ডেটা + মানুষ + প্রক্রিয়া। শুধু model-এর accuracy নয়, পুরো সিস্টেমের ফল মাপতে হয় — model আর মানুষ মিলে কতগুলো সঠিক সিদ্ধান্ত হচ্ছে, আর ভুল হলে কত দ্রুত ধরা পড়ছে।

৬ · বাংলা আর কম-সম্পদের ভাষা

বাংলা বিশ্বের বহুল-কথিত ভাষাগুলোর একটি, অথচ AI-এর হিসাবে প্রায়ই একে low-resource language বলা হয়। কারণ ভাষাভাষীর সংখ্যা নয় — যন্ত্রে পড়ার মতো, পরিষ্কার, label দেওয়া ডিজিটাল ডেটা, যেমন হাতে-যাচাই করা অনুবাদ-জোড়া, লেখা-সহ কথার রেকর্ডিং, অনুভূতি-চিহ্নিত রিভিউ। ইংরেজির তুলনায় এমন ডেটা সাধারণত অনেক কম, যদিও গত কয়েক বছরে গবেষক ও ওপেন-সোর্স সম্প্রদায়ের কাজে পরিস্থিতি ধীরে ধীরে বদলাচ্ছে। নিখুঁত তুলনামূলক সংখ্যা এখানে দিচ্ছি না, কারণ মাপার পদ্ধতিভেদে তা অনেক আলাদা আসে।

বাজারঘরের রিভিউ-বাক্সে কী আসে, একবার ভাবুন:

"পণ্যটা ভালো, কিন্তু ডেলিভারি লেট"
"product ta valo na, taka ferot chai"
"Delivery fast chilo 👍 kintu packet chhera"
"মাল ঠিক আছে, দাম বেশি"
  • মিশ্র লিপি আর Banglish: একই মানুষ কখনো বাংলা হরফে, কখনো রোমান হরফে বাংলা লেখেন, মাঝে ইংরেজি শব্দ ঢোকান। একে বলে code-mixing. “valo”, “bhalo”, “vlo” — একই শব্দের বহু বানান।
  • আঞ্চলিক ভাষা: চট্টগ্রাম, সিলেট, নোয়াখালী বা অন্য অঞ্চলের কথ্য রূপ শব্দ, উচ্চারণ আর বাক্যগঠনে প্রমিত বাংলা থেকে অনেক আলাদা হতে পারে (কিছু রূপকে ভাষাবিদেরা আলাদা ভাষা হিসেবেও দেখেন)। প্রমিত বাংলায় শেখা speech model এখানে প্রায়ই দুর্বল — এটি আবার সেই distribution shift.
  • লেখার কারিগরি সমস্যা: একই “য়” Unicode-এ এক অক্ষরেও লেখা যায়, আবার “য” + নুকতা মিলিয়েও। চোখে একই, যন্ত্রের কাছে আলাদা। পুরোনো non-Unicode ফন্টে লেখা নথি সরাসরি পড়লে অর্থহীন অক্ষর আসে। এগুলো পর্ব ১০ আর পর্ব ২৩-এ হাতে-কলমে দেখবেন।
  • অনুবাদ-নির্ভর মূল্যায়ন: ইংরেজি benchmark যন্ত্রে অনুবাদ করে বাংলা model যাচাই করলে অনুবাদের ভুলও মাপের ভেতরে ঢুকে যায়।

কোনো AI টুল “বাংলা সমর্থন করে” বললেই ধরে নেবেন না যে আপনার ব্যবহারকারীদের বাংলায় সে ভালো কাজ করবে। নিজের ব্যবহারকারীদের মতো বাস্তব নমুনা — প্রমিত, Banglish, আঞ্চলিক, ভুল বানান — আলাদা আলাদা দলে ভাগ করে যাচাই করুন। বাংলা লেখার ডেটা নিয়ে পূর্ণ একটি classifier বানাবেন পর্ব ৬৭-এ।

৭ · Fairness, bias আর গোপনীয়তা

একটি model গড়ে ভালো হতে পারে, অথচ নির্দিষ্ট কোনো দলের জন্য অনেক খারাপ। এখানে bias মানে ব্যবস্থাগত ঝোঁক — কোনো দলের প্রতি নিয়মিতভাবে বেশি বা ভিন্ন রকম ভুল। আর fairness হলো সেই প্রশ্ন: ভুলগুলো দলগুলোর মধ্যে কীভাবে ভাগ হচ্ছে, আর সেটি কি গ্রহণযোগ্য?

২০১৮ সালে Joy Buolamwini ও Timnit Gebru-র গবেষণা “Gender Shades” (Conference on Fairness, Accountability and Transparency-তে প্রকাশিত) তিনটি বাণিজ্যিক মুখ-বিশ্লেষণ সিস্টেমের লিঙ্গ-নির্ণয় যাচাই করে। প্রবন্ধের সারাংশ অনুযায়ী, গাঢ় ত্বকের নারীদের ক্ষেত্রে ভুলের হার সর্বোচ্চ প্রায় ৩৪.৭% পর্যন্ত উঠেছিল, অথচ হালকা ত্বকের পুরুষদের ক্ষেত্রে সর্বোচ্চ ছিল ০.৮%. মূল শিক্ষা: সামগ্রিক accuracy একটি সংখ্যায় এই বৈষম্য লুকিয়ে থাকে; উপদল (subgroup) ধরে আলাদা মাপলে তবেই দেখা যায়।

ভুল দলভেদে কীভাবে আলাদা হয়, তা দেখার মূল যন্ত্র confusion matrix — চার ঘরের একটি টেবিল: সঠিক “না” (TN), ভুল সতর্কবার্তা (FP), ধরা না-পড়া (FN), সঠিক ধরা (TP). এ থেকে দুটি হার:

FPR = FP ÷ (FP + TN)   ·   FNR = FN ÷ (FN + TP)

এখানে FPR (false positive rate) মানে নির্দোষদের মধ্যে কত ভাগকে ভুল করে সন্দেহ করা হলো; FNR (false negative rate) মানে আসল ঘটনাগুলোর মধ্যে কত ভাগ ধরা পড়ল না। নিচের খেলনা-উদাহরণে বাজারঘরের একটি fraud-সতর্কতা model. দল ১ শহরের ক্রেতা, অনেক ডেটা; দল ২ গ্রামের ক্রেতা, মাত্র ১০০টি অর্ডার, আর তাঁরা স্বাভাবিকভাবেই একসঙ্গে বড় অর্ডার দেন (পাইকারি কেনা)।

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix

rng = np.random.default_rng(3)

def orders(n, shift):
    amount = rng.normal(5 + shift, 2, n)       # order size (thousand taka)
    night = rng.random(n)                      # share of orders at night
    risk = 0.6 * (amount - shift) + 3 * night + rng.normal(0, 1, n)
    fraud = (risk > 6).astype(int)
    return np.column_stack([amount, night]), fraud

# Group 1: city customers, lots of data. Group 2: rural, little data,
# and they normally place bigger (bulk) orders.
X1, y1 = orders(900, shift=0)
X2, y2 = orders(100, shift=3)
model = LogisticRegression().fit(np.vstack([X1, X2]), np.concatenate([y1, y2]))

for name, X, y in [("Group 1", X1, y1), ("Group 2", X2, y2)]:
    tn, fp, fn, tp = confusion_matrix(y, model.predict(X)).ravel()
    print(name, "TN=%d FP=%d FN=%d TP=%d" % (tn, fp, fn, tp))
    print("   false-alarm rate (FPR) = %.2f" % (fp / (fp + tn)))
    print("   missed-fraud rate (FNR) = %.2f" % (fn / (fn + tp)))

আসল আউটপুট:

Group 1 TN=687 FP=20 FN=112 TP=81
   false-alarm rate (FPR) = 0.03
   missed-fraud rate (FNR) = 0.58
Group 2 TN=49 FP=29 FN=2 TP=20
   false-alarm rate (FPR) = 0.37
   missed-fraud rate (FNR) = 0.09

হাতে মিলিয়ে নিন। দল ১-এ FPR = ২০ ÷ (২০ + ৬৮৭) = ২০ ÷ ৭০৭ ≈ ০.০৩; দল ২-এ FPR = ২৯ ÷ (২৯ + ৪৯) = ২৯ ÷ ৭৮ ≈ ০.৩৭। অর্থাৎ গ্রামের সৎ ক্রেতাদের প্রায় ৩৭%-এর অর্ডার ভুল করে সন্দেহজনক হচ্ছে, শহরে মাত্র ৩%. কারণ: model একটিই নিয়ম শিখেছে “বড় অর্ডার মানে ঝুঁকি”, আর গ্রামের দলের ডেটা এত কম যে তাদের “স্বাভাবিক বড় অর্ডার” সে আলাদা করে চিনতে পারেনি। উল্টো দিকে শহরে model অনেক fraud ধরতে পারছে না (FNR ০.৫৮)। মোট accuracy (৬৮৭ + ৮১ + ৪৯ + ২০) ÷ ১০০০ = ০.৮৩৭ — একটি “ভালো-দেখানো” সংখ্যা, যার ভেতরে দুই দলের দুই রকম ক্ষতি লুকানো।

আরও গভীরে: fairness-এর একাধিক গাণিতিক সংজ্ঞা আছে — দলগুলোর মধ্যে সমান FPR ও FNR (equalized odds), সমান positive হার (demographic parity), কিংবা একই স্কোরের অর্থ সব দলে এক (calibration). ২০১৬–১৭ সালে Kleinberg, Mullainathan ও Raghavan এবং আলাদাভাবে Chouldechova দেখান যে দলগুলোর আসল হার আলাদা হলে কিছু সংজ্ঞা একসঙ্গে পূরণ করা সাধারণভাবে সম্ভব নয়। তাই কোন সংজ্ঞা বেছে নেবেন, তা শুধু গণিতের নয় — মূল্যবোধ আর প্রেক্ষাপটের সিদ্ধান্ত।

গোপনীয়তা আর ডেটা সুরক্ষা — একটি ইঙ্গিত

AI-এর জ্বালানি ডেটা, আর সেই ডেটার বড় অংশ মানুষের: নাম, ফোন নম্বর, ঠিকানা, কেনাকাটার ইতিহাস, কণ্ঠ, ছবি। কয়েকটি মূলনীতি প্রায় সব আধুনিক ডেটা-সুরক্ষা চিন্তায় পাওয়া যায়: যতটুকু দরকার ততটুকুই সংগ্রহ (data minimisation), যে উদ্দেশ্যে নেওয়া সেই উদ্দেশ্যেই ব্যবহার, সম্মতি, নিরাপদে রাখা, আর দরকার ফুরোলে মুছে ফেলা। ইউরোপীয় ইউনিয়নের GDPR (২০১৮ থেকে কার্যকর) এ ধরনের আইনের একটি বহুল আলোচিত উদাহরণ। বাংলাদেশে ব্যক্তিগত ডেটা সুরক্ষা নিয়ে আইন ও নীতিমালা কয়েক বছর ধরে আলোচনা আর পরিবর্তনের মধ্যে আছে; কোনো প্রকল্প শুরুর আগে সরকারি সর্বশেষ সূত্র আর প্রয়োজনে আইনজ্ঞের পরামর্শ নিন — এই পর্ব কোনো আইনি পরামর্শ নয়। একটি ব্যবহারিক নিয়ম মনে রাখুন: ব্যক্তিগত ডেটা কখনো অনলাইন AI chatbot-এ পেস্ট করবেন না।

৮ · দায় কার — ডেটা, model, deployment আর মানুষ

AI ভুল করলে প্রথম প্রতিক্রিয়া প্রায়ই “অ্যালগরিদমের দোষ”। কিন্তু অ্যালগরিদম কোনো আইনি বা নৈতিক ব্যক্তি নয়; সিদ্ধান্তগুলো নিয়েছেন মানুষ — কোন ডেটা নেওয়া হবে, কোন মাপকাঠিতে model বাছাই হবে, কোথায় চালু হবে, কে নজর রাখবেন। নিচের ছবিতে একটি AI সিস্টেমের জীবনের চারটি ধাপ, প্রতিটিতে কোন ভুল ঢোকে, আর কার প্রশ্ন করা উচিত।

AI সিস্টেমের চার ধাপ আর দায়

Where failures enter, and who owns each stage

AI সিস্টেমের চার ধাপ আর দায় ১ · ডেটা (Data) ভুল: একপেশে নমুনা, ভুল label দায়: ডেটা টিম ২ · Model ভুল: shortcut, শুধু গড় মাপ দায়: ML engineer, reviewer ৩ · Deployment ভুল: নতুন জেলা বা ঋতু দায়: product টিম, ব্যবস্থাপক ৪ · মানুষের তদারকি ভুল: automation bias দায়: যাচাইকারী, প্রতিষ্ঠান ফিডব্যাক → নতুন ডেটা
ছবি ৬.১ — প্রতিটি ধাপে আলাদা ভুল ঢোকে, তাই প্রতিটি ধাপে একজন দায়িত্বপ্রাপ্ত মানুষ থাকা চাই। ড্যাশ দেওয়া তীর feedback loop — মানুষের সংশোধন আর বাস্তব ফল আবার ডেটায় ফেরে।

বাস্তব দুর্ঘটনায় প্রায়ই দেখা যায়, দোষ একজনের নয় — অনেক হাতে ছোট ছোট ফাঁক মিলে বড় ক্ষতি। নৈতিকতার আলোচনায় একে “problem of many hands” বলা হয়: সবাই একটু একটু দায়ী, তাই শেষে কেউই দায় নেন না। এর প্রতিকার হলো আগে থেকেই লিখে রাখা — কোন ধাপের মালিক কে, কোন সংখ্যা খারাপ হলে কে থামাবেন। Model-এর উদ্দেশ্য, ডেটা, সীমা আর দলভিত্তিক মাপ এক জায়গায় লিখে রাখার একটি প্রচলিত রূপ model card (Mitchell ও সহকর্মী, ২০১৯); ডেটার জন্য একই ধরনের নথি “datasheets for datasets” (Gebru ও সহকর্মী)। এগুলো হাতে-কলমে বানাবেন পর্ব ৭১ আর পর্ব ৭২-এ।

কোনো AI feature চালুর আগে — ব্যবহারিক চেকলিস্ট

পরীক্ষা ও ইন্টারভিউতে (বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় যে ধরনের প্রশ্ন সাধারণত আসে):

  • Distribution shift কী? — Training আর ব্যবহারের ডেটার বণ্টন আলাদা হওয়া; ফলে test-এ ভালো model বাস্তবে খারাপ করে।
  • Covariate shift আর concept drift-এর পার্থক্য? — প্রথমটিতে input-এর বণ্টন বদলায়, নিয়ম একই; দ্বিতীয়টিতে input থেকে উত্তরের সম্পর্কই বদলায়।
  • Training accuracy বেশি, নতুন ডেটায় কম — কী কী কারণ হতে পারে? — Overfitting, distribution shift, data leakage, বা spurious feature-এ নির্ভরতা।
  • FP = ২০, TN = ৮০ হলে FPR কত? — ২০ ÷ (২০ + ৮০) = ০.২০।
  • Human-in-the-loop কখন কাজ করে না? — যাচাইয়ের সময়, তথ্য বা ক্ষমতা না থাকলে; তখন মানুষ শুধু রাবার স্ট্যাম্প (automation bias).

৯ · সৎ সীমা — এই পর্ব কী বলে না

যে পর্ব AI-এর সীমা নিয়ে, তার নিজের সীমাও স্পষ্ট বলা দরকার।

  • খেলনা ডেটা: এই পর্বের প্রতিটি কোড ছোট, কাল্পনিক, seed দেওয়া ডেটায় চলে। সংখ্যাগুলো (৮৭% থেকে ৬২%, ৩৭% বনাম ৩%) শুধু এই খেলনা-উদাহরণের, কোনো বাস্তব সিস্টেম বা সাধারণ নিয়মের মাপ নয়। ভিন্ন seed বা ভিন্ন ডেটায় সংখ্যা বদলাবে, যদিও প্রবণতা একই থাকার কথা।
  • সরল model: সবখানে logistic regression ব্যবহার করা হয়েছে যাতে ওজন পড়া যায়। Deep learning model-এ shortcut আরও লুকানো থাকে, খোঁজাও কঠিন।
  • সমাধান সহজ নয়: “আরও ডেটা আনুন”, “মানুষ রাখুন” — বাস্তবে এগুলোর খরচ, সময় আর নিজস্ব ঝুঁকি আছে। কোনো একটি কৌশল সব সমস্যা সারায় না।
  • বিতর্ক আছে: recommender কতটা মানুষের রুচি সংকুচিত করে (“filter bubble”) — এ নিয়ে গবেষণার ফল মিশ্র। fairness-এর কোন সংজ্ঞা ঠিক, তাতেও সবাই একমত নন।
  • আইন ও নৈতিকতা: এখানে শুধু ইঙ্গিত দেওয়া হয়েছে। AI নৈতিকতা নিয়ে এই সাইটে পরে একটি আলাদা AI Ethics কোর্স আসবে; আর এই কোর্সে দায়িত্বশীল AI-এর হাতে-কলমে অভ্যাস (bias যাচাই, গোপনীয়তা, নথিপত্র) আসবে পর্ব ৭২-এ।
ভালো test স্কোর একটি প্রতিশ্রুতি — শুধু সেই জগতের জন্য, যেখান থেকে test ডেটা এসেছে।

১০ · AI-এর যুগে — AI সহকারী দিয়ে ডেটা ও AI-এর কাজ

মজার ব্যাপার হলো, AI-এর ভুল নিয়ে কাজ করতে গিয়েও আপনি সম্ভবত AI সহকারীর সাহায্য নেবেন — কোড লেখাতে, ব্যাখ্যা চাইতে। সেখানেও এই পর্বের শিক্ষাগুলো খাটে। AI সহকারী প্রায়ই যে ভুলগুলো করে:

AI সহকারীর ভুলকীভাবে ধরবেন
পুরোনো API — pandas-এর DataFrame.append বা np.floatনিজের version-এর অফিসিয়াল docs দেখা, চালিয়ে দেখা
অস্তিত্বহীন function বা parameter বানানোdocs-এ নাম খোঁজা; error এলে চেপে না রাখা
Split-এর আগে পুরো ডেটায় scaling — test ডেটা training-এ ঢুকে যায়সবার আগে split; পর্ব ৫৬ দেখুন
Training set-এ accuracy দেখিয়ে “model দারুণ” বলাআলাদা test আর নতুন উৎসের ডেটায় মাপা
Warning লুকিয়ে ফেলা (warnings.filterwarnings("ignore"))warning পড়ে কারণ বোঝা
বিশ্বাসযোগ্য কিন্তু ভুল পরিসংখ্যান বা বানানো উদ্ধৃতিহাতে একটি সংখ্যা মেলানো, মূল সূত্র খোঁজা
দলভিত্তিক মাপ বাদ দিয়ে শুধু গড় দেখানোনিজে থেকে subgroup ধরে confusion matrix চাওয়া

AI সহকারীকে এমনভাবে প্রশ্ন করুন, যাতে সে নিজেই ঝুঁকিগুলো সামনে আনে। নিচের prompt-এ লক্ষ করুন — ডেটার নমুনা নয়, শুধু কাঠামো দেওয়া হয়েছে, কোনো ব্যক্তিগত তথ্য নেই:

আমি একটি অনলাইন দোকানের জন্য scikit-learn 1.8 দিয়ে একটি classifier বানাচ্ছি, যা আগে থেকে বলবে কোন ডেলিভারি দেরি হবে। Feature: দূরত্ব (km), বৃষ্টি (mm), জেলা। এখন শুধু একটি জেলার ডেটা আছে, পরে আরও জেলায় চালু হবে। ১. কোন কোন distribution shift-এর ঝুঁকি আছে, তালিকা দাও। ২. চালুর আগে আর পরে কী কী মাপব (দলভিত্তিক FPR/FNR সহ), তার একটি পরিকল্পনা দাও। ৩. কোড দিলে শুধু বর্তমান scikit-learn-এর API ব্যবহার করো, আর প্রতিটি function অফিসিয়াল docs-এর কোন পাতায় আছে বলো। ৪. যেখানে তুমি নিশ্চিত নও, সেখানে স্পষ্ট করে "নিশ্চিত নই" লেখো।

AI সহকারীর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট

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

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

প্র ০১Husky বনাম নেকড়ের উদাহরণটি তো একটি ইচ্ছাকৃত পরীক্ষা ছিল — তাহলে এটি থেকে বাস্তবের জন্য কী শেখার আছে?

২০১৬ সালে Ribeiro, Singh ও Guestrin তাঁদের “Why Should I Trust You?” প্রবন্ধে LIME নামের ব্যাখ্যা-পদ্ধতি দেখাতে গিয়ে ইচ্ছে করেই একটি দুর্বল classifier বানান: training ছবিতে নেকড়ের পেছনে বরফ, husky-র পেছনে নয়। উদ্দেশ্য ছিল দেখানো — model ভুল কারণে ঠিক উত্তর দিলে শুধু accuracy দেখে তা ধরা যায় না, কিন্তু “কোন অংশ দেখে সিদ্ধান্ত নিচ্ছ” প্রশ্ন করলে ধরা যায়। প্রবন্ধে তাঁরা মানুষের ওপর একটি ছোট পরীক্ষাও করেন: ব্যাখ্যা দেখার পর অংশগ্রহণকারীরা এই model-কে কম বিশ্বাস করতে শুরু করেন।

তাহলে বাস্তবের জন্য শিক্ষা কী? প্রথমত, পরীক্ষাটি পরিকল্পিত হলেও সমস্যার কাঠামো বাস্তব। ২০১৮ সালে Zech ও সহকর্মীদের একটি গবেষণা (PLOS Medicine) বুকের X-ray থেকে নিউমোনিয়া শনাক্তের model পরীক্ষা করে দেখায় যে model হাসপাতাল-ভেদে ছবির বৈশিষ্ট্য চিনতে পারছিল, আর এক হাসপাতালের ডেটায় শেখা model অন্য হাসপাতালে প্রায়ই খারাপ করছিল — অর্থাৎ রোগের লক্ষণের বাইরের সংকেতও কাজে লাগছিল। ২০২০ সালে Geirhos ও সহকর্মীরা এমন বহু ঘটনাকে “shortcut learning” নামে একত্র করেন।

দ্বিতীয়ত, shortcut সাধারণত দেখা যায় না, কারণ test ডেটাও প্রায়ই training-এর একই উৎস থেকে আসে — দুটোতেই বরফ আছে। তাই প্রকৃত যাচাই মানে ভিন্ন উৎসের ডেটায় যাচাই: অন্য বিক্রেতা, অন্য হাসপাতাল, অন্য জেলা। তৃতীয়ত, ব্যাখ্যা-পদ্ধতি (LIME, SHAP ইত্যাদি) সহায়ক কিন্তু নিখুঁত নয়; এগুলোর নিজস্ব সীমা নিয়েও গবেষণা আছে। শেষ কথাটি ডোমেইন বিশেষজ্ঞের — মাছওয়ালা বা ডাক্তার এক নজরে বলে দিতে পারেন “বরফ তো তাজার প্রমাণ নয়”।

মূল উপলব্ধি: ঠিক উত্তর আর ঠিক কারণ এক জিনিস নয়। Model-কে জিজ্ঞেস করুন “কেন”, আর তার উত্তর এমন ডেটায় পরীক্ষা করুন যেখানে সহজ শর্টকাট আর কাজ করে না।

প্র ০২Gender Shades গবেষণা গড় accuracy-র বদলে উপদল ধরে মাপল — এতে কী বদলাল, আর এটি থেকে বাংলাদেশের AI নির্মাতারা কী শিখতে পারেন?

২০১৮ সালে Joy Buolamwini ও Timnit Gebru তিনটি বাণিজ্যিক মুখ-বিশ্লেষণ সিস্টেমের লিঙ্গ-নির্ণয় যাচাই করেন। তাঁদের মূল কৌশল ছিল সহজ কিন্তু শক্তিশালী: ছবিগুলো ত্বকের রং আর লিঙ্গ — দুটো মিলিয়ে চারটি উপদলে ভাগ করে আলাদা আলাদা ভুলের হার মাপা (একে intersectional মূল্যায়ন বলা হয়)। প্রবন্ধের সারাংশ অনুযায়ী, গাঢ় ত্বকের নারীদের ক্ষেত্রে ভুলের হার সর্বোচ্চ প্রায় ৩৪.৭% পর্যন্ত পৌঁছায়, অথচ হালকা ত্বকের পুরুষদের ক্ষেত্রে সর্বোচ্চ ০.৮%. শুধু “লিঙ্গ” বা শুধু “ত্বকের রং” ধরে ভাগ করলে বৈষম্য এতটা তীব্র দেখাত না — দুইয়ের মিলনে সবচেয়ে বড় ফাঁক।

তাঁরা এটাও দেখান যে বহুল ব্যবহৃত কিছু মুখের ছবির ডেটাসেটে হালকা ত্বকের মানুষ অনেক বেশি ছিলেন। অর্থাৎ সমস্যার একটি বড় উৎস ডেটা। গবেষণাটি প্রকাশের পর জনপরিসরে ব্যাপক আলোচনা হয়, এবং পরে Raji ও Buolamwini-র একটি অনুবর্তী গবেষণায় (২০১৯) দেখা যায়, পরীক্ষিত কিছু কোম্পানি তাদের সিস্টেম হালনাগাদ করার পর ব্যবধান কমেছে — যদিও সব সমস্যা দূর হয়নি। প্রকাশ্য, নির্দিষ্ট মাপ চাপ তৈরি করতে পারে, এটাই এর বড় শিক্ষা।

বাংলাদেশের প্রেক্ষাপটে উপদলগুলো আলাদা হবে: প্রমিত বাংলা বনাম আঞ্চলিক কথ্য, বাংলা হরফ বনাম Banglish, শহর বনাম গ্রাম, পুরোনো বনাম নতুন স্মার্টফোনের ক্যামেরা, তরুণ বনাম বয়স্ক কণ্ঠ। একটি বাংলা speech-to-text টুল ঢাকার শিক্ষার্থীদের কণ্ঠে চমৎকার হতে পারে, অথচ গ্রামের বয়স্ক কৃষকের কণ্ঠে প্রায় অচল। গড় accuracy-তে এই ফাঁক চোখে পড়বে না। তাই যে কেউ AI পণ্য বানান, তাঁর প্রথম কাজ হওয়া উচিত নিজের ব্যবহারকারীদের সম্ভাব্য উপদল তালিকা করা আর প্রতিটির জন্য যথেষ্ট পরীক্ষার নমুনা জোগাড় করা।

মূল উপলব্ধি: একটি গড় সংখ্যা অনেক মানুষের অভিজ্ঞতা ঢেকে দেয়। “কাদের জন্য কাজ করে, কাদের জন্য করে না” — এই প্রশ্ন মাপা না হলে উত্তরও কেউ জানে না।

প্র ০৩“চূড়ান্ত সিদ্ধান্ত মানুষ নেবেন” — এটুকু বললেই কি AI-এর ঝুঁকি মিটে যায়?

না, আর এর পক্ষে দীর্ঘ গবেষণার ইতিহাস আছে। বিমানের autopilot আর ককপিট স্বয়ংক্রিয়করণ নিয়ে human factors গবেষকেরা কয়েক দশক ধরে দেখেছেন, যন্ত্র যখন বেশিরভাগ সময় ঠিক থাকে, মানুষ তখন নজরদারি কমিয়ে দেন। ১৯৯০-এর দশকে Mosier, Skitka ও সহকর্মীদের মতো গবেষকেরা “automation bias” নিয়ে পরীক্ষা করেন; ২০১০ সালে Parasuraman ও Manzey-র পর্যালোচনা এই প্রবণতা আর complacency-কে একসঙ্গে ব্যাখ্যা করে। দুই রকম ভুল দেখা যায়: যন্ত্র সতর্ক না করলে মানুষ নিজে সমস্যা খোঁজেন না (বাদ পড়ার ভুল), আর যন্ত্র ভুল পরামর্শ দিলে মানুষ তা মেনে নেন (কাজ করে ফেলার ভুল)।

একটি বহুল আলোচিত ঘটনা: ২০১৮ সালে যুক্তরাষ্ট্রের অ্যারিজোনায় একটি পরীক্ষামূলক স্বয়ংচালিত গাড়ির ধাক্কায় একজন পথচারী মারা যান। পরে যুক্তরাষ্ট্রের পরিবহন নিরাপত্তা বোর্ড (NTSB)-এর তদন্তে একাধিক কারণ উঠে আসে — সফটওয়্যারের পথচারী-শনাক্তকরণের সীমা, গাড়িতে থাকা নিরাপত্তা-চালকের মনোযোগের অভাব, আর পরীক্ষা পরিচালনাকারী প্রতিষ্ঠানের নিরাপত্তা-ব্যবস্থার দুর্বলতা। অর্থাৎ “মানুষ আছেন” — শুধু এটুকু নিরাপত্তা দেয়নি; সিস্টেমটি এমনভাবে নকশা করা ছিল না যাতে মানুষ দীর্ঘ সময় সতর্ক থাকতে পারেন।

তাহলে কার্যকর তদারকির শর্ত কী? যাচাইকারীর হাতে সময় ও যুক্তিসংগত কাজের চাপ; model-এর অনিশ্চয়তা আর কারণ দেখার সুযোগ; model-এর বিরুদ্ধে যাওয়ার ক্ষমতা ও সুরক্ষা; নিয়মিত প্রশিক্ষণ, যেখানে ইচ্ছে করে কিছু ভুল উদাহরণ মিশিয়ে দেখা হয় মানুষ ধরতে পারছেন কি না; আর মানুষের সংশোধন রেকর্ড করা। কিছু ক্ষেত্রে উল্টো নকশাও ভালো — আগে মানুষ নিজে সিদ্ধান্ত নেবেন, তারপর model-এর মত দেখবেন, যাতে model-এর উত্তর শুরুতেই মনকে প্রভাবিত না করে।

মূল উপলব্ধি: Human-in-the-loop একটি নকশার সমস্যা, কোনো নাম-ফলক নয়। মানুষকে সত্যিই যাচাই করার মতো সময়, তথ্য আর ক্ষমতা না দিলে তিনি শুধু দায় চাপানোর একটি জায়গা হয়ে যান।

প্র ০৪Feedback loop-এ ডেটা “সত্যি” হলেও ভুল শিক্ষা দেয় কীভাবে? Recommender-এর বাইরে এর বিপদ কোথায়?

Feedback loop-এর মূল ফাঁদ হলো: আমরা যে ডেটা দেখি, তা পৃথিবীর নিরপেক্ষ ছবি নয় — সেটি আমাদের আগের সিদ্ধান্তের ছাপ। Simulation-এ Phone-এর click মাত্র ৪, এটি “সত্যি” সংখ্যা; কিন্তু এর অর্থ “Phone কেউ পছন্দ করে না” নয়, বরং “Phone কাউকে দেখানোই হয়নি”। পরিসংখ্যানে একে selection bias-এর একটি রূপ বলা যায়: কোন ঘটনা রেকর্ড হবে, তা আগের নীতি ঠিক করে দিয়েছে।

Recommender-এর বাইরে এটি আরও গুরুতর হতে পারে। ২০১৮ সালে Ensign ও সহকর্মীরা “Runaway Feedback Loops in Predictive Policing” প্রবন্ধে একটি সরল গাণিতিক মডেলে দেখান — যেখানে পুলিশ পাঠানো হয় আগের রেকর্ড দেখে, আর রেকর্ড তৈরি হয় যেখানে পুলিশ যায়, সেখানে কিছু এলাকা ক্রমেই বেশি “অপরাধপ্রবণ” দেখাতে পারে, আসল হার একই থাকলেও। একই কাঠামো খাটে কর-পরিদর্শন, খাদ্য-পরিদর্শন, লেনদেন যাচাই বা ঋণ অনুমোদনে: যাদের ঋণ দেওয়া হয় না, তারা ঋণ শোধ করতে পারতেন কি না, সেই ডেটা কখনো তৈরিই হয় না।

প্রতিকারের কয়েকটি পরিচিত কৌশল আছে। এক, exploration — কিছু অংশ সিদ্ধান্ত ইচ্ছে করে এলোমেলো বা কম-দেখা বিকল্পে দেওয়া (multi-armed bandit সমস্যার মূল টানাপোড়েন হলো explore বনাম exploit). দুই, ডেটায় শুধু ফল নয়, “কী দেখানো হয়েছিল” তাও লেখা, যাতে পরে সংশোধন করা যায়। তিন, নিয়মিতভাবে নিরপেক্ষ নমুনা — এলোমেলোভাবে বাছাই করা কিছু ঘটনা পুরোপুরি যাচাই করা। চার, বৈচিত্র্যকে নিজেই একটি মাপকাঠি বানানো। Recommender কতটা মানুষের রুচি সংকুচিত করে (“filter bubble”), তা নিয়ে গবেষণার ফল মিশ্র; তবে যে ব্যবস্থায় সিদ্ধান্ত ডেটা তৈরি করে, সেখানে চক্রটি যে ঝুঁকি, তা নিয়ে সংশয় কম।

মূল উপলব্ধি: ডেটা জিজ্ঞেস করার আগে জিজ্ঞেস করুন — এই ডেটা কে, কোন নিয়মে তৈরি করেছে? আপনার সিস্টেম নিজেই যদি সেই নিয়ম হয়, তাহলে আপনি নিজের প্রতিধ্বনি শুনছেন।

প্র ০৫বাংলা ভাষার জন্য AI বানাতে গেলে “ইংরেজির model অনুবাদ করে চালাই” — এই পথের সমস্যা কোথায়?

অনুবাদের পথ প্রলোভনজনক: ইংরেজিতে অনেক ডেটা আর ভালো model আছে, তাই বাংলা লেখাকে যন্ত্রে ইংরেজি করে নিলেই তো হলো! কিন্তু এতে কয়েকটি স্তরে ক্ষতি হয়। প্রথম স্তর অনুবাদের নিজের ভুল — Banglish (“product ta valo na”), আঞ্চলিক শব্দ, বাগধারা (“চোখে সর্ষে ফুল দেখা”) যন্ত্র-অনুবাদে প্রায়ই অর্থ হারায়। একটি নেতিবাচক রিভিউ অনুবাদে নিরপেক্ষ হয়ে গেলে sentiment model ঠিক কাজ করলেও উত্তর ভুল হবে।

দ্বিতীয় স্তর সাংস্কৃতিক প্রেক্ষাপট। “দাম একটু বেশি, তবে মাল ভালো” — বাংলাদেশি ক্রেতার কাছে এটি প্রায়ই প্রশংসা; আক্ষরিক অনুবাদে মিশ্র মনে হতে পারে। নাম, স্থান, উৎসব, মুদ্রা, তারিখের ধরন — সবখানেই ইংরেজি-কেন্দ্রিক ডেটায় শেখা model-এর বাড়তি ভুল হতে পারে। তৃতীয় স্তর মূল্যায়ন: অনেক বাংলা benchmark নিজেই ইংরেজি থেকে অনুবাদ করা হয়েছে, ফলে স্বাভাবিক বাংলা লেখার চেহারা সেখানে নেই; সেখানে ভালো ফল মানেই বাস্তব রিভিউতে ভালো ফল নয় — আবার distribution shift.

তাহলে কী করবেন? শুরুতেই নিজের ব্যবহারকারীদের বাস্তব নমুনা নিয়ে একটি ছোট কিন্তু যত্নে label দেওয়া বাংলা test set বানানো, যেখানে প্রমিত, Banglish ও আঞ্চলিক রূপ আলাদা চিহ্নিত। তারপর তুলনা: অনুবাদ-পথ, বহুভাষিক (multilingual) pretrained model, আর সরাসরি বাংলা ডেটায় শেখা ছোট model — কোনটি আপনার test set-এ, কোন উপদলে ভালো। লেখার কারিগরি দিকও ভুলবেন না: Unicode normalization, একই অক্ষরের একাধিক রূপ, পুরোনো non-Unicode নথি। বাংলা ভাষার প্রযুক্তি নিয়ে বাংলাদেশ ও ভারতের বিশ্ববিদ্যালয় আর ওপেন-সোর্স সম্প্রদায়ে কাজ বাড়ছে; তবে নির্দিষ্ট কোনো ডেটাসেট বা model বেছে নেওয়ার আগে তার লাইসেন্স, উৎস আর model card নিজে পড়ে নিন (পর্ব ৭১)।

মূল উপলব্ধি: ভাষা শুধু শব্দের তালিকা নয়, মানুষের অভ্যাস আর প্রেক্ষাপট। নিজের ব্যবহারকারীদের ভাষায় তৈরি test set ছাড়া কোনো বাংলা AI সত্যিই যাচাই করা হয় না।

অনুশীলন

হিসাব, কোড, আগাম অনুমান আর নকশা-সমালোচনা — চার রকম কাজ।

  1. হিসাব করুন: একটি fraud model-এর দুই দলের confusion matrix — দল ক: TN = ৪৫০, FP = ৫০, FN = ২০, TP = ৮০; দল খ: TN = ৯০, FP = ৩০, FN = ১০, TP = ২০। প্রতিটি দলের accuracy, FPR আর FNR বের করুন। কোন দলের সৎ গ্রাহকেরা বেশি হয়রানির শিকার?

    দল ক: মোট = ৪৫০ + ৫০ + ২০ + ৮০ = ৬০০। Accuracy = (৪৫০ + ৮০) ÷ ৬০০ = ৫৩০ ÷ ৬০০ ≈ ০.৮৮৩। FPR = ৫০ ÷ (৫০ + ৪৫০) = ৫০ ÷ ৫০০ = ০.১০। FNR = ২০ ÷ (২০ + ৮০) = ২০ ÷ ১০০ = ০.২০।

    দল খ: মোট = ৯০ + ৩০ + ১০ + ২০ = ১৫০। Accuracy = (৯০ + ২০) ÷ ১৫০ = ১১০ ÷ ১৫০ ≈ ০.৭৩৩। FPR = ৩০ ÷ (৩০ + ৯০) = ৩০ ÷ ১২০ = ০.২৫। FNR = ১০ ÷ (১০ + ২০) = ১০ ÷ ৩০ ≈ ০.৩৩।

    দল খ-এর সৎ গ্রাহকদের ২৫%-কে ভুল করে সন্দেহ করা হচ্ছে, দল ক-এ ১০% — আড়াই গুণ। একই সঙ্গে দল খ-এ fraud-ও বেশি বাদ পড়ছে। দুই দল মিলিয়ে মোট accuracy (৫৩০ + ১১০) ÷ ৭৫০ ≈ ০.৮৫৩ — এই একটি সংখ্যায় ফাঁকটি দেখা যায় না।

  2. আগাম বলুন (predict the output): নিচের কোডটি চালানোর আগে লিখে ফেলুন কী ছাপা হবে। y_true = [0,0,0,0,1,1], y_pred = [0,1,0,1,1,0]; তারপর tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel() আর print(tn, fp, fn, tp, fp/(fp+tn)). শেষে উপরের যেকোনো কোড-বাক্সে পেস্ট করে মিলিয়ে নিন (প্রথমে from sklearn.metrics import confusion_matrix লিখতে হবে)।

    জোড়া ধরে মিলাই: (0,0) TN, (0,1) FP, (0,0) TN, (0,1) FP, (1,1) TP, (1,0) FN. তাই TN = ২, FP = ২, FN = ১, TP = ১। FPR = ২ ÷ (২ + ২) = ০.৫। ছাপা হবে:

    2 2 1 1 0.5

    খেয়াল করুন, scikit-learn-এ দুই শ্রেণির confusion matrix-এ সারি হলো আসল উত্তর, কলাম অনুমান, আর ক্রম 0 তারপর 1 — তাই ravel() দেয় TN, FP, FN, TP ক্রমে। ক্রম ভুল মনে রাখলে FPR আর FNR উল্টে যায়, যা পরীক্ষায় একটি প্রচলিত ভুল।

  3. কোড বদলে দেখুন: Shortcut-এর কোডে training-এর ice_match=0.95 বদলে 0.6 করে চালান। বরফের ওজন, training accuracy আর test accuracy কোন দিকে যাবে বলে মনে করেন? চালিয়ে মিলিয়ে নিন, আর কারণ ব্যাখ্যা করুন।

    Training-এ বরফ যখন মাত্র ৬০% ক্ষেত্রে উত্তরের সঙ্গে মেলে, তখন সেটি আর “প্রায় নিখুঁত” শর্টকাট নয়। তাই model বরফকে অনেক কম ওজন দেবে আর কানকোর ওপর বেশি নির্ভর করবে। Training accuracy কমবে (কারণ সহজ সংকেতটি দুর্বল হয়েছে), কিন্তু test accuracy বাড়বে এবং gill-only model-এর কাছাকাছি চলে আসবে, কারণ model এখন আসল লক্ষণ শিখছে। নির্দিষ্ট সংখ্যা নিজে চালিয়ে দেখুন — আর লক্ষ করুন, এখানে training accuracy কমা আসলে ভালো খবর। শিক্ষা: training-এর উঁচু স্কোর নিজে কোনো প্রমাণ নয়; কোন সংকেত থেকে স্কোর আসছে, সেটাই আসল।

  4. নকশা-সমালোচনা: একটি কাল্পনিক উপজেলা অফিস প্রস্তাব দিল: “আবেদনপত্র স্ক্যান করে OCR দিয়ে পড়ব, তারপর একটি model ঠিক করবে কোন আবেদন আগে দেখা হবে। কর্মীরা শুধু model-এর তালিকার ওপরের ২০টি দেখবেন।” এই নকশায় এই পর্বের কোন কোন ঝুঁকি দেখছেন, আর কী কী পরিবর্তনের পরামর্শ দেবেন?
    • বাংলা OCR-এর ভুল: হাতে লেখা, যুক্তাক্ষর, পুরোনো ফন্ট বা খারাপ স্ক্যানে OCR ভুল পড়তে পারে; সেই ভুল সরাসরি অগ্রাধিকারে ঢুকবে। প্রতিকার: OCR-এর আত্মবিশ্বাস কম হলে মানুষের হাতে পাঠানো।
    • Feedback loop: শুধু ওপরের ২০টি দেখা হলে বাকিগুলোর ফল কখনো জানা যাবে না, আর পরের model আগের পছন্দই আরও জোরে শিখবে। প্রতিকার: প্রতিদিন কিছু এলোমেলো আবেদনও দেখা।
    • Fairness: হাতে লেখা বা আঞ্চলিক বানানের আবেদন (প্রায়ই গ্রামের বা বয়স্ক আবেদনকারীর) পিছিয়ে পড়তে পারে। প্রতিকার: উপদল ধরে মাপা।
    • Automation bias ও আপিল: কর্মীরা তালিকাকেই সত্য ধরে নিতে পারেন। প্রতিকার: আবেদনকারীর জন্য সময়সীমা ও আপিলের পথ, কর্মীর জন্য তালিকা ভাঙার ক্ষমতা।
    • গোপনীয়তা ও দায়: ব্যক্তিগত তথ্য কোথায় রাখা হবে, কে দেখবে, কতদিন — লিখিত নীতি আর প্রতিটি ধাপের দায়িত্বপ্রাপ্ত মানুষ।

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

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

ক্রমএকটি AI feature দায়িত্বশীলভাবে চালুর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. 🎯 সমস্যা আর ভুলের দাম লিখে ফেলা, একটি সহজ baseline ঠিক করা
  2. 📦 ডেটার উৎস যাচাই আর train/test ভাগ
  3. 📐 Model শেখানো, আর উপদল ধরে FPR ও FNR মাপা
  4. 🚚 সীমিত পরিসরে চালু, মানুষের যাচাইসহ
  5. 🔭 চালুর পর monitoring, ফিডব্যাক জমানো আর দরকারে আবার শেখানো

একটি ডেলিভারি-দেরির model এক জেলায় ৮৭% accuracy দিল, কিন্তু অন্য জেলায় চালু করার পর ৬২%. কোডে কোনো বাগ নেই। সবচেয়ে সম্ভাব্য কারণ কী?

  • Model training data মুখস্থ করেছে (overfitting)
  • নতুন জেলার ডেটার বণ্টন বা সম্পর্ক আলাদা — distribution shift
  • Random seed ভুল দেওয়া হয়েছে
  • Accuracy হিসাবের সূত্র নতুন জেলায় খাটে না

মাছের ছবি দেখে “তাজা/বাসি” বলা একটি model-এর training accuracy ৯৬%, কিন্তু নতুন বিক্রেতাদের ছবিতে ৫৫%. Model-এর ওজনে দেখা গেল “ছবিতে বরফ আছে” feature-এর ওজন সবচেয়ে বেশি। এটি কোন সমস্যার উদাহরণ?

  • Hallucination
  • Adversarial example
  • Shortcut learning — ভুয়া সম্পর্কে নির্ভরতা
  • Feedback loop

একটি fraud model-এর একটি দলে TN = ৪৯, FP = ২৯, FN = ২, TP = ২০। ওই দলের false positive rate (FPR) প্রায় কত?

  • ০.৩৭
  • ০.০৯
  • ০.২৯
  • ০.৬৯

একটি recommender শুধু আগে বেশি click পাওয়া পণ্য দেখায়। কয়েক সপ্তাহ পরে ডেটায় দেখা গেল একটি category প্রায় কোনো click পায়নি। সবচেয়ে সতর্ক ব্যাখ্যা কোনটি?

  • ক্রেতারা ওই category পছন্দ করেন না, তাই বাদ দেওয়া উচিত
  • ওই category-র পণ্যের মান খারাপ
  • Click গোনার কোডে বাগ আছে
  • ওই category খুব কম দেখানো হয়েছে, তাই click-এর ডেটা তৈরিই হয়নি — feedback loop

একজন কর্মীকে ঘণ্টায় কয়েকশো AI-সতর্কবার্তা “অনুমোদন” করতে হয়, আর model-এর বিরুদ্ধে গেলে তাঁকে লিখিত কারণ দিতে হয়। এই নকশার মূল ঝুঁকি কী?

  • Model বেশি সতর্কবার্তা দিচ্ছে, তাই সে আরও নির্ভুল হবে
  • কর্মী কার্যত যাচাই না করেই মেনে নেবেন — automation bias
  • Distribution shift
  • Hallucination

একটি বাংলা রিভিউ-classifier প্রমিত বাংলায় লেখা test set-এ ৯০% accuracy দিল। ব্যবহারকারীদের অনেকে Banglish আর আঞ্চলিক শব্দে লেখেন। চালুর আগে সবচেয়ে জরুরি কাজ কোনটি?

  • ৯০% যথেষ্ট, সরাসরি চালু করা
  • সব রিভিউ ইংরেজিতে অনুবাদ করে নেওয়া
  • Banglish ও আঞ্চলিক লেখার বাস্তব নমুনা নিয়ে উপদল ধরে আলাদা করে মাপা
  • যাচাই ছাড়াই আরও বড় model ব্যবহার করা

শব্দকোষ

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

মনে রাখুন

  1. AI সবচেয়ে নির্ভরযোগ্য সরু কাজে, প্রচুর ডেটা আর দ্রুত ফিডব্যাক থাকলে।
  2. Model শুধু তার training data-র জগতের প্রতিশ্রুতি দেয়; জগৎ বদলালে — distribution shift — ফল ভেঙে পড়ে, আর model নিজে তা টের পায় না।
  3. উঁচু training accuracy shortcut-ও হতে পারে; ভিন্ন উৎসের ডেটায় যাচাই আর “কেন” প্রশ্ন জরুরি।
  4. Hallucination, adversarial example, feedback loop আর মানুষের automation bias — সিস্টেমের ভুল শুধু model-এ নয়।
  5. গড় নয়, উপদল ধরে FPR ও FNR; আর ডেটা, model, deployment, তদারকি — প্রতিটি ধাপে একজন দায়িত্বপ্রাপ্ত মানুষ।

পরের পর্বে: AI-এর মানচিত্র শেষ। এবার নিজের কম্পিউটারে কাজের জায়গা তৈরি — Python install, uv, virtual environment আর package, যাতে এই পর্বের কোডগুলো নিজের মেশিনেও চালাতে পারেন।

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

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