Part 01 · Mathematics for AI
Probability and Statistics
Model কখনো হ্যাঁ বা না বলে না, বলে কতটা সম্ভাবনা। Probability, distribution, Bayes' rule, আর আসল result আর noise আলাদা করতে যে mean আর variance লাগে।
⏱ 1-2 ঘণ্টা · Station 2 / 92
জিনিসটা কী, কেন দরকার
একটা spam filter কে জিজ্ঞেস করো "এটা কি spam?" ভালো filter কখনো শুধু হ্যাঁ বা না বলে না। বলে "92% সম্ভাবনা spam"। একটা LLM কে "দুপুরে খেলাম" এর পরের শব্দ জিজ্ঞেস করলে সে একটা শব্দ বেছে দেয় না; vocabulary র প্রতিটা শব্দকে একটা chance দেয়, তারপর সেখান থেকে একটা তোলা হয়।
সব AI system কথা বলে probability তে, আর তার ব্যাপারে তুমি যা মাপবে তার সবকিছুতে থাকে noise। এই lesson এ চারটা জিনিস শিখবে, যেগুলো পুরো course এ বারবার লাগবে:
- Probability আর distribution: কোন result কতটা সম্ভব, আর সব result এর পুরো table যেটা যোগ করলে 1 হয়।
- Bayes' rule: নতুন প্রমাণ দেখলে আগের ধারণা কীভাবে update করবে।
- Mean আর variance: সাধারণ মানটা কত, আর মানগুলো তার আশেপাশে কতটা লাফায়।
- Sampling: একটা distribution থেকে result তোলা। LLM প্রতিটা token এর জন্য ঠিক এটাই করে।
ভেতরে কীভাবে চলে
Probability হলো 0 (কখনো না) থেকে 1 (সবসময়) এর মধ্যে একটা সংখ্যা। একটা distribution এ প্রতিটা সম্ভাব্য result আর তার probability লেখা থাকে, আর সব মিলিয়ে যোগফল 1। Model এর শেষ layer কিছু কাঁচা score দেয়, এদের বলে logits। Softmax এগুলোকে distribution বানায়: প্রতিটা score কে e এর power বানাও, তারপর মোট দিয়ে ভাগ করো।
Conditional probability P(A | B) মানে "শুধু যেসব ক্ষেত্রে B সত্যি, তার মধ্যে A হওয়ার chance"। Bayes' rule একটাকে উল্টে আরেকটা বানায়:
P(spam | "free") = P("free" | spam) × P(spam) / P("free")
এটা বিশ্বাস করার সবচেয়ে সহজ উপায় হলো গুনে দেখা। 1,000 টা email এর মধ্যে 200 টা spam। Spam এর 60% এ "free" আছে (120 টা), আর normal mail এর 5% এ (40 টা)। "Free" ওয়ালা একটা email মানে ওই 160 টার একটা, আর তার 120 টাই spam: 75%। প্রমাণ দেখার আগে ধারণা ছিল 20% (prior), প্রমাণ দেখার পরে হলো 75% (posterior)।
Mean আর variance। Mean হলো গড়। Variance হলো mean থেকে দূরত্বের বর্গের গড়; তার বর্গমূল হলো standard deviation (σ)। n টা result এর গড় নিলে সেই গড়টাও মোটামুটি σ/√n পরিমাণ কাঁপে, একে বলে standard error। Accuracy আসলে 1 (ঠিক) আর 0 (ভুল) এর গড়, তাই একই নিয়মে বোঝা যায় accuracy কতটা ভরসা করা যায়।
Sampling। Distribution থেকে তোলা মানে বেশি probability র result বেশিবার আসবে, কিন্তু সবসময় না। একই prompt দুইবার দিলে আলাদা answer আসতে পারে এই কারণেই (temperature দিয়ে এটা কীভাবে বদলায় সেটা Part 4 এ)।
একটা রোগ প্রতি 100 জনে 1 জনের হয়। একটা test অসুস্থদের 99% কে ধরে, আর সুস্থদের 1% কে ভুল করে positive দেখায়। তোমার result positive এলো। তুমি অসুস্থ, এর chance মোটামুটি কত?
ছবিতে দেখো
Code এ হিসাবগুলো
কাজের মধ্যে যে তিনটা ছোট হিসাব সবসময় আসবে: spam filter এর Bayes update, softmax দিয়ে score থেকে পরের শব্দের distribution, আর একটা model এর accuracy আরেকটার চেয়ে সত্যিই বেশি কিনা তার check।
import math
# 1) Bayes' rule on a spam filter, counted out of 1,000 emails.
p_spam = 0.20 # 200 of 1,000 emails are spam
p_free_given_spam = 0.60 # "free" appears in 60% of spam
p_free_given_ham = 0.05 # and in 5% of normal mail
p_free = p_free_given_spam * p_spam + p_free_given_ham * (1 - p_spam)
p_spam_given_free = p_free_given_spam * p_spam / p_free
print(f"P(free) = {p_free:.3f}")
print(f"P(spam | free) = {p_spam_given_free:.3f}")
# 2) A model's output is a distribution: softmax turns scores into probabilities.
words = ["bhat", "ruti", "pasta"]
logits = [2.0, 1.0, 0.1]
exps = [math.exp(z) for z in logits]
probs = [e / sum(exps) for e in exps]
for w, p in zip(words, probs):
print(f"P(next = {w:<5}) = {p:.3f}")
print(f"sum = {sum(probs):.3f}")
# 3) Is model B really better? Accuracy is a mean of 0/1 results, so it has noise.
def interval(correct, n):
p = correct / n
se = math.sqrt(p * (1 - p) / n) # standard error of the mean
return p, p - 1.96 * se, p + 1.96 * se
for name, correct, n in [("A", 82, 100), ("B", 84, 100), ("A", 8200, 10000), ("B", 8400, 10000)]:
p, lo, hi = interval(correct, n)
print(f"model {name} n={n:<6} accuracy {p:.3f} 95% range [{lo:.3f}, {hi:.3f}]")package main
import (
"fmt"
"math"
)
func interval(correct, n int) (p, lo, hi float64) {
p = float64(correct) / float64(n)
se := math.Sqrt(p * (1 - p) / float64(n)) // standard error of the mean
return p, p - 1.96*se, p + 1.96*se
}
func main() {
// 1) Bayes' rule on a spam filter, counted out of 1,000 emails.
pSpam := 0.20
pFreeGivenSpam := 0.60
pFreeGivenHam := 0.05
pFree := pFreeGivenSpam*pSpam + pFreeGivenHam*(1-pSpam)
fmt.Printf("P(free) = %.3f\n", pFree)
fmt.Printf("P(spam | free) = %.3f\n", pFreeGivenSpam*pSpam/pFree)
// 2) A model's output is a distribution: softmax turns scores into probabilities.
words := []string{"bhat", "ruti", "pasta"}
logits := []float64{2.0, 1.0, 0.1}
total := 0.0
exps := make([]float64, len(logits))
for i, z := range logits {
exps[i] = math.Exp(z)
total += exps[i]
}
sum := 0.0
for i, w := range words {
p := exps[i] / total
sum += p
fmt.Printf("P(next = %-5s) = %.3f\n", w, p)
}
fmt.Printf("sum = %.3f\n", sum)
// 3) Is model B really better? Accuracy is a mean of 0/1 results, so it has noise.
runs := []struct {
name string
correct, n int
}{{"A", 82, 100}, {"B", 84, 100}, {"A", 8200, 10000}, {"B", 8400, 10000}}
for _, r := range runs {
p, lo, hi := interval(r.correct, r.n)
fmt.Printf("model %s n=%-6d accuracy %.3f 95%% range [%.3f, %.3f]\n", r.name, r.n, p, lo, hi)
}
}Output:
P(free) = 0.160
P(spam | free) = 0.750
P(next = bhat ) = 0.659
P(next = ruti ) = 0.242
P(next = pasta) = 0.099
sum = 1.000
model A n=100 accuracy 0.820 95% range [0.745, 0.895]
model B n=100 accuracy 0.840 95% range [0.768, 0.912]
model A n=10000 accuracy 0.820 95% range [0.812, 0.828]
model B n=10000 accuracy 0.840 95% range [0.833, 0.847]
কী দেখলাম:
- P(spam | free) = 0.750, diagram এ গুনে যে 75% পেয়েছিলাম সেটাই।
- Softmax দিল "bhat" 66%, "ruti" 24%, "pasta" 10%, যোগফল 1। এখান থেকে sample করলে model বেশিরভাগ সময় bhat বলবে, কিন্তু মোটামুটি 10 বারে 1 বার pasta বলবে।
- 100 টা প্রশ্নে model A পেল 82%, B পেল 84%, কিন্তু দুইটার 95% range অনেকটা জুড়ে আছে ([0.745, 0.895] আর [0.768, 0.912])। B ভালো, এটা বলা যায় না। 10,000 প্রশ্নে range ছোট হয়ে ±1% এর নিচে নামে, আর overlap করে না। 2% এর পার্থক্য তখনই আসল যখন সেটা দেখার মতো যথেষ্ট data আছে।
Production এ যা মাথায় রাখবে
- ছোট eval set মিথ্যা বলে। 100 টা example এ "2% improvement" আসলে noise। নতুন prompt বা model ship করার আগে (Part 8) পার্থক্যটা standard error এর সাথে মিলিয়ে দেখো, নইলে আরো example চালাও।
- Base rate গুরুত্বপূর্ণ। যেখানে payment এর মাত্র 0.1% fraud, সেখানে "99% accurate" fraud model ও বেশিরভাগ সময় সৎ customer কেই flag করতে পারে। সবসময় prior টা জিজ্ঞেস করো।
- Probability সবসময় সৎ না। Model এর 0.9 মানে যে 10 বারে 9 বার ঠিক, এমন guarantee নেই। এটা check করাকে বলে calibration, আর এখনকার LLM গুলো প্রায়ই নিজের উপর বেশি confident।
- সংখ্যা overflow। বড় logits এ softmax overflow করে (e^1000)। আসল code আগে সবচেয়ে বড় logit টা বিয়োগ করে নেয়, result একই থাকে কিন্তু safe। অনেক ছোট probability গুণ করলে 0 হয়ে যায়, তাই system গুলো log-probability যোগ করে।
এক কথায়
Model distribution দেয়, Bayes' rule prior কে প্রমাণ দিয়ে update করে, আর মাপা প্রতিটা সংখ্যায় মোটামুটি σ/√n noise থাকে। তাই result গুলো শুধু একটা আরেকটার সাথে না, তাদের uncertainty র সাথেও মিলিয়ে দেখো।
নিজে করে দেখো
একটা support bot message route করে। 30% message refund নিয়ে। Refund message এর 50% এ "money" শব্দটা থাকে, অন্য message এর 10% এ। একটা message এ "money" আছে। এটা refund নিয়ে হওয়ার chance কত? আগে 1,000 টা message ধরে গুনে বের করো, তারপর formula দিয়ে মিলিয়ে নাও।
Answer
300 টা refund message, তার 150 টায় "money"। বাকি 700 টার 70 টায় "money"। "Money" ওয়ালা 220 টার মধ্যে 150 টা refund: 150 / 220 ≈ 0.682, মানে প্রায় 68%। Formula দিয়ে: 0.5 × 0.3 / (0.5 × 0.3 + 0.1 × 0.7) = 0.15 / 0.22 ≈ 0.682।
Station stamp
Chapter শেষ করো
পড়া শেষ হলে Complete চাপো, progress save হবে। XP শুধু Pro তে — Pro থাকলে এই chapter এ +10 XP পেতে।
Pro নিয়ে XP পাও →