ক্রস-এনট্রপি, KL ডাইভার্জেন্স ও লস ফাংশনের ভিত্তি
এই পাঠে যা শিখবেন
- এনট্রপি, ক্রস-এনট্রপি ও KL ডাইভার্জেন্সের সঠিক সংজ্ঞা ও এদের মধ্যে সম্পর্ক
- কেন KL ডাইভার্জেন্স অ-প্রতিসম, এবং এর ব্যবহারিক অর্থ কী
- এক-হট লেবেলের জন্য cross-entropy loss কীভাবে $-\log Q(\text{true class})$-এ সরল হয়
- ক্রস-এনট্রপি মিনিমাইজেশন কেন এবং কীভাবে ম্যাক্সিমাম লাইকলিহুড এস্টিমেশনের সমতুল্য (পাঠ ৩০)
- NumPy দিয়ে এনট্রপি/ক্রস-এনট্রপি/KL হাতে-কলমে গণনা
১ · এনট্রপি — অনিশ্চয়তার পরিমাপ
তথ্যতত্ত্বে (information theory) একটি ঘটনার "বিস্ময়" (surprise/information content) পরিমাপ করা হয় $-\log P(x)$ দিয়ে — যে ঘটনা যত কম সম্ভাব্য, তার সংঘটন তত বেশি "তথ্য" বহন করে। একটি সম্পূর্ণ বিতরণ $P$-এর এনট্রপিEntropy, $H(P)$একটি বিতরণ থেকে নমুনা নিলে গড়ে কত "বিস্ময়" পাওয়ার প্রত্যাশা করা যায়, তার পরিমাপ। হলো এই বিস্ময়ের প্রত্যাশিত মান (পাঠ ২৭-এর $\mathbb{E}[\cdot]$ ব্যবহার করে): $$H(P) = -\sum_x P(x) \log P(x) = \mathbb{E}_{X\sim P}[-\log P(X)]$$ একটি ফেয়ার কয়েনের এনট্রপি সর্বোচ্চ (দুটি ফলাফলই সমান অনিশ্চিত), আর একটি সবসময় হেড পড়া কয়েনের এনট্রপি শূন্য (কোনো অনিশ্চয়তাই নেই — ফলাফল আগে থেকেই জানা)।
২ · ক্রস-এনট্রপি — দুটি বিতরণের তুলনা
এখন কল্পনা করুন সত্যিকারের বিতরণ $P$, কিন্তু আমরা এটি জানি না — বরং আমাদের মডেল একটি অনুমিত বিতরণ $Q$ ব্যবহার করে। ক্রস-এনট্রপিCross-Entropy, $H(P,Q)$$P$ থেকে আসা ডেটাকে $Q$ ব্যবহার করে "এনকোড" করলে গড়ে কত বিস্ময়/কস্ট লাগবে তার পরিমাপ। হলো — সত্যিকারের বিতরণ $P$ থেকে ডেটা এলেও, বিস্ময় গণনা হয় $Q$ দিয়ে: $$H(P, Q) = -\sum_x P(x) \log Q(x)$$ $Q$ যদি $P$-এর সমান হয়, তাহলে $H(P,Q) = H(P)$ — সর্বনিম্ন সম্ভাব্য মান। $Q$ যত ভুল হবে, $H(P,Q)$ তত বেশি হবে। এই কারণেই ক্রস-এনট্রপি একটি স্বাভাবিক লস ফাংশন — একে মিনিমাইজ করা মানে মডেলের $Q$-কে প্রকৃত $P$-এর যতটা সম্ভব কাছে নিয়ে যাওয়া।
৩ · KL ডাইভার্জেন্স — বিশুদ্ধ "পার্থক্য"
ক্রস-এনট্রপির মধ্যে দুটি জিনিস মিশে আছে — বিতরণের নিজস্ব অনিশ্চয়তা ($H(P)$, যা $Q$ যাই হোক না কেন স্থির), এবং $Q$ ভুল হওয়ার কারণে অতিরিক্ত "খরচ"। এই দ্বিতীয় অংশটুকু আলাদা করাই হলো KL ডাইভার্জেন্সKullback–Leibler Divergence$Q$, $P$ থেকে গড়ে কতটা "দূরে" তার পরিমাপ — তবে এটি একটি প্রকৃত দূরত্ব (metric) নয়, কারণ এটি অ-প্রতিসম।: $$D_{KL}(P \| Q) = \sum_x P(x) \log \frac{P(x)}{Q(x)} = H(P, Q) - H(P)$$ যেহেতু $H(P) \geq 0$ এবং তথ্যতাত্ত্বিকভাবে $H(P,Q) \geq H(P)$ সবসময় সত্য (Gibbs' inequality, প্রমাণ ছাড়াই বলা হলো), তাই $D_{KL}(P\|Q) \geq 0$, এবং সমতা ঘটে শুধু $P=Q$ হলে। খুব গুরুত্বপূর্ণ একটি বিষয় — $$D_{KL}(P\|Q) \neq D_{KL}(Q\|P) \quad \text{সাধারণত}$$ এটি একটি প্রকৃত দূরত্ব ফাংশন (metric) নয় — এটি বরং "$Q$ দিয়ে $P$-কে কতটা খারাপভাবে বর্ণনা করা হচ্ছে" তার একমুখী পরিমাপ।
$D_{KL}(P\|Q)$ প্রচণ্ড শাস্তি দেয় যদি $P(x)>0$ এমন কোনো $x$-এ $Q(x)\approx 0$ হয় (কারণ $\log(P/Q)\to\infty$) — অর্থাৎ, বাস্তবে ঘটতে পারে এমন কোনো ঘটনাকে মডেল "অসম্ভব" ভাবলে ভারী পেনাল্টি পড়ে। এই অসামঞ্জস্যই নির্ধারণ করে VAE-এর মতো generative model-এ $D_{KL}(P\|Q)$ নাকি $D_{KL}(Q\|P)$ ব্যবহার করা হবে তার উপর মডেলের আচরণ (mode-covering বনাম mode-seeking) কেমন হবে।
৪ · কোড: এনট্রপি, ক্রস-এনট্রপি ও KL হাতে-কলমে
নিচের কোডে দুটি সাধারণ (৩-ক্লাস) বিতরণ $P, Q$ নিয়ে তিনটি রাশিই গণনা করা হলো, এবং যাচাই করা হলো $H(P,Q) = H(P) + D_{KL}(P\|Q)$ সম্পর্কটি সংখ্যাগতভাবে মিলছে কি না।
import numpy as np
P = np.array([0.5, 0.3, 0.2]) # প্রকৃত (true) বিতরণ
Q = np.array([0.4, 0.4, 0.2]) # মডেলের পূর্বাভাসিত বিতরণ
entropy_P = -np.sum(P * np.log(P))
cross_entropy_PQ = -np.sum(P * np.log(Q))
kl_PQ = np.sum(P * np.log(P / Q))
print("H(P) =", round(entropy_P, 5))
print("H(P, Q) =", round(cross_entropy_PQ, 5))
print("D_KL(P || Q) =", round(kl_PQ, 5))
print("H(P) + KL =", round(entropy_P + kl_PQ, 5), "(H(P,Q)-এর সমান হওয়া উচিত)")
# --- এক-হট ক্লাসিফিকেশন কেস ---
# আসল ক্লাস = ০ (one-hot), মডেলের সফটম্যাক্স আউটপুট Q
P_onehot = np.array([1.0, 0.0, 0.0])
Q_pred = np.array([0.7, 0.2, 0.1])
ce_onehot = -np.sum(P_onehot * np.log(Q_pred))
minus_log_q_true = -np.log(Q_pred[0])
print("\nএক-হট cross-entropy =", round(ce_onehot, 5))
print("-log(Q[সঠিক ক্লাস]) =", round(minus_log_q_true, 5), "(মিলে যাওয়ার কথা)")
৫ · এক-হট লেবেল ও ক্লাসিফিকেশন লস
ক্লাসিফিকেশনে সত্যিকারের লেবেল প্রায়ই এক-হট (one-hot) আকারে থাকে — সঠিক ক্লাসে $P=1$, বাকি সব ক্লাসে
$P=0$। যেহেতু $P(x)=0$ হলে $P(x)\log Q(x) = 0$ (কনভেনশন অনুযায়ী), ক্রস-এনট্রপি সমষ্টির প্রায় সব পদ শূন্য হয়ে যায়,
শুধু সঠিক ক্লাসের পদটি থেকে যায়:
$$H(P, Q) = -\sum_x P(x)\log Q(x) = -1 \cdot \log Q(\text{সঠিক ক্লাস}) = -\log Q(\text{সঠিক ক্লাস})$$
এই সরল সূত্রটিই — -log(predicted probability of the true class) — PyTorch/TensorFlow-এর
CrossEntropyLoss-এর ভেতরে ঠিক এভাবেই বাস্তবায়িত হয়।
৬ · ক্রস-এনট্রপি মিনিমাইজেশন = MLE (পাঠ ৩০-এর সাথে সংযোগ)
পাঠ ৩০-এ আমরা দেখেছিলাম MLE মানে log-likelihood $\ell(\theta) = \sum_i \log Q_\theta(y_i \mid x_i)$ ম্যাক্সিমাইজ করা (iid ডেটার উপর)। একটি ডেটাসেটে $n$টি স্যাম্পলের গড় cross-entropy লস হলো: $$\mathcal{L} = \frac{1}{n}\sum_{i=1}^n \big(-\log Q_\theta(y_i \mid x_i)\big) = -\frac{1}{n}\ell(\theta)$$ অর্থাৎ, cross-entropy লস মিনিমাইজ করা ঠিক negative log-likelihood মিনিমাইজ করা, যা log-likelihood $\ell(\theta)$ ম্যাক্সিমাইজ করার সমতুল্য — অর্থাৎ, ঠিক MLE। এই কারণেই "cross-entropy loss মিনিমাইজ করো" এবং "categorical/Bernoulli মডেলের জন্য ম্যাক্সিমাম লাইকলিহুড এস্টিমেট খুঁজো" — এই দুটি বাক্য গাণিতিকভাবে একই কাজ বর্ণনা করে।
ক্রস-এনট্রপি লস কোনো "স্বেচ্ছাচারী" ইঞ্জিনিয়ারিং পছন্দ নয় — এটি সরাসরি সম্ভাবনা তত্ত্ব থেকে বেরিয়ে আসে, এবং এটি মিনিমাইজ করা মানেই আপনার মডেলের পূর্বাভাসিত বিতরণ $Q$-কে প্রকৃত বিতরণ $P$-এর যতটা সম্ভব কাছাকাছি নিয়ে যাওয়া (KL ডাইভার্জেন্স মিনিমাইজ করার সমতুল্য, কারণ $H(P)$ প্যারামিটার-নিরপেক্ষ স্থির), এবং এটিই একই সাথে ম্যাক্সিমাম লাইকলিহুড এস্টিমেশন করা।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ যদি মডেল সঠিক ক্লাসকে $Q(\text{সঠিক}) \to 0$ সম্ভাবনা দেয় (প্রায় নিশ্চিতভাবে ভুল উত্তর), তাহলে cross-entropy loss-এর কী হয়?
$-\log Q(\text{সঠিক})$-এ $Q \to 0$ হলে লস $\to \infty$। এই আচরণ ইচ্ছাকৃত — এটি মডেলকে ভয়াবহভাবে আত্মবিশ্বাসী ভুল উত্তরের জন্য প্রচণ্ড শাস্তি দেয়, যা MSE-এর মতো লস দিতে পারত না। এটিই এক কারণ কেন ক্লাসিফিকেশনে MSE-এর বদলে cross-entropy পছন্দ করা হয় — গ্রেডিয়েন্টও এক্ষেত্রে বেশি তথ্যপূর্ণ থাকে।
প্র ০২ $D_{KL}(P\|Q)=0$ হওয়ার একমাত্র শর্ত কী, এবং $D_{KL}(P\|Q)$ কখনো ঋণাত্মক হতে পারে কি?
$D_{KL}(P\|Q)=0$ ঘটে শুধুমাত্র $P=Q$ (সব $x$-এ) হলে। এটি কখনো ঋণাত্মক হতে পারে না — এটি সর্বদা $\geq 0$ (Gibbs' inequality)। এই বৈশিষ্ট্যটাই এটিকে "দূরত্বের মতো" ব্যবহারযোগ্য করে তোলে, যদিও এটি প্রতিসম না হওয়ায় পুরোপুরি গাণিতিক অর্থে একটি metric নয়।
প্র ০৩ বাইনারি ক্লাসিফিকেশনে (Bernoulli) cross-entropy loss-এর সূত্র $-[y\log \hat y + (1-y)\log(1-\hat y)]$ — এটি কীভাবে এই পাঠের সাধারণ সূত্র থেকে আসে?
এখানে $P = (y, 1-y)$ (সত্যিকারের লেবেল, ২-ক্লাস one-hot-এর মতো) এবং $Q = (\hat y, 1-\hat y)$ (মডেলের পূর্বাভাস)। সাধারণ সূত্র $H(P,Q) = -\sum_x P(x)\log Q(x)$ বসালে ঠিক $-[y\log\hat y + (1-y)\log(1-\hat y)]$ পাওয়া যায় — এটি এই পাঠের সাধারণ ক্রস-এনট্রপির একটি বিশেষ (২-ক্লাস) কেস মাত্র।
অনুশীলন
-
নিজে হিসাব করুন: কোড সেলে $Q$-কে $P$-এর সমান করে দিন (অর্থাৎ
Q = np.array([0.5, 0.3, 0.2]))। Run চাপার আগে অনুমান করুন — $D_{KL}(P\|Q)$ ও $H(P,Q)$-এর মান কী হবে? তারপর মিলিয়ে দেখুন।$P=Q$ হলে $D_{KL}(P\|Q)=0$ এবং $H(P,Q)=H(P)$ — কারণ এটিই সর্বনিম্ন সম্ভাব্য ক্রস-এনট্রপি। কোড রান করলে দেখবেন
D_KLপ্রায় $0$ (ফ্লোটিং-পয়েন্ট নির্ভুলতার কারণে সম্পূর্ণ শূন্য না-ও হতে পারে) এবংH(P,Q),H(P)-এর সমান। -
প্রমাণ করুন: $Q$-এর উপাদানগুলোর সমষ্টি $1$ না হলে (যেমন
Q = np.array([0.4, 0.4, 0.4])) এই সূত্রগুলো ব্যবহার করা কেন গাণিতিকভাবে ভুল হবে?$Q$ একটি বৈধ সম্ভাবনা বিতরণ হওয়ার জন্য অবশ্যই $\sum_x Q(x) = 1$ হতে হবে (পাঠ ২৪-এর স্বতঃসিদ্ধ)। এটি না মানলে $H(P,Q)$ ও $D_{KL}(P\|Q)$-এর ব্যাখ্যা ("গড় বিস্ময়", "অতিরিক্ত কস্ট") আর অর্থবহ থাকে না — বাস্তবে নিউরাল নেটওয়ার্কে সবসময় softmax ব্যবহার করা হয় ঠিক এই কারণে, কারণ softmax-এর আউটপুট গ্যারান্টিযুক্তভাবে যোগফলে $1$ হয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পাঠ ৩৩ · হাইপোথিসিস টেস্টিং ও p-value পূর্ববর্তী নাল হাইপোথিসিস, টেস্ট স্ট্যাটিসটিক ও p-value-এর সঠিক ব্যাখ্যা ফিরে দেখুন।
- পাঠ ৩৫ · ক্যাপস্টোন — লিনিয়ার রিগ্রেশন সম্পূর্ণ গাণিতিকভাবে চূড়ান্ত পাঠ পুরো কোর্সের সংশ্লেষণ — গ্রেডিয়েন্ট, নরমাল ইকুয়েশন, MLE ও NumPy কোড একসাথে।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৩৫টি পাঠ Math for AI & ML কোর্সের সব পাঠের তালিকা।