পাঠ ৩৪ · ৫৭-এর মধ্যে · মডিউল ৮
Home / Courses / Ethics in Computing & AI Safety / জেনারেলাইজেশন

ট্রেনিং ডেটা, জেনারেলাইজেশন ও ফেইলিওর মোড

Training data, generalization & failure modes
৯ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • ওভারফিটিং ও আন্ডারফিটিং-এর সংজ্ঞা ও পার্থক্য
  • ডিস্ট্রিবিউশন শিফট কী এবং কেন এটি ওভারফিটিং থেকে আলাদা একটি সমস্যা
  • Python দিয়ে একটি সত্যিকারের হিসাব — একই শেখা থ্রেশহোল্ড নিয়মের ভুলের হার ট্রেনিং জনগোষ্ঠীতে বনাম একটি শিফট হওয়া জনগোষ্ঠীতে তুলনা করা
  • কেন এই ব্যর্থতা মোডগুলো বোঝা একটি AI সিস্টেম মোতায়েনের আগে এথিক্যাল ডিউ-ডিলিজেন্সের অংশ

১ · ওভারফিটিং বনাম আন্ডারফিটিং

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

ওভারফিটিং
ট্রেনিং ডেটায় প্রায় নিখুঁত, নতুন ডেটায় খারাপ — মডেল "মুখস্থ" করেছে, "শেখেনি"।
আন্ডারফিটিং
ট্রেনিং ডেটাতেও খারাপ — মডেল প্যাটার্নটি ধরার মতো যথেষ্ট জটিল নয়।
ডিস্ট্রিবিউশন শিফট
মডেল ট্রেনিং ডেটায় ভালোভাবে জেনারেলাইজ করলেও, ভিন্ন জনগোষ্ঠীতে প্রয়োগ করলে ব্যর্থ হতে পারে।

২ · ডিস্ট্রিবিউশন শিফট — একটি তৃতীয়, সূক্ষ্ম সমস্যা

ওভারফিটিং/আন্ডারফিটিং একই জনগোষ্ঠীর মধ্যে (ট্রেনিং বনাম নতুন ডেটা, কিন্তু একই উৎস থেকে) ঘটে। ডিস্ট্রিবিউশন শিফট আলাদা — এখানে মডেল ট্রেনিং ডেটায় সম্পূর্ণ সঠিকভাবে জেনারেলাইজ করতে পারে, কিন্তু বাস্তবে যে জনগোষ্ঠীর উপর প্রয়োগ করা হয় তা ট্রেনিং জনগোষ্ঠী থেকে ভিন্ন হয়ে যায় — যেমন একটি মেডিকেল ডায়াগনস্টিক মডেল একটি হাসপাতালের রোগীদের উপর ট্রেনিং করে অন্য একটি ভিন্ন জনসংখ্যাগত প্রেক্ষাপটের হাসপাতালে মোতায়েন করা, অথবা একটি ঋণ-অনুমোদন মডেল এক অর্থনৈতিক পরিস্থিতিতে ট্রেনিং করে ভিন্ন পরিস্থিতিতে ব্যবহার করা। মডেলের কোনো "বাগ" নেই — সমস্যাটি হলো যে ধারণা এটি শিখেছে তা নতুন প্রেক্ষাপটে আর সত্য নয়।

৩ · একটি সত্যিকারের ডিস্ট্রিবিউশন-শিফট হিসাব

নিচের কোড সেলে L33-এর থ্রেশহোল্ড-লার্নিং পদ্ধতিই পুনরায় ব্যবহার করা হয়েছে। প্রথমে একটি সিন্থেটিক "ট্রেনিং জনগোষ্ঠী"-তে (গ্রাহকের মাসিক খরচ থেকে "উচ্চ-মূল্যের গ্রাহক" অনুমান) সবচেয়ে কম ভুলের থ্রেশহোল্ড খোঁজা হয়েছে, এবং সেই একই থ্রেশহোল্ড নিয়ম দুই জায়গায় প্রয়োগ করে ভুলের হার তুলনা করা হয়েছে — ট্রেনিং জনগোষ্ঠীতে (যা আশানুরূপভাবে কম) এবং একটি "শিফট হওয়া" নতুন জনগোষ্ঠীতে, যেখানে আসল সম্পর্কটাই বদলে গেছে (এই সিন্থেটিক দ্বিতীয় বাজারে, কম খরচকারী গ্রাহকরাই এখন প্রকৃতপক্ষে বেশি "উচ্চ-মূল্যের")।

Python
# একটি সিন্থেটিক, ইলাস্ট্রেটিভ উদাহরণ -- বাস্তব কোনো কোম্পানি বা গ্রাহকের ডেটা নয়
# প্রতিটি এন্ট্রি: (মাসিক খরচ, উচ্চ-মূল্যের গ্রাহক কিনা -- 1 = হ্যাঁ, 0 = না)

# ট্রেনিং জনগোষ্ঠী -- L33-এর প্যাটার্নের মতোই, ১০ গুণ স্কেল করা
train_population = [
    (10, 0), (20, 0), (30, 0), (40, 0), (50, 0), (50, 1),
    (60, 1), (70, 0), (80, 1), (90, 1), (100, 1),
]

# শিফট হওয়া "ডিপ্লয়মেন্ট" জনগোষ্ঠী -- এখানে আসল সম্পর্কটাই উল্টে গেছে:
# কম খরচকারী গ্রাহকরাই এখন প্রকৃতপক্ষে বেশি "উচ্চ-মূল্যের" (যেমন একটি ভিন্ন সাবস্ক্রিপশন-ভিত্তিক বাজার)
deployment_population = [
    (5, 1), (15, 1), (25, 1), (35, 1), (45, 1), (45, 0),
    (55, 0), (65, 0), (75, 0), (85, 0), (95, 0),
]

def predict(spend, threshold):
    return 1 if spend >= threshold else 0

def error_rate(data, threshold):
    errors = sum(1 for spend, label in data if predict(spend, threshold) != label)
    return errors, errors / len(data)

# --- "ট্রেনিং": ট্রেনিং জনগোষ্ঠীতে সবচেয়ে কম ভুলের থ্রেশহোল্ড খোঁজা (L33-এর মতো একই অনুসন্ধান) ---
candidate_thresholds = list(range(10, 101, 10))
best_threshold = None
best_train_errors = None
for t in candidate_thresholds:
    errors, _ = error_rate(train_population, t)
    if best_train_errors is None or errors < best_train_errors:
        best_train_errors = errors
        best_threshold = t

train_errors, train_rate = error_rate(train_population, best_threshold)
deploy_errors, deploy_rate = error_rate(deployment_population, best_threshold)

print(f"শেখা থ্রেশহোল্ড: {best_threshold}\n")
print(f"ট্রেনিং জনগোষ্ঠীতে ভুলের হার:      {train_errors}/{len(train_population)} = {train_rate:.1%}")
print(f"শিফট হওয়া জনগোষ্ঠীতে ভুলের হার:   {deploy_errors}/{len(deployment_population)} = {deploy_rate:.1%}")
print(f"\nভুলের হার বেড়েছে {deploy_rate / train_rate:.1f}x -- একই নিয়ম, ভিন্ন জনগোষ্ঠী")

    
কোডটি চালালে দেখা যাবে শেখা থ্রেশহোল্ড (৫০) ট্রেনিং জনগোষ্ঠীতে মাত্র ২/১১ ≈ ১৮.২% ভুল করে — L33-এর মতোই একটি যুক্তিসঙ্গত জেনারেলাইজেশন। কিন্তু ঠিক একই নিয়ম শিফট হওয়া জনগোষ্ঠীতে প্রয়োগ করলে ভুলের হার লাফিয়ে ১০/১১ ≈ ৯০.৯%-এ চলে যায় — প্রায় বিপরীত ফল, কারণ ওই বাজারে আসল সম্পর্কটাই উল্টে গেছে। এটি ওভারফিটিং নয় (মডেল ট্রেনিং ডেটায় ভালোভাবেই জেনারেলাইজ করেছিল) — এটি বিশুদ্ধ ডিস্ট্রিবিউশন শিফট।
মূল কথা · Key takeaway

একটি মডেল তার ট্রেনিং ডেটায় ভালো পারফরম্যান্স দেখানোর মানে এই নয় যে এটি সব প্রেক্ষাপটে ভালো কাজ করবে। মোতায়েনের আগে যাচাই করা প্রয়োজন — যে জনগোষ্ঠীতে সিস্টেমটি আসলে ব্যবহৃত হবে তা ট্রেনিং ডেটার জনগোষ্ঠীর যথেষ্ট প্রতিনিধিত্বমূলক কিনা। এই প্রশ্নটি M4-এ আরও গভীরভাবে ফিরে আসবে, যেখানে "ডিপ্লয়মেন্ট বায়াস" আলোচনা করা হবে — প্রশিক্ষণের প্রেক্ষাপট ও বাস্তব-ব্যবহারের প্রেক্ষাপটের অমিল থেকে যে বায়াস তৈরি হয়।

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

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

প্র ০১ উপরের কোড সেলের ফলাফল কি ওভারফিটিং-এর উদাহরণ?

না। ওভারফিটিং হলে মডেল ট্রেনিং জনগোষ্ঠীতেই ভালো করতো না দ্বিতীয় কোনো নমুনায় — এখানে মডেল ট্রেনিং জনগোষ্ঠীতে যুক্তিসঙ্গতভাবে ভালো করেছে (১৮.২% ভুল, L33-এর মতোই)। সমস্যাটি হলো যে জনগোষ্ঠীতে প্রয়োগ করা হয়েছে সেটিই আলাদা — এটি একটি ভিন্ন ব্যর্থতা মোড (ডিস্ট্রিবিউশন শিফট), মডেলের ফিটিং-এর মান নিয়ে সমস্যা নয়।

প্র ০২ একটি প্রতিষ্ঠান কীভাবে বুঝতে পারে তাদের মডেল ডিস্ট্রিবিউশন শিফটের ঝুঁকিতে আছে কিনা?

একটি সাধারণ পদ্ধতি হলো ট্রেনিং ডেটার জনসংখ্যাগত/পরিসংখ্যানগত বৈশিষ্ট্য বাস্তব ডিপ্লয়মেন্ট জনগোষ্ঠীর বৈশিষ্ট্যের সাথে তুলনা করা, এবং মোতায়েনের পরেও নিয়মিতভাবে মডেলের পারফরম্যান্স মনিটর করা — কারণ জনগোষ্ঠী সময়ের সাথে ধীরে ধীরে বদলাতেও পারে (একে কখনো কখনো "কনসেপ্ট ড্রিফট" বলা হয়)। এককালীন পরীক্ষা যথেষ্ট নয়।

প্র ০৩ ডিস্ট্রিবিউশন শিফট কেন একটি এথিক্যাল প্রশ্ন, শুধু একটি টেকনিক্যাল প্রশ্ন নয়?

কারণ প্রায়ই যে জনগোষ্ঠীর উপর একটি মডেল ট্রেনিং করা হয় (সাধারণত সহজলভ্য, বেশি প্রতিনিধিত্বপ্রাপ্ত ডেটা) তার তুলনায় যে জনগোষ্ঠীর উপর এটি প্রকৃতপক্ষে প্রয়োগ করা হয় তার মধ্যে একটি পদ্ধতিগত অসামঞ্জস্য থাকে — এবং প্রায়ই কম প্রতিনিধিত্বপ্রাপ্ত/প্রান্তিক গোষ্ঠীগুলোই সবচেয়ে বেশি ভুলের শিকার হয়। একটি মডেল "গড়ে" ভালো পারফর্ম করছে বলার অর্থ এই নয় যে এটি সব উপ-গোষ্ঠীতে সমানভাবে নির্ভরযোগ্য (M4-এ বিস্তারিত)।

অনুশীলন

  1. চিন্তা করুন: একটি মুখ-শনাক্তকরণ মডেল একটি নির্দিষ্ট আলোক-পরিস্থিতি ও ক্যামেরার ধরনে তোলা ছবির উপর ট্রেনিং করা হয়েছে। এটি ভিন্ন আলোক-পরিস্থিতি বা ক্যামেরায় মোতায়েন করলে কী ধরনের ডিস্ট্রিবিউশন শিফট ঘটতে পারে?

    ছবির পিক্সেল বৈশিষ্ট্য (আলো, কনট্রাস্ট, রেজোলিউশন) ট্রেনিং ডেটার থেকে ভিন্ন হয়ে যাবে, যদিও অন্তর্নিহিত কাজ (মুখ শনাক্ত করা) একই থাকে — একে "ইনপুট ডিস্ট্রিবিউশন শিফট" বলা যায়। মডেল ট্রেনিং পরিস্থিতির সূক্ষ্ম ভিজ্যুয়াল প্যাটার্নের উপর নির্ভরশীল হয়ে পড়লে, নতুন পরিস্থিতিতে নির্ভুলতা উল্লেখযোগ্যভাবে কমে যেতে পারে।

  2. পরীক্ষা করুন: উপরের কোড সেলে deployment_population-এর প্রতিটি এন্ট্রির লেবেল উল্টে দিন (0 কে 1, 1 কে 0 করুন) এবং Run চাপুন — ভুলের হার কীভাবে বদলায় লক্ষ করুন।

    লেবেল উল্টালে প্রতিটি আগের "ভুল" পূর্বাভাস এখন "সঠিক" হয়ে যাবে এবং প্রতিটি আগের "সঠিক" পূর্বাভাস "ভুল" হয়ে যাবে — তাই নতুন ভুলের হার হবে 1 - 0.909 = 0.091, অর্থাৎ প্রায় ৯.১%। এটি দেখায় ভুলের হার সম্পূর্ণভাবে নির্ভর করে ডেটার প্রকৃত লেবেল প্যাটার্নের সাথে শেখা নিয়মের মিল কতটা, এলোমেলো কোনো সংখ্যা নয়।

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

আগের পাঠ
মেশিন লার্নিং মডেল কীভাবে সিদ্ধান্ত নেয়