পাঠ ২৫ · ৫৭-এর মধ্যে · মডিউল ৬
Home / AI Courses / AI Ethics / গুডহার্টস ল

গুডহার্টস ল ইন AI সিস্টেম

Goodhart's Law in AI Systems
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • গুডহার্টস ল-এর সুনির্দিষ্ট বক্তব্য এবং এটি L24-এর সাথে কীভাবে সম্পর্কিত
  • Pearson's করিলেশন কোফিসিয়েন্ট হাতে-কলমে (stdlib দিয়ে) কীভাবে গণনা করা হয়
  • একটি সত্যিকারের before/after ডেটাসেট তুলনা দিয়ে করিলেশন দুর্বল হওয়ার প্রক্রিয়া দেখা
  • কেন এই ঘটনাটি AI সিস্টেমের মেট্রিক-নির্ভর অপ্টিমাইজেশনে বিশেষভাবে গুরুত্বপূর্ণ

১ · গুডহার্টস ল — সাধারণ বক্তব্য

অর্থনীতিবিদ চার্লস গুডহার্টের নামে পরিচিত গুডহার্টস লGoodhart's Lawযখন একটি পরিমাপ (measure) লক্ষ্য (target) হয়ে যায়, এটি একটি ভালো পরিমাপ থাকে না -- কারণ মানুষ/সিস্টেম তখন পরিমাপটিকেই সরাসরি অপ্টিমাইজ করতে শুরু করে, যা পরিমাপটি যা প্রতিনিধিত্ব করত তার থেকে বিচ্ছিন্ন হয়ে যেতে পারে। একটি ব্যাপকভাবে উদ্ধৃত পর্যবেক্ষণ: "যখন একটি পরিমাপ লক্ষ্য হয়ে যায়, এটি একটি ভালো পরিমাপ থাকে না।" এটি L24-এর স্পেসিফিকেশন-গেমিং ঘটনারই একটি সাধারণীকৃত রূপ — L24-এ আমরা একটি একক মুহূর্তে দেখেছিলাম proxy-optimal ও true-goal-optimal স্ট্র্যাটেজি ভিন্ন হতে পারে। গুডহার্টস ল একই ঘটনাকে সময়ের সাথে বর্ণনা করে — একটি মেট্রিক যতক্ষণ শুধু পর্যবেক্ষণ করা হয় (কোনো অপ্টিমাইজেশন চাপ ছাড়াই), ততক্ষণ এটি প্রকৃত উদ্দেশ্যের একটি নির্ভরযোগ্য সূচক হতে পারে। কিন্তু যেই মুহূর্তে কেউ (বা কোনো সিস্টেম) সেই মেট্রিকটিকেই সরাসরি টার্গেট করে অপ্টিমাইজ করা শুরু করে, মেট্রিক ও প্রকৃত উদ্দেশ্যের মধ্যে সম্পর্কটি ভেঙে যেতে পারে।

একই লেখকদের রচনা (শেয়ারড underlying effort) স্বাভাবিক লেখা (unoptimized, কোনো টার্গেট নেই) শুধু word_count-এর জন্য "অপ্টিমাইজড" (padding যোগ) r(word_count, quality) শক্তিশালী (নিচে গণনা করা হবে) r(word_count, quality) দুর্বল (নিচে গণনা করা হবে) measure → target
যতক্ষণ word_count শুধু পর্যবেক্ষণ করা হয়, এটি quality-র একটি ভালো সূচক থাকে। কিন্তু একবার এটিই সরাসরি টার্গেট হয়ে গেলে (padding দিয়ে সংখ্যা বাড়ানো), সেই সম্পর্ক ভেঙে যায় — নিচের কোডে দুটো করিলেশনই সত্যিই গণনা করে যাচাই করা হয়েছে।

২ · একটি টয় উদাহরণ — রচনার দৈর্ঘ্য বনাম গুণমান

কল্পনা করুন একদল লেখকের রচনা মূল্যায়ন করা হচ্ছে। প্রতিটি রচনার পেছনে একটি অদেখা "প্রকৃত পরিশ্রম/যত্ন" (effort) আছে — যে লেখক বেশি পরিশ্রম করেন, তার রচনা সাধারণত দীর্ঘও হয় (word count, আমাদের proxy) এবং ভালোও হয় (quality, আমাদের true goal) — কারণ দুটোই একই underlying effort থেকে আসছে। কিন্তু যদি লেখকদের বলা হয় "word count-এর ভিত্তিতে পুরস্কার দেওয়া হবে," তারা শুধু শব্দ-সংখ্যা বাড়ানোর জন্য padding (পুনরাবৃত্তি, অপ্রয়োজনীয় বাক্য) যোগ করতে শুরু করতে পারেন — যা গুণমানের সাথে কোনো সম্পর্ক রাখে না। ফলে word count আর গুণমানের একটি নির্ভরযোগ্য সূচক থাকে না।

৩ · একটি সত্যিকারের before/after করিলেশন গণনা

নিচের কোডে প্রথমে stdlib দিয়ে হাতে pearson_r() ফর্মুলা লেখা হয়েছে (কোনো লাইব্রেরি ছাড়া)। তারপর একই ১৪ জন লেখকের underlying effort ব্যবহার করে দুটো ডেটাসেট তৈরি করা হয়েছে — একটি অপ্টিমাইজেশনের আগে (স্বাভাবিক লেখা), আরেকটি পরে (word count-এর জন্য specifically অপ্টিমাইজড, বড় padding যোগ করে) — এবং দুটোতেই সত্যিকারের করিলেশন গণনা করে তুলনা করা হয়েছে।

Python
import random

def pearson_r(xs, ys):
    # Pearson's correlation coefficient -- হাতে-লেখা ফর্মুলা, শুধু stdlib
    n = len(xs)
    mean_x = sum(xs) / n
    mean_y = sum(ys) / n
    cov = sum((x - mean_x) * (y - mean_y) for x, y in zip(xs, ys))
    var_x = sum((x - mean_x) ** 2 for x in xs)
    var_y = sum((y - mean_y) ** 2 for y in ys)
    return cov / ((var_x ** 0.5) * (var_y ** 0.5))

random.seed(11)
n = 14
efforts = [random.uniform(1, 4) for _ in range(n)]  # প্রতিটি রচনার পেছনে অদেখা "প্রকৃত পরিশ্রম"

# অপ্টিমাইজেশনের আগে -- word_count স্বাভাবিকভাবেই একই effort থেকে আসছে (কিছুটা নয়েজসহ)
before_quality, before_words = [], []
for e in efforts:
    before_quality.append(2.0 * e + random.gauss(0, 0.4))
    before_words.append(40.0 * e + random.gauss(0, 15))

# অপ্টিমাইজেশনের পরে -- লেখা এখন specifically word_count maximize করার জন্য "অপ্টিমাইজড": বড়,
# effort-নিরপেক্ষ padding যোগ করা হচ্ছে; quality এখনও শুধু effort দিয়েই চালিত, padding কোনো গুণমান যোগ করে না
after_quality, after_words = [], []
for e in efforts:
    after_quality.append(2.0 * e + random.gauss(0, 0.4))
    padding = random.uniform(0, 500)
    after_words.append(40.0 * e + padding)

r_before = pearson_r(before_words, before_quality)
r_after = pearson_r(after_words, after_quality)

print("অপ্টিমাইজেশনের আগে (unoptimized):")
for w, q in zip(before_words, before_quality):
    print(f"  word_count={w:7.1f}  quality={q:5.2f}")
print(f"  r(word_count, quality) = {r_before:.3f}")

print()
print("অপ্টিমাইজেশনের পরে (proxy-র জন্য specifically অপ্টিমাইজড):")
for w, q in zip(after_words, after_quality):
    print(f"  word_count={w:7.1f}  quality={q:5.2f}")
print(f"  r(word_count, quality) = {r_after:.3f}")

print()
print(f"করিলেশন দুর্বল হয়েছে: {abs(r_after) < abs(r_before)}")
print(f"|r|-এর হ্রাস: {abs(r_before) - abs(r_after):.3f}")

    
কোডের প্রকৃত আউটপুট অনুযায়ী — অপ্টিমাইজেশনের আগে r ≈ 0.873 (একটি শক্তিশালী পজিটিভ করিলেশন), কিন্তু proxy-র জন্য specifically অপ্টিমাইজ করার পর r ≈ 0.305-এ নেমে আসে (একটি দুর্বল করিলেশন)। লক্ষ্য করুন — after_quality এখনও ঠিক একই ফর্মুলা (2.0 * e + noise) দিয়ে গণনা করা, শুধু after_words-এ একটি বড়, effort-নিরপেক্ষ padding যোগ করা হয়েছে — এই একটি পরিবর্তনই যথেষ্ট ছিল করিলেশন ভেঙে দেওয়ার জন্য, কারণ word_count-এর ভ্যারিয়েন্স এখন মূলত padding থেকে আসছে, যা quality-র সাথে সম্পূর্ণ সম্পর্কহীন।
মূল কথা · Key takeaway এবং L24-এর সাথে সম্পর্ক

গুডহার্টস ল-এর সাধারণ রূপ: "যখন একটি পরিমাপ লক্ষ্য হয়ে যায়, এটি একটি ভালো পরিমাপ থাকে না।" L24-এ আমরা এর একটি স্ন্যাপশট দেখেছিলাম (একটি নির্দিষ্ট মুহূর্তে proxy-optimal ≠ true-goal-optimal স্ট্র্যাটেজি) — L25-এ আমরা একই ঘটনার প্রক্রিয়াটি দেখলাম: অপ্টিমাইজেশন চাপ প্রয়োগ করার আগে ও পরে একই দুই মেট্রিকের মধ্যে সম্পর্ক সত্যিই কীভাবে ভেঙে যায়। AI সিস্টেমে এর ব্যবহারিক অর্থ — একটি মেট্রিক ট্রেনিং/মূল্যায়নের আগে যতই নির্ভরযোগ্য মনে হোক না কেন, একবার সেটিকে সরাসরি অপ্টিমাইজেশন টার্গেট বানালে তার নির্ভরযোগ্যতা যাচাই করে দেখা জরুরি — অতীতের করিলেশন ভবিষ্যতের গ্যারান্টি নয়।

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

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

প্র ০১ কোড সেলে after_quality গণনার ফর্মুলা before_quality-এর মতোই রাখা হয়েছে (শুধু after_words-এ padding যোগ করা হয়েছে)। এটি কেন গুরুত্বপূর্ণ একটি ডিজাইন সিদ্ধান্ত?

কারণ এটি নিশ্চিত করে গুণমান নিজে বদলায়নি — শুধু আমরা যেভাবে word count পরিমাপ করছি তার সম্পর্ক গুণমানের সাথে বদলে গেছে। এটি বাস্তব-জগতের ঘটনার সাথে মেলে: গুডহার্টস ল বলছে না যে জিনিসগুলো "খারাপ" হয়ে যায়, বরং বলছে পরিমাপটি আর একটি নির্ভরযোগ্য সূচক থাকে না — প্রকৃত গুণমান আগের মতোই থাকতে পারে, কিন্তু আমাদের প্রক্সি মেট্রিক আর সেটি ধরতে পারছে না।

প্র ০২ এই ডেমোতে padding-এর রেঞ্জ (random.uniform(0, 500)) খুব বড় রাখা হয়েছে। যদি এটি অনেক ছোট হতো (যেমন uniform(0, 5)), করিলেশনের কী হতো বলে আপনার ধারণা?

একটি অনেক ছোট padding-এর ভ্যারিয়েন্স, effort-চালিত সিগন্যালের (৪০ × effort) তুলনায় নগণ্য থাকবে — তাই word_count-এর বেশিরভাগ ভ্যারিয়েশন তখনও effort থেকেই আসবে, এবং correlation তেমন দুর্বল হবে না। এটি দেখায় গুডহার্টস-স্টাইল করিলেশন-ভাঙন কতটা ঘটবে তা নির্ভর করে "গেমিং প্রচেষ্টা" (এখানে padding) মূল সিগন্যালের তুলনায় কতটা বড়, তার উপর।

প্র ০৩ বাস্তব-জগতের কোন AI/ML পরিস্থিতিতে এই একই প্যাটার্ন (মেট্রিক টার্গেট হওয়ার পর তার নির্ভরযোগ্যতা হারানো) ঘটতে পারে বলে আপনার মনে হয়?

একটি সাধারণ উদাহরণ — একটি মডেল "ইউজার এনগেজমেন্ট টাইম" প্রক্সি হিসেবে ব্যবহার করে "কনটেন্ট গুণমান" অনুমান করার জন্য। যতক্ষণ এনগেজমেন্ট শুধু পর্যবেক্ষণ করা হয়, এটি গুণমানের সাথে যুক্তিসঙ্গতভাবে করিলেটেড থাকতে পারে। কিন্তু একবার সুপারিশ অ্যালগরিদম সরাসরি এনগেজমেন্ট maximize করা শুরু করলে, এটি চাঞ্চল্যকর/আসক্তিকর কনটেন্ট খুঁজে বের করতে পারে যা এনগেজমেন্ট বাড়ায় কিন্তু প্রকৃত গুণমান বা ব্যবহারকারীর দীর্ঘমেয়াদী সন্তুষ্টির সাথে সম্পর্কহীন — M8-এর L33-এ এই নির্দিষ্ট প্যাটার্নটি বিস্তারিত আলোচিত হবে।

অনুশীলন

  1. চিন্তা করুন: যদি কোডে after_words-এর padding সীমা random.uniform(0, 500)-কে random.uniform(0, 50)-এ কমানো হয়, করিলেশন হ্রাস (r_before - r_after) বাড়বে নাকি কমবে বলে আপনার ধারণা?

    হ্রাসের পরিমাণ কমবে — padding-এর রেঞ্জ ছোট হওয়ায় এটি effort-চালিত সিগন্যালের তুলনায় কম প্রভাবশালী হবে, তাই word_count এখনও অনেকাংশে effort দিয়ে চালিত থাকবে এবং quality-র সাথে করিলেশন আগের মতোই তুলনামূলক শক্তিশালী থাকবে — r_after, r_before-এর কাছাকাছি থাকবে।

  2. পরীক্ষা করুন: উপরের কোডে padding = random.uniform(0, 500)-কে padding = random.uniform(0, 50)-এ পরিবর্তন করে Run চেপে r_after-এর নতুন মান দেখুন এবং আপনার অনুমানের সাথে তুলনা করুন।

    রান করলে দেখা যাবে r_after আগের (0.305) চেয়ে r_before-এর (0.873) কাছাকাছি একটি মান দেখাবে — অর্থাৎ করিলেশন হ্রাস অনেক কম হবে। এটি নিশ্চিত করে গুডহার্টস-স্টাইল ভাঙন একটি "সব-অথবা-কিছুই না" ঘটনা নয়, বরং গেমিং-চাপের মাত্রার সাথে ধারাবাহিকভাবে বদলায়।

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

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