পাঠ ২৩ · ৩০-এর মধ্যে · মডিউল ৩
Home / AI Courses / AI Foundations / সংখ্যাগত স্থিরতা

সংখ্যাগত স্থিরতা — কেন NaN আসে

Numerical stability — why NaNs happen
৯ মিনিট পড়া মাঝারি · Intermediate Python কোডসহ

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

  • কম্পিউটার সংখ্যা কীভাবে সংরক্ষণ করে — 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}$
Python · Overflow
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}$
Python · Underflow
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}")

    
$\log(\exp(x))$ গাণিতিকভাবে $x$ হওয়ার কথা। কিন্তু $\exp(-1000)$ underflow করে $0$ হয়ে যায় — তারপর $\log(0) = -\infty$।

৪ · NaN — সবচেয়ে ভয়ের শব্দ

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 / 0
  • inf - inf
  • log(0) বা log(negative)
  • sqrt(negative)
  • 0 * inf
  • arccos(x) যখন $|x| > 1$
Python · NaN-এর জন্ম
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)

    
NaN-এর একটি অদ্ভুত বৈশিষ্ট্য — 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 অসম্ভব।

Python · Stable Softmax
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)}")

    
Naive softmax বড় মানে NaN. Stable softmax — একই গণিত, কিন্তু সংখ্যাগতভাবে নির্ভরযোগ্য। সব AI library এই trick ব্যবহার করে।
Numerical stability — সমস্যা ও সমাধান Why NaN appears, and how to prevent it Float Ranges float64 ±1.8 × 10³⁰⁸ float32 ±3.4 × 10³⁸ float16 ±6.5 × 10⁴ (ছোট!) bfloat16 (Google) ±3.4 × 10³⁸ (LLM-এ) ⚠️ NaN-এর উৎস log(0) → −∞ 0 / 0 → NaN ∞ − ∞ → NaN exp(big) → ∞ √(neg) → NaN propagate Loss = NaN → Training নষ্ট all weights become NaN, model dead ✅ সমাধান Stable softmax x − max(x) overflow এড়ায় Log-space log(p₁p₂) = log p₁ + log p₂ underflow এড়ায় Epsilon log(p + 1e−12) log(0) এড়ায় Gradient clip ‖∇‖ ≤ τ explosion রোধ
Float-এর সীমা → NaN-এর জন্ম → training disaster. সমাধান: stable softmax, log-space, epsilon, gradient clipping. প্রতিটি AI library এই trick ব্যবহার করে।

৭ · 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)
Loss হঠাৎ NaN হলে — সমাধানের আগে কারণ বুঝুন। সাধারণ ভুল — শুধু "NaN এড়াতে" arbitrary clipping দিয়ে দেওয়া। এতে symptom লুকায়, রোগ থাকে। প্রকৃত cause — exploding gradient? Learning rate বেশি? Bad data? Numerically unstable formula? — খুঁজে বের করুন।
আধুনিক framework (PyTorch, TensorFlow, JAX) — অনেক সাধারণ trick অভ্যন্তরীণভাবে ব্যবহার করে। তবু বড় মডেলে NaN আসা সাধারণ। AI-প্রকৌশলীর কাজের একটা বড় অংশই — সংখ্যাগত স্থিরতা ঠিক রাখা। বড় টিম — Meta, OpenAI — এ নিয়ে dedicated researchers.

৯ · এক বাক্যে

"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:

  1. Exploding gradient (50% cases):
    • Symptom: loss-এর আগে gradient norm explode.
    • Fix: gradient clipping (clip_grad_norm_, max=1.0)।
  2. Learning rate বেশি (20%):
    • Symptom: শুরুতেই NaN.
    • Fix: warmup, ১০x ছোট LR.
  3. Bad data (15%):
    • Symptom: নির্দিষ্ট batch-এ NaN.
    • Fix: torch.isfinite(x).all() assertion.
  4. log(0) variant (10%):
    • Symptom: cross-entropy-এ predictions extreme.
    • Fix: epsilon, label smoothing.
  5. 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-ই বোঝেন।

অনুশীলন

  1. পরীক্ষা করুন: উপরের 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), কিন্তু সংখ্যাগতভাবে আলাদা।

  2. লিখুন: 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$।

  3. চিন্তা করুন: AI মডেল প্রশিক্ষণে ১,০০,০০০ ধাপের পর হঠাৎ loss NaN হলো। কী কী চেক করবেন?

    প্র ০৩-এ বিস্তারিত। Priority order:

    1. Gradient norm — explode? → Gradient clipping.
    2. Specific batch corrupt? → Data validation.
    3. LR scheduler-এ unusual jump?
    4. Mixed precision overflow? → Layer wise float32 fallback.
    5. Weight saturation? → Histogram check.
    6. Last good checkpoint থেকে resume + verbose log.

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

কোড রানার কাজ না করলে? ব্রাউজারে কাজ না করলে Google Colab ব্যবহার করুন — Google-এর ফ্রি অনলাইন Python পরিবেশ, শুধু Gmail অ্যাকাউন্ট লাগে।
পূর্ববর্তী পাঠ
পাঠ ২২ · অপ্টিমাইজেশন