এক্সপ্লেনেশনের ধরন — গ্লোবাল, লোকাল, কন্ট্রাস্টিভ ও উদাহরণ-ভিত্তিক
এই পাঠে যা শিখবেন
- এক্সপ্লেনেশনের চারটি ধরন — গ্লোবাল, লোকাল, কন্ট্রাস্টিভ, উদাহরণ-ভিত্তিক — এবং তাদের মধ্যে পার্থক্য
- কীভাবে একই আন্ডারলাইং মডেল থেকে চার ধরনের ব্যাখ্যাই প্রকৃতপক্ষে গণনা করা যায়
- একটি সত্যিকারের কোড উদাহরণ — একই ঋণ-আবেদনের সিদ্ধান্ত চার ধরনের ব্যাখ্যায় দেখা
- কোন প্রশ্নের জন্য কোন ধরনের এক্সপ্লেনেশন সবচেয়ে উপযুক্ত তা বেছে নেওয়ার একটি ব্যবহারিক নির্দেশনা
১ · চার ধরনের এক্সপ্লেনেশন — সংক্ষেপে
সিস্টেমটি সামগ্রিকভাবে কীভাবে কাজ করে — কোন ফিচারগুলো সাধারণভাবে সবচেয়ে বেশি গুরুত্বপূর্ণ। প্রশ্ন: "সিস্টেমটি সাধারণত কীভাবে সিদ্ধান্ত নেয়?"
এই একটি নির্দিষ্ট সিদ্ধান্তের জন্য কোন ফিচারগুলো সবচেয়ে বেশি প্রভাব ফেলেছে। প্রশ্ন: "আমার ক্ষেত্রে ঠিক কেন এটা হলো?"
কেন এই ফলাফল, অন্য একটি নির্দিষ্ট ফলাফল নয়। প্রশ্ন: "কী বদলালে ফলাফল অন্যরকম হতো?"
একইরকম প্রোফাইলের অতীত কেসগুলোর কী হয়েছিল। প্রশ্ন: "আমার মতো অন্য কারো ক্ষেত্রে কী হয়েছিল?"
নিচের কোডে যে গণনাগুলো ব্যবহার করা হয়েছে (ওয়েট-ভিত্তিক অবদান, বেসলাইনের সাথে তুলনা, দূরত্ব) সেগুলো একটি সরলীকৃত, স্বচ্ছ উদাহরণ — বাস্তব SHAP/LIME-এর মতো টেকনিকের গাণিতিক বিস্তারিত AI Ethics কোর্সে আছে। এখানে লক্ষ্য হলো ধারণাটি দেখানো: একই মডেল থেকে চার ধরনের ভিন্ন, উভয়ই সঠিক ব্যাখ্যা বের করা সম্ভব।
২ · একই সিদ্ধান্ত, দুই ভাবে — গ্লোবাল ও লোকাল
একটি সরল ঋণ-অনুমোদন স্কোরিং মডেল কল্পনা করা যাক — চারটি ফিচার (আয়, ক্রেডিট-ব্যবহারের হার, সাম্প্রতিক বিলম্বিত-পেমেন্ট, অ্যাকাউন্টের বয়স), প্রতিটির একটি ওয়েট। স্কোর ০-এর বেশি বা সমান হলে অনুমোদিত, নাহলে প্রত্যাখ্যাত। নিচের কোডে আবেদনকারী X-এর জন্য মডেলটি চালিয়ে গ্লোবাল ও লোকাল দুই ধরনের ব্যাখ্যাই বের করা হয়েছে।
weights = {
"income": 0.4,
"credit_utilization": -0.5,
"late_payments": -0.3,
"account_age": 0.1,
}
bias = -0.05
baseline = {"income": 0.5, "credit_utilization": 0.4, "late_payments": 0.1, "account_age": 0.5}
applicant_x = {"income": 0.6, "credit_utilization": 0.8, "late_payments": 0.4, "account_age": 0.3}
def score(features):
return bias + sum(weights[f] * features[f] for f in weights)
score_x = score(applicant_x)
decision = "অনুমোদিত" if score_x >= 0 else "প্রত্যাখ্যাত"
print(f"আবেদনকারী X-এর স্কোর: {score_x:.2f} -> সিদ্ধান্ত: {decision}")
# --- গ্লোবাল এক্সপ্লেনেশন: মডেল সামগ্রিকভাবে কীভাবে কাজ করে ---
print("\nগ্লোবাল এক্সপ্লেনেশন (ওয়েট অনুযায়ী গুরুত্বের ক্রম):")
for feat, w in sorted(weights.items(), key=lambda kv: abs(kv[1]), reverse=True):
direction = "ইতিবাচক" if w > 0 else "নেতিবাচক"
print(f" {feat}: ওয়েট {w:+.2f} ({direction} প্রভাব)")
# --- লোকাল এক্সপ্লেনেশন: এই নির্দিষ্ট আবেদনকারীর জন্য কেন এই সিদ্ধান্ত ---
contributions = {f: weights[f] * (applicant_x[f] - baseline[f]) for f in weights}
baseline_score = score(baseline)
print("\nলোকাল এক্সপ্লেনেশন (এই আবেদনকারীর জন্য প্রতিটি ফিচারের প্রকৃত অবদান, বেসলাইনের তুলনায়):")
for feat, c in sorted(contributions.items(), key=lambda kv: abs(kv[1]), reverse=True):
print(f" {feat}: {c:+.3f}")
print(f" বেসলাইন (গড় আবেদনকারী) স্কোর: {baseline_score:.3f}")
print(f" বেসলাইন স্কোর + মোট অবদান = {baseline_score:.3f} + ({sum(contributions.values()):+.3f}) = {baseline_score + sum(contributions.values()):.3f} (X-এর প্রকৃত স্কোরের সমান)")
credit_utilization-ই সবচেয়ে বড় ওয়েটের ফিচার (-০.৫০) — এটি সিস্টেম সম্পর্কে একটি
সাধারণ সত্য, এই আবেদনকারী সম্পর্কে নির্দিষ্ট কিছু নয়। লোকাল এক্সপ্লেনেশন ভিন্ন কথা বলে: এই নির্দিষ্ট
আবেদনকারীর জন্য credit_utilization-এর প্রকৃত অবদান -০.২০০ (গড় আবেদনকারীর
তুলনায় তার ব্যবহারের হার বেশি হওয়ায়), যা তার প্রত্যাখ্যানের সবচেয়ে বড় একক কারণ — কিন্তু income
আসলে সামান্য ইতিবাচক অবদান রেখেছে (+০.০৪০)। গ্লোবাল ব্যাখ্যা "সিস্টেমের ধরন" বলে, লোকাল ব্যাখ্যা "এই ব্যক্তির
গল্প" বলে — দুটোই সঠিক, কিন্তু ভিন্ন প্রশ্নের উত্তর।
৩ · কন্ট্রাস্টিভ ও উদাহরণ-ভিত্তিক ব্যাখ্যা
আবেদনকারী X হয়তো জিজ্ঞাসা করবেন "আমি কী করলে অনুমোদিত হতাম?" (কন্ট্রাস্টিভ) অথবা "আমার মতো অন্য কারো কী হয়েছিল?" (উদাহরণ-ভিত্তিক)। নিচের কোডে একই মডেল ও একই আবেদনকারীর জন্য এই দুই ধরনের ব্যাখ্যাও বের করা হয়েছে।
import math
weights = {
"income": 0.4,
"credit_utilization": -0.5,
"late_payments": -0.3,
"account_age": 0.1,
}
bias = -0.05
baseline = {"income": 0.5, "credit_utilization": 0.4, "late_payments": 0.1, "account_age": 0.5}
applicant_x = {"income": 0.6, "credit_utilization": 0.8, "late_payments": 0.4, "account_age": 0.3}
# --- কন্ট্রাস্টিভ এক্সপ্লেনেশন: "এই সিদ্ধান্ত কেন, ওই সিদ্ধান্ত নয়?" ---
# শুধু credit_utilization পরিবর্তন করলে সিদ্ধান্ত পাল্টাতে কত মান দরকার (বাকি সব ফিচার অপরিবর্তিত)?
other_sum = bias + sum(weights[f] * applicant_x[f] for f in weights if f != "credit_utilization")
threshold_value = -other_sum / weights["credit_utilization"]
new_score = other_sum + weights["credit_utilization"] * threshold_value
print("কন্ট্রাস্টিভ এক্সপ্লেনেশন:")
print(f" আবেদনকারী X-এর credit_utilization = {applicant_x['credit_utilization']}")
print(f" যদি এটি {threshold_value:.2f} বা তার কম হতো (অন্য সব ফিচার একই থাকলে), স্কোর হতো {new_score:.2f}")
print(f" -> অর্থাৎ অনুমোদিত হতো, প্রত্যাখ্যাত নয়।")
# --- উদাহরণ-ভিত্তিক এক্সপ্লেনেশন: সবচেয়ে কাছাকাছি অতীত কেস ---
past_applicants = [
{"name": "A", "income": 0.55, "credit_utilization": 0.75, "late_payments": 0.35, "account_age": 0.32, "outcome": "প্রত্যাখ্যাত"},
{"name": "B", "income": 0.65, "credit_utilization": 0.30, "late_payments": 0.05, "account_age": 0.60, "outcome": "অনুমোদিত"},
{"name": "C", "income": 0.20, "credit_utilization": 0.90, "late_payments": 0.50, "account_age": 0.10, "outcome": "প্রত্যাখ্যাত"},
{"name": "D", "income": 0.60, "credit_utilization": 0.85, "late_payments": 0.45, "account_age": 0.28, "outcome": "প্রত্যাখ্যাত"},
]
def distance(a, b):
return math.sqrt(sum((a[f] - b[f]) ** 2 for f in weights))
print("\nউদাহরণ-ভিত্তিক এক্সপ্লেনেশন (নিকটতম অতীত কেসসমূহ, দূরত্বের ক্রমে):")
ranked = sorted(past_applicants, key=lambda p: distance(p, applicant_x))
for p in ranked:
print(f" আবেদনকারী {p['name']}: দূরত্ব {distance(p, applicant_x):.4f}, ফলাফল ছিল {p['outcome']}")
nearest = ranked[0]
print(f"\n -> সবচেয়ে কাছাকাছি: আবেদনকারী {nearest['name']} ({nearest['outcome']}) -- একইরকম প্রোফাইলের অতীত আবেদনকারীও {nearest['outcome']} হয়েছিলেন।")
credit_utilization (০.৮০) যদি ০.২০ বা তার কম
হতো, স্কোর ০.০০-এ পৌঁছাত এবং সিদ্ধান্ত অনুমোদিত হতো — এটি সরাসরি একটি কার্যকর পদক্ষেপ দেখায়।
উদাহরণ-ভিত্তিক ব্যাখ্যা দেখায়: সবচেয়ে কাছাকাছি প্রোফাইলের অতীত আবেদনকারী D (দূরত্ব মাত্র
~০.০৭), যিনিও প্রত্যাখ্যাত হয়েছিলেন — এটি X-এর সিদ্ধান্তকে একটি বাস্তব, তুলনাযোগ্য প্রসঙ্গ
দেয়। লক্ষ্য করুন — লোকাল এক্সপ্লেনেশন যা বলেছিল (credit_utilization-ই মূল কারণ), কন্ট্রাস্টিভ ও
উদাহরণ-ভিত্তিক ব্যাখ্যা দুটোই তার সাথে সামঞ্জস্যপূর্ণ — চারটি ব্যাখ্যাই একই অন্তর্নিহিত গল্প বলছে, শুধু ভিন্ন
কোণ থেকে।
৪ · কখন কোনটি ব্যবহার করবেন
গ্লোবাল এক্সপ্লেনেশন উপযোগী — পুরো সিস্টেমের প্যাটার্ন বা পক্ষপাত বোঝার জন্য।
লোকাল এক্সপ্লেনেশন উপযোগী — "আমার ক্ষেত্রে কেন" প্রশ্নের সরাসরি উত্তর।
কন্ট্রাস্টিভ এক্সপ্লেনেশন সবচেয়ে কার্যকর — এটি সরাসরি বলে দেয় কী বদলালে ফলাফল বদলাবে।
উদাহরণ-ভিত্তিক ব্যাখ্যা ভরসাযোগ্য মনে হয় — এটি দেখায় সিদ্ধান্তটি একটি বিচ্ছিন্ন ঘটনা নয়, বরং একটি সামঞ্জস্যপূর্ণ প্যাটার্নের অংশ।
"সঠিক এক্সপ্লেনেশন" বলে একক কিছু নেই — একই সিদ্ধান্তের জন্য চার ধরনের ব্যাখ্যাই একসাথে সত্য হতে পারে। ভালো এক্সপ্লেইনেবিলিটি ডিজাইনের কাজ হলো ব্যবহারকারী ঠিক কী জানতে চাইছেন তা চিনে সঠিক ধরনের ব্যাখ্যাটি সঠিক সময়ে দেখানো — শুধু একটি প্রযুক্তিগতভাবে উপলব্ধ ব্যাখ্যা যা-ই থাকুক তা দেখিয়ে দেওয়া নয়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
গ্লোবাল এক্সপ্লেনেশন বলছিল সবচেয়ে গুরুত্বপূর্ণ ফিচার credit_utilization, আর লোকাল
এক্সপ্লেনেশনও তাই বলল। এটি কি সবসময় এভাবে মিলবে?
না, সবসময় মিলবে না। গ্লোবাল ওয়েট মডেলের সামগ্রিক প্যাটার্ন দেখায়, কিন্তু একজন নির্দিষ্ট আবেদনকারীর জন্য
তার ফিচারের মান বেসলাইন থেকে কতটা দূরে তার উপরও লোকাল অবদান নির্ভর করে। উদাহরণস্বরূপ, যদি আবেদনকারী X-এর
income বেসলাইনের চেয়ে অনেক বেশি হতো, তাহলে সামান্য ওয়েট (০.৪) হলেও এর লোকাল অবদান
credit_utilization-কে ছাড়িয়ে যেতে পারত — এই ক্ষেত্রে দৈবক্রমে দুটো মিলে গেছে।
প্র ০২ কন্ট্রাস্টিভ এক্সপ্লেনেশন কেন প্রায়ই সবচেয়ে "কার্যকর" (actionable) ব্যাখ্যা হিসেবে বিবেচিত হয়?
কারণ এটি সরাসরি একটি "যদি-তাহলে" ফরম্যাটে উত্তর দেয় — শুধু কারণ বলে না, বরং বলে দেয় ঠিক কী পরিবর্তন করলে ভিন্ন ফলাফল আসত। এটি ব্যবহারকারীকে একটি নির্দিষ্ট, পরিমাপযোগ্য লক্ষ্য দেয় (যেমন "credit_utilization ০.২০ বা তার নিচে আনুন"), যা শুধু "আপনার credit_utilization বেশি" বলার চেয়ে অনেক বেশি কার্যকর।
প্র ০৩ উদাহরণ-ভিত্তিক ব্যাখ্যার একটি সম্ভাব্য ঝুঁকি কী হতে পারে, যদি "নিকটতম অতীত কেস" আসলে একটি অন্যায্য বা পক্ষপাতদুষ্ট প্যাটার্নের অংশ হয়?
যদি অতীত কেসগুলোর ডেটাসেটেই কোনো পদ্ধতিগত পক্ষপাত থাকে (যেমন একটি নির্দিষ্ট গোষ্ঠীর আবেদনকারীরা ঐতিহাসিকভাবে অন্যায্যভাবে প্রত্যাখ্যাত হয়েছেন), তাহলে "আপনার মতো অন্যরাও প্রত্যাখ্যাত হয়েছিলেন" দেখানো সেই পক্ষপাতকে বৈধতা দেওয়ার মতো শোনাতে পারে, যদিও আসলে তা ন্যায্যতার প্রমাণ নয় — এটি নিছক সামঞ্জস্যতার প্রমাণ। ন্যায্যতা ও পক্ষপাত-বিশ্লেষণের গভীর আলোচনা AI Ethics কোর্সে আছে।
অনুশীলন
-
চিন্তা করুন: দ্বিতীয় কোড সেলে যদি আবেদনকারী X-এর
late_payments-কে0.0-এ পরিবর্তন করা হয় (বাকি সব একই রেখে) এবং নতুন করে স্কোর গণনা করা হয়, আপনার কি মনে হয় এটি একাই সিদ্ধান্তকে "অনুমোদিত"-এ পাল্টে দেবে?অনুমান করা যেতে পারে যে যেহেতু
late_payments-এর লোকাল অবদান ছিল -০.০৯০ (মাঝারি মাপের), এটি একাই পুরো -০.৩০ ঘাটতি পূরণ করতে পারবে না — আসল সিদ্ধান্ত এখনও প্রত্যাখ্যাতই থাকবে বলে অনুমান করা যুক্তিসঙ্গত। -
পরীক্ষা করুন: প্রথম কোড সেলে
applicant_x-এর"late_payments": 0.4-কে"late_payments": 0.1-এ (অর্থাৎ বেসলাইনের সমান) পরিবর্তন করে নতুনscore_xদেখুন।late_payments-কে বেসলাইনের (০.১) সমান করলে সেই ফিচারের অবদান শূন্য হয়ে যায়, এবং নতুন স্কোর হয় -০.৩০ + ০.০৯ = -০.২১ — এখনও ঋণাত্মক, অর্থাৎ এখনও প্রত্যাখ্যাত। এটি ঠিক অনুমান ১-কে নিশ্চিত করে: একটি মাঝারি-অবদানকারী ফিচার ঠিক করলেও, প্রধান কারণ (credit_utilization, -০.২০ অবদান) না বদলালে সিদ্ধান্ত পাল্টায় না — এটাই কন্ট্রাস্টিভ এক্সপ্লেনেশনের গুরুত্ব দেখায়: এটি সঠিকভাবে চিহ্নিত করে ঠিক কোন ফিচার বদলানো দরকার।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কনফিডেন্স ও আনসার্টেইনটি কমিউনিকেশন ডিজাইন পরবর্তী পাঠ একটি সংখ্যাসূচক কনফিডেন্স স্কোরকে ব্যবহারকারীর জন্য বোধগম্য ভাষায় রূপান্তর করা।
- কেন এক্সপ্লেইনেবিলিটি একটি UX সমস্যা, শুধু টেকনিক্যাল নয় আগের পাঠ কেন টেকনিক্যালি-সঠিক ব্যাখ্যাও UX হিসেবে ব্যর্থ হতে পারে।
- AI Ethics কোর্স সহোদর কোর্স LIME, SHAP-এর মতো টেকনিক্যাল XAI পদ্ধতির গভীর গাণিতিক কভারেজ।