এই পর্বে যা শিখবেন
- Expected value আর expected utility দিয়ে একটি ব্যবসায়িক সিদ্ধান্ত হিসাব করা, আর ঝুঁকি এড়ানো, certainty equivalent ও risk premium সহজ ভাষায় বোঝা
- Decision node আর chance node সহ decision tree এঁকে হাতে ও recursive কোডে পেছন থেকে হিসাব (rollback) করা
- নিখুঁত তথ্যের দাম (EVPI) আর sensitivity analysis দিয়ে বোঝা, কোন সংখ্যা বদলালে সিদ্ধান্ত উল্টে যায়
- Markov decision process লেখা, Bellman equation পড়া, আর value iteration হাতে দুই sweep ও কোডে convergence পর্যন্ত চালানো
- Policy iteration-এর সঙ্গে তুলনা, γ আর step cost-এর প্রভাব, আর POMDP ও reinforcement learning-এর দিকে সেতু
মডিউল ৯-এর এটি শেষ পর্ব, আর এখানেই কোর্সের classical AI-এর অর্ধেক শেষ হচ্ছে। আগের চার পর্বে শিখেছি অনিশ্চয়তায় বিশ্বাস হালনাগাদ করা: Bayes-এর উপপাদ্য (পর্ব ৫০), Naive Bayes (পর্ব ৫১), Bayesian network (পর্ব ৫২) আর Markov model (পর্ব ৫৩)। কিন্তু বৃষ্টির সম্ভাবনা ৭০% জানার পরও ঠিক করতে হয় ছাতা নেবেন কি না। এই পর্ব সেই শেষ ধাপের: সম্ভাবনা থেকে সিদ্ধান্ত। উদাহরণ আবার বাজারঘর, এই কোর্সের কাল্পনিক অনলাইন দোকান; সব দাম, চাহিদা আর সম্ভাবনা বানানো সংখ্যা, কোনো আসল দোকানের নয়। চালানো যায় এমন ব্লকগুলো পাতাতেই চলে (ব্রাউজারের Python, NumPy 2.4.6, matplotlib 3.10.8); প্রথমবার package নামতে কয়েক সেকেন্ড লাগতে পারে।
১ · বিশ্বাস থেকে কাজ — rational agent কীভাবে বেছে নেয়
পর্ব ১-এ এই কোর্সের কাজের সংজ্ঞা ছিল: AI হলো এমন agent বানানো, যে পরিবেশ দেখে এমন কাজ বেছে নেয় যাতে একটি মাপকাঠিতে প্রত্যাশিত ফল সবচেয়ে ভালো হয়। সেখানে মেট্রো, CNG আর বাসের একটি ছোট উদাহরণে utility-based agent দেখেছিলেন। “প্রত্যাশিত” শব্দটির পুরো অর্থ এবার খুলে দেখা যাক।
যেকোনো সিদ্ধান্তে তিনটি উপাদান থাকে:
- কাজ (action): আপনি যা বেছে নিতে পারেন। যেমন ঈদের আগে ১০০ পিস পাঞ্জাবি আনবেন, না ২০০ পিস।
- অবস্থা (state of the world): যা আপনার হাতে নেই, কিন্তু ফল ঠিক করে। যেমন এবার চাহিদা বেশি হবে, না কম। এর ওপর আপনার বিশ্বাস একটি সম্ভাবনা, যা আগের পর্বগুলোর হাতিয়ার দিয়ে ডেটা থেকে আসে।
- ফল (outcome) আর তার utility: প্রতিটি কাজ আর অবস্থার জোড়ায় কী ঘটে, আর সেটি আপনার কাছে কতটা ভালো।
এই তিনটি জানা থাকলে নিয়মটি এক লাইনের:
EU(a) = ∑s P(s) · U(a, s), সিদ্ধান্ত = argmaxa EU(a)
এখানে a একটি কাজ, s জগতের একটি অবস্থা, P(s) সেই অবস্থার সম্ভাবনা, U(a, s) সেই জোড়ার utility, আর ∑ মানে সব অবস্থার ওপর যোগ। argmax মানে “যে a-তে মান সবচেয়ে বড়, সেই a”. একে বলে maximum expected utility নীতি (সংক্ষেপে MEU). Russell ও Norvig-এর বই rational agent-কে এভাবেই সংজ্ঞায়িত করে।
চায়ের দোকানের মালিক সকালে ঠিক করেন কত লিটার দুধ আনবেন। বৃষ্টি হলে বিক্রি বেশি, রোদ হলে কম। তিনি সম্ভাবনার সূত্র জানেন না, কিন্তু মাথায় ঠিক এই হিসাবটিই চলে: “আজ বৃষ্টির সম্ভাবনা বেশি, দুধ বেশি আনলে লাভ, না বিকলে দুধ নষ্ট হলে ক্ষতি কত?”
এ পর্যন্ত কোর্সের বেশিরভাগ AI ধরে নিয়েছিল কাজের ফল নিশ্চিত। Search-এ (মডিউল ৭) “বাঁয়ে যাওয়া” মানে নিশ্চিতভাবে বাঁয়ের ঘরে পৌঁছানো, আর পর্ব ৪৯-এর STRIPS planning-এও প্রতিটি action deterministic. ব্যতিক্রম ছিল পর্ব ৪২-এর লুডুর মতো খেলা, যেখানে chance node এসেছিল। বাস্তব জগৎ প্রায়ই stochastic: রাস্তা বন্ধ থাকতে পারে, গ্রাহক বাসায় না-ও থাকতে পারেন।
২ · Expected value — ঈদের আগে ১০০ না ২০০ পিস
বাজারঘর ঈদের আগে একটি পাঞ্জাবি বিক্রি করবে (সব সংখ্যা কাল্পনিক)। প্রতিটির কেনা দাম ৬০০ টাকা, বিক্রি ১০০০ টাকা। ঈদের পরে যা বাঁচবে, তা ২০০ টাকায় ছেড়ে দিতে হবে। চাহিদা নিয়ে দুটি সম্ভাবনা: বেশি চাহিদা (২০০ জন কিনতে চাইবেন) সম্ভাবনা ০.৬, কম চাহিদা (মাত্র ৮০ জন) সম্ভাবনা ০.৪. আনার সিদ্ধান্ত ঈদের আগেই নিতে হবে।
প্রথমে প্রতিটি জোড়ার লাভ হাতে হিসাব করি:
- ১০০ পিস, বেশি চাহিদা: সব বিক্রি, ১০০ × (১০০০ − ৬০০) = ৪০,০০০ টাকা।
- ১০০ পিস, কম চাহিদা: ৮০টি ১০০০ টাকায়, বাকি ২০টি ২০০ টাকায়: ৮০,০০০ + ৪,০০০ − ৬০,০০০ = ২৪,০০০ টাকা।
- ২০০ পিস, বেশি চাহিদা: ২০০ × ৪০০ = ৮০,০০০ টাকা।
- ২০০ পিস, কম চাহিদা: ৮০,০০০ + ১২০ × ২০০ − ১,২০,০০০ = −১৬,০০০ টাকা, মানে ক্ষতি।
| কাজ | বেশি চাহিদা (০.৬) | কম চাহিদা (০.৪) | Expected value |
|---|---|---|---|
| ১০০ পিস আনা | ৪০,০০০ | ২৪,০০০ | ০.৬ × ৪০,০০০ + ০.৪ × ২৪,০০০ = ৩৩,৬০০ |
| ২০০ পিস আনা | ৮০,০০০ | −১৬,০০০ | ০.৬ × ৮০,০০০ − ০.৪ × ১৬,০০০ = ৪১,৬০০ |
Expected value (EV) পর্ব ৩৬-এ দেখেছেন: প্রতিটি মানকে তার সম্ভাবনা দিয়ে গুণ করে যোগফল, মানে দীর্ঘ মেয়াদের ওজনসহ গড়। লাভকেই utility ধরলে, মানে টাকার প্রতিটি অঙ্ক সমান মূল্যবান ধরলে, ২০০ পিস আনা ভালো: প্রত্যাশিত লাভ ৮,০০০ টাকা বেশি। এভাবে শুধু EV দেখে সিদ্ধান্ত নেওয়াকে বলে risk-neutral আচরণ।
EV ৪১,৬০০ টাকা মানে এই ঈদে ঠিক ৪১,৬০০ টাকা লাভ হবে, তা নয়। এই ঈদে হবে হয় ৮০,০০০, নয় −১৬,০০০. EV হলো একই পরিস্থিতি বহুবার ঘটলে গড় ফল। যে দোকান শত শত পণ্যে এমন সিদ্ধান্ত নেয়, তার জন্য EV ভালো পথনির্দেশ; যার একটি খারাপ মৌসুমেই ব্যবসা বন্ধ হতে পারে, তার জন্য নয়।
৩ · Expected value যথেষ্ট নয় — ঝুঁকি, utility আর certainty equivalent
ধরুন বাজারঘর ছোট, ঈদের আগে হাতে নগদ মাত্র ২০,০০০ টাকা (ধার করে মাল তোলা হবে, ঈদের পরে শোধ)। ২০০ পিস এনে চাহিদা কম হলে হাতে থাকবে ৪,০০০ টাকা; অন্যদিকে নগদ ২,০০,০০০ টাকার একটি বড় দোকানের কাছে ১৬,০০০ টাকার ক্ষতি সহ্য করার মতো। একই EV, কিন্তু দুই দোকানের কাছে ঝুঁকির ওজন আলাদা। এই অনুভূতির নাম risk aversion: একই গড় হলে মানুষ অনিশ্চিত ফলের চেয়ে নিশ্চিত ফল পছন্দ করেন।
টাকার utility বাঁকা
প্রথম ১০,০০০ টাকা যতটা কাজে লাগে (ভাড়া, খাবার), দশম লাখের পরের ১০,০০০ টাকা ততটা নয়। তাই টাকা থেকে utility-র লেখচিত্র সোজা রেখা নয়, ধীরে ধীরে চ্যাপ্টা হয়ে আসা একটি বাঁক, যাকে বলে concave function. সবচেয়ে পরিচিত দুটি রূপ হলো log আর বর্গমূল: U(w) = ln(w) বা U(w) = √w, যেখানে w হলো সিদ্ধান্তের পরে হাতে থাকা মোট টাকা।
ছোট দোকানের জন্য হাতে হিসাব (নগদ ২০,০০০):
- ১০০ পিস: শেষে ৬০,০০০ বা ৪৪,০০০ টাকা। EU = ০.৬ × ln ৬০,০০০ + ০.৪ × ln ৪৪,০০০ ≈ ০.৬ × ১১.০০২ + ০.৪ × ১০.৬৯২ ≈ ১০.৮৭৮.
- ২০০ পিস: শেষে ১,০০,০০০ বা ৪,০০০ টাকা। EU = ০.৬ × ১১.৫১৩ + ০.৪ × ৮.২৯৪ ≈ ১০.২২৫.
EU-তে ১০০ পিস জেতে। log-এ ৪,০০০ টাকার মান খুব ছোট, কারণ শূন্যের কাছে log দ্রুত নিচে নামে; বড় ক্ষতির ভয় হিসাবে ঢুকে গেছে।
Certainty equivalent আর risk premium
EU-র একক (log-টাকা) কারও কাছে অর্থবহ নয়। তাই উল্টো প্রশ্ন করি: কত টাকা নিশ্চিত পেলে দোকানটি এই জুয়ার সমান খুশি হতো? এটিই certainty equivalent (CE): U(নগদ + CE) = EU. log-এর জন্য CE = eEU − নগদ. আর EV − CE হলো risk premium: অনিশ্চয়তা এড়াতে আপনি গড়ে যতটা লাভ ছেড়ে দিতে রাজি। মানুষ যে গড়ের চেয়ে বেশি প্রিমিয়াম দিয়েও বীমা কেনেন, তার ব্যাখ্যা এখানেই।
import math
# বাজারঘর, ঈদের পাঞ্জাবি (কাল্পনিক): কেনা 600, বিক্রি 1000, ঈদের পরে বাকিটা 200 টাকা
# লাভ পয়সায় (integer), যাতে টাকার হিসাবে float-এর গোলমাল না ঢোকে
profit = {100: {"high": 40_000_00, "low": 24_000_00},
200: {"high": 80_000_00, "low": -16_000_00}}
prob = {"high": 0.6, "low": 0.4}
def taka(paisa):
return f"{paisa / 100:,.2f}"
def ev(q):
return sum(prob[d] * profit[q][d] for d in prob)
for q in profit:
print(f"stock {q}: EV = {taka(ev(q))} taka")
for cash in (20_000_00, 200_000_00): # ঈদের আগে দোকানের নগদ টাকা
print(f"\nstarting cash {taka(cash)} taka, utility = log(cash after Eid)")
for q in profit:
eu = sum(prob[d] * math.log((cash + profit[q][d]) / 100) for d in prob)
ce = round(math.exp(eu) * 100) - cash # certainty equivalent, paisa
print(f" stock {q}: EU = {eu:.4f} CE = {taka(ce)} "
f"risk premium = {taka(ev(q) - ce)}")
best = max(ev(q) for q in profit)
perfect = sum(prob[d] * max(profit[q][d] for q in profit) for d in prob)
print("\nEV with a perfect forecast =", taka(perfect), "taka")
print("value of perfect information =", taka(perfect - best), "taka")আসল আউটপুট (ব্রাউজারের Python):
stock 100: EV = 33,600.00 taka
stock 200: EV = 41,600.00 taka
starting cash 20,000.00 taka, utility = log(cash after Eid)
stock 100: EU = 10.8780 CE = 32,999.51 risk premium = 600.49
stock 200: EU = 10.2254 CE = 7,594.59 risk premium = 34,005.41
starting cash 200,000.00 taka, utility = log(cash after Eid)
stock 100: EU = 12.3608 CE = 33,467.24 risk premium = 132.76
stock 200: EU = 12.3746 CE = 36,712.91 risk premium = 4,887.09
EV with a perfect forecast = 57,600.00 taka
value of perfect information = 16,000.00 taka
ছোট দোকানের কাছে ২০০ পিসের জুয়ার CE মাত্র ৭,৫৯৪.৫৯ টাকা: নিশ্চিত ৭,৬০০ টাকার মতো পেলেই সে এই ঝুঁকি ছেড়ে দিত, যদিও গড় লাভ ৪১,৬০০. Risk premium ৩৪,০০৫.৪১ টাকা। ১০০ পিসের CE ৩২,৯৯৯.৫১, তাই ছোট দোকান ১০০ পিস বাছবে। বড় দোকানের কাছে ২০০ পিসের CE ৩৬,৭১২.৯১ টাকা, যা ১০০ পিসের ৩৩,৪৬৭.২৪-এর চেয়ে বেশি, তাই সে ২০০ পিস বাছবে। একই সম্ভাবনা, একই utility-র ধরন, শুধু হাতের নগদ আলাদা, আর সিদ্ধান্ত উল্টে গেছে। বড় সম্পদের কাছে log-এর বাঁক প্রায় সোজা, তাই risk premium ছোট। শেষ দুই লাইন অংশ ৫-এর বিষয়।
টাকা পয়সায় integer; শুধু সম্ভাবনার গুণ আর log-এ float, আর CE পয়সায় round করা।
St Petersburg paradox: একটি মুদ্রা head না আসা পর্যন্ত ছোড়া হয়; k-তম টসে প্রথম head এলে আপনি 2k টাকা পান। EV = ½ × ২ + ¼ × ৪ + ⅛ × ৮ + … = ১ + ১ + ১ + …, অসীম। তবু কেউ এই খেলায় ঢুকতে কয়েক টাকার বেশি দিতে চান না। প্রশ্নটি Nicolaus Bernoulli ১৭১৩ সালের একটি চিঠিতে তোলেন বলে প্রচলিত, আর তাঁর চাচাতো ভাই Daniel Bernoulli ১৭৩৮ সালে সেন্ট পিটার্সবার্গ একাডেমির পত্রিকায় সমাধান প্রস্তাব করেন: মানুষ টাকার মান নয়, তার utility-র গড় দেখে, আর utility বাড়ে মোটামুটি log-এর মতো। তিনি নিজেই উল্লেখ করেন, Gabriel Cramer ১৭২৮ সালের দিকে কাছাকাছি একটি ধারণা দিয়েছিলেন। আগের সম্পদ উপেক্ষা করে U = ln(x) ধরলে E[ln X] = ∑ k ln 2 / 2k = 2 ln 2, তাই CE = 4 টাকা: অসীম EV-র খেলার “ন্যায্য দাম” মাত্র ৪ টাকা।
দুশো বছর পরে John von Neumann আর Oskar Morgenstern তাঁদের Theory of Games and Economic Behavior বইয়ের দ্বিতীয় সংস্করণে (১৯৪৭) দেখান: কারও পছন্দ কয়েকটি যুক্তিসঙ্গত শর্ত মানলে, তাঁর আচরণ কোনো একটি utility function-এর expected utility সর্বোচ্চ করার মতো করে বর্ণনা করা যায়। এই von Neumann–Morgenstern axiom-গুলো সাধারণত চার নামে বলা হয়: completeness, transitivity, continuity আর independence; বিভিন্ন বইয়ে এদের রূপ আর সংখ্যা কিছুটা আলাদা। মূল কথা: MEU খেয়ালি সূত্র নয়, সুসংগত পছন্দের পরিণতি। মানুষ সবসময় এই শর্ত মানেন কি না, তা ভাবনার প্রশ্ন ২-এ দেখবেন।
৪ · Decision tree — সিদ্ধান্ত আর সম্ভাবনার গাছ, পেছন থেকে হিসাব
বাস্তবে সিদ্ধান্ত প্রায়ই একটির পর একটি আসে। বাজারঘরের মার্কেটিং দল প্রস্তাব দিল: ঈদের আগে “ফ্রি ডেলিভারি” প্রচার চালানো হোক। এতে খরচ ১০,০০০ টাকা (ডেলিভারি চার্জ দোকান বহন করবে), কিন্তু বেশি চাহিদার সম্ভাবনা ০.৬ থেকে বেড়ে ০.৮ হবে বলে তাঁদের অনুমান (কাল্পনিক)। প্রচারের সিদ্ধান্ত আগে, তারপর stock-এর সিদ্ধান্ত, তারপর চাহিদা জানা যাবে।
এমন ক্রমের সিদ্ধান্ত আঁকা হয় decision tree দিয়ে। (Machine learning-এর decision tree আলাদা জিনিস।) গাছে দুই ধরনের node:
- Decision node (বর্গ ■): এখানে আপনি বেছে নেন। এর মান = শাখাগুলোর মানের মধ্যে সবচেয়ে বড় (শাখার খরচ বাদ দিয়ে)।
- Chance node (বৃত্ত ●): এখানে জগৎ “বেছে নেয়”. এর মান = শাখাগুলোর সম্ভাবনা-ওজনসহ গড়, ঠিক পর্ব ৪২-এর expectiminimax-এর chance node-এর মতো, শুধু এখানে কোনো প্রতিপক্ষ নেই।
হিসাব চলে পাতা থেকে গোড়ার দিকে, পেছন দিকে; একে বলে rollback বা backward induction. নিচের stepper-এ “পরে” চাপুন।
- গাছ আঁকা। বাঁয়ের বর্গ D0 প্রথম সিদ্ধান্ত: প্রচার চালাবেন কি না। হ্যাঁ শাখায় ১০,০০০ টাকা খরচ। তারপর D1 বা D2-তে stock-এর সিদ্ধান্ত, তারপর বৃত্তে চাহিদা, আর ডানে পাতায় অংশ ২-এর লাভ। প্রচার হলে বেশি চাহিদার সম্ভাবনা ০.৮, না হলে ০.৬.
- প্রচারের পরের chance node. C1 (১০০ পিস) = ০.৮ × ৪০,০০০ + ০.২ × ২৪,০০০ = ৩২,০০০ + ৪,৮০০ = ৩৬,৮০০. C2 (২০০ পিস) = ০.৮ × ৮০,০০০ − ০.২ × ১৬,০০০ = ৬৪,০০০ − ৩,২০০ = ৬০,৮০০.
- D1-এ সবচেয়ে বড়টি। প্রচারের পরে আপনি ২০০ পিস বাছবেন, তাই D1 = ৬০,৮০০. সবুজ মোটা দাগ বেছে নেওয়া শাখা দেখায়। এখানে গড় নয়, max, কারণ আপনি নিজেই বাছেন।
- প্রচার ছাড়া। P(high) = ০.৬, তাই C3 = ৩৩,৬০০ আর C4 = ৪১,৬০০, অংশ ২-এর সারণির সঙ্গে হুবহু মেলে।
- D2. প্রচার না হলেও ২০০ পিস ভালো: D2 = ৪১,৬০০.
- গোড়ায়। প্রচারের শাখার মান থেকে খরচ বাদ: ৬০,৮০০ − ১০,০০০ = ৫০,৮০০; প্রচার ছাড়া ৪১,৬০০. তাই সেরা পরিকল্পনা: প্রচার চালান, তারপর ২০০ পিস আনুন; প্রত্যাশিত লাভ ৫০,৮০০ টাকা। এটি risk-neutral হিসাব; ছোট দোকানের জন্য পাতায় টাকার বদলে utility বসাতে হবে।
একই rollback কোডে একটি ছোট recursive function, কারণ গাছের প্রতিটি অংশও একটি গাছ (DSA কোর্সের recursion পর্ব)। Node তিন রকম: leaf (একটি integer, লাভ পয়সায়), chance node আর decision node.
# node: ("decision", name, {choice: (cost, child)}),
# ("chance", name, [(prob, child), ...]), বা leaf = লাভ (পয়সা, int)
def stock(p_high):
return ("decision", f"stock? (P(high)={p_high})", {
"100": (0, ("chance", "demand | 100", [(p_high, 40_000_00), (1 - p_high, 24_000_00)])),
"200": (0, ("chance", "demand | 200", [(p_high, 80_000_00), (1 - p_high, -16_000_00)])),
})
tree = ("decision", "free delivery?", {
"yes": (10_000_00, stock(0.8)), # প্রচারের খরচ 10,000 টাকা
"no": (0, stock(0.6)),
})
def rollback(node, depth=0):
if isinstance(node, int): # leaf
return node
kind, name, branches = node
pad = " " * depth
if kind == "chance": # সম্ভাবনা-ওজনসহ গড়
value = round(sum(p * rollback(child, depth + 1) for p, child in branches))
print(f"{pad}chance {name}: {value / 100:,.0f}")
return value
values = {c: rollback(child, depth + 1) - cost # decision: সবচেয়ে বড়টি
for c, (cost, child) in branches.items()}
best = max(values, key=values.get)
print(f"{pad}decision {name}: choose {best} -> {values[best] / 100:,.0f}")
return values[best]
print("root value:", f"{rollback(tree) / 100:,.0f} taka")আসল আউটপুট:
chance demand | 100: 36,800
chance demand | 200: 60,800
decision stock? (P(high)=0.8): choose 200 -> 60,800
chance demand | 100: 33,600
chance demand | 200: 41,600
decision stock? (P(high)=0.6): choose 200 -> 41,600
decision free delivery?: choose yes -> 50,800
root value: 50,800 taka
ছাপার ক্রমটি লক্ষ করুন: ভেতরের node আগে, গোড়া সবার শেষে। Recursion নিজেই পাতায় নেমে তারপর উঠে আসে। প্রতিটি সংখ্যা stepper-এর সঙ্গে মেলে: D1 = ৬০,৮০০, D2 = ৪১,৬০০, আর গোড়ায় choose yes -> 50,800, কারণ প্রচারের ১০,০০০ টাকা খরচ শাখাতেই বাদ হয়।
৫ · তথ্যের দাম আর sensitivity analysis — পূর্বাভাসের মূল্য কত
একটি কোম্পানি প্রস্তাব দিল: তারা ঈদের আগেই নিশ্চিতভাবে বলে দেবে চাহিদা বেশি হবে না কম, ফি নেবে। কত টাকা পর্যন্ত দেওয়া যুক্তিসঙ্গত? (প্রচার ছাড়া, P(high) = ০.৬ ধরে।)
পূর্বাভাস হাতে থাকলে আপনি প্রতিটি অবস্থার জন্য আলাদা সেরা কাজ বাছতে পারতেন: বেশি চাহিদা শুনলে ২০০ (৮০,০০০), কম শুনলে ১০০ (২৪,০০০)। পূর্বাভাস আসার আগে আপনি জানেন না কোনটি শুনবেন, তাই এর প্রত্যাশিত মান ০.৬ × ৮০,০০০ + ০.৪ × ২৪,০০০ = ৫৭,৬০০. পূর্বাভাস ছাড়া সেরা EV ছিল ৪১,৬০০. পার্থক্যই value of perfect information (EVPI):
EVPI = Es[ maxa U(a, s) ] − maxa Es[ U(a, s) ] = 57,600 − 41,600 = 16,000 টাকা
প্রথম পদে “আগে জেনে তারপর বাছা”, দ্বিতীয় পদে “আগে বেছে তারপর জানা”. অংশ ৩-এর কোডের শেষ দুই লাইন ঠিক এটিই ছেপেছিল। কোনো পূর্বাভাসই নিখুঁত নয়, তাই EVPI হলো একটি ঊর্ধ্বসীমা: ১৬,০০০ টাকার বেশি দাম চাওয়া পূর্বাভাস কখনো লাভজনক নয় (risk-neutral হিসাবে)। ভুল করতে পারে এমন পূর্বাভাসের দাম আরও কম, আর তা Bayes দিয়ে হিসাব হয় (পর্ব ৫০)।
তথ্যের দাম আছে শুধু তখনই, যখন তা সিদ্ধান্ত বদলাতে পারে। চাহিদা যা-ই হোক আপনি যদি একই কাজ করতেন, পূর্বাভাসের দাম শূন্য। এখানে কম চাহিদা শুনলে আপনি ২০০ থেকে ১০০-তে সরে আসতেন, আর সেই ৪০,০০০ টাকার বাঁচানো ক্ষতি (২৪,০০০ − (−১৬,০০০)) ০.৪ সম্ভাবনায় ঘটে: ০.৪ × ৪০,০০০ = ১৬,০০০. পর্ব ৩৮-এর entropy মাপে অনিশ্চয়তা কতটা কমে; EVPI মাপে সেই কমা সিদ্ধান্তে কত টাকার।
Sensitivity analysis — সম্ভাবনা ভুল হলে?
০.৬ সংখ্যাটি একটি অনুমান। এটি ০.৪৫ হলেও কি ২০০ পিসই ঠিক? Sensitivity analysis মানে একটি ইনপুট ধীরে ধীরে বদলে দেখা, সিদ্ধান্ত কোথায় উল্টে যায়। p = P(high) ধরলে দুই কাজের EV দুটি সরলরেখা:
EV100(p) = 24,000 + 16,000p, EV200(p) = −16,000 + 96,000p
দুটি সমান হয় যখন ৪০,০০০ = ৮০,০০০p, মানে p = ০.৫. এই crossover point-এর ওপরে ২০০, নিচে ১০০. আমাদের অনুমান ০.৬ সীমা থেকে মাত্র ০.১ দূরে, তাই সিদ্ধান্তটি “ভঙ্গুর”: সম্ভাবনার অনুমান সামান্য ভুল হলেই সেরা কাজ বদলায়।
import numpy as np
import matplotlib.pyplot as plt
p = np.linspace(0, 1, 101) # P(high demand), 0 থেকে 1
ev100 = p * 40_000 + (1 - p) * 24_000 # টাকা
ev200 = p * 80_000 + (1 - p) * -16_000
best = np.maximum(ev100, ev200)
perfect = p * 80_000 + (1 - p) * 24_000 # আগে চাহিদা জানলে
evpi = perfect - best
# ev100 = ev200 সমীকরণ: 24000 + 16000p = -16000 + 96000p
cross = (24_000 + 16_000) / (96_000 - 16_000)
print("crossover P(high) =", cross)
for q in (0.3, 0.45, 0.6, 0.8):
i = round(q * 100)
pick = "200" if ev200[i] > ev100[i] else "100"
print(f"P(high)={q}: EV100={ev100[i]:,.0f} EV200={ev200[i]:,.0f} "
f"choose {pick} EVPI={evpi[i]:,.0f}")
print("largest EVPI:", f"{evpi.max():,.0f}", "at P(high) =", p[evpi.argmax()])
fig, ax = plt.subplots(figsize=(6.4, 3.6), layout="constrained")
ax.plot(p, ev100 / 1000, label="stock 100")
ax.plot(p, ev200 / 1000, label="stock 200")
ax.plot(p, evpi / 1000, "--", label="value of perfect information")
ax.axvline(cross, color="gray", lw=1)
ax.axhline(0, color="black", lw=0.6)
ax.set_xlabel("P(high demand)")
ax.set_ylabel("thousand taka")
ax.set_title("Sensitivity: Eid stocking decision")
ax.legend(fontsize=8)
plt.show()আসল আউটপুট (ছবির নিচের লেখা অংশ):
crossover P(high) = 0.5
P(high)=0.3: EV100=28,800 EV200=12,800 choose 100 EVPI=12,000
P(high)=0.45: EV100=31,200 EV200=27,200 choose 100 EVPI=18,000
P(high)=0.6: EV100=33,600 EV200=41,600 choose 200 EVPI=16,000
P(high)=0.8: EV100=36,800 EV200=60,800 choose 200 EVPI=8,000
largest EVPI: 20,000 at P(high) = 0.5
ছবিতে দুটি সরলরেখা ধূসর খাড়া দাগে (p = ০.৫) কাটাকাটি করে। ২০০ পিসের রেখা খাড়া, মানে ঝুঁকি বেশি। ০.৪৫-এ ১০০ পিস ৪,০০০ টাকা এগিয়ে, ০.৬-এ ২০০ পিস ৮,০০০ টাকা এগিয়ে। ড্যাশ দেওয়া EVPI-র বাঁকটি তাঁবুর মতো: দুই প্রান্তে শূন্য (p = ০ বা ১ হলে আপনি আগেই নিশ্চিত, পূর্বাভাস কিছু যোগ করে না), আর সর্বোচ্চ ২০,০০০ ঠিক crossover point-এ, যেখানে আপনি সবচেয়ে দোটানায়। সিদ্ধান্ত সীমার কাছে থাকলেই তথ্য কেনা সবচেয়ে লাভজনক।
৬ · ধাপে ধাপে সিদ্ধান্ত — Markov decision process
এবার বাজারঘরের ডেলিভারি রাইডারের কথা ভাবুন। প্রতিটি মোড়ে তিনি ঠিক করেন কোন দিকে যাবেন, আর প্রতিটি সিদ্ধান্তের পরে নতুন জায়গায় নতুন সিদ্ধান্ত। একটি রাস্তা মাঝে মাঝে বন্ধ থাকে (মিছিল, পানি জমা বা খোঁড়াখুঁড়ি); তখন তিনি যেখানে ছিলেন সেখানেই আটকে থাকেন। Decision tree এখানে অসম্ভব বড় হয়, কারণ প্রতিটি ধাপে শাখা গুণ হয় আর রাইডার একই মোড়ে বারবার ফিরতে পারেন।
সেই মডেলের নাম Markov decision process (MDP). এর পাঁচটি অংশ:
- State S: agent কোথায় আছে। এখানে রাইডার কোন ঘরে।
- Action A: প্রতিটি state-এ কী করা যায়। এখানে ^ v > < (উত্তর, দক্ষিণ, পূর্ব, পশ্চিম)।
- Transition probability P(s′ | s, a): s-এ a করলে s′-এ পৌঁছানোর সম্ভাবনা। বন্ধ হতে পারা রাস্তায় ঢুকতে চাইলে ০.৫ সম্ভাবনায় ঢোকা যায়, ০.৫ সম্ভাবনায় একই ঘরে থাকতে হয়।
- Reward R: প্রতিটি ধাপে পাওয়া সংখ্যা। গ্রাহকের কাছে পৌঁছালে +১০, কাছের ছোট একটি অর্ডারে +২, আর প্রতিটি ধাপে সময় আর জ্বালানির খরচ, যাকে বলব step cost (যেমন −০.১)।
- Discount factor γ (গামা), ০ ≤ γ ≤ ১: ভবিষ্যতের reward আজকের তুলনায় কতটা কম মূল্যবান। t ধাপ পরের reward-কে γt দিয়ে গুণ করা হয়। γ = ০.৯ হলে ১০ ধাপ পরের reward-এর ওজন ০.৯১০ ≈ ০.৩৪৯. ছোট γ মানে অধৈর্য agent.
“Markov” শব্দটি একটি অনুমান থেকে: Markov property, মানে ভবিষ্যৎ শুধু বর্তমান state আর action-এর ওপর নির্ভর করে, কীভাবে এখানে এলাম তার ওপর নয়। পর্ব ৫৩-এর Markov chain-এ এটিই ছিল; MDP সেই chain-এ action আর reward যোগ করে। বাস্তবে এটি সরলীকরণ (যানজট কিছুক্ষণ থাকে); দরকার হলে state-এ বাড়তি তথ্য রাখা হয়।
রাইডারের grid MDP
3 × 4 grid: shop S, sometimes-blocked road R, customer G (+10), small order g (+2)
MDP-র উত্তর একটি পথ নয়, একটি policy π: প্রতিটি state-এ কোন action নিতে হবে তার নিয়ম, π(s) = a. কারণ রাস্তা বন্ধ থাকলে রাইডার কোথায় পড়বেন আগে জানা নেই; policy সব জায়গার উত্তর আগেই রাখে। একটি policy কতটা ভালো, তা মাপে value function Vπ(s): s থেকে π মেনে চললে ভবিষ্যতের সব discount করা reward-এর প্রত্যাশিত যোগফল,
Vπ(s) = E[ r1 + γ r2 + γ2 r3 + … | শুরু s, π মেনে ]
লক্ষ্য হলো optimal policy π*, যার মান প্রতিটি state-এ সবচেয়ে বেশি। নাম আর গণিত এসেছে Richard Bellman-এর কাছ থেকে: তাঁর ১৯৫৭ সালের বই Dynamic Programming আর একই বছরের প্রবন্ধ “A Markovian Decision Process”-কে সাধারণত এই কাঠামোর সূচনা ধরা হয়, যদিও sequential decision-এর কাছাকাছি ধারণা তার আগেও ছিল।
৭ · Bellman equation আর value iteration — হাতে দুই sweep
Bellman-এর মূল পর্যবেক্ষণটি সহজ ভাষায়: একটি জায়গার মান = এখনকার সেরা কাজের তাৎক্ষণিক reward + যেখানে গিয়ে পড়বেন সেই জায়গার মানের discount করা গড়। পুরো ভবিষ্যৎ একবারে হিসাব করার দরকার নেই; শুধু এক ধাপ সামনে দেখে বাকিটা পরের state-এর মানের হাতে ছেড়ে দিলেই চলে। সূত্রে, Bellman optimality equation:
V*(s) = maxa ∑s′ P(s′ | s, a) · [ R(s, a, s′) + γ · V*(s′) ]
বন্ধনীর ভেতরের যোগফলটিকে বলে Q-value, Q(s, a): s-এ a করে তারপর সেরাভাবে চললে প্রত্যাশিত মান। তাহলে V*(s) = maxa Q(s, a), আর optimal policy হলো প্রতিটি state-এ সবচেয়ে বড় Q-র action, যাকে বলে greedy policy. এটি অংশ ৪-এর rollback-এরই রূপ (গড় আর max), শুধু গাছের বদলে state-এর জালে।
হাতে হিসাবের মতো একটি ছোট MDP
Grid-এ যাওয়ার আগে দুই state-এর একটি MDP নিই, যা পরীক্ষার খাতায় হাতে করা যায়। রাইডার দোকানে (S). দুটি পথ:
- short (মাঝে মাঝে বন্ধ রাস্তা): ০.৭ সম্ভাবনায় গ্রাহকের কাছে পৌঁছান, reward +১০, কাজ শেষ। ০.৩ সম্ভাবনায় রাস্তা বন্ধ: অপেক্ষার খরচ −১, আবার S-এ।
- long (ঘুরপথ): নিশ্চিতভাবে মোড় M-এ যান, খরচ −১. M থেকে একটিই কাজ, নিশ্চিতভাবে গ্রাহকের কাছে, +১০.
γ = ০.৯. গ্রাহকের ঘর G terminal, তাই V(G) = ০.
দুই state-এর রাইডার MDP
Tiny MDP: from S, "short" reaches G with 0.7 or stays with 0.3; "long" goes to M, then G
Value iteration চলে এভাবে: সব V = ০ দিয়ে শুরু, তারপর প্রতিটি state-এ Bellman equation-এর ডান দিক হিসাব করে নতুন V বানানো। সব state একবার হালনাগাদ করাকে বলে একটি sweep. প্রথম sweep-এ (সব V = ০) Q(S, short) = ০.৭ × ১০ + ০.৩ × (−১) = ৬.৭ আর Q(S, long) = −১, তাই V1(S) = ৬.৭; আর V1(M) = ১০. দ্বিতীয় sweep-এ S-এর হালনাগাদ নিচে ধাপে ধাপে।
Q(s,a) = ∑ P·[R + γ·V(s′)] V(s) = max Q(s,a)
| অংশ | |
| হিসাব | |
| মান |
- আগের sweep-এর মান। Bellman update সবসময় আগের sweep-এর V ব্যবহার করে: V1(S) = ৬.৭, V1(M) = ১০, আর terminal G-এর মান ০.
- short, সফল শাখা। ০.৭ সম্ভাবনায় G-তে পৌঁছে +১০; G terminal, তাই তারপরের মান ০. অবদান ০.৭ × ১০ = ৭.০০০.
- short, বন্ধ শাখা। ০.৩ সম্ভাবনায় −১ আর আবার S, যার আগের মান ৬.৭. অবদান ০.৩ × (−১ + ৬.০৩) = ০.৩ × ৫.০৩ = ১.৫০৯.
- Q(S, short). দুই শাখার যোগফল ৭.০০০ + ১.৫০৯ = ৮.৫০৯. এটি chance node-এর গড়ের মতোই।
- Q(S, long). নিশ্চিতভাবে −১ আর M, যার মান এখন ১০: −১ + ০.৯ × ১০ = ৮.০০০. প্রথম sweep-এ M-এর মান ০ ছিল বলে long-কে −১ দেখাচ্ছিল; মান এক sweep-এ এক ধাপ করে পেছনে ছড়ায়।
- max নেওয়া। V2(S) = max(৮.৫০৯, ৮.০০০) = ৮.৫০৯, আর greedy action short. এটি decision node-এর max.
এভাবে sweep চলতে থাকলে মান স্থির হয়ে আসে, মানে convergence. নিচের stepper-এ প্রতিটি sweep-এর ফল; সংখ্যাগুলো scratch কোডে হিসাব করা, Δ মানে এক sweep-এ কোনো state-এর মানের সবচেয়ে বড় পরিবর্তন। প্রথম sweep-এর পরে V(M) সবসময় ১০.
- শুরু। সব মান ০. যেকোনো শুরু থেকেই একই উত্তরে পৌঁছায় (γ < ১ হলে)।
- Sweep ১। short = ৬.৭০০, long = −১.০০০, তাই V(S) = ৬.৭০০. V(M) ০ থেকে ১০ হলো, তাই Δ = ১০.
- Sweep ২। আগের stepper-এর হিসাব: short = ৮.৫০৯, long = ৮.০০০. এখনো short এগিয়ে, Δ = ১.৮০৯.
- Sweep ৩। short = ৭ + ০.৩ × (−১ + ০.৯ × ৮.৫০৯) = ৮.৯৯৭. Δ = ০.৪৮৮৪.
- Sweep ৪। V(S) = ৯.১২৯, Δ = ০.১৩১৯. খেয়াল করুন, প্রতিবার Δ আগের প্রায় ০.২৭ গুণ: ০.৪৮৮৪ × ০.২৭ ≈ ০.১৩১৯. কারণ শুধু বন্ধ শাখাটি (০.৩) S-এ ফেরে, আর সেটি γ = ০.৯ দিয়ে কমে: ০.৩ × ০.৯ = ০.২৭.
- Sweep ৫। V(S) = ৯.১৬৫, Δ = ০.০৩৫৬. Policy প্রথম sweep থেকেই short; মান স্থির হওয়ার আগেই policy স্থির হয়, যা policy iteration-এর মূল ভাবনা।
- Sweep ৯। Δ = ০.০০০২. Δ একটি ছোট সীমার (tolerance) নিচে নামলে কোড থামে।
- সঠিক মান। short স্থির ধরে সমীকরণ V = ৭ + ০.৩ × (−১ + ০.৯V) = ৬.৭ + ০.২৭V, তাই V = ৬.৭ ÷ ০.৭৩ ≈ ৯.১৭৮. এটি long-এর ৮-এর চেয়ে বেশি, তাই optimal policy: short, যদিও ৩০% সময় অপেক্ষা করতে হয়।
Policy iteration — আগে policy, তারপর তার মান
Policy iteration উল্টো পথে যায়, আর একে সাধারণত Ronald Howard-এর ১৯৬০ সালের বই Dynamic Programming and Markov Processes-এর সঙ্গে যুক্ত করা হয়। দুটি ধাপ পালা করে চলে:
- Policy evaluation: বর্তমান policy স্থির রেখে তার Vπ বের করা। max নেই বলে এটি সরল সমীকরণের সেট।
- Policy improvement: সেই V দিয়ে প্রতিটি state-এ greedy action বাছা। কিছু না বদলালে থামা।
ছোট MDP-তে হাতে: শুরুর policy “long”. Evaluation: V(S) = −১ + ০.৯ × ১০ = ৮. Improvement: Q(S, short) = ৭ + ০.৩ × (−১ + ০.৯ × ৮) = ৭ + ১.৮৬ = ৮.৮৬ > ৮, তাই policy বদলে “short”. আবার evaluation: V(S) = ৯.১৭৮. Improvement: long-এর Q = ৮ < ৯.১৭৮, কিছু বদলায় না, থামা। মাত্র দুই round, যেখানে value iteration-এ নয়টি sweep লেগেছিল; তবে প্রতিটি round-এ একটি পূর্ণ evaluation আছে।
৮ · কোডে value iteration আর policy iteration — γ আর step cost বদলালে
এবার ছবি ৫৪.১-এর grid. নিচের কোডে q_value হলো Bellman equation-এর বন্ধনীর অংশ: একটি দিকে চললে কোথায় পৌঁছান (ম্যাপের বাইরে গেলে যেখানে ছিলেন), R-এ ঢুকতে চাইলে block সম্ভাবনায় আগের ঘরে থাকা, আর প্রতিটি ধাপে step খরচ। Terminal ঘর (G, g) V-তে নেই, তাই তাদের মান ০ ধরা হয় (V.get(t, 0.0)). একই MDP-তে value iteration আর policy iteration চালিয়ে মেলানো হয়েছে, তারপর তিনটি সেটিংয়ে policy কীভাবে বদলায় দেখা হয়েছে। আউটপুটে প্রতিটি ঘরে মান আর greedy action-এর তীর।
GRID = ["....", "S.RG", "g..."] # S দোকান, R মাঝে মাঝে বন্ধ রাস্তা, G গ্রাহক +10, g ছোট অর্ডার +2
END, MOVES = {"G": 10, "g": 2}, {"^": (-1, 0), "v": (1, 0), ">": (0, 1), "<": (0, -1)}
CELLS = [(r, c) for r in range(3) for c in range(4) if GRID[r][c] not in END]
def q_value(V, s, m, gamma, step, block): # Q(s, m): এক ধাপ সামনে দেখে প্রত্যাশিত মান
r, c = s[0] + MOVES[m][0], s[1] + MOVES[m][1]
if not (0 <= r < 3 and 0 <= c < 4): r, c = s # ম্যাপের বাইরে গেলে যেখানে ছিল
outs = [(1 - block, (r, c)), (block, s)] if GRID[r][c] == "R" else [(1.0, (r, c))]
return sum(p * (step + END.get(GRID[t[0]][t[1]], 0) + gamma * V.get(t, 0.0)) for p, t in outs)
def greedy(V, *mdp):
return {s: max(MOVES, key=lambda m: q_value(V, s, m, *mdp)) for s in CELLS}
def value_iteration(*mdp, tol=1e-4):
V = dict.fromkeys(CELLS, 0.0)
for sweep in range(1, 1000):
new = {s: max(q_value(V, s, m, *mdp) for m in MOVES) for s in CELLS}
if max(abs(new[s] - V[s]) for s in CELLS) < tol: return new, sweep
V = new
def policy_iteration(*mdp):
pi = dict.fromkeys(CELLS, "<") # শুরু: সবখানে "বাঁয়ে"
for rounds in range(1, 100):
V = dict.fromkeys(CELLS, 0.0)
for _ in range(300): V = {s: q_value(V, s, pi[s], *mdp) for s in CELLS} # evaluation
new = greedy(V, *mdp) # improvement
if new == pi: return pi, rounds
pi = new
def show(V, pi):
for r in range(3):
print(" ".join(f" {GRID[r][c]} " if GRID[r][c] in END else f"{V[(r, c)]:5.2f}{pi[(r, c)]}" for c in range(4)))
V, sweeps = value_iteration(0.9, -0.1, 0.5)
pi, rounds = policy_iteration(0.9, -0.1, 0.5)
print("VI sweeps:", sweeps, "| PI rounds:", rounds, "| same policy:", pi == greedy(V, 0.9, -0.1, 0.5))
show(V, pi)
for mdp in [(0.5, -0.1, 0.5), (0.9, -3.0, 0.5), (0.9, -0.1, 0.8)]:
V, sweeps = value_iteration(*mdp)
print(f"\ngamma, step, block = {mdp}: {sweeps} sweeps")
show(V, greedy(V, *mdp))আসল আউটপুট:
VI sweeps: 17 | PI rounds: 4 | same policy: True
6.95> 7.83> 8.81> 9.90v
7.03> 7.92> 9.90> G
g 7.83> 8.81> 9.90^
gamma, step, block = (0.5, -0.1, 0.5): 10 sweeps
1.06> 2.33> 4.85> 9.90v
1.90v 3.17> 9.90> G
g 2.33> 4.85> 9.90^
gamma, step, block = (0.9, -3.0, 0.5): 15 sweeps
-3.03> -0.03> 3.30> 7.00v
-1.00v 0.27> 7.00> G
g -0.03> 3.30> 7.00^
gamma, step, block = (0.9, -0.1, 0.8): 6 sweeps
6.95> 7.83> 8.81> 9.90v
6.15^ 6.95^ 9.90> G
g 7.83> 8.81> 9.90^
মূল সেটিং (γ = ০.৯, step = −০.১, রাস্তা বন্ধ ৫০%): দুই অ্যালগরিদম একই policy দেয় (same policy: True). Value iteration-এ ১৭টি sweep, policy iteration-এ ৪টি round; কিন্তু প্রতিটি round-এর ভেতরে কোডটি ৩০০ বার evaluation চালায়, তাই এখানে মোট কাজ আসলে policy iteration-এ বেশি। S থেকে তীর >: রাইডার সোজা পথ নেন, আর মাঝের ঘর থেকেও >, মানে বন্ধ হতে পারা রাস্তায় ঢোকার চেষ্টা (মান ৭.৯২)। ওপর দিয়ে ঘুরলে −০.১ + ০.৯ × ৭.৮৩ ≈ ৬.৯৫, আর g-তে গেলে মাত্র ১.৯.
γ = ০.৫: S-এর তীর এবার v, মান ১.৯০: অধৈর্য রাইডার কাছের ছোট অর্ডার নেন, কারণ তিন ধাপ দূরের +১০-এর বর্তমান মূল্য অনেক কমে গেছে (সোজা পথে S-এর Q হতো −০.১ + ০.৫ × ৩.১৭ ≈ ১.৪৯)। Step cost −৩: প্রতিটি ধাপ এত দামি যে আবারও v; g-তে গেলে −৩ + ২ = −১.০০, আর কোথাও না গিয়ে দাঁড়িয়ে থাকা আরও খারাপ। রাস্তা ৮০% বন্ধ: মাঝের ঘরের তীর ^, মানে ঘুরপথ (৬.৯৫)। S-এ ^ আর > দুটোই সমান ৬.১৫ দেয় (দুটি পথই পাঁচ ধাপের ঘুরপথ), আর max প্রথমটি বেছেছে; সমান মানের policy একাধিক থাকতে পারে। শেষ সেটিংয়ে ৬টি sweep, কারণ বেছে নেওয়া পথে অনিশ্চিত ফেরা নেই।
Reward আর γ লেখা মানেই আপনি agent-কে বলছেন কী চান। Step cost খুব বড় করলে রাইডারকে “যত তাড়াতাড়ি সম্ভব শেষ করা” শেখানো হয়, আর বাস্তবে তা ঝুঁকিপূর্ণ রাস্তা বা গতির দিকে ঠেলে দিতে পারে, যে ঝুঁকি বহন করেন রাইডার নিজে, model-এর লেখক নন।
৯ · MDP-এর পরে — POMDP, reinforcement learning আর সৎ সতর্কতা
যখন state-ও দেখা যায় না
আমাদের রাইডার সবসময় জানেন তিনি কোথায়। কিন্তু ধরুন তিনি জানেন না রাস্তাটি এখন বন্ধ কি না, শুধু ইঙ্গিত দেখেন (অন্য রাইডারের দেরি, ভিড়ের শব্দ)। পর্ব ৫৩-এর hidden Markov model-এর লুকানো অবস্থার মতো, তখন MDP হয়ে যায় POMDP (partially observable MDP), আর agent একটি state নয়, সম্ভাব্য state-গুলোর ওপর একটি সম্ভাবনা-বণ্টন, অর্থাৎ belief state, হালনাগাদ করে চলে; POMDP ঠিকভাবে সমাধান করা সাধারণত অনেক বেশি কঠিন।
Planning-এর সঙ্গে সম্পর্ক
পর্ব ৪৯-এর classical planning-এ action-এর ফল নিশ্চিত, তাই উত্তর একটি action-এর ক্রম। MDP হলো planning under uncertainty, যার উত্তর একটি policy. অনিশ্চয়তা কম হলে plan আর replanning-ও চলে; অনিশ্চয়তা বেশি আর মাপা গেলে policy বেশি নির্ভরযোগ্য।
Reinforcement learning-এর দিকে সেতু
Value iteration চালাতে P(s′ | s, a) আর R পুরোপুরি জানা লাগে। Reinforcement learning (RL) এই ফাঁক পূরণ করে: agent পরিবেশে বারবার কাজ করে, পাওয়া reward আর পরের state থেকে নিজেই মান বা policy শেখে, সবচেয়ে পরিচিত পদ্ধতিগুলোর একটি Q-learning (Chris Watkins, ১৯৮৯), যা অভিজ্ঞতা থেকে সরাসরি Q(s, a) শেখে। নতুন সমস্যা আসে নতুন পথ চেষ্টা বনাম জানা পথে থাকা (exploration–exploitation). পর্ব ৫৫ (যন্ত্র কীভাবে শেখে) RL-এর জায়গা দেখাবে, আর পরের একটি কোর্স RL গভীরভাবে পড়াবে।
লাইব্রেরিতে MDP কেমন দেখায়, তা দেখতে একটি ছোট সত্যিকারের run: Farama Foundation-এর Gymnasium-এর FrozenLake, যেখানে বরফ পিছলে action-এর ফল অনিশ্চিত, আর library-টি transition table P সরাসরি দেয়, তাই এতে আমাদের নিজের value iteration চালানো যায়।
$ cd ~/bazarghar-ai
$ python frozen_vi.py
gymnasium 1.4.0
state 14, action RIGHT: [(0.33333333333333337, 14, 0, False), (0.3333333333333333, 15, 1, True), (0.33333333333333337, 10, 0, False)]
reset -> 0 {'prob': 1}
step -> (1, 0, False, False, {'prob': 0.3333333333333333})
sweeps: 438
[[0.542 0.499 0.471 0.457]
[0.558 0. 0.358 0. ]
[0.592 0.643 0.615 0. ]
[0. 0.742 0.863 0. ]]
[['S' 'F' 'F' 'F']
['F' 'H' 'F' 'H']
['F' 'F' 'F' 'H']
['H' 'F' 'F' 'G']]
[['<' '^' '^' '^']
['<' '<' '<' '<']
['^' 'v' '<' '<']
['<' '>' 'v' '<']]
সত্যিকারের run (desktop, Python 3.14.4, gymnasium 1.4.0, NumPy 2.5.4; লেখার সময়ের version). frozen_vi.py-তে অংশ ৮-এর মতোই Bellman update, P[s][a] থেকে, γ = ০.৯৯. State ১৪-এ RIGHT চাপলে তিনটি ফল, প্রতিটি ১/৩: পিছলে একই জায়গায়, লক্ষ্যে (reward 1), বা ওপরে। env.step পাঁচটি জিনিস ফেরত দেয় (obs, reward, terminated, truncated, info) আর reset দুটি; পুরোনো OpenAI Gym-এ (০.২৬-এর আগে) step চারটি দিত, তাই পুরোনো টিউটোরিয়াল বা AI-এর লেখা কোড এখানে প্রায়ই ভেঙে যায়। শুরুর ঘর S-এ optimal তীর <, দেয়ালের দিকে: বাঁয়ে চাপলে পিছলে কখনো গর্তে (H) পড়া যায় না, শুধু ধীরে নিচে সরা যায়। গর্ত আর লক্ষ্যের ঘরের তীর অর্থহীন (সব Q = ০)। γ = ০.৯৯ প্রায় ১ বলে ৪৩৮টি sweep লেগেছে।
সৎ সতর্কতা
- Utility বের করা কঠিন। কারও utility function জিজ্ঞেস করে সরাসরি পাওয়া যায় না; প্রশ্ন সাজানোর ধরন বদলালেই উত্তর বদলায় (ভাবনার প্রশ্ন ২)।
- Model ভুল হতে পারে। ০.৬ বা ০.৫-এর মতো সম্ভাবনা অনুমান; ভুল সম্ভাবনায় “optimal” policy আসলে খারাপ হতে পারে। তাই sensitivity analysis আর ফল দেখে model হালনাগাদ (পর্ব ৫০-এর Bayes). পরিস্থিতি বদলালে (distribution shift) পুরোনো policy অচল হয়।
- কার ঝুঁকি, কার লাভ। Expected value গড় দেখে, কিন্তু কে খারাপ দিকটি বহন করেন তা দেখে না। দোকানের লাভ বাড়ানো policy রাইডারের নিরাপত্তা বা নির্দিষ্ট এলাকার গ্রাহকের সেবা কমিয়ে দিতে পারে। এই fairness-এর প্রশ্ন পর্ব ৭২ (দায়িত্বশীল AI-এর অভ্যাস) আলোচনা করবে।
আরও গভীরে: γ < ১ হলে Bellman update একটি contraction: যেকোনো দুটি value function-এর সর্বোচ্চ দূরত্ব প্রতিটি update-এ অন্তত γ গুণ কমে, তাই Banach fixed-point উপপাদ্য অনুযায়ী value iteration একটি অনন্য V*-এ পৌঁছায় (ছোট MDP-তে দেখেছেন, কমার হার ০.২৭ ≤ ০.৯)। Policy iteration সসীম MDP-তে সসীম round-এ থামে, কারণ policy-র সংখ্যা সসীম আর প্রতিটি round-এ policy আরও ভালো হয় বা থামে। বিস্তারিত দেখুন Sutton ও Barto-র Reinforcement Learning: An Introduction (দ্বিতীয় সংস্করণ, ২০১৮) আর Russell ও Norvig-এর বইয়ের sequential decision-এর অধ্যায়।
পরীক্ষা ও ইন্টারভিউতে:
- ৫০% সম্ভাবনায় ০, ৫০% সম্ভাবনায় ১০,০০০ টাকা; U = √x হলে CE কত? EU = ০.৫ × ১০০ = ৫০, তাই CE = ৫০২ = ২,৫০০ টাকা; risk premium ৫,০০০ − ২,৫০০ = ২,৫০০.
- EVPI কীভাবে হিসাব করবেন? প্রতিটি অবস্থায় সেরা ফলের সম্ভাবনা-ওজনসহ গড় থেকে তথ্য ছাড়া সেরা EV বিয়োগ; এটি যেকোনো পূর্বাভাসের দামের ঊর্ধ্বসীমা।
- MDP-র উপাদান কী কী? State, action, transition probability P(s′|s,a), reward R আর discount factor γ; উত্তর একটি policy π(s).
- Value iteration বনাম policy iteration? প্রথমটি max সহ Bellman update বারবার চালায়; দ্বিতীয়টি evaluation আর greedy improvement পালা করে চালায়, সাধারণত কম round কিন্তু প্রতিটি round ভারী।
১০ · AI-এর যুগে — সিদ্ধান্তের কোড আর সংখ্যা যাচাই
AI সহকারী দিয়ে decision tree বা value iteration লেখানো সহজ, আর কোড প্রায়ই চলেও। সমস্যা হলো ভুলগুলো চুপচাপ থাকে: ভুল সংখ্যা দিয়েও একটি সুন্দর policy-র তীর ছাপা হয়। সাধারণ ভুলগুলো হলো: terminal state-এর পরেও মান যোগ করা, একই sweep-এ নতুন আর পুরোনো মান গুলিয়ে ফেলা, γ = ১-এ loop থামার শর্ত ভুলে যাওয়া, পুরোনো Gym API (step-এর চারটি মান) লেখা, আর বানানো সম্ভাবনাকে তথ্য বলে দেখানো। নিচের prompt আর চেকলিস্ট এগুলো ধরতে সাহায্য করে।
নিয়মগুলো স্পষ্ট লিখুন, হাতে মেলানো যায় এমন ছোট উদাহরণ চান, আর আসল ব্যবসা বা গ্রাহকের তথ্য পেস্ট করবেন না; কাল্পনিক সংখ্যাই যথেষ্ট।
AI-এর লেখা সিদ্ধান্তের কোড হাতে পেলে — যাচাইয়ের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১St Petersburg paradox-এ expected value অসীম, তবু কেউ বেশি দাম দিতে চান না। এটি কি EV-র ব্যর্থতা, নাকি প্রশ্নটিই অবাস্তব? Bernoulli-র সমাধান কি সব প্রশ্নের উত্তর দেয়?
প্যারাডক্সটি অষ্টাদশ শতকে Bernoulli পরিবারের চিঠিপত্রে আলোচিত হয়: Nicolaus Bernoulli ১৭১৩ সালের দিকে প্রশ্নটি তোলেন, আর Daniel Bernoulli ১৭৩৮ সালে সেন্ট পিটার্সবার্গ একাডেমির পত্রিকায় যে সমাধান দেন, তা থেকেই নাম। তাঁর যুক্তি ছিল, টাকার বাড়তি এক অঙ্কের মূল্য নির্ভর করে আপনার হাতে আগে কত আছে তার ওপর; ধনীর কাছে একটি মুদ্রার মূল্য গরিবের চেয়ে কম। log utility নিলে খেলার CE কয়েক টাকায় নেমে আসে, যা মানুষের আচরণের কাছাকাছি। এখান থেকেই expected utility আর diminishing marginal utility-র ধারণা অর্থনীতিতে ঢোকে।
তবে এটি একমাত্র ব্যাখ্যা নয়। দ্বিতীয় ব্যাখ্যা বাস্তবতা: কোনো ব্যাংক বা খেলোয়াড়ের টাকা অসীম নয়। প্রদানকারী সর্বোচ্চ ধরুন ২৩০ টাকা দিতে পারলে, তারপরের সব ফল সেই সীমায় আটকে যায়, আর EV মাত্র কয়েক ডজন টাকায় নামে। তৃতীয়ত, utility সীমাহীন হলে (log-ও সীমাহীন) পুরস্কার আরও দ্রুত বাড়িয়ে নতুন প্যারাডক্স বানানো যায় বলে অনেকে দেখিয়েছেন, তাই কেউ কেউ বলেন utility সীমিত হওয়া উচিত।
AI-এর জন্য শিক্ষাটি সরাসরি। একটি agent শুধু EV সর্বোচ্চ করলে সে খুব ছোট সম্ভাবনার বিশাল পুরস্কারের পেছনে ছুটতে পারে, বা খুব ছোট সম্ভাবনার বিপর্যয় উপেক্ষা করতে পারে। দুই দিকেই utility-র আকার, সীমা আর ঝুঁকি-নীতি মানুষকে ঠিক করতে হয়।
মূল উপলব্ধি: EV ভুল নয়, কিন্তু এটি একমাত্র মাপকাঠি নয়; সীমিত সম্পদ, বাঁকা utility আর ছোট সম্ভাবনার অনিশ্চয়তা হিসাবে না নিলে “গাণিতিকভাবে সেরা” সিদ্ধান্ত বাস্তবে অর্থহীন বা বিপজ্জনক হতে পারে।
প্র ০২মানুষ কি সত্যিই expected utility মেনে সিদ্ধান্ত নেন? না মানলে AI agent-এর কি মানুষের মতো আচরণ করা উচিত, নাকি “যুক্তিসঙ্গত” আচরণ?
পরীক্ষায় দেখা গেছে, প্রায়ই না। ১৯৫৩ সালে ফরাসি অর্থনীতিবিদ Maurice Allais একটি জোড়া প্রশ্ন দেন, যা এখন Allais paradox নামে পরিচিত। প্রথম জোড়ায় বেশিরভাগ মানুষ নিশ্চিত একটি বড় পুরস্কার বাছেন, সামান্য বেশি EV-র ঝুঁকিপূর্ণ বিকল্প ছেড়ে। দ্বিতীয় জোড়ায় দুই বিকল্প থেকে একই অংশ বাদ দিলে, যা von Neumann–Morgenstern-এর independence শর্ত অনুযায়ী পছন্দ বদলানোর কথা নয়, অনেকেই পছন্দ উল্টে ফেলেন। মানে তাঁদের আচরণ কোনো একক utility function দিয়ে ব্যাখ্যা করা যায় না।
১৯৭৯ সালে Daniel Kahneman আর Amos Tversky-র prospect theory এই ধরনগুলো একটি কাঠামোয় আনে: মানুষ মোট সম্পদ নয়, একটি reference point থেকে লাভ-ক্ষতি দেখেন; ক্ষতির কষ্ট সমান লাভের আনন্দের চেয়ে বেশি (loss aversion); আর ছোট সম্ভাবনাকে বাড়িয়ে ও মাঝারি সম্ভাবনাকে কমিয়ে ওজন দেন। Kahneman ২০০২ সালে অর্থনীতিতে নোবেল পান।
AI-এর জন্য প্রশ্নটি দুই ভাগে আসে। এক, সুপারিশ বা মূল্য নির্ধারণের system মানুষের আসল আচরণ অনুমান করতে চাইলে prospect theory-র মতো বর্ণনামূলক model বেশি কাজে লাগে। দুই, যে agent আমাদের হয়ে সিদ্ধান্ত নেয় (ঝুঁকি ব্যবস্থাপনা, চিকিৎসার পরামর্শ), সেখানে সাধারণত সুসংগত নিয়ম (normative) চাই, কারণ অসংগত পছন্দ দিয়ে কাউকে ধাপে ধাপে ক্ষতির দিকে ঠেলে দেওয়া যায়। তবে সেই utility কার মূল্যবোধ প্রকাশ করে, সেই প্রশ্ন থেকেই যায়।
মূল উপলব্ধি: Expected utility মানুষের আচরণের নিখুঁত বর্ণনা নয়, একটি সুসংগত আদর্শ; AI-এ কোনটি লাগবে, তা নির্ভর করে আপনি মানুষকে বুঝতে চান, নাকি মানুষের হয়ে সিদ্ধান্ত নিতে চান।
প্র ০৩MDP-তে reward লেখেন মানুষ। ভুলভাবে লেখা reward কী ধরনের অদ্ভুত বা ক্ষতিকর আচরণ তৈরি করতে পারে, আর ডেলিভারির ক্ষেত্রে কীভাবে সাবধান হবেন?
Optimal policy কেবল লেখা reward-এর সাপেক্ষে optimal. Reward যদি আপনার আসল উদ্দেশ্যের একটি অসম্পূর্ণ প্রতিনিধি হয়, agent সেই ফাঁক খুঁজে বের করবে; একে specification gaming বা reward hacking বলে। একটি বহুল উদ্ধৃত উদাহরণ ২০১৬ সালের OpenAI-এর একটি ব্লগ লেখা: নৌকা-দৌড়ের একটি খেলায় পয়েন্টের reward দিয়ে প্রশিক্ষিত agent দৌড় শেষ না করে একটি জায়গায় ঘুরে ঘুরে বারবার পয়েন্টের লক্ষ্যবস্তু ছুঁয়ে বেশি পয়েন্ট পেত।
Goodhart-এর নিয়মের সঙ্গে এর মিল আছে: কোনো মাপকাঠিকে লক্ষ্য বানালে তা আর ভালো মাপকাঠি থাকে না। ডেলিভারিতে “প্রতি ডেলিভারির সময়” কমানোকেই একমাত্র reward বানালে policy দ্রুত কিন্তু ঝুঁকিপূর্ণ রাস্তা বেছে নিতে পারে, দূরের বা কঠিন এলাকার অর্ডার এড়িয়ে যেতে পারে, বা রাইডারের বিশ্রামের সময় চেপে দিতে পারে। অংশ ৮-এর কোডে দেখেছেন, step cost বাড়ালে রাইডার বড় অর্ডার ছেড়ে কাছের ছোট অর্ডারে চলে যান; একই পরিবর্তন বাস্তবে কারও সেবা কমিয়ে দেয়।
সাবধানতা: নিরাপত্তাকে reward নয়, কঠোর বাধা (constraint) হিসেবে রাখা; ফল এলাকা আর রাইডারের দল অনুযায়ী ভাগ করে দেখা; simulation-এ “অদ্ভুত” আচরণ খোঁজা; আর যাঁদের ওপর ফল পড়ে, তাঁদের মত নেওয়া (পর্ব ৭২)।
মূল উপলব্ধি: Agent যা চাইতে বলা হয়েছে তা-ই খোঁজে, আপনি যা বোঝাতে চেয়েছিলেন তা নয়; reward লেখা একটি নকশা আর নৈতিক সিদ্ধান্ত, আর ফল যাচাই করতে হয় কে লাভবান আর কে ঝুঁকি বহন করছেন, দুই দিক থেকেই।
প্র ০৪Value iteration ছোট grid-এ কয়েক মিলিসেকেন্ডে চলে। তাহলে দাবা, Go বা পুরো শহরের ডেলিভারি নেটওয়ার্কে কেন সরাসরি চালানো যায় না, আর সেখানে কী করা হয়?
প্রতিটি sweep-এ প্রতিটি state, প্রতিটি action আর প্রতিটি সম্ভাব্য পরের state দেখতে হয়, তাই এক sweep-এর খরচ মোটামুটি |S|২ × |A|-এর অনুপাতে (sparse transition হলে কম)। আমাদের grid-এ terminal ছাড়া ১০টি state; একটি শহরের ডেলিভারিতে state মানে শুধু রাইডারের জায়গা নয়, প্রতিটি রাইডারের জায়গা, অপেক্ষমাণ প্রতিটি অর্ডার আর রাস্তার অবস্থার মিলিত রূপ। ১০০টি মোড় আর ১০ জন রাইডার হলেই শুধু জায়গার মিশ্রণ ১০০১০ = ১০২০. Bellman এই সমস্যাকে curse of dimensionality নাম দেন: চলক বাড়লে state সূচকীয় হারে বাড়ে। দাবা আর Go-এর state-এর সংখ্যাও এমনই বিশাল।
এর তিনটি প্রধান উত্তর আছে। এক, সব state-এর মান না রেখে একটি function দিয়ে অনুমান করা (function approximation), যেমন একটি neural network V(s) বা Q(s, a)-এর অনুমান দেয়। Gerald Tesauro-র TD-Gammon (১৯৯০-এর দশকের শুরু) নিজের সঙ্গে খেলে ব্যাকগ্যামনে খুব উঁচু মানে পৌঁছায় বলে পরিচিত, আর DeepMind-এর AlphaGo (২০১৬) Go-তে neural network-এর মূল্যায়নের সঙ্গে Monte Carlo tree search জোড়া দেয় (পর্ব ৪২)। দুই, শুধু বর্তমান অবস্থা থেকে সামনে অল্প কিছু ধাপ search করা, পুরো policy আগে না বানিয়ে। তিন, সমস্যা ভেঙে ছোট করা: প্রতিটি রাইডারকে আলাদা MDP ধরা, বা অর্ডার বণ্টন আর রুট বাছাই আলাদা স্তরে করা।
প্রতিটির দাম আছে: function approximation-এ convergence-এর গ্যারান্টি থাকে না, আর ভাঙলে উপ-সমস্যার পারস্পরিক প্রভাব হারায়।
মূল উপলব্ধি: Bellman equation-এর ধারণা বড় সমস্যাতেও একই থাকে, কিন্তু টেবিলে সব state লেখা অসম্ভব হয়ে যায়; তখন অনুমান, সীমিত search আর সমস্যা ভাঙার কৌশল লাগে, আর সঙ্গে আসে নতুন ধরনের ভুলের ঝুঁকি।
প্র ০৫“আরও ডেটা নিলে সিদ্ধান্ত ভালো হবে” কথাটি কি সবসময় সত্য? তথ্যের দামের ধারণা ব্যবসা, চিকিৎসা আর AI-এর ডেটা সংগ্রহে কী শেখায়?
তথ্যের দামের তত্ত্ব ১৯৬০-এর দশকে গড়ে ওঠে বলে ধরা হয়; Howard Raiffa ও Robert Schlaifer-এর ১৯৬১ সালের বই আর Ronald Howard-এর ১৯৬৬ সালের “information value theory” প্রবন্ধ প্রায়ই উদ্ধৃত হয়। মূল বার্তা অংশ ৫-এ দেখেছেন: তথ্যের মূল্য আসে শুধু সেই ক্ষেত্রগুলো থেকে, যেখানে তথ্য আপনার কাজ বদলাতে পারে। সিদ্ধান্ত যদি সব সম্ভাব্য ফলেই একই থাকে, তথ্যের দাম শূন্য, যত নিখুঁতই হোক। আর আমাদের sensitivity-র ছবিতে EVPI সবচেয়ে বেশি ছিল ঠিক সীমার কাছে, যেখানে দুই কাজ প্রায় সমান।
তাই “আরও ডেটা” সবসময় লাভজনক নয়। ডেটার খরচ আছে: টাকা, সময় (ঈদের আগে জরিপ শেষ না হলে তা অর্থহীন), আর মানুষের গোপনীয়তা। চিকিৎসায় একই যুক্তি: যে পরীক্ষার ফল চিকিৎসা বদলাবে না, তা রোগীর খরচ আর ঝুঁকি বাড়ায়, আর মিথ্যা positive অপ্রয়োজনীয় দুশ্চিন্তা ও চিকিৎসা আনতে পারে (পর্ব ৩৫-এর base rate মনে করুন)। বাজার-জরিপের ফি EVPI-এর বেশি হলে তা কখনো লাভজনক নয়।
AI-এ এর প্রয়োগ active learning: label কেনা হয় যেখানে model সবচেয়ে দোটানায়, ঠিক EVPI-এর সর্বোচ্চ বিন্দুর মতো। RL-এ exploration-ও তথ্য কেনা: অজানা রাস্তা একবার চেষ্টা করার খরচ আছে, কিন্তু শেখা তথ্য ভবিষ্যতে কাজে লাগে।
মূল উপলব্ধি: তথ্য তখনই মূল্যবান, যখন তা একটি সিদ্ধান্ত বদলাতে পারে, আর সময়মতো আসে; ডেটা সংগ্রহের আগে জিজ্ঞেস করুন, কোন ফলে আমি কী ভিন্নভাবে করব, আর তার দাম সংগ্রহের খরচের চেয়ে বেশি কি না।
অনুশীলন
হিসাব, হাতে value iteration, নকশার সমালোচনা আর আউটপুট অনুমান; প্রতিটির উত্তর নিচে লুকানো আছে।
-
CE আর তথ্যের দাম (হিসাব): (ক) একটি সুযোগে ৫০% সম্ভাবনায় ০ টাকা, ৫০% সম্ভাবনায় ১০,০০০ টাকা। U(x) = √x হলে EV, EU, CE আর risk premium কত? (খ) বাজারঘরের ঈদের stock-এর সারণিতে (১০০ পিস: ৪০,০০০ বা ২৪,০০০; ২০০ পিস: ৮০,০০০ বা −১৬,০০০) P(high) = ০.৭ হলে EVPI কত?
(ক) EV = ০.৫ × ১০,০০০ = ৫,০০০. EU = ০.৫ × √০ + ০.৫ × √১০,০০০ = ০.৫ × ১০০ = ৫০. CE: √CE = ৫০, তাই CE = ২,৫০০ টাকা। Risk premium = ৫,০০০ − ২,৫০০ = ২,৫০০ টাকা। বর্গমূলের utility-তে এই ব্যক্তি নিশ্চিত ২,৫০০ আর এই জুয়াকে সমান দেখেন।
(খ) EV100 = ২৪,০০০ + ১৬,০০০ × ০.৭ = ৩৫,২০০; EV200 = −১৬,০০০ + ৯৬,০০০ × ০.৭ = ৫১,২০০; সেরা ৫১,২০০. নিখুঁত তথ্যে: ০.৭ × ৮০,০০০ + ০.৩ × ২৪,০০০ = ৫৬,০০০ + ৭,২০০ = ৬৩,২০০. EVPI = ৬৩,২০০ − ৫১,২০০ = ১২,০০০ টাকা। অন্যভাবে: কম চাহিদা জানলে ১০০-তে সরে ৪০,০০০ বাঁচে, ০.৩ × ৪০,০০০ = ১২,০০০. ০.৬-এর চেয়ে কম, কারণ ০.৭ সীমা (০.৫) থেকে আরও দূরে।
-
হাতে value iteration (হিসাব): দুই state-এর রাইডার MDP-তে (short: সফল হলে +১০, বন্ধ হলে −১ আর আবার S; long: −১ দিয়ে M, তারপর +১০; γ = ০.৯) রাস্তা বন্ধের সম্ভাবনা ০.৩-এর বদলে ০.৬ ধরুন। সব V = ০ থেকে শুরু করে দুই sweep হাতে করুন, তারপর optimal policy আর V*(S) বের করুন।
এখন Q(S, short) = ০.৪ × ১০ + ০.৬ × (−১ + ০.৯ V(S)) = ৩.৪ + ০.৫৪ V(S).
- Sweep ১: Q(short) = ৩.৪, Q(long) = −১ + ০.৯ × ০ = −১; V1(S) = ৩.৪ (short), V1(M) = ১০.
- Sweep ২: Q(short) = ৩.৪ + ০.৫৪ × ৩.৪ = ৫.২৩৬; Q(long) = −১ + ০.৯ × ১০ = ৮.০; V2(S) = ৮.০, greedy action long.
- স্থির অবস্থা: short স্থির রাখলে V = ৩.৪ ÷ (১ − ০.৫৪) = ৩.৪ ÷ ০.৪৬ ≈ ৭.৩৯১ < ৮. তাই optimal policy long, V*(S) = ৮.০. (Sweep ৩-এ Q(short) = ৩.৪ + ০.৫৪ × ৮ = ৭.৭২ < ৮, policy বদলায় না।)
প্রথম sweep-এর policy (short) চূড়ান্ত নয়, কারণ M-এর মান তখনো পৌঁছায়নি। সীমাটিও বের করা যায়: বন্ধের সম্ভাবনা b হলে short-এর মান V = (১০ − ১১b) ÷ (১ − ০.৯b); একে ৮-এর সমান বসালে b ≈ ০.৫২৬. বন্ধের সম্ভাবনা এর বেশি হলেই long ভালো।
-
নকশার সমালোচনা: একজন সহকর্মী বাজারঘরের রাইডারদের রুটের জন্য একটি MDP বানিয়েছেন। Reward: ডেলিভারি শেষ হলে +১০, প্রতি মিনিটে −১, γ = ০.৯৯. Transition probability এসেছে শুধু গত শীতকালের দুই সপ্তাহের GPS ডেটা থেকে। তিনি বলছেন, “policy optimal, তাই সব রাইডারকে এটি মানতে বাধ্য করব।” কী কী সমস্যা দেখছেন, আর কীভাবে নতুন করে সাজাবেন?
- Reward অসম্পূর্ণ: শুধু সময় আর ডেলিভারি; নিরাপত্তা, ট্রাফিক আইন, রাইডারের বিশ্রাম আর দূরের এলাকার গ্রাহকের সেবা নেই। এমন reward ঝুঁকিপূর্ণ দ্রুত রাস্তা আর কঠিন অর্ডার এড়ানোর দিকে ঠেলে দিতে পারে।
- Model পুরোনো ও সংকীর্ণ: শীতের দুই সপ্তাহে বর্ষার জলাবদ্ধতা বা ঈদের ভিড় নেই; ছোট নমুনায় সম্ভাবনার অনুমান নড়বড়ে। এটি distribution shift-এর ঝুঁকি।
নতুন নকশা: নিরাপত্তাকে কঠোর শর্ত রাখুন (কিছু রাস্তা বা গতি বাদ), সারা বছরের ডেটা আর মৌসুম অনুযায়ী আলাদা transition নিন, sensitivity analysis চালান, এলাকা অনুযায়ী ফল মাপুন, আর policy-কে পরামর্শ হিসেবে দিন, যেখানে রাইডার কারণ জানিয়ে ভিন্ন পথ নিতে পারেন।
-
আউটপুট অনুমান: নিচের কোড কী ছাপবে?
V = {"S": 0.0, "M": 0.0} for sweep in range(2): short = 0.7 * 10 + 0.3 * (-1 + 0.9 * V["S"]) long_ = -1 + 0.9 * V["M"] V = {"S": round(max(short, long_), 3), "M": 10.0} print(sweep + 1, V, "short" if short >= long_ else "long")1 {'S': 6.7, 'M': 10.0} short 2 {'S': 8.509, 'M': 10.0} shortসত্যিকারের run (desktop Python 3.14.4). এটি ছোট MDP-র value iteration-এর প্রথম দুই sweep. প্রথম sweep-এ
V["M"]তখনো ০, তাই long = −১, আর short = ৭ − ০.৩ = ৬.৭. লক্ষ করুন, নতুন dict একবারে বানানো হয়েছে, তাই একই sweep-এর ভেতরে পুরোনো মানই ব্যবহার হয়। দ্বিতীয় sweep-এ long = −১ + ৯ = ৮ আর short = ৭ + ০.৩ × ৫.০৩ = ৮.৫০৯.round(…, 3)ছাড়া দ্বিতীয় লাইনে float-এর শেষ অঙ্কে ছোট গোলমাল দেখা যেতে পারত।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি MDP value iteration দিয়ে সমাধানের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- State, action, transition probability, reward আর γ লিখে MDP তৈরি করা
- সব state-এর মান শূন্য (বা যেকোনো সংখ্যা) দিয়ে শুরু করা
- প্রতিটি state-এ প্রতিটি action-এর Q-value আগের মান দিয়ে হিসাব করা
- প্রতিটি state-এ সবচেয়ে বড় Q-কে নতুন মান বানানো
- সর্বোচ্চ পরিবর্তন সীমার নিচে না নামা পর্যন্ত sweep পুনরাবৃত্তি করা
- শেষ মান থেকে প্রতিটি state-এ greedy policy পড়া
বিকল্প A: ৫০% সম্ভাবনায় ১০০০ টাকা, ৫০% সম্ভাবনায় ০. বিকল্প B: নিশ্চিত ৪৫০ টাকা। একজন risk-neutral সিদ্ধান্তগ্রহীতা কোনটি বাছবেন?
- A, কারণ তার EV ৫০০
- B, কারণ এটি নিশ্চিত
- দুটি সমান, কারণ দুটির EV একই
- utility function না জানলে বলা যায় না
একটি জুয়ায় ৫০% সম্ভাবনায় ০ টাকা আর ৫০% সম্ভাবনায় ১০,০০০ টাকা। U(x) = √x হলে certainty equivalent কত?
- ৫,০০০ টাকা
- ৫০ টাকা
- ২,৫০০ টাকা
- প্রায় ৭,০৭১ টাকা
একটি সিদ্ধান্তে তথ্য ছাড়া সেরা expected লাভ ৪১,৬০০ টাকা। চাহিদা আগে নিশ্চিতভাবে জানলে প্রত্যাশিত লাভ হতো ৫৭,৬০০ টাকা। একটি নিখুঁত পূর্বাভাসের জন্য সর্বোচ্চ কত দেওয়া যুক্তিসঙ্গত (risk-neutral)?
- ৫৭,৬০০ টাকা
- ১৬,০০০ টাকা
- ৪১,৬০০ টাকা
- শূন্য, কারণ পূর্বাভাস লাভ বাড়ায় না
একটি MDP-তে γ = ০.৯. এখন থেকে দুই ধাপ পরে (দ্বিতীয় ধাপের শেষে) পাওয়া ১০ reward-এর বর্তমান মূল্য কত, যদি প্রথম ধাপের reward-কে γ⁰ = ১ দিয়ে গোনা হয়?
- ১০
- ৮.১
- ১
- ৯
একটি state s-এ action a নিলে ০.৮ সম্ভাবনায় reward ৫ পেয়ে s₁-এ যাওয়া যায় (V(s₁) = ১০), আর ০.২ সম্ভাবনায় reward −১ পেয়ে terminal state-এ (মান ০)। γ = ০.৯ হলে Q(s, a) কত?
- ১১.০
- ১১.২
- ১৪.০
- ১২.০
MDP আর POMDP-এর মূল পার্থক্য কী?
- POMDP-তে transition probability থাকে, MDP-তে থাকে না
- POMDP-তে reward থাকে না
- POMDP-তে agent বর্তমান state সরাসরি দেখতে পায় না, belief state রাখে
- POMDP-তে discount factor ব্যবহার হয় না
Value iteration আর policy iteration সম্পর্কে কোন কথাটি সঠিক?
- দুটি সাধারণত আলাদা optimal policy দেয়
- Policy iteration সাধারণত কম round নেয়, তবে প্রতিটি round বেশি ভারী
- Value iteration-এ transition probability জানা লাগে না
- Value iteration-এর চূড়ান্ত উত্তর শুরুর মানের ওপর নির্ভর করে
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- MEU নীতি: EU(a) = ∑ P(s) U(a, s); rational agent সবচেয়ে বড় EU-র কাজ বাছে। টাকাকেই utility ধরলে এটি expected value, অর্থাৎ risk-neutral সিদ্ধান্ত।
- ঝুঁকি: concave utility (log, √) ঝুঁকি এড়ানো প্রকাশ করে; CE = যে নিশ্চিত টাকা জুয়ার সমান, risk premium = EV − CE. হাতে নগদ কম হলে একই জুয়ার CE অনেক কমে (St Petersburg, Bernoulli ১৭৩৮)।
- Decision tree: পাতা থেকে পেছনে; chance node-এ সম্ভাবনা-ওজনসহ গড়, decision node-এ খরচ বাদ দিয়ে max. EVPI = তথ্যসহ প্রত্যাশিত সেরা − তথ্য ছাড়া সেরা; এটি পূর্বাভাসের দামের ঊর্ধ্বসীমা, আর crossover point-এ সবচেয়ে বড়।
- MDP: state, action, P(s′|s,a), reward আর γ; উত্তর একটি policy. Bellman: V*(s) = maxa ∑ P(s′|s,a)[R + γV*(s′)]. Value iteration এটি বারবার চালায়; policy iteration evaluation আর greedy improvement পালা করে চালায়।
- সীমা আর পরের পথ: γ আর step cost policy বদলায়, তাই reward লেখা একটি মূল্যবোধের সিদ্ধান্ত। State না দেখলে POMDP, model না জানলে reinforcement learning. Utility, model আর কার ঝুঁকি, তিনটিই সৎভাবে যাচাই করুন।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৫৫ · যন্ত্র কীভাবে শেখে — supervised, unsupervised আর reinforcementপরবর্তী পর্বমডিউল ১০-এর শুরু: ডেটা থেকে শেখা আর reinforcement learning-এর জায়গা।
- AI-এর ভিত্তি আর Python for AI · কোর্স হোম৭৯টি পর্বপুরো কোর্সের রোডম্যাপ; পরের পর্ব ৫৫ · যন্ত্র কীভাবে শেখে।
- পর্ব ৪৯ · Planning — লক্ষ্য থেকে কাজের ধারাবাহিকতাআগের ভিত্তিনিশ্চিত action-এর জগতে plan, যার অনিশ্চিত রূপ এই পর্বের MDP.
- পর্ব ৪২ · খেলার search — minimax আর alpha-betaআগের ভিত্তিChance node আর expectiminimax, decision tree-এর আত্মীয়।
- পর্ব ৩৬ · Distribution আর samplingআগের ভিত্তিRandom variable আর expected value, যা এখানে সিদ্ধান্তের মাপকাঠি।
- DSA · Dynamic Programming — memoization আর tabulationপাশের ট্র্যাকBellman-এর একই ধারণা: বড় সমস্যার উত্তর ছোট উপ-সমস্যার উত্তর থেকে।