পাঠ ১৫ · ৫৭-এর মধ্যে · মডিউল ৪
Home / Courses / Ethics in Computing & AI Safety / অ্যালগরিদমিক বায়াস ও ফেয়ারনেস

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

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

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

  • বায়াসের তিনটি স্বতন্ত্র উৎস — ডেটা, মডেল, ডিপ্লয়মেন্ট — এবং তাদের মধ্যে পার্থক্য
  • হিস্টোরিক্যাল বায়াস বনাম স্যাম্পলিং বায়াস — দুটি ভিন্ন ধরনের ডেটা বায়াস
  • কীভাবে একটি "নিরপেক্ষ" অ্যালগরিদমও প্রশিক্ষণ ডেটার প্যাটার্ন অ্যামপ্লিফাই করতে পারে
  • Python দিয়ে একটি সত্যিকারের স্যাম্পলিং-বায়াস পরীক্ষা — ভারসাম্যহীন ট্রেনিং ডেটায় ফিট করা থ্রেশহোল্ড দুটি গোষ্ঠীতে কতটা ভিন্ন ত্রুটির হার দেয়

১ · বায়াস ঢোকার তিনটি জায়গা

একটি মেশিন লার্নিং সিস্টেম তৈরির পাইপলাইনে অন্তত তিনটি ধাপ আছে যেখানে অ্যালগরিদমিক বায়াসAlgorithmic Biasএকটি সিস্টেমের সিদ্ধান্তে পদ্ধতিগত, পুনরাবৃত্তিমূলক ত্রুটি যা নির্দিষ্ট গোষ্ঠীর প্রতি অন্যায্যভাবে প্রভাব ফেলে। ঢুকতে পারে — ডেটা সংগ্রহের সময়, মডেল ট্রেনিংয়ের সময়, এবং ডিপ্লয়মেন্টের সময়। এই তিনটি স্বতন্ত্র — একটি সিস্টেমে তিনটির যেকোনো একটি, দুটি, বা তিনটিই একসাথে থাকতে পারে, এবং প্রতিটির প্রতিকার আলাদা (মিটিগেশন কৌশল L18-এ)।

ডেটা সংগ্রহ হিস্টোরিক্যাল + স্যাম্পলিং বায়াস মডেল ট্রেনিং প্যাটার্ন অ্যামপ্লিফিকেশন ডিপ্লয়মেন্ট প্রেক্ষাপটের অমিল
প্রতিটি ধাপ একটি স্বতন্ত্র "প্রবেশপথ" — একটি ধাপে বায়াস না থাকলেও পরের ধাপে থাকতে পারে।

২ · ডেটা বায়াস — দুই ধরনের

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

৩ · মডেল বায়াস

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

৪ · ডিপ্লয়মেন্ট বায়াস

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

এই তিনটি কেন আলাদা করে চেনা জরুরি

যদি সমস্যাটি স্যাম্পলিং বায়াস হয়, সমাধান হলো আরও প্রতিনিধিত্বমূলক ডেটা সংগ্রহ করা। যদি সমস্যাটি মডেল বায়াস হয়, সমাধান হতে পারে ফেয়ারনেস কনস্ট্রেইন্ট যোগ করা (L18)। যদি সমস্যাটি ডিপ্লয়মেন্ট বায়াস হয়, সমাধান হলো নতুন প্রেক্ষাপটে পুনরায় যাচাই করা বা ব্যবহারের সুযোগ সীমাবদ্ধ করা — একটি ভুল নির্ণয় ভুল প্রতিকারের দিকে নিয়ে যায়।

৫ · স্যাম্পলিং বায়াস: একটি সত্যিকারের হিসাব

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

Python
# সিন্থেটিক, ইলাস্ট্রেটিভ উদাহরণ -- বাস্তব কোনো ডেটাসেট নয়
# লক্ষ্য: "স্যাম্পলিং বায়াস" সংখ্যায় দেখা

# পূর্ণ জনগোষ্ঠী -- দুটি গোষ্ঠী, প্রতিটির প্রকৃত (true) নিয়ম আলাদা
# Group A: feature >= 60 হলে প্রকৃত label পজিটিভ (1)
group_a = [
    (40, 0), (45, 0), (50, 0), (55, 0), (58, 0),
    (62, 1), (65, 1), (70, 1), (75, 1), (80, 1),
]
# Group B: feature >= 45 হলে প্রকৃত label পজিটিভ -- ভিন্ন প্রকৃত সম্পর্ক
group_b = [
    (30, 0), (35, 0), (40, 0), (42, 0), (44, 0),
    (46, 1), (48, 1), (50, 1), (55, 1), (60, 1),
]

# ট্রেনিং সেট: Group A থেকে সবগুলো (১০), কিন্তু Group B থেকে মাত্র ২টি
# -- ব্যাপক ভারসাম্যহীন (disproportionate) স্যাম্পলিং
training_set = group_a + group_b[:2]

def error_count(data, threshold):
    errors = 0
    for feature, actual in data:
        predicted = 1 if feature >= threshold else 0
        if predicted != actual:
            errors += 1
    return errors

# ট্রেনিং সেটের প্রতিটি ফিচার-মানকে candidate থ্রেশহোল্ড হিসেবে ব্যবহার করে
# যেটি সবচেয়ে কম ট্রেনিং-ত্রুটি দেয় সেটি খোঁজা হচ্ছে
candidates = sorted(set(f for f, _ in training_set))
best_threshold = None
best_errors = len(training_set) + 1
for t in candidates:
    e = error_count(training_set, t)
    if e < best_errors:
        best_errors = e
        best_threshold = t

print(f"ট্রেনিং সেটে সেরা থ্রেশহোল্ড: feature >= {best_threshold}  (ট্রেনিং ত্রুটি: {best_errors}/{len(training_set)})")

# এখন এই একই থ্রেশহোল্ড পূর্ণ জনগোষ্ঠীর (উভয় গ্রুপের সব ১০ জন) উপর প্রয়োগ করে
# প্রতিটি গোষ্ঠীতে আলাদাভাবে ত্রুটির হার গণনা
err_a = error_count(group_a, best_threshold)
err_b = error_count(group_b, best_threshold)

print(f"\nGroup A -- ত্রুটির হার: {err_a}/{len(group_a)} = {err_a/len(group_a)*100:.0f}%")
print(f"Group B -- ত্রুটির হার: {err_b}/{len(group_b)} = {err_b/len(group_b)*100:.0f}%")

    
কোডটি চালালে দেখা যাবে সেরা থ্রেশহোল্ড feature >= 62 ট্রেনিং সেটে শূন্য ত্রুটি দেয় (কারণ এটি মূলত Group A-এর প্যাটার্নের সাথে পুরোপুরি মেলে) — কিন্তু পূর্ণ জনগোষ্ঠীতে প্রয়োগ করলে Group A-তে ত্রুটির হার ০%, অথচ Group B-তে ৫০%। কারণ থ্রেশহোল্ডটি কখনোই Group B-এর প্রকৃত সম্পর্ক (feature >= 45) দেখেইনি — ট্রেনিং সেটে Group B-এর মাত্র দুইজন ছিল, দুজনই নেগেটিভ উদাহরণ।
মূল কথা · Key takeaway

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

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

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

প্র ০১ উপরের কোড সেলে অ্যালগরিদম নিজে কোনো "ভুল" করেনি — তাহলে দোষ কার?

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

প্র ০২ মডেল বায়াস কীভাবে হিস্টোরিক্যাল বায়াস থেকে আলাদা?

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

প্র ০৩ যদি একটি মডেল তার নিজস্ব ট্রেনিং ও টেস্ট ডেটাতে নিখুঁত পারফর্ম করে, তাহলে কি এটি ডিপ্লয়মেন্ট বায়াস থেকে মুক্ত?

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

অনুশীলন

  1. চিন্তা করুন: একটি মুখ-শনাক্তকরণ (face recognition) সিস্টেমের কথা ভাবুন যা মূলত একটি নির্দিষ্ট জনগোষ্ঠীর ছবি দিয়ে ট্রেইন করা হয়েছে। এটি কি ডেটা বায়াস, মডেল বায়াস, নাকি ডিপ্লয়মেন্ট বায়াসের উদাহরণ — নাকি একাধিক?

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

  2. পরীক্ষা করুন: উপরের কোড সেলে training_set-এ Group B থেকে [:2] এর বদলে [:6] (অর্ধেক) নিয়ে Run চেপে দেখুন Group B-এর ত্রুটির হার কীভাবে বদলায়।

    Group B থেকে অর্ধেক (৬ জন, যার মধ্যে কিছু পজিটিভ উদাহরণও থাকবে) ট্রেনিং সেটে যোগ হলে, সেরা থ্রেশহোল্ড খোঁজার প্রক্রিয়া এখন Group B-এর প্রকৃত সম্পর্কও (feature >= 45) বিবেচনায় নিতে বাধ্য হবে, ফলে সেরা থ্রেশহোল্ড কমবে এবং Group B-তে ত্রুটির হার উল্লেখযোগ্যভাবে কমবে — যদিও Group A-এর জন্য এটি হয়তো আর নিখুঁত (০% ত্রুটি) থাকবে না। এটিই দেখায় কেন প্রতিনিধিত্বমূলক ডেটা উভয় গোষ্ঠীর জন্যই গুরুত্বপূর্ণ।

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

আগের পাঠ
সার্ভেইল্যান্স, ট্র্যাকিং ও প্যানপ্টিকন সমস্যা