Home »
Blog »
AI/ML Engineer সিরিজ » Series 06 » Episode 05
MLP দিয়ে classification: epoch, batch, learning rate টিউন করা
কার্যকর MLP (Series 06, Episode 05)
🟡 INTERMEDIATE
Series 06 — Deep Learning with PyTorch
Episode 05 / 08
📑 এই পর্বে যা যা আছে
- ১. গল্প: "কাজ তো করছে, কিন্তু কেন কাজ করছে?"
- ২. MLP আসলে কী?
- ৩. Epoch, Batch, Iteration — গুলিয়ে ফেলবেন না
- ৪. কেন mini-batch? (পুরো data একসাথে নয় কেন)
- ৫. DataLoader — PyTorch-এ data খাওয়ানোর ঠিক উপায়
- ৬. সম্পূর্ণ MLP training (real dataset)
- ৭. Learning rate, batch size টিউনিং
- ৮. Train vs Validation — overfitting ধরা
- ৯. Visual: batch, epoch, loss curve
- ১০. Experiment: batch size বদলে দেখুন
- ১১. বাংলাদেশের বাস্তব উদাহরণ
- ১২. Boss Question
- ১৩. Job Requirement Decoder
- ১৪. সাধারণ ভুল ধারণা
- ১৫. Interview Prep
- ১৬. হাতে-কলমে
- ১৭. Project Connection ও সারসংক্ষেপ
🧩 ১. গল্প: "কাজ তো করছে, কিন্তু কেন কাজ করছে?"
গত পর্বে Rahim একটা tiny network train করেছে। কিন্তু সে খেয়াল করল — code-এ কিছু সংখ্যা আছে
(epoch=100, lr=0.05) যেগুলো সে কেবল কপি করেছে, কেন সেই মান — জানে না।
আর "batch" শব্দটা এখনো ধোঁয়াশা।
Rahim: "আপা, epoch ১০০ কেন? ২০০ দিলে কি আরও ভালো হবে? আর batch size জিনিসটা কী?"
Nila: "এগুলোকে বলে hyperparameter — model শেখে না, তুমি ঠিক করে দাও। ভুল দিলে হয় model শেখে না,
নয়তো overfit করে বা অকারণে ধীর হয়। আজ আমরা একটা আসল MLP বানিয়ে এই সংখ্যাগুলোর অর্থ হাতে-কলমে বুঝব —
যাতে তুমি আর অন্ধভাবে কপি না করো।"
🏗️ ২. MLP আসলে কী?
MLP (Multi-Layer Perceptron) হলো সবচেয়ে মৌলিক neural network — কয়েকটা
nn.Linear layer পরপর, মাঝে activation (সাধারণত ReLU)। "fully connected" network-ও বলে,
কারণ প্রতিটা neuron আগের layer-এর সব neuron-এর সাথে যুক্ত। এটা tabular/vector data-তে ভালো কাজ করে।
স্পষ্টীকরণ: MLP ছবির জন্য আদর্শ নয় (spatial সম্পর্ক ধরে না) — সেজন্য CNN লাগে (পরের পর্ব)।
MLP শেখা তবু জরুরি, কারণ এটাই সব neural network-এর ভিত্তি এবং vector/embedding data-তে খুব ব্যবহৃত।
🔢 ৩. Epoch, Batch, Iteration — গুলিয়ে ফেলবেন না
| শব্দ | মানে | উদাহরণ (1000 sample, batch=100) |
| Epoch | পুরো training data একবার model দেখল | ১ epoch = ১০০০ sample একবার |
| Batch | data-র একটা ছোট অংশ, একসাথে process | batch size = ১০০ sample |
| Iteration | এক batch-এর এক weight update | ১ epoch = ১০ iteration (1000/100) |
সহজ সূত্র: iteration per epoch = মোট sample ÷ batch size। ১০০০ sample, batch ১০০ হলে
প্রতি epoch-এ ১০ বার weight update হয়।
❓ ৪. কেন mini-batch? (পুরো data একসাথে নয় কেন)
তিনটা কারণে আমরা পুরো data একসাথে না দিয়ে ছোট batch-এ ভাগ করি:
- Memory: লাখ লাখ sample একসাথে GPU-তে ঢুকবে না।
- গতি: ছোট batch-এ ঘন ঘন update হয়, দ্রুত শেখে।
- Generalization: batch-এর সামান্য "noise" model-কে ভালো minimum খুঁজতে সাহায্য করে (কম overfit)।
পরিভাষা: পুরো data একসাথে = Batch GD; এক sample করে = Stochastic GD (SGD);
ছোট ছোট batch = Mini-batch GD — বাস্তবে এটাই সবচেয়ে বেশি ব্যবহৃত। সাধারণ batch size:
32, 64, 128।
📥 ৫. DataLoader — PyTorch-এ data খাওয়ানোর ঠিক উপায়
হাতে batch ভাগ না করে PyTorch-এর Dataset ও DataLoader ব্যবহার করি — এটা
automatically batch বানায়, shuffle করে, দরকারে parallel-এ data load করে।
import torch
from torch.utils.data import TensorDataset, DataLoader
# ধরা যাক X (1000, 10) feature, y (1000,) label
X = torch.randn(1000, 10)
y = (X.sum(dim=1) > 0).long()
dataset = TensorDataset(X, y)
loader = DataLoader(dataset, batch_size=64, shuffle=True)
# এক epoch-এ ঘোরা
for xb, yb in loader:
print(xb.shape, yb.shape) # প্রতি batch: (64, 10) (64,)
break
কেন shuffle=True? প্রতি epoch-এ data-র ক্রম বদলালে model ক্রম মুখস্থ করতে পারে না, ভালো generalize করে।
💻 ৬. সম্পূর্ণ MLP training (real dataset)
scikit-learn-এর একটা বাস্তব dataset (breast cancer — binary classification) দিয়ে সম্পূর্ণ MLP।
খেয়াল করুন Series 03/05-এর preprocessing (scaling) এখানে কীভাবে কাজে লাগছে:
import torch
import torch.nn as nn
from torch.utils.data import TensorDataset, DataLoader
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 1) data
data = load_breast_cancer()
X_tr, X_te, y_tr, y_te = train_test_split(
data.data, data.target, test_size=0.2, random_state=0)
# 2) scaling (NN-এ প্রায় সবসময় জরুরি!)
scaler = StandardScaler().fit(X_tr)
X_tr = torch.tensor(scaler.transform(X_tr), dtype=torch.float32)
X_te = torch.tensor(scaler.transform(X_te), dtype=torch.float32)
y_tr = torch.tensor(y_tr, dtype=torch.long)
y_te = torch.tensor(y_te, dtype=torch.long)
train_loader = DataLoader(TensorDataset(X_tr, y_tr),
batch_size=32, shuffle=True)
# 3) MLP model
class MLP(nn.Module):
def __init__(self, in_dim):
super().__init__()
self.net = nn.Sequential(
nn.Linear(in_dim, 32), nn.ReLU(),
nn.Linear(32, 16), nn.ReLU(),
nn.Linear(16, 2), # 2 class
)
def forward(self, x):
return self.net(x)
model = MLP(X_tr.shape[1])
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 4) training loop (batch সহ)
for epoch in range(30):
model.train()
for xb, yb in train_loader:
optimizer.zero_grad()
loss = criterion(model(xb), yb)
loss.backward()
optimizer.step()
# validation প্রতি ৫ epoch
if epoch % 5 == 0:
model.eval()
with torch.no_grad():
acc = (model(X_te).argmax(1) == y_te).float().mean()
print(f"epoch {epoch:2d} | test acc {acc.item():.3f}")
কেন StandardScaler? neural network-এ feature-এর মাপ বেমানান হলে (একটা ০–১, আরেকটা
০–১০০০) training অস্থির হয়। scaling সব feature-কে একই মাপে আনে — NN-এ এটা প্রায় বাধ্যতামূলক।
কেন model.train()/model.eval()? dropout/batchnorm-এর মতো layer train ও inference-এ
ভিন্ন আচরণ করে; mode সেট করা জরুরি। torch.no_grad() inference-এ memory/গতি বাঁচায়।
🎚️ ৭. Learning rate, batch size টিউনিং
| Hyperparameter | বাড়ালে | কমালে |
| Learning rate | দ্রুত, কিন্তু বেশি হলে diverge | স্থিতিশীল, কিন্তু ধীর |
| Batch size | মসৃণ কিন্তু কম update, বেশি memory | বেশি noise, ভালো generalization হতে পারে |
| Epoch | বেশি শেখা, কিন্তু বেশি হলে overfit | underfit হতে পারে |
| Hidden size/layer | বেশি capacity, overfit ঝুঁকি | simple, underfit ঝুঁকি |
Engineer টিপ: শুরু করুন Adam, lr=0.001, batch=32 দিয়ে — এটা নিরাপদ ডিফল্ট। তারপর একটা
একটা করে বদলে validation accuracy দেখুন। সব একসাথে বদলাবেন না।
📊 ৮. Train vs Validation — overfitting ধরা
Series 05-এর overfitting মনে আছে? DL-এও একই। train loss কমছে কিন্তু validation accuracy বাড়ছে না/কমছে
মানে model data মুখস্থ করছে (overfit)। তাই আমরা সবসময় আলাদা validation/test set-এ মাপি।
loss
│ train ↘↘↘↘↘↘↘↘ (কমতেই থাকে)
│ val ↘↘↘↗↗↗↗↗ ← এখানে থেকে val বাড়ছে = OVERFIT শুরু
│ (এখানে থামানো ভালো = early stopping)
└──────────────────────────── epoch →
🧪 ৯. Experiment: batch size বদলে দেখুন
উপরের কোডে batch_size ৩২ → ৮ → ২৫৬ করে চালান। খেয়াল করুন — ছোট batch-এ প্রতি epoch ধীর
কিন্তু কম epoch-এ ভালো হয়; বড় batch-এ দ্রুত কিন্তু কখনো একটু কম accuracy। এই trade-off হাতে অনুভব করাই লক্ষ্য।
🇧🇩 ১০. বাংলাদেশের বাস্তব উদাহরণ
একটা fintech-এ credit-scoring MLP train করার সময় engineer-রা ঠিক এই কাজই করে — batch size, learning
rate টিউন করে validation AUC সর্বোচ্চ করা, আর overfit এড়ানো। tabular data হলেও অনেক দল embedding +
MLP ব্যবহার করে। এই hyperparameter intuition ছাড়া model হয় শেখে না, নয়তো production-এ ভুল করে।
💼 ১১. Boss Question
Boss: "তুমি বললে model 'train হচ্ছে, ৩০ epoch'। এই epoch বাড়ালে কি আমার model আরও ভালো হবে?"
উত্তর: "স্যার, একটা সীমা পর্যন্ত হ্যাঁ — তারপর উল্টো খারাপ হয় (overfitting), মানে
training data-তে ভালো কিন্তু নতুন real customer-এ খারাপ। তাই আমরা validation set-এ নজর রাখি আর ঠিক
সময়ে থামাই (early stopping)। এতে সময়/GPU খরচও বাঁচে, আর production-এ model নির্ভরযোগ্য থাকে।"
🔎 ১২. Job Requirement Decoder
"Ability to train and tune neural networks (hyperparameter tuning)."
| প্রশ্ন | উত্তর |
| কী বোঝায়? | আপনি MLP train করতে ও epoch/batch/lr টিউন করে ভালো ফল পেতে পারেন। |
| কেন চায়? | default দিয়ে ভালো model হয় না; টিউনিং লাগে। |
| কোন সমস্যা সমাধান করে? | underfit/overfit, ধীর training, অস্থির loss। |
| junior-এর কী জানা লাগে? | epoch/batch/iteration পার্থক্য, DataLoader, scaling, train/val split, early stopping। |
| এখনই কী master লাগে না? | advanced scheduler, Bayesian hyperparameter search, mixed precision। |
| GitHub-এ কীভাবে দেখাবে? | MLP project + loss/accuracy curve + "টিউনিং কীভাবে করলাম" note। |
| interview-তে কী? | "batch size বাড়ালে কী হয়?", "overfit কীভাবে ধরবেন?" |
⚠️ ১৩. সাধারণ ভুল ধারণা
ভুল ১: NN-এ feature scaling না করা → training অস্থির, ধীর।
ভুল ২: শুধু train accuracy দেখা → overfit না ধরা।
ভুল ৩: "epoch যত বেশি তত ভালো" → overfit।
ভুল ৪: inference-এ model.eval() ও torch.no_grad() না দেওয়া।
ভুল ৫: validation set দিয়ে বারবার টিউন করে সেটাকেই "টেস্ট" ভাবা → data leakage (আলাদা test রাখুন)।
🎤 ১৪. Interview Prep
প্রশ্ন ১: Epoch, batch, iteration-এর পার্থক্য?
উত্তর: epoch = পুরো data একবার; batch = data-র অংশ; iteration = এক batch-এর এক update।
প্রশ্ন ২: Batch size ছোট/বড় করলে কী হয়?
উত্তর: ছোট = বেশি noise, ভালো generalize, ধীর; বড় = মসৃণ, দ্রুত, বেশি memory।
প্রশ্ন ৩: Overfitting কীভাবে ধরবেন ও কমাবেন?
উত্তর: train vs val gap দেখে ধরা; কমাতে — early stopping, dropout, regularization, বেশি data।
প্রশ্ন ৪: NN-এ scaling কেন জরুরি?
উত্তর: ভিন্ন মাপের feature training অস্থির করে; scaling gradient-কে সুস্থিত করে।
✍️ ১৫. হাতে-কলমে
১. উপরের breast-cancer MLP চালিয়ে test accuracy ০.৯৫+ নিতে টিউন করুন।
২. train loss আর val accuracy দুটোই প্রতি epoch জমিয়ে plot করুন; overfit শুরু কোথায় খুঁজুন।
৩. hidden layer একটা বাড়ান/কমান — ফলাফল কেমন বদলায়?
৪. lr=0.1 দিয়ে দেখুন loss অস্থির হয় কিনা।
📌 ১৬. Project Connection ও সারসংক্ষেপ
MLP হলো সব neural network-এর ভিত্তি। আমাদের flagship-এ পরে যখন job description-এর embedding-এর উপর
একটা classifier বসাব, সেটা হবে এমনই একটা MLP। এখন যে training-loop ও টিউনিং শিখলাম, সেটাই সব DL project-এ
একই থাকবে — শুধু model আর data বদলাবে।
এই পর্বে শিখলাম:
✓ MLP = পরপর Linear layer + ReLU; vector data-তে ভালো
✓ epoch / batch / iteration-এর পরিষ্কার পার্থক্য
✓ mini-batch কেন (memory, গতি, generalization); DataLoader ব্যবহার
✓ scaling, train/eval mode, no_grad — বাস্তব training-এর অপরিহার্য অংশ
✓ lr/batch/epoch টিউনিং আর train-vs-val দিয়ে overfit ধরা
পরবর্তী পর্ব (S06E06): "CNN — computer কীভাবে ছবি দেখে" — MLP ছবিতে কেন দুর্বল, convolution
ও pooling কীভাবে কাজ করে, আর আমরা শূন্য থেকে P4 image classifier বানাব।