পাঠ ৩৪ · ৩৫-এর মধ্যে · মডিউল ৭
Home / AI Courses / Math for AI & ML / ক্রস-এনট্রপি ও KL ডাইভার্জেন্স

ক্রস-এনট্রপি, KL ডাইভার্জেন্স ও লস ফাংশনের ভিত্তি

Cross-entropy, KL divergence & loss function foundations
১২ মিনিট পড়া মাঝারি · Intermediate NumPy কোডসহ সম্পূর্ণ বাংলায়

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

  • এনট্রপি, ক্রস-এনট্রপি ও 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)$ সম্পর্কটি সংখ্যাগতভাবে মিলছে কি না।

Python · NumPy
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 মডেলের জন্য ম্যাক্সিমাম লাইকলিহুড এস্টিমেট খুঁজো" — এই দুটি বাক্য গাণিতিকভাবে একই কাজ বর্ণনা করে।

মূল কথা · Key takeaway

ক্রস-এনট্রপি লস কোনো "স্বেচ্ছাচারী" ইঞ্জিনিয়ারিং পছন্দ নয় — এটি সরাসরি সম্ভাবনা তত্ত্ব থেকে বেরিয়ে আসে, এবং এটি মিনিমাইজ করা মানেই আপনার মডেলের পূর্বাভাসিত বিতরণ $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)]$ পাওয়া যায় — এটি এই পাঠের সাধারণ ক্রস-এনট্রপির একটি বিশেষ (২-ক্লাস) কেস মাত্র।

অনুশীলন

  1. নিজে হিসাব করুন: কোড সেলে $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)-এর সমান।

  2. প্রমাণ করুন: $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