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 update

Learning 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 হয়?

ইন্টারভিউ প্রশ্ন

  1. SGD, Mini-Batch, Batch GD-এর পার্থক্য।
  2. Momentum কীভাবে কাজ করে?
  3. Adam vs SGD — কখন কোনটা?
  4. Learning rate বেশি/কম হলে কী হয়?
  5. Local minima থেকে বের হওয়ার কৌশল।

সারসংক্ষেপ

✨ এই অধ্যায়ে যা শিখলাম
  • Gradient Descent = loss-এর descent direction-এ পদক্ষেপ।
  • Mini-Batch GD = practical সবার সেরা।
  • Adam = বেশিরভাগ সময় default পছন্দ।
  • Learning rate = সবচেয়ে গুরুত্বপূর্ণ hyperparameter।
  • এই অধ্যায়ে আমাদের Phase 1 শেষ। পরের Phase-এ আমরা পুরো নিউরাল নেটওয়ার্ক শূন্য থেকে বানাব!