মূল content-এ যাও

Deep Learning/Neural Network-এর ভিত্তি/Lesson 04

Backpropagation

Network কীভাবে শেখে — loss, gradient আর chain rule; numerical gradient দিয়ে যাচাই; আর একটা neuron-কে gradient descent দিয়ে নিজে হাতে train করা, প্রতিটা ধাপ দেখে।

সময়
28 মিনিট
Exercise
1
Challenge
1
Quiz
3 প্রশ্ন

সহজ ভাষায়

Network শেখে তিন ধাপে, বারবার:

1. Forward:   input ──► prediction
2. Loss:      prediction আর আসল উত্তর কতটা দূরে?
3. Backward:  প্রতিটা weight কোন দিকে সরালে loss কমবে? সেদিকে একটু সরাও
              └─────────────── আবার ১ ───────────────┘

তৃতীয় ধাপের প্রশ্ন — "প্রতিটা weight কোন দিকে?" — উত্তর দেয় gradient, আর সেটা হিসাব করার পদ্ধতির নাম backpropagation।

কেন দরকার?

এটাই deep learning-এর ইঞ্জিন। ১৯৮৬-এ Rumelhart, Hinton আর Williams দেখালেন backprop দিয়ে বহু-layer network train করা যায় — perceptron-এর XOR সমস্যার সমাধান। আজ PyTorch-এর loss.backward() এক লাইনে এটা করে — কিন্তু ভেতরে কী হয় না জানলে training-এর সমস্যা (loss nan, শেখে না, vanishing gradient) debug করা অসম্ভব।

Gradient: ঢাল

একটা weight ww আর loss L(w)L(w)। Derivative dLdw\frac{dL}{dw} বলে: ww সামান্য বাড়ালে LL কতটা বদলায়।

  • dLdw>0\frac{dL}{dw} > 0 → ww বাড়ালে loss বাড়ে → ww কমাও
  • dLdw<0\frac{dL}{dw} < 0 → ww বাড়ালে loss কমে → ww বাড়াও

তাই সবসময় ঢালের উল্টো দিকে:

w←w−η ∂L∂ww \leftarrow w - \eta \, \frac{\partial L}{\partial w}

এটাই gradient descent — কুয়াশায় ঢাকা পাহাড় থেকে নামা: চারপাশ দেখা যায় না, কিন্তু পায়ের নিচের ঢাল বোঝা যায় — সেই ঢাল ধরে নিচে নামো।

main.py

Numerical gradient: যাচাইয়ের অস্ত্র

যেকোনো function-এর ঢাল সংখ্যা দিয়ে অনুমান করা যায় — দুই পাশে সামান্য সরে দেখো:

dfdx≈f(x+h)−f(x−h)2h\frac{df}{dx} \approx \frac{f(x + h) - f(x - h)}{2h}

সহজ, কিন্তু প্রতিটা weight-এর জন্য দুটো আলাদা forward pass লাগে। ১০ লাখ weight-এ ২০ লাখ forward pass — অসম্ভব ধীর। তাই training-এ backprop, আর backprop ঠিক আছে কিনা যাচাইয়ে (gradient check) numerical gradient।

Chain rule: backprop-এর হৃদয়

একটা neuron: z=w⋅x+bz = w \cdot x + b, p=σ(z)p = \sigma(z), L=BCE(y,p)L = \text{BCE}(y, p)। আমরা চাই ∂L∂w\frac{\partial L}{\partial w}। এটা একটা শিকল:

∂L∂w=∂L∂p⋅∂p∂z⋅∂z∂w\frac{\partial L}{\partial w} = \frac{\partial L}{\partial p} \cdot \frac{\partial p}{\partial z} \cdot \frac{\partial z}{\partial w}

প্রতিটা টুকরো আলাদাভাবে সহজ। আর sigmoid + cross-entropy একসাথে নিলে একটা সুন্দর সরলীকরণ হয়:

∂L∂z=p−y\frac{\partial L}{\partial z} = p - y

অর্থাৎ ভুল = prediction − আসল। তারপর:

∂L∂w=1nX⊤(p−y),∂L∂b=1n∑(p−y)\frac{\partial L}{\partial w} = \frac{1}{n} X^\top (p - y), \qquad \frac{\partial L}{\partial b} = \frac{1}{n}\sum (p - y)
forward:   X ──► z = Xw + b ──► p = σ(z) ──► L
backward:  dw = Xᵀ·dz/n ◄── dz = p − y ◄────── শুরু

চলো numerical gradient দিয়ে যাচাই করি যে এই সূত্রগুলো ঠিক:

main.py

দুটো প্রায় হুবহু এক। গভীর network-এ একই chain rule layer-এর পর layer উল্টো দিকে চলতে থাকে — তাই নাম backpropagation।

Exercise

Exercise

Numerical gradient

+20 XP

যেকোনো function-এর ঢাল (derivative) সংখ্যা দিয়ে অনুমান করা যায়:

f'(x) ≈ ( f(x + h) − f(x − h) ) ÷ 2h, যেখানে h খুব ছোট (যেমন 1e-5)

numerical_grad(f, x, h=1e-5) লেখো। তারপর f(x) = x³ − 2x-এর জন্য x = 2-তে ঢাল slope-এ রাখো। (আসল উত্তর 3x² − 2 = 10 — কাছাকাছি আসা উচিত।)

solution.py

Quiz

  1. Q1Gradient কী বলে?
  2. Q2Backpropagation-এ 'back' কেন?
  3. Q3Numerical gradient থাকতে backpropagation কেন লাগে?
0/3 answered

Challenge

Challenge

একটা neuron gradient descent দিয়ে train করো

+50 XP

Logistic neuron: p = sigmoid(X · w + b), loss = binary cross-entropy।

Backpropagation-এর ফলাফল (chain rule দিয়ে বের করা, lesson-এ ব্যাখ্যা আছে): - dz = p − y - dw = Xᵀ · dz ÷ n - db = mean(dz)

train(X, y, lr=0.5, steps=500) লেখো: w শূন্য (shape: feature সংখ্যা), b = 0 দিয়ে শুরু; প্রতি step-এ forward → gradient → w ← w − lr·dw, b ← b − lr·db। Return (w, b, losses) — losses প্রতিটা step-এর loss-এর list (update-এর আগের loss)।

solution.py

বাস্তবে কোথায় ব্যবহার হয়?

Challenge-এ যা লিখলে — forward, loss, backward, update — PyTorch-এ এর প্রতিটা ধাপের নিজস্ব লাইন:

import torch

model = torch.nn.Sequential(torch.nn.Linear(2, 1), torch.nn.Sigmoid())
optimizer = torch.optim.SGD(model.parameters(), lr=0.5)
loss_fn = torch.nn.BCELoss()

for step in range(500):
    p = model(X).squeeze()        # 1. forward
    loss = loss_fn(p, y)          # 2. loss
    optimizer.zero_grad()
    loss.backward()               # 3. backward — সব gradient নিজে থেকে (autograd)
    optimizer.step()              # 4. update: w ← w − lr · grad

loss.backward() হলো তোমার dz = p − y, dw = Xᵀ·dz/n — শুধু যেকোনো জটিল network-এর জন্য নিজে থেকে (autograd)। এই চার লাইনের loop-টা — GPT train করা থেকে শুরু করে image classifier পর্যন্ত — প্রায় সব deep learning code-এর হৃদয়।

Interview প্রশ্ন

  • Beginner: Gradient descent কী? Learning rate কী করে?
  • Intermediate: Backpropagation কী? Chain rule-এর ভূমিকা কী?
  • Advanced: Sigmoid + cross-entropy-তে gradient কেন p − y হয়ে যায়? Gradient check কীভাবে করবে আর কেন training-এ ব্যবহার করবে না?

এরপর কী?

🎉 Neural Network-এর ভিত্তি module শেষ — neuron, activation, forward pass আর backpropagation। তুমি এখন জানো একটা neural network ভেতরে আসলে কী করে।

পরের module: Network train করা — বিভিন্ন loss আর optimizer (Adam), পূর্ণ training loop, overfitting আটকানো (dropout), আর PyTorch-এ এই সবকিছু।