MLP দিয়ে classification: epoch, batch, learning rate টিউন করা

কার্যকর MLP (Series 06, Episode 05)

🟡 INTERMEDIATE Series 06 — Deep Learning with PyTorch Episode 05 / 08

📑 এই পর্বে যা যা আছে

🧩 ১. গল্প: "কাজ তো করছে, কিন্তু কেন কাজ করছে?"

গত পর্বে 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 একবার
Batchdata-র একটা ছোট অংশ, একসাথে processbatch 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-এ ভাগ করি:

পরিভাষা: পুরো data একসাথে = Batch GD; এক sample করে = Stochastic GD (SGD); ছোট ছোট batch = Mini-batch GD — বাস্তবে এটাই সবচেয়ে বেশি ব্যবহৃত। সাধারণ batch size: 32, 64, 128।

📥 ৫. DataLoader — PyTorch-এ data খাওয়ানোর ঠিক উপায়

হাতে batch ভাগ না করে PyTorch-এর DatasetDataLoader ব্যবহার করি — এটা 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বেশি শেখা, কিন্তু বেশি হলে overfitunderfit হতে পারে
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 বানাব।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.