Chapter 11
গ্র্যাডিয়েন্ট ডিসেন্ট
Gradient Descent
🎬 পাহাড় থেকে নামার গল্প
কল্পনা করুন — আপনি ঘন কুয়াশায় পাহাড়ের চূড়ায়। নিচে নামতে চান, কিন্তু কিছুই দেখছেন না। কী করবেন? পা দিয়ে অনুভব করবেন — কোন দিকে slope নিচে। সেই দিকেই একটু এগিয়ে যাবেন। আবার, আবার, আবার। এক সময় উপত্যকায় পৌঁছাবেন। এটাই Gradient Descent।
মূল সূত্র
w_new = w_old - η × ∂L/∂w
η (learning rate) — পদক্ষেপ কতটা বড়। বেশি হলে overshoot, কম হলে চিরকাল লাগবে।
তিন ধরনের Gradient Descent
১. Batch Gradient Descent
সম্পূর্ণ dataset দেখে একবার weight update। সঠিক gradient, কিন্তু বড় dataset-এ ধীর।
২. Stochastic Gradient Descent (SGD)
প্রতি sample-এ একবার update। দ্রুত কিন্তু noisy।
৩. Mini-Batch Gradient Descent
৩২ বা ৬৪ sample-এর batch-এ update। সবার সেরা balance — practice-এ এটাই ব্যবহৃত।
Optimizer-দের পরিবার
Optimizer
মূল ধারণা
কখন ব্যবহার
SGD
Vanilla gradient descent
সরল মডেল
SGD + Momentum
আগের gradient-এর গতি ধরে রাখে
convex সমস্যা
RMSProp
প্রতি param-এ adaptive lr
RNN
Adam
Momentum + RMSProp
Default পছন্দ
AdamW
Adam + better weight decay
Transformer
Learning Rate — সবচেয়ে গুরুত্বপূর্ণ hyperparameter
🔑 কীভাবে বাছবেন?
- সাধারণ ভাল শুরু:
1e-3(Adam) বা1e-2(SGD)। - Loss NaN বা বিস্ফোরিত — lr অনেক বেশি, কমান।
- Loss খুব ধীরে কমছে — lr বাড়ান।
- Learning Rate Scheduler ব্যবহার করুন — শেষের দিকে কমান।
PyTorch-এ Optimizer
import torch
import torch.nn as nn
model = nn.Linear(10, 1)
loss_fn = nn.MSELoss()
# SGD with momentum
opt = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# Adam (default পছন্দ)
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
# Training step
x = torch.randn(32, 10)
y = torch.randn(32, 1)
pred = model(x)
loss = loss_fn(pred, y)
opt.zero_grad() # পুরনো gradient মুছে ফেলুন
loss.backward() # নতুন gradient হিসাব করুন
opt.step() # weight updateLearning Rate Scheduler
scheduler = torch.optim.lr_scheduler.StepLR(opt, step_size=10, gamma=0.5)
for epoch in range(50):
train_one_epoch(...)
scheduler.step() # প্রতি 10 epoch-এ lr অর্ধেকVisualization — কেমন দেখায়
import numpy as np
import matplotlib.pyplot as plt
# f(w) = (w - 3)^2 কে minimize
w = -5.0
lr = 0.1
history = [w]
for _ in range(50):
grad = 2 * (w - 3)
w -= lr * grad
history.append(w)
ws = np.linspace(-6, 8, 100)
plt.plot(ws, (ws - 3)**2)
plt.plot(history, [(h-3)**2 for h in history], "o-", color="red")
plt.title("Gradient Descent path"); plt.show()Local Minima ও Saddle Point
Loss landscape-এ অনেক "গর্ত" থাকে। কখনো মডেল একটি local minimum-এ আটকে যায় — সেটাই সেরা না। Momentum, Adam-এর মতো optimizer এই সমস্যা কাটিয়ে উঠতে সাহায্য করে।
সাধারণ ভুল ধারণা
⚠️ যা এড়িয়ে চলবেন
opt.zero_grad()না করা — PyTorch-এ gradient জমা হতে থাকে।- সব সময় একই learning rate — scheduler ব্যবহার করুন।
- Adam = "সবসময় সেরা" — সরল সমস্যায় SGD-ও ভালো generalize করতে পারে।
অনুশীলন
১. f(w₁, w₂) = (w₁-2)² + (w₂+3)² minimize করুন GD দিয়ে।
২. SGD, SGD+Momentum, Adam — একই সমস্যায় তিনটার convergence speed তুলনা করুন।
৩. একটি LR schedule plot করুন (StepLR, CosineAnnealing)।
মিনি প্রজেক্ট
🚀 আজকের চ্যালেঞ্জ
গত অধ্যায়ের XOR/Moons মডেল নিন। তিনটি optimizer (SGD, Momentum, Adam) দিয়ে train করে loss curve একসাথে plot করুন। কোনটা দ্রুত converge হয়?
ইন্টারভিউ প্রশ্ন
- SGD, Mini-Batch, Batch GD-এর পার্থক্য।
- Momentum কীভাবে কাজ করে?
- Adam vs SGD — কখন কোনটা?
- Learning rate বেশি/কম হলে কী হয়?
- Local minima থেকে বের হওয়ার কৌশল।
সারসংক্ষেপ
✨ এই অধ্যায়ে যা শিখলাম
- Gradient Descent = loss-এর descent direction-এ পদক্ষেপ।
- Mini-Batch GD = practical সবার সেরা।
- Adam = বেশিরভাগ সময় default পছন্দ।
- Learning rate = সবচেয়ে গুরুত্বপূর্ণ hyperparameter।
- এই অধ্যায়ে আমাদের Phase 1 শেষ। পরের Phase-এ আমরা পুরো নিউরাল নেটওয়ার্ক শূন্য থেকে বানাব!