গ্রেডিয়েন্ট — উপরে যাওয়ার দিক
এই পাঠে যা শিখবেন
- আংশিক ডেরিভেটিভ (partial derivative) — যখন একাধিক চলক থাকে
- গ্রেডিয়েন্ট কী — সব আংশিক ডেরিভেটিভের ভেক্টর
- "উপরে যাওয়ার সবচেয়ে খাড়া দিক" — গ্রেডিয়েন্টের জ্যামিতিক অর্থ
- NumPy দিয়ে গ্রেডিয়েন্ট সংখ্যাগতভাবে বের করা
১ · এক চলক থেকে দু'চলকে
আগের পাঠে আমরা $f(x)$-এর ডেরিভেটিভ দেখেছি — একটি চলক $x$। কিন্তু বাস্তবে — বিশেষ করে AI-তে — ফাংশন প্রায়ই অনেক চলকের। যেমন একটি বাড়ির দাম শুধু আকার নয়, অবস্থান, বয়স, কক্ষ-সংখ্যা — সব কিছুর উপর নির্ভর করে।
সরল উদাহরণ — $f(x, y) = x^2 + y^2$। দু'টি চলক। ঢাল কোন দিকে?
২ · আংশিক ডেরিভেটিভ
একটি চলকের সাপেক্ষে আংশিক ডেরিভেটিভPartial Derivativeবহু-চলক ফাংশনে — একটি চলকের সাপেক্ষে derivative নিয়ে অন্যগুলো ধ্রুব ধরা। চিহ্ন: $\partial$ (curly d, "del")। AI-তে loss function কোটি কোটি weight-এর — প্রতিটির সাপেক্ষে আংশিক derivative-ই gradient. Multivariable calculus-এর core. মানে — অন্য সব চলক ধ্রুব ধরে নিয়ে শুধু সেই চলকের সাপেক্ষে ডেরিভেটিভ। চিহ্ন: $\partial$ (curly d)।
উদাহরণ
$f(x, y) = x^2 + y^2$
- $x$-এর সাপেক্ষে আংশিক: $\dfrac{\partial f}{\partial x} = 2x$ ($y^2$-এর ডেরিভেটিভ ০, কারণ $y$ ধ্রুব)
- $y$-এর সাপেক্ষে আংশিক: $\dfrac{\partial f}{\partial y} = 2y$
আরেকটি উদাহরণ
$f(x, y) = 3x^2 y + 4xy^2 + 5$
- $\dfrac{\partial f}{\partial x} = 6xy + 4y^2$ ($y$ ধ্রুব ধরা হলো)
- $\dfrac{\partial f}{\partial y} = 3x^2 + 8xy$
$\partial f/\partial x$ = পূর্ব দিকে এক ধাপ গেলে কত উচ্চতা পরিবর্তন।
$\partial f/\partial y$ = উত্তর দিকে এক ধাপ গেলে কত উচ্চতা পরিবর্তন।
৩ · গ্রেডিয়েন্ট = সব আংশিক ডেরিভেটিভের ভেক্টর
সব আংশিক ডেরিভেটিভ একসাথে রাখলে — পাওয়া যায় গ্রেডিয়েন্ট ভেক্টরGradientএকটি বহু-চলক ফাংশনের সব আংশিক derivative-এর ভেক্টর। যেদিকে ফাংশন সবচেয়ে দ্রুত বাড়ে সেদিকে নির্দেশ করে। চিহ্ন: $\nabla f$।। চিহ্ন: $\nabla f$ (nabla)।
$$\nabla f = \begin{pmatrix} \dfrac{\partial f}{\partial x} \\[6pt] \dfrac{\partial f}{\partial y} \end{pmatrix}$$
$f(x, y) = x^2 + y^2$-এর গ্রেডিয়েন্ট:
$$\nabla f = \begin{pmatrix} 2x \\ 2y \end{pmatrix}$$
$x = 1, y = 2$ বিন্দুতে — $\nabla f = (2, 4)$।
৪ · গ্রেডিয়েন্টের জ্যামিতিক অর্থ
এটাই AI-এর সবচেয়ে গুরুত্বপূর্ণ একটি ধারণা —
গ্রেডিয়েন্ট ভেক্টর — যেদিকে ফাংশন সবচেয়ে দ্রুত বাড়ে সেই দিকে নির্দেশ করে। এর বিপরীত দিক — সবচেয়ে দ্রুত কমার দিক।
পাহাড়ের উপমায় — আপনি $(x, y)$ বিন্দুতে দাঁড়িয়ে আছেন। গ্রেডিয়েন্ট ভেক্টর তার দিকে ইশারা করে — যেদিকে গেলে সবচেয়ে দ্রুত উপরে উঠবেন। $-\nabla f$ — তার বিপরীত — সবচেয়ে দ্রুত নিচে নামার দিক।
৫ · কেন AI-এর জন্য গুরুত্বপূর্ণ?
AI-তে আমরা একটি loss function $L(w_1, w_2, \ldots, w_n)$ বানাই। লক্ষ্য — এই $L$-কে যতটা সম্ভব ছোট করা।
কিন্তু $L$-এর কোটি কোটি চলক ($w_1, w_2, \ldots$) থাকে। কোন দিকে যাবেন? — গ্রেডিয়েন্ট বলে দেয়।
- $\nabla L$ গণনা করুন — উপরে যাওয়ার দিক।
- বিপরীতে এক ছোট ধাপ যান: $w \leftarrow w - \eta \nabla L$ (এখানে $\eta$ = learning rateLearning Rateপ্রতি training step-এ weight update-এর "ধাপের আকার"। বড় = দ্রুত কিন্তু overshoot, ছোট = ধীর কিন্তু stable. DL-এর সবচেয়ে গুরুত্বপূর্ণ hyperparameter.)।
- পুনরাবৃত্তি করুন — ক্রমশ $L$-এর সর্বনিম্নে পৌঁছানো।
এটাই Gradient Descent — পরের পাঠে বিস্তারিত। আজ শুধু জানা — গ্রেডিয়েন্ট কী।
৬ · NumPy দিয়ে গ্রেডিয়েন্ট
সংজ্ঞা থেকেই গ্রেডিয়েন্ট সংখ্যাগতভাবে বের করা যায় — প্রতিটি চলকের সাপেক্ষে আলাদাভাবে।
import numpy as np
# f(x, y) = x^2 + y^2
def f(point):
x, y = point
return x ** 2 + y ** 2
def gradient(f, point, h=1e-6):
point = np.array(point, dtype=float)
grad = np.zeros_like(point)
for i in range(len(point)):
p_plus = point.copy()
p_plus[i] += h
grad[i] = (f(p_plus) - f(point)) / h
return grad
# (1, 2) বিন্দুতে গ্রেডিয়েন্ট
g = gradient(f, [1.0, 2.0])
print(f"∇f(1, 2) ≈ {g}")
# তাত্ত্বিক উত্তর: (2*1, 2*2) = (2, 4)
gradient() function-টি যেকোনো মাত্রায় কাজ করে।
৭ · উচ্চ-মাত্রিক গ্রেডিয়েন্ট
AI মডেলে মিলিয়ন বা বিলিয়ন চলক থাকতে পারে। গ্রেডিয়েন্ট তখন একটি বিশাল ভেক্টর।
import numpy as np
# 5-চলকের একটি ফাংশন
# f(w) = w[0]^2 + 2*w[1]^2 + 3*w[2]^2 + 4*w[3]^2 + 5*w[4]^2
def f(w):
coeffs = np.array([1, 2, 3, 4, 5])
return np.sum(coeffs * w ** 2)
def gradient(f, w, h=1e-6):
w = np.array(w, dtype=float)
grad = np.zeros_like(w)
for i in range(len(w)):
wp = w.copy()
wp[i] += h
grad[i] = (f(wp) - f(w)) / h
return grad
w0 = np.array([1.0, 1.0, 1.0, 1.0, 1.0])
print("ফাংশন মান:", f(w0))
print("গ্রেডিয়েন্ট:", gradient(f, w0))
# তাত্ত্বিক: (2, 4, 6, 8, 10)
৮ · একটি ভিজ্যুয়াল উপলব্ধি
$f(x, y) = x^2 + y^2$ — একটি বাটির আকৃতির পৃষ্ঠ (paraboloid)। কেন্দ্র $(0, 0)$-এ সর্বনিম্ন, $L = 0$।
যেকোনো বিন্দু থেকে $-\nabla f$-এর দিকে গেলে — সরাসরি কেন্দ্রের দিকে চলে যাবেন।
বাস্তব loss landscape এত সরল নয় — এটা পাহাড়-উপত্যকা মেশানো। কিন্তু মূলনীতি একই: গ্রেডিয়েন্টের বিপরীত দিকে গেলে নিচে নামবেন।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ "Gradient সবচেয়ে দ্রুত উপরে যাওয়ার দিক" — এই দাবি কেন সত্য? Mathematically প্রমাণ কী?
এই দাবিটি যেন magic, কিন্তু আসলে directional derivative ও Cauchy-Schwarz inequality থেকে সরাসরি প্রমাণ।
Directional derivative:
- একটি unit vector $\hat{\mathbf{u}}$-এর দিকে $f$-এর পরিবর্তনের হার = $D_{\hat{u}}f = \nabla f \cdot \hat{\mathbf{u}}$।
- এটি dot product — gradient ও direction-এর।
Dot product expansion:
$\nabla f \cdot \hat{\mathbf{u}} = \|\nabla f\| \cdot \|\hat{\mathbf{u}}\| \cdot \cos\theta = \|\nabla f\| \cos\theta$
($\hat{\mathbf{u}}$ unit vector, তাই $\|\hat{\mathbf{u}}\| = 1$)
Maximize over $\theta$:
- $\cos\theta$ সর্বোচ্চ যখন $\theta = 0$ — অর্থাৎ $\hat{\mathbf{u}}$ ও $\nabla f$ একই দিকে।
- সর্বোচ্চ মান = $\|\nabla f\|$।
- সর্বনিম্ন মান যখন $\theta = 180°$ — অর্থাৎ $-\nabla f$ দিকে। মান = $-\|\nabla f\|$।
প্রভাব:
- $\nabla f$ direction-এ সর্বাধিক বৃদ্ধি।
- $-\nabla f$ direction-এ সর্বাধিক হ্রাস।
- $\nabla f$ এর বিপরীতে — সবচেয়ে দ্রুত কমার পথ।
- Perpendicular (কোণ ৯০°) — কোনো পরিবর্তন নেই (level curve-এ চলা)।
মূল উপলব্ধি: গ্রেডিয়েন্ট-এর "magic" আসলে dot product-এর geometry. এই কারণেই AI-এর প্রতিটি step gradient-এর বিপরীত দিকে — এর কোনো বিকল্প নেই (locally)।
Caveat: এই "steepest" শুধু infinitesimally সত্য। বড় ধাপে — landscape curvature কারণে পথ optimal না-ও হতে পারে। তাই Newton's method, second-order optimization-এ Hessian ব্যবহার।
প্র ০২ GPT-৪-এর ১.৭৫ trillion parameters. প্রতিটি training step-এ এত বিশাল gradient compute কীভাবে সম্ভব? Backprop-এর efficiency কোথা থেকে আসে?
এই প্রশ্ন AI computation-এর সবচেয়ে gripping engineering trick-এ পৌঁছায় — backpropagation.
Naive approach — কেন কাজ করবে না:
- Numerical: প্রতিটি parameter-এর জন্য একটি forward pass. ১.৭৫T params × forward time = অসম্ভব।
- প্রতিটি step-এ ~১০ trillion FLOPs forward. × 1.75T = 1.75 × 10²⁵ FLOPs. মহাবিশ্বের গণনাও কম।
Backprop-এর genius — chain rule:
- Computation graph: প্রতিটি operation একটি node.
- Forward pass: input → output, intermediate values store.
- Backward passBackpropagationoutput থেকে input-এর দিকে chain rule দিয়ে gradient propagate করার algorithm. DL-এর শেখার মূল engine — Rumelhart, Hinton, Williams (১৯৮৬)।: output থেকে input-এর দিকে — প্রতিটি node-এ local derivative × upstream gradient.
- একটি forward + একটি backward = সব gradients.
কেন এটি দ্রুত — Reverse-mode AutoDiff:
- Output scalar ($L$) → input vector (parameters)।
- Cost ≈ forward pass cost × constant (~৩×)।
- প্রতিটি parameter-এর gradient — independently compute নয়, একসাথে।
- এই efficiency এসে কারণ — sum-of-products structure-এ shared sub-expressions.
উদাহরণ — সরল network:
- $L = (y - W_2 \sigma(W_1 x))^2$।
- Forward: $h = W_1 x$, $a = \sigma(h)$, $\hat{y} = W_2 a$, $L = (y - \hat{y})^2$।
- Backward (chain rule):
- $\partial L / \partial \hat{y} = -2(y - \hat{y})$।
- $\partial L / \partial W_2 = (\partial L / \partial \hat{y}) \cdot a^T$।
- $\partial L / \partial a = W_2^T \cdot (\partial L / \partial \hat{y})$।
- $\partial L / \partial h = (\partial L / \partial a) \cdot \sigma'(h)$।
- $\partial L / \partial W_1 = (\partial L / \partial h) \cdot x^T$।
- Forward + backward = total gradient. Memory cost: forward intermediates store.
Modern implementations:
- PyTorch autograd: dynamic computation graph, eager.
- JAX: functional, JIT compile-এ XLA.
- TensorFlow: static graph (older), eager (newer)।
- Activation checkpointing: memory save — recompute কিছু intermediates.
- Mixed precision (fp16): half memory, almost-same accuracy.
- Distributed training: gradient sync across GPUs (data parallel)।
মূল উপলব্ধি: Backprop শুধু "calculus" না — এটি AI-র একটি engineering miracle. ১৯৮৬-তে Rumelhart, Hinton, Williams পেপারে আনুষ্ঠানিকীকরণ। এই algorithm ছাড়া আজকের কোনো DL সম্ভব না।
প্র ০৩ Loss landscape "smooth bowl" না — এটা ১,০০০,০০০-D-এর rocky landscape. Saddle points, local minima, plateaus — gradient descent কীভাবে navigate করে?
High-dimensional optimization-এর geometry counterintuitive. অনেক popular ধারণা ভুল।
মিথ ১: "Many local minima"
- ২-D-এ অনেক — সত্য।
- হাই-D-এ — Choromanska et al. (২০১৪) ও পরে Dauphin et al. দেখান — DL loss surface-এ local minima বিরল, সাধারণত globally optimum-এর কাছে।
- সমস্যা — bad local minima না, saddle points.
মিথ ২: "Gradient descent gets stuck"
- Saddle point — eigenvalues mixed (positive ও negative)।
- Pure GD-এ slow escape — gradient ছোট কিন্তু ০ না।
- Stochasticity — saddle থেকে বেরিয়ে আসতে সাহায্য করে। SGD এ কারণে ভাল।
আসল চ্যালেঞ্জ:
- Plateaus: বড় flat region — gradient ~০, কিন্তু minimum না।
- Cliffs: Sharp derivative — gradient explosion.
- Curvature variation: এক direction-এ steep, অন্য direction-এ flat — pure GD struggle.
- Pathological curvature: Hessian poorly conditioned → slow.
আধুনিক optimizers — কী করে:
- Momentum (Polyak ১৯৬৪): velocity store — slow regions accelerate. $v_{t+1} = \beta v_t - \eta \nabla L$।
- Nesterov accelerated: "look ahead" — momentum direction-এ আগে থেকে gradient.
- AdaGrad/RMSprop: per-parameter learning rate — frequent updates-এ কম, rare-এ বেশি।
- AdamAdam · Adaptive Moment Estimation(২০১৪) সবচেয়ে জনপ্রিয় optimizer — momentum ও RMSprop-এর মিশ্রণ। প্রতিটি parameter-এর নিজস্ব learning rate adaptive. DL-এর default পছন্দ। (Kingma ২০১৪): momentum + RMSprop combined. DL-এ default.
- AdamW: weight decay decoupled. Modern LLM-এ standard.
- Lion (Google ২০২৩): Adam-এর simpler alternative. Memory-efficient.
SGD-র counterintuitive efficacy:
- Random mini-batches → noisy gradients.
- Noise = exploration. Saddle escape সহজ।
- Implicit regularization — generalization ভাল।
- Sharp minima vs flat minima — SGD flat-এর দিকে bias. Flat minima better generalize.
Loss landscape visualization:
- Li et al. (২০১৮) — DL loss surfaces 2D projection দেখায়।
- ResNet skip connection — landscape smoother করে।
- Wide networks — flat-এর প্রবণতা।
মূল উপলব্ধি: Pure gradient descent — old textbook. Modern AI-তে — momentum, adaptive learning rates, stochastic noise. সব মিলে — high-D rocky landscape navigate. এই কারণে DL "এত ভাল কাজ করে" — যা অপ্রত্যাশিত।
প্র ০৪ Gradient ভেক্টরের দৈর্ঘ্য $\|\nabla f\|$ কী বলে? AI training-এ কখন এটা গুরুত্বপূর্ণ?
Gradient-এর direction guide করে; কিন্তু magnitude-ও তথ্য বহন করে।
Geometric meaning:
- $\|\nabla f\|$ = সেই বিন্দুতে সবচেয়ে দ্রুত পরিবর্তনের হার।
- বড় magnitude = খাড়া পাহাড়, দ্রুত পরিবর্তন।
- ছোট magnitude = সমতল area, ধীর পরিবর্তন।
- $\|\nabla f\| = 0$ = critical point (min/max/saddle)।
Training-এ practical implications:
-
(১) Gradient explosion:
- $\|\nabla L\|$ অনেক বড় → weight update বিশাল → loss diverges.
- RNN/Transformer training-এ common.
- Solution: Gradient clippingGradient Clippingএকটি কৌশল — gradient-এর norm threshold-এর বেশি হলে কেটে scale করা। gradient explosion প্রতিরোধে RNN ও Transformer training-এ অপরিহার্য।. Limit $\|\nabla L\| \leq c$ (typically ১.০)।
-
(২) Gradient vanishing:
- $\|\nabla L\| \to 0$ → কোনো learning না।
- Deep network-এ — chain rule-এ small numbers multiply.
- Sigmoid activation-এ severe. ReLU + BatchNorm + skip connection — সমাধান।
-
(৩) Learning rate tuning:
- Effective step size = $\eta \cdot \|\nabla L\|$।
- $\|\nabla L\|$ training-এর শুরুতে বড়, শেষে ছোট।
- তাই — learning rate schedule (warm-up, cosine decay)।
-
(৪) Convergence detection:
- $\|\nabla L\| < \epsilon$ — typically training stop criterion.
- Practice-এ — validation loss দেখা better.
Per-parameter view:
- Adam — প্রতিটি parameter-এর gradient magnitude track.
- Frequently-updated params → smaller effective step (RMS-normalized)।
- Rarely-updated → larger step.
- এটি sparse data (NLP, recommendation)-এ critical.
Diagnostic tool:
- Training-এ gradient norm log করুন। Sudden spike → divergence risk. Slow decay → healthy convergence.
- Per-layer gradient norms — DL debugging-এ standard.
- "Healthy" training: norms ~constant scale-এ — neither growing nor vanishing.
RLHF-এ আরেক angle:
- Reward model-এ training reward gradient signal — small.
- Therefore RLHF — KL penalty, gradient clipping carefully.
মূল উপলব্ধি: Gradient direction = "where to go"। Gradient magnitude = "how confident is the signal"। দু'টিই training-এ critical. Magnitude ignore করলে — divergence বা stagnation.
অনুশীলন
-
হাতে গণনা: $f(x, y) = x^3 y + 2xy^2$।
- $\partial f/\partial x$ ও $\partial f/\partial y$ বের করুন।
- $(1, 2)$ বিন্দুতে গ্রেডিয়েন্ট কত?
- $\partial f/\partial x = 3x^2 y + 2y^2$।
- $\partial f/\partial y = x^3 + 4xy$।
- $(1, 2)$-এ: $\partial f/\partial x = 3(1)(2) + 2(4) = 14$; $\partial f/\partial y = 1 + 8 = 9$।
- $\nabla f(1,2) = (14, 9)$।
-
NumPy-তে যাচাই: উপরের কোডে $f$ পরিবর্তন করে নিজের ফাংশনের গ্রেডিয়েন্ট যাচাই করুন।
import numpy as np def f(point): x, y = point return x**3 * y + 2*x*y**2 def gradient(f, point, h=1e-6): point = np.array(point, dtype=float) grad = np.zeros_like(point) for i in range(len(point)): p = point.copy() p[i] += h grad[i] = (f(p) - f(point)) / h return grad print(gradient(f, [1.0, 2.0])) # ≈ [14, 9] -
চিন্তা করুন: পাহাড়ের উপমায় — যদি গ্রেডিয়েন্ট ভেক্টরের দৈর্ঘ্য বড় হয়, সেটা কী বলে? যদি ছোট হয়?
প্র ০৪-এ বিস্তারিত আছে। সংক্ষেপে:
- বড় $\|\nabla f\|$: খাড়া পাহাড়, দ্রুত পরিবর্তন। AI-তে ঝুঁকি — gradient explosion. Solution: clipping.
- ছোট $\|\nabla f\|$: সমতল, ধীর পরিবর্তন। AI-তে — stuck, vanishing gradient. Solution: ReLU, BatchNorm, skip connections.
- $\|\nabla f\| = 0$: Critical point — min, max, বা saddle.
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পাঠ ১৫ · Gradient Descent পরবর্তী পাঠ Gradient + iteration = AI-এর শেখার algorithm.
- পাঠ ১৩ · ডেরিভেটিভ আগের পাঠ এক চলকের derivative — partial derivative-এর ভিত্তি।
- পাঠ ২২ · Optimization এই পাঠের সাথে সম্পর্কিত Adam, SGD, AdamW — modern optimizers কীভাবে gradient ব্যবহার করে।
- সব AI Courses দেখুন ABCL TECH Python, ML, DL, NLP, CV, GenAI, RL, MLOps — সব AI কোর্স একসাথে।