পাঠ ০৯ · ৫৭-এর মধ্যে · মডিউল ৩
Home / AI Courses / AI Ethics / বায়াসের উৎস

বায়াস কোথা থেকে আসে — ডেটা, মডেল, ডিপ্লয়মেন্ট

Where bias comes from: data, model, deployment
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • বায়াসের তিনটি প্রধান উৎস — ডেটা, মডেল, ডিপ্লয়মেন্ট — এবং প্রতিটির মধ্যে পার্থক্য
  • ডেটা বায়াসের তিনটি উপ-প্রকার: ঐতিহাসিক, রিপ্রেজেন্টেশন, মেজারমেন্ট বায়াস
  • মডেল কীভাবে ছোট ইনপুট পার্থক্যকে অ্যাম্প্লিফাই করতে পারে, এবং অ্যাগ্রিগেশন বায়াস কী
  • ডিপ্লয়মেন্ট বায়াস ও ফিডব্যাক লুপ কী, এবং কেন এটি ডেটা/মডেল ঠিক থাকলেও ঘটতে পারে
  • একটি সম্পূর্ণ নতুন, সত্যিকারের গণনা করা প্রক্সি-বায়াস ডেমো

১ · বায়াসের তিনটি প্রধান উৎস

L01-এ আমরা দেখেছি একটি মডেল কোনো protected attribute সরাসরি ব্যবহার না করেও একটি প্রক্সি ফিচার-এর মাধ্যমে বায়াসড ফলাফল দিতে পারে। কিন্তু "মডেলে প্রক্সি ফিচার আছে" — এটুকুই বায়াসের একমাত্র উৎস নয়। একটি সম্পূর্ণ AI পাইপলাইনকে তিনটি স্তরে ভাগ করলে বায়াস কোথায় ঢুকতে পারে তা আরও স্পষ্টভাবে বোঝা যায়:

ডেটা বায়াস
ট্রেনিং ডেটা নিজেই অতীতের বৈষম্য, অসম প্রতিনিধিত্ব, বা অসম পরিমাপ বহন করে।
মডেল বায়াস
অ্যালগরিদম/অপ্টিমাইজেশন প্রক্রিয়া নিজেই ডেটার ছোট পার্থক্যকে বড় আউটপুট পার্থক্যে রূপান্তরিত করে।
ডিপ্লয়মেন্ট বায়াস
মডেল যে প্রেক্ষাপটে তৈরি/যাচাই হয়েছিল, তার থেকে ভিন্ন প্রেক্ষাপটে ব্যবহার করা হয়।
১ · ডেটা ঐতিহাসিক/রিপ্রেজেন্টেশন/মেজারমেন্ট বায়াস ২ · মডেল অ্যাম্প্লিফিকেশন/অ্যাগ্রিগেশন বায়াস ৩ · ডিপ্লয়মেন্ট কনটেক্সট মিসম্যাচ/ফিডব্যাক লুপ
AI পাইপলাইনের তিনটি ধাপ — প্রতিটি ধাপে ভিন্নভাবে বায়াস প্রবেশ করতে পারে, এবং একটি ধাপ "পরিষ্কার" হলেও পরের ধাপে নতুন বায়াস যোগ হতে পারে।

২ · ডেটা বায়াস — গভীরে

ডেটা বায়াসের তিনটি সাধারণ উপ-প্রকার আলাদা করে চেনা দরকার, কারণ প্রতিটির সমাধান ভিন্ন:

ক · ঐতিহাসিক বায়াস (Historical bias)

ডেটা যদি নিখুঁতভাবেও সংগ্রহ করা হয়, তবুও এটি অতীতের বাস্তব জগতের বৈষম্য প্রতিফলিত করতে পারে। যেমন একটি হায়ারিং মডেল যদি গত ১০ বছরের প্রকৃত নিয়োগের ডেটায় ট্রেন করা হয় এবং সেই ইন্ডাস্ট্রিতে ঐতিহাসিকভাবে একটি নির্দিষ্ট গ্রুপ কম প্রতিনিধিত্ব পেয়ে থাকে, মডেল "সফল প্রার্থীর প্যাটার্ন" হিসেবে সেই ঐতিহাসিক অসমতাকেই শিখে ফেলে — ডেটা কালেকশনে কোনো "ভুল" ছাড়াই।

খ · রিপ্রেজেন্টেশন বায়াস (Representation bias)

ট্রেনিং ডেটাসেটে যদি একটি গ্রুপের নমুনা সংখ্যা তুলনামূলকভাবে অনেক কম হয়, মডেল সেই গ্রুপের প্যাটার্ন ভালোভাবে শিখতে পারে না — ফলে সেই গ্রুপের জন্য মডেলের অ্যাকুরেসি তুলনামূলকভাবে কম হয়। M5-এ আলোচিত Gender Shades গবেষণা (L02) এই সমস্যার একটি সুপরিচিত বাস্তব উদাহরণ — বেঞ্চমার্ক ডেটাসেটে গাঢ়-ত্বকের নারীদের প্রতিনিধিত্ব তুলনামূলকভাবে কম ছিল বলে সেই সাবগ্রুপে এরর রেট বেশি ছিল।

গ · মেজারমেন্ট বায়াস (Measurement bias)

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

৩ · মডেল বায়াস — অ্যালগরিদম কীভাবে পার্থক্য বাড়িয়ে তোলে

ডেটা সম্পূর্ণ "ফেয়ার" হলেও মডেল/অপ্টিমাইজেশন প্রক্রিয়া নিজেই বায়াস যোগ করতে বা বাড়াতে পারে। দুটি সাধারণ প্রক্রিয়া:

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

৪ · ডিপ্লয়মেন্ট বায়াস — কনটেক্সট মিসম্যাচ ও ফিডব্যাক লুপ

ডেটা ও মডেল দুটোই "ঠিক" থাকলেও ডিপ্লয়মেন্ট পর্যায়ে বায়াস ঢুকতে পারে:

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

মডেল কীভাবে ট্রেনিং ডেটা থেকে প্যাটার্ন শেখে এবং অপ্টিমাইজেশন প্রক্রিয়া কীভাবে কাজ করে তার সম্পূর্ণ কারিগরি বিস্তারিত Machine Learning কোর্সে কভার করা হয়েছে — এখানে আমরা শুধু ততটুকু মেকানিজম ব্যাখ্যা করছি যতটুকু বায়াসের নৈতিক প্রশ্নটি বোঝার জন্য জরুরি।

৫ · একটি সত্যিকারের ডেমো — ভিন্ন দৃশ্যকল্প, একই লুকিয়ে থাকা বায়াস

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

Python
import random
random.seed(11)

def generate_policies(n, group):
    policies = []
    for _ in range(n):
        if group == "A":
            # সিন্থেটিক ডেটা: ঐতিহাসিকভাবে কম বিনিয়োগ পাওয়া এলাকায় রিপোর্ট করা ক্লেইম-ডেনসিটি বেশি (কাল্পনিক প্যাটার্ন সিমুলেট করা)
            zip_claim_density = max(0, random.gauss(8, 2))
        else:
            zip_claim_density = max(0, random.gauss(4, 2))
        driving_record_score = random.gauss(70, 12)  # ব্যক্তিগত ড্রাইভিং রেকর্ড -- উভয় গ্রুপেই একই বিতরণ থেকে
        policies.append({"group": group, "zip_claim_density": zip_claim_density, "driving_record_score": driving_record_score})
    return policies

policies = generate_policies(250, "A") + generate_policies(250, "B")
random.shuffle(policies)

def risk_premium_score(p):
    # লক্ষ্য করুন: মডেল "group" মোটেও ব্যবহার করছে না -- শুধু zip_claim_density ও driving_record_score
    return 0.55 * p["zip_claim_density"] + 0.45 * (p["driving_record_score"] / 10)

HIGH_PREMIUM_THRESHOLD = 7.5
for p in policies:
    p["score"] = risk_premium_score(p)
    p["high_premium_tier"] = p["score"] >= HIGH_PREMIUM_THRESHOLD

group_a = [p for p in policies if p["group"] == "A"]
group_b = [p for p in policies if p["group"] == "B"]

rate_a = sum(p["high_premium_tier"] for p in group_a) / len(group_a) * 100
rate_b = sum(p["high_premium_tier"] for p in group_b) / len(group_b) * 100

print(f"গ্রুপ A: {len(group_a)}টি পলিসি, উচ্চ-প্রিমিয়াম টিয়ারে পড়েছে: {rate_a:.1f}%")
print(f"গ্রুপ B: {len(group_b)}টি পলিসি, উচ্চ-প্রিমিয়াম টিয়ারে পড়েছে: {rate_b:.1f}%")
print(f"\nমডেল কি 'group' ফিচারটি সরাসরি ব্যবহার করেছে? না -- শুধু zip_claim_density ও driving_record_score।")
print(f"তবুও উচ্চ-প্রিমিয়াম টিয়ারে পড়ার হারের পার্থক্য: {abs(rate_a - rate_b):.1f} পার্সেন্টেজ পয়েন্ট")

    
কোডটি রান করলে দেখা যায় গ্রুপ A-এর প্রায় ৫৬% পলিসি উচ্চ-প্রিমিয়াম টিয়ারে পড়ছে, অথচ গ্রুপ B-এর মাত্র প্রায় ৫%-এর কাছাকাছি — প্রায় ৫১ পার্সেন্টেজ পয়েন্টের বিশাল ব্যবধান। মডেল কোথাও "group" দেখেনি; এটি সম্পূর্ণভাবে zip_claim_density ফিচারের মাধ্যমে ঐতিহাসিক ডেটা বায়াস পুনরুৎপাদন করছে — L01-এর ডেমোর মতোই একই কাঠামো, সম্পূর্ণ ভিন্ন ডোমেইনে।
মূল কথা · Key takeaway

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

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

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

প্র ০১ উপরের ইন্স্যুরেন্স ডেমোকে "ডেটা বায়াস", "মডেল বায়াস" নাকি "ডিপ্লয়মেন্ট বায়াস" হিসেবে শ্রেণীবদ্ধ করবেন, এবং কেন?

এটি মূলত ডেটা বায়াস (নির্দিষ্টভাবে ঐতিহাসিক বায়াস) — সমস্যাটি মডেলের গণিতে নেই (এটি শুধু একটি সরল ওয়েটেড সাম করছে), বরং zip_claim_density ফিচারটি নিজেই ঐতিহাসিক বৈষম্যের একটি প্রক্সি হয়ে আছে। মডেল যদি এমন কোনো ফিচারকে অতিরিক্ত ওয়েট দিত যেটি স্বাভাবিকভাবে তুলনামূলকভাবে কম গুরুত্বপূর্ণ হওয়া উচিত ছিল, সেটি মডেল বায়াসের (অ্যাম্প্লিফিকেশন) দিকে আরও ঝুঁকে যেত।

প্র ০২ যদি zip_claim_density ফিচারটি সম্পূর্ণ বাদ দিয়ে শুধু driving_record_score দিয়ে প্রিমিয়াম নির্ধারণ করা হতো, গ্রুপ A ও B-এর মধ্যে পার্থক্য কী হতো বলে আপনার ধারণা?

যেহেতু driving_record_score কোডে উভয় গ্রুপের জন্য একই বিতরণ (random.gauss(70, 12)) থেকে জেনারেট করা হয়েছে, শুধু সেটি ব্যবহার করলে গ্রুপ A ও B-এর উচ্চ-প্রিমিয়াম হার গড়ে প্রায় সমান হতো। এটি আবার নিশ্চিত করে যে গ্যাপের আসল উৎস zip_claim_density ফিচারটিই, ব্যক্তিগত ড্রাইভিং রেকর্ড নয়।

প্র ০৩ ডেটা ও মডেল দুটোই "ফেয়ার" হওয়া সত্ত্বেও কীভাবে শুধু ডিপ্লয়মেন্টের কারণে বায়াস দেখা দিতে পারে, তার একটি নিজের উদাহরণ ভাবুন।

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

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে HIGH_PREMIUM_THRESHOLD-কে 7.5 থেকে 9.0-এ বাড়ালে গ্রুপ A ও B-এর উচ্চ-প্রিমিয়াম হার কীভাবে বদলাবে বলে আপনার ধারণা?

    থ্রেশহোল্ড বাড়ালে উভয় গ্রুপেরই উচ্চ-প্রিমিয়াম হার কমবে, কিন্তু গ্রুপ B-এর হার (যা এমনিতেই কম) শূন্যের কাছাকাছি নেমে যাওয়ার সম্ভাবনা বেশি, যখন গ্রুপ A-এর হার তুলনামূলকভাবে বেশি থাকবে — কারণ গ্রুপ A-এর গড় zip_claim_density এমনিতেই বেশি।

  2. পরীক্ষা করুন: উপরের কোড সেলে HIGH_PREMIUM_THRESHOLD = 7.5-কে HIGH_PREMIUM_THRESHOLD = 9.0-এ পরিবর্তন করে Run চেপে আপনার অনুমান যাচাই করুন।

    থ্রেশহোল্ড ৯.০-এ উভয় গ্রুপের সংখ্যা কমবে, তবে গ্রুপ B-এর সংখ্যা প্রায় শূন্যের কাছাকাছি চলে যাবে যেহেতু তাদের গড় zip_claim_density (৪-এর কাছাকাছি) থেকে score ৯.০ পার হওয়া পরিসংখ্যানগতভাবে বিরল, যেখানে গ্রুপ A-এর জন্য (গড় ৮-এর কাছাকাছি) এটি অনেক বেশি সম্ভব — এটি দেখায় থ্রেশহোল্ড যত কঠোর হয়, লুকানো বায়াস প্রায়ই আপেক্ষিকভাবে আরও প্রকট হয়ে ওঠে।

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

  • পরবর্তী পাঠ L10 ফেয়ারনেস মেট্রিক্স — ডেমোগ্রাফিক প্যারিটি, ইকুয়ালাইজড অডস ও ক্যালিব্রেশন সত্যিকারের কনফিউশন-ম্যাট্রিক্স গণনা দিয়ে মাপা শেখা।
  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ নৈতিক ফ্রেমওয়ার্ক, বায়াস-ফেয়ারনেস, প্রাইভেসি, ট্রান্সপারেন্সি, AI অ্যালাইনমেন্ট, জেনারেটিভ AI/LLM এথিক্স, সামাজিক প্রভাব, গভর্নেন্স ও রেগুলেশন, সেক্টর-স্পেসিফিক এথিক্স ও এক্সিস্টেনশিয়াল রিস্ক বিতর্ক।
  • Ethics in Computing & AI Safety কোর্স সহোদর কোর্স সাধারণ কম্পিউটিং এথিক্স, প্রফেশনাল এথিক্স ও সেফটি-ক্রিটিক্যাল কেস স্টাডির একটি বিস্তৃত সার্ভে।
আগের পাঠ
ফ্রেমওয়ার্কগুলো একসাথে প্রয়োগ — একটি ওয়ার্কড AI সিদ্ধান্ত