সংখ্যাগত স্থিরতা — কেন NaN আসে
এই পাঠে যা শিখবেন
- কম্পিউটার সংখ্যা কীভাবে সংরক্ষণ করে — float32, float64, bfloat16
- Overflow ও Underflow কী, কখন হয়
- NaN ও Inf — AI কোডে সবচেয়ে সাধারণ বাগ ও তার উৎস
- Log-sum-exp trick — softmax-কে স্থিতিশীল করার পদ্ধতি
- ব্যবহারিক টিপস — production training-এ NaN ঠেকানো
১ · কম্পিউটার সংখ্যা সংরক্ষণে সীমাবদ্ধতা
গণিতে $\pi$ একটি অসীম দশমিক — $3.14159265358979...$। কিন্তু কম্পিউটারে সংখ্যা সংরক্ষণে নির্দিষ্ট জায়গা থাকে। তাই প্রতিটি সংখ্যা আনুমানিক। এই আনুমানিকতাই অনেক সমস্যার মূল।
IEEE 754IEEE 754floating-point সংখ্যার আন্তর্জাতিক standard (১৯৮৫)। Sign + exponent + mantissa. সব আধুনিক CPU/GPU এই standard মেনে চলে। তাই আপনার Python ফলাফল Java-তেও একই। standard-এ সংখ্যা সংরক্ষিত — sign + exponent + mantissa. প্রতিটি format-এ:
প্রধান format
- float64 (double): ৬৪ bits, ~১৫ ডিজিট নির্ভুলতা। Range $\pm 1.8 \times 10^{308}$। বিজ্ঞান ও গণনায় standard.
- float32 (single): ৩২ bits, ~৭ ডিজিট। Range $\pm 3.4 \times 10^{38}$। GPU-তে দ্রুত। AI-তে বহুল ব্যবহৃত।
- float16 (half): ১৬ bits. Range $\pm 6.5 \times 10^{4}$। Memory ও bandwidth সাশ্রয়।
- bfloat16BFloat16 · Brain Floating PointGoogle-এর তৈরি ১৬-bit format — float32-এর সমান range কিন্তু কম precision. আজকের LLM training-এ অত্যন্ত জনপ্রিয়।: Google-এর variant — float16-এর precision কম, কিন্তু range float32-এর সমান। Transformer-এ favorite.
- int8: ৮ bits, $-128$ থেকে $127$। QuantizedQuantization · কোয়ান্টাইজেশনমডেলের weights-কে float থেকে কম-bit integer-এ রূপান্তর — memory ও speed-এ লাভ, সামান্য accuracy ক্ষতি। Phone-এ LLM চালানোর চাবি। inference-এ।
২ · Overflow — সংখ্যা খুব বড়
প্রতিটি format-এর সর্বোচ্চ মান আছে — অতিক্রম করলে সংখ্যা Inf (Infinity) হয়ে যায়।
- float16 সর্বোচ্চ ≈ $6.5 \times 10^{4}$ (মাত্র ৬৫,৫০৪!)
- float32 সর্বোচ্চ ≈ $3.4 \times 10^{38}$
- float64 সর্বোচ্চ ≈ $1.8 \times 10^{308}$
import numpy as np
# একটি বিশাল সংখ্যা গণনা
x = np.float32(1e30)
print(f"x = {x}")
print(f"x * x = {x * x}") # Overflow!
print(f"exp(100) (float32) = {np.float32(np.exp(100))}")
print(f"exp(1000) (float64) = {np.exp(1000)}")
# float16-এ আরও সহজ
y = np.float16(60000)
print(f"\nfloat16 60000 * 2 = {y * 2}") # inf!
exp(1000)-এর মান প্রায় $10^{434}$ — float64-এর সীমা ছাড়িয়ে যায়। ফল: inf। float16-এ ৬০,০০০ × ২-ই overflow!
৩ · Underflow — সংখ্যা খুব ছোট
একইভাবে, খুব ছোট সংখ্যা শূন্য হয়ে যায়:
- float32 সর্বনিম্ন (অশূন্য) ≈ $1.4 \times 10^{-45}$
- float64 সর্বনিম্ন ≈ $5 \times 10^{-324}$
import numpy as np
# খুব ছোট সংখ্যা
x = np.exp(-1000)
print(f"exp(-1000) = {x}") # Underflow! 0 হয়ে যায়
# এর log নিতে গেলে
print(f"log(exp(-1000)) = {np.log(x) if x > 0 else 'log(0) = -inf'}")
# সঠিক উপায় — সরাসরি
print(f"সঠিক উত্তর: {-1000}")
৪ · NaN — সবচেয়ে ভয়ের শব্দ
Not-a-Number — একটি special float valueNaNIEEE 754-এর তিনটি special value: +∞, −∞, NaN. NaN নিজের সমান না (NaN == NaN → False), যেকোনো operation NaN-এর সাথে → NaN. AI training-এ NaN propagate করে গোটা batch নষ্ট করে। যা কোনো বৈধ মান নয়। AI কোডে loss হঠাৎ NaN হলে — পুরো প্রশিক্ষণ নষ্ট।
কীভাবে NaN আসে?
0 / 0inf - inflog(0)বাlog(negative)sqrt(negative)0 * infarccos(x)যখন $|x| > 1$
import numpy as np
print("0 / 0 =", np.float64(0)/np.float64(0))
print("log(0) =", np.log(0))
print("inf-inf =", np.inf - np.inf)
print("0 * inf =", 0 * np.inf)
# NaN-এর সম্পত্তি — কোনো কিছুর সমান না, এমনকি নিজেরও না
x = np.nan
print(f"\nx == x: {x == x}") # False!
print(f"np.isnan(x): {np.isnan(x)}") # True
# NaN propagate করে
y = np.array([1.0, 2.0, np.nan, 4.0])
print(f"sum: {y.sum()}") # nan
print(f"mean: {y.mean()}") # nan
print(f"nanmean: {np.nanmean(y)}") # 2.333... (NaN ignore)
x == x False! তাই NaN চেক করতে np.isnan() ব্যবহার করুন। NaN array-এ থাকলে — sum, mean সবই NaN.
৫ · AI-তে NaN-এর সাধারণ কারণ
- Cross-entropy-তে: $-\log(p)$ যখন $p \to 0$ → $\infty$ → পরে NaN.
- Division by zero: Normalization-এ যখন denominator ০।
- Exploding gradientExploding GradientBackpropagation-এ gradient মান দ্রুত বিশাল হয়ে যাওয়া — weights inf/NaN-এ পরিণত করে। RNN/deep network-এ পরিচিত সমস্যা; gradient clipping এর সমাধান।: Gradient খুব বড় হয়ে weights NaN বানিয়ে দেয়।
- Learning rate বেশি: দু'এক ধাপেই overflow.
- Mixed precision: float16-এ overflow সহজ।
- Bad data: Input-এ NaN বা inf থাকলে — propagate.
- Activation function: $\tanh$, $\text{sigmoid}$ saturate হলে gradient ০ → সমস্যা।
৬ · Log-Sum-ExpLog-Sum-Exp Trick$\log\sum e^{x_i} = m + \log\sum e^{x_i - m}$ ($m = \max x$)। Softmax/cross-entropy-কে overflow-মুক্ত করার গাণিতিক কৌশল। Trick — Softmax-এর স্থিরতা
AI-তে softmax function অপরিহার্য:
$$\text{softmax}(x_i) = \dfrac{e^{x_i}}{\sum_j e^{x_j}}$$
সমস্যা — $x_i$ একটু বড় হলে $e^{x_i}$ overflow করে। যেমন $e^{1000}$ = $\infty$।
কৌশল
প্রতিটি $x_i$ থেকে সর্বোচ্চ মান $m$ বিয়োগ করুন — গাণিতিকভাবে কোনো পার্থক্য নেই, কিন্তু overflow এড়ানো যায়:
$$\text{softmax}(x_i) = \dfrac{e^{x_i - m}}{\sum_j e^{x_j - m}}, \quad m = \max_j x_j$$
প্রমাণ: numerator ও denominator-এ $e^m$ গুণ — cancel. গণিত একই, কিন্তু সর্বোচ্চ exponent $0$, বাকি negative — সবই $\leq 1$, overflow অসম্ভব।
import numpy as np
def naive_softmax(x):
e = np.exp(x)
return e / e.sum()
def stable_softmax(x):
x = x - np.max(x) # সবচেয়ে গুরুত্বপূর্ণ লাইন
e = np.exp(x)
return e / e.sum()
# পরীক্ষা: বড় মান
x_big = np.array([1000.0, 1001.0, 1002.0])
print("Naive:")
print(naive_softmax(x_big)) # NaN (overflow)
print("\nStable:")
print(stable_softmax(x_big)) # সঠিক মান
# ছোট মানে — দু'টোই কাজ করে
x_small = np.array([1.0, 2.0, 3.0])
print(f"\nছোট মানে — naive: {naive_softmax(x_small)}")
print(f"ছোট মানে — stable: {stable_softmax(x_small)}")
৭ · Log-Probability — log space-এ থাকুন
অনেক AI গণনায় সম্ভাবনা গুণ করতে হয়:
$p_1 \cdot p_2 \cdot p_3 \cdots p_n$ — সবগুলো ০-১ এর মধ্যে — দ্রুত ০-এ পৌঁছাবে (underflow)।
কৌশল — log space-এ যান: $$\log(p_1 p_2 p_3 \cdots p_n) = \log p_1 + \log p_2 + \log p_3 + \cdots + \log p_n$$
গুণের বদলে যোগ — overflow/underflow-এর ঝুঁকি অনেক কম। তাই AI-তে প্রায়ই দেখবেন log_prob, log_likelihood, log_softmax — সব log-space-এ কাজ।
Hidden Markov Model, Naive Bayes, Language Model — সবেই।
৮ · ব্যবহারিক টিপস — NaN ঠেকানো
- $\log$-এ ছোট epsilon যোগ:
log(p + 1e-12) - Division-এ ০ চেক:
x / (y + 1e-8) - Gradient clippingGradient Clippinggradient-এর norm কোনো নির্দিষ্ট সীমা ($\tau$)-এর বেশি হলে scale down করা — exploding gradient রোধ করে। RNN ও Transformer training-এ অপরিহার্য।: gradient-এর norm সীমা দিন (PyTorch:
clip_grad_norm_) - Learning rate ছোট রাখুন (Adam-এ 1e-3, fine-tune-এ 1e-5)
- Stable softmax/log-softmax ব্যবহার (PyTorch-এ
F.log_softmax) - Loss NaN হলে — দ্রুত থামিয়ে কারণ খুঁজুন (NaN-এর প্রথম উৎসই বাগ)
- Mixed precision (AMP) — sensitive operations float32-এ রাখুন
- Input data validate — NaN/inf আছে কিনা check (
np.isfinite)
৯ · এক বাক্যে
"Computer-এর সংখ্যা সীমিত, AI-এর গণিত অসীম। দু'টির সংঘর্ষেই NaN. Stable softmax + log-space — দু'টি trick অর্ধেক সমস্যা সমাধান।"
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ আজকের বড় LLM (GPT-4, Llama-3) সব float16/bfloat16-এ train. কেন float32-এ না? বিনিময়ে কী trade-off, এবং mixed precision কীভাবে balance করে?
Mixed precision training — modern LLM-এর foundation. ২০১৭-এর Volta GPU-র Tensor Cores-এর পর থেকে standard. কারণ purely economic: speed, memory, energy.
(১) কেন float16/bfloat16?
- Memory: float16 = float32-এর অর্ধেক। 70B model float32-এ 280GB, float16-এ 140GB.
- Speed: Tensor Cores float16/bfloat16-এ ২-৪x দ্রুত।
- Bandwidth: GPU memory ↔ compute — ছোট data দ্রুত transfer.
- Cost: GPU hour ও power dramatic কমে।
(২) float16 বনাম bfloat16:
-
float16: 1 sign + 5 exp + 10 mantissa. Range $\pm 6.5 \times 10^{4}$, precision ~৩-৪ ডিজিট।
- সমস্যা: গ্রেডিয়েন্ট ছোট হলে underflow.
- Solution: loss scaling — gradient × 2^k, পরে unscale.
-
bfloat16: 1 sign + 8 exp + 7 mantissa. Range float32-এর সমান $\pm 3.4 \times 10^{38}$, precision কম।
- Google TPU-তে designed.
- Range বড় তাই overflow/underflow rare.
- Loss scaling লাগে না — সরল।
- আজকের LLM training-এ favorite.
(৩) Mixed precision strategy:
- Forward + backward: float16/bfloat16 (দ্রুত)।
- Master weights: float32 (precision সংরক্ষণ)।
- Optimizer state: float32 (Adam-এর variance)।
- Loss accumulation: float32 (small loss numbers)।
- Layer norm, softmax: float32 (numerically sensitive)।
(৪) Trade-offs:
- Pros: 2-4x speed, half memory, similar accuracy.
- Cons: Loss scaling-এর hyperparameter, debug কঠিন, NaN-prone.
- Edge case: ছোট architecture-এ pure float32 মাঝে মাঝে ভাল।
(৫) Production checklist:
- PyTorch
torch.cuda.amp.autocast()— automatic. - NaN detection:
torch.isnan(loss).any()regular check. - Gradient scaler:
GradScaler()। - Tensor Cores enable: A100, H100-এ standard.
(৬) আরও আগামীর দিক:
- FP8 (Hopper, ২০২২): H100-এ — half memory of FP16.
- INT8 / INT4 inference: Quantization — production-এ ৫-১০x দ্রুত।
- FP4 (২০২৫+): Research, extreme efficiency.
মূল উপলব্ধি: Floating-point precision — শুধু gণিতিক detail না, AI-এর economics. GPT-4 training cost $100M — half precision না হলে $400M হতো। যিনি bfloat16-এর nuances বুঝেন — তিনি modern AI infrastructure-এ valuable.
প্র ০২ "$x - \max(x)$" — এই এক লাইন কেন গাণিতিকভাবে softmax বদলায় না? প্রমাণ করুন এবং ব্যাখ্যা করুন কেন এটি সব AI library-তে standard.
এই trick — log-sum-exp-এর foundation — অসাধারণ সরল কিন্তু গভীর। সব deep learning framework-এ অভ্যন্তরীণ। দেখুন কেন কাজ করে।
গাণিতিক প্রমাণ:
মূল softmax: $\text{softmax}(x_i) = \dfrac{e^{x_i}}{\sum_j e^{x_j}}$
$m = \max_j x_j$ subtract করুন:
$\dfrac{e^{x_i - m}}{\sum_j e^{x_j - m}} = \dfrac{e^{x_i} \cdot e^{-m}}{\sum_j e^{x_j} \cdot e^{-m}} = \dfrac{e^{-m}}{e^{-m}} \cdot \dfrac{e^{x_i}}{\sum_j e^{x_j}} = \text{softmax}(x_i)$
$e^{-m}$ numerator ও denominator-এ গুণ — cancel. গণিত একই।
(১) কেন overflow এড়ায়?
- Subtraction-এর পর: $x_i - m \leq 0$ সবার জন্য (max-এ $0$)।
- $e^{0} = 1$ সর্বোচ্চ। $e^{\text{negative}} \in (0, 1]$।
- সর্বোচ্চ exponent শূন্য — overflow অসম্ভব।
(২) Underflow concern?
- Subtraction-এর পর কিছু $x_i - m$ খুব negative হতে পারে — $e^{-1000} \to 0$।
- কিন্তু অন্তত একটি term ($\max$) = $1$ — denominator কখনো ০ হবে না।
- তাই division safe.
(৩) Log-sum-exp variant:
আরও সাধারণ trick: $\log\sum_j e^{x_j}$ গণনায়:
$\log\sum_j e^{x_j} = m + \log\sum_j e^{x_j - m}$
এটি cross-entropy, log-likelihood, attention scoring — সবেই ব্যবহৃত।
(৪) PyTorch ভেতরে কী চলছে?
torch.softmax,torch.log_softmax— সবেই এই trick.- CUDA kernel-এ optimized.
- Backward pass-এ gradient calculation-ও stable.
(৫) কেন আগে নয়?
- "Stable softmax" trick পুরোনো (১৯৭০-এর scientific computing literature)।
- Neural network early days-এ overlooked — অনেক bug source.
- ২০১২ AlexNet-এর পর CUDA library-এ standard.
(৬) Attention-এ critical:
- Transformer attention: $\text{softmax}\left(\dfrac{QK^T}{\sqrt{d_k}}\right)V$।
- $QK^T$ values অনেক বড় হতে পারে — stable softmax ছাড়া NaN.
- Flash Attention (Dao et al. ২০২২) — log-sum-exp trick + GPU memory hierarchy.
(৭) যেকোনো language-এ implementation:
- NumPy:
x - np.max(x, axis=-1, keepdims=True) - PyTorch:
F.log_softmax(x, dim=-1) - JAX:
jax.nn.log_softmax(x) - TensorFlow:
tf.nn.log_softmax(x)
মূল উপলব্ধি: এই এক-লাইনের trick numerical computing-এর সৌন্দর্য। গণিত একই, সংখ্যাগতভাবে অপরিহার্য। ভাল ML engineer এই detail-এ মনোযোগ দেয় — যা separates production থেকে toy code.
প্র ০৩ "Loss = NaN" debug — practical workflow কী? কোথা থেকে শুরু, কী কী tool, কীভাবে root cause খুঁজে বের করব?
NaN debugging — production ML-এর সবচেয়ে frustrating অভিজ্ঞতা। ২ ঘণ্টায় training, ১,০০,০০০ step পরে loss NaN — কী করবেন? Systematic approach:
(১) প্রথম response — থামান, বিশ্লেষণ:
- Training-এ NaN early detection:
if torch.isnan(loss): break। - Last good checkpoint থেকে resume — disaster avoid.
- Logs সংরক্ষণ: loss, grad norm, learning rate, weights min/max.
(২) Common causes — ranked:
-
Exploding gradient (50% cases):
- Symptom: loss-এর আগে gradient norm explode.
- Fix: gradient clipping (
clip_grad_norm_, max=1.0)।
-
Learning rate বেশি (20%):
- Symptom: শুরুতেই NaN.
- Fix: warmup, ১০x ছোট LR.
-
Bad data (15%):
- Symptom: নির্দিষ্ট batch-এ NaN.
- Fix:
torch.isfinite(x).all()assertion.
-
log(0) variant (10%):
- Symptom: cross-entropy-এ predictions extreme.
- Fix: epsilon, label smoothing.
-
Mixed precision overflow (5%):
- Symptom: float16-এ specific operation.
- Fix: ঐ operation float32-এ wrap.
(৩) PyTorch debugging tools:
torch.autograd.set_detect_anomaly(True)— backward-এ NaN-এর source trace.torch.utils.checkpoint— memory-efficient debugging.- Hooks: প্রতিটি layer-এ output check.
- TensorBoard: loss, grad histogram visualize.
- Weights & Biases: production logging.
(৪) Bisection technique:
- Loss এ NaN — কোন layer-এ?
- Forward pass-এ layer-wise output check.
- Output finite হলে — পরের layer-এ যান।
- প্রথম যে layer NaN return করে — সেটিই সমস্যা।
(৫) Numerical safety checks:
def assert_finite(t, name):
if not torch.isfinite(t).all():
nan_count = torch.isnan(t).sum().item()
inf_count = torch.isinf(t).sum().item()
raise ValueError(f"{name}: {nan_count} NaN, {inf_count} Inf")
# Forward pass-এ
x = embedding(input_ids)
assert_finite(x, "embedding")
x = attention(x)
assert_finite(x, "attention")
(৬) Real-world example workflows:
- "Training stable for 1k steps, NaN at 1001":
- Sample at step 1000 corrupt? — data check.
- Specific weight saturate? — weight histogram.
- LR scheduler-এ jump? — log scheduler values.
- "NaN in attention only at long sequences":
- $QK^T$ values too large?
- Stable softmax confirm.
- Sequence length-নির্ভর scaling factor.
- "NaN only on certain GPUs":
- cuDNN version mismatch?
- Tensor Core specific (Ampere vs Hopper)?
(৭) Prevention > cure:
- Initial training run-এ verbose logging.
- Gradient clipping সর্বদা।
- Warmup mandatory.
- Validation NaN check প্রতি epoch.
- Smaller model দিয়ে dry-run.
(৮) যখন সব ব্যর্থ:
- Learning rate aggressive কমান (১০-১০০x)।
- Smaller batch, smaller model.
- float32 fallback.
- Loss curve community-তে share — কেউ same experience.
মূল উপলব্ধি: NaN debugging শিল্প — empirical, frustrating, কিন্তু skill. প্রতিটি ভাল ML engineer তার career-এ ১০০+ NaN debug করে। প্রতিটি বার শিখলে — এক একটি মূল্যবান lesson. Patient, systematic approach — that's the only way.
প্র ০৪ "Quantization" — INT8, INT4 inference. কেন এটি আজকের on-device AI-এর foundation? Numerical precision হারানো — তবু কীভাবে accuracy ধরে রাখে?
Quantization — phone-এ Llama চালানোর secret. ২০২২ থেকে এর গবেষণা explosive. GPU-তে train, edge-এ deploy — quantization এর ব্রিজ।
(১) Quantization কী?
- Float32 (৩২ bits) → INT8 (৮ bits) → INT4 (৪ bits)।
- Real number → Integer mapping: $x_{\text{int}} = \text{round}(x_{\text{float}} / s + z)$।
- $s$ = scale factor, $z$ = zero point.
(২) কেন critical?
- Memory: 4x to 8x reduction. 7B model float32-এ 28GB, INT4-এ 3.5GB — phone-এ চলে।
- Speed: Integer math float-এর চেয়ে ৪-৮x দ্রুত।
- Energy: Mobile battery-এ critical.
- Bandwidth: Memory ↔ compute small data.
(৩) Quantization-এর ধরন:
-
Post-Training Quantization (PTQ):
- Train float-এ, deploy int-এ।
- সরল, কিন্তু accuracy drop সম্ভব।
- GPTQ, AWQ — popular.
-
Quantization-Aware Training (QAT):
- Training-এই quantization simulate.
- ভাল accuracy, কিন্তু expensive.
-
Dynamic vs Static:
- Dynamic: runtime-এ activation quantize.
- Static: pre-computed scales.
(৪) কেন accuracy ধরে রাখে?
- Redundancy: Modern model overparameterized — extra precision অপ্রয়োজন।
- Robustness: Activation noise-এ trained network resilient.
- Critical layers identified: Sensitive layers (first, last) higher precision.
- Outlier handling: AWQ, SmoothQuant — extreme values protect.
(৫) Trade-offs:
- INT8: প্রায় lossless (~১% accuracy drop)।
- INT4: ১-৫% drop, কিন্তু 4x compression.
- INT2/INT1: research, large degradation.
(৬) Real-world examples:
- Llama.cpp: CPU-তে quantized Llama চালায়। M1 Mac-এ 7B model.
- GGUF format: Various quantization levels (Q4_K, Q5_K, Q8_0)।
- iPhone Neural Engine: INT8 default.
- Edge TPU: INT8 only.
(৭) Calibration data:
- Quantization-এ scale calculate-এর জন্য representative data.
- ৫০০-১০০০ samples enough.
- Domain-specific calibration — better accuracy.
(৮) আগামী direction:
- Mixed-precision quantization: Layer-by-layer optimal precision.
- 1-bit LLM (BitNet, ২০২৪): Weight $\in \{-1, 0, 1\}$।
- Hardware-aware: GPU/TPU/NPU-specific quantization.
- Activation quantization: Weight + activation দু'টোই।
(৯) Bangladesh context:
- Cheap Android phone-এ AI চালানো — quantization indispensable.
- Bangla LLM-এর mobile deployment.
- Edge inference — internet ছাড়া AI.
- Banglalink/Robi data limit-এ — local model.
মূল উপলব্ধি: Quantization বুঝলে — full picture দেখতে পান। Training (full precision) → Optimization (mixed precision) → Deployment (quantized)। প্রতিটি stage-এর numerical considerations. আজকের production AI engineer তিন stage-ই বোঝেন।
অনুশীলন
-
পরীক্ষা করুন: উপরের naive_softmax-কে $[5, 6, 7]$-এ চালান। তারপর $[500, 501, 502]$-এ। কী পার্থক্য?
$[5, 6, 7]$-এ: naive ও stable দু'টোই $\approx [0.09, 0.244, 0.665]$।
$[500, 501, 502]$-এ: naive $\to$
[nan, nan, nan]($e^{500}$ overflow); stable $\to$ একই $[0.09, 0.244, 0.665]$।গাণিতিক উত্তর identical (input shift-invariant), কিন্তু সংখ্যাগতভাবে আলাদা।
-
লিখুন: Python-এ একটি ফাংশন তৈরি করুন যা একটি লিস্ট-এর কিছু সম্ভাবনার লগ-যোগফল দেয় (
logsumexp) — overflow এড়িয়ে।import numpy as np def logsumexp(x): """log(sum(exp(x))) — stable version.""" m = np.max(x) return m + np.log(np.sum(np.exp(x - m))) # পরীক্ষা x = np.array([1000.0, 1001.0, 1002.0]) print(logsumexp(x)) # ~1002.407 print(np.log(np.sum(np.exp(x)))) # naive: inf! # scipy-এও আছে: scipy.special.logsumexpপ্রমাণ: $\log\sum e^{x_i} = m + \log\sum e^{x_i - m}$, যেখানে $m = \max x$।
-
চিন্তা করুন: AI মডেল প্রশিক্ষণে ১,০০,০০০ ধাপের পর হঠাৎ loss NaN হলো। কী কী চেক করবেন?
প্র ০৩-এ বিস্তারিত। Priority order:
- Gradient norm — explode? → Gradient clipping.
- Specific batch corrupt? → Data validation.
- LR scheduler-এ unusual jump?
- Mixed precision overflow? → Layer wise float32 fallback.
- Weight saturation? → Histogram check.
- Last good checkpoint থেকে resume + verbose log.
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পাঠ ২৪ · ML-এর জন্য পরিসংখ্যান পরবর্তী পাঠ MLE, MAP, CI — সংখ্যাগত স্থিরতার গণিত-ভিত্তি।
- পাঠ ২২ · অপ্টিমাইজেশন আগের পাঠ কেন NaN আসে — exploding gradient, optimization unstable.
- পাঠ ২১ · তথ্য তত্ত্ব এই পাঠের সাথে সম্পর্কিত Cross-entropy-এ log(0) — সবচেয়ে সাধারণ NaN-এর উৎস।
- সব AI Courses দেখুন ABCL TECH Python, ML, DL, NLP, CV, GenAI, RL, MLOps — সব AI কোর্স একসাথে।