সরাসরি পর্বে যান
পর্ব ০১ · ৯১-এর মধ্যে · মডিউল ১

Deep learning-এর মানচিত্র — ML থেকে কোথায় যাচ্ছি আর কেন গভীর network

The Deep Learning Roadmap — From Machine Learning to Deep Networks

Taught in Bangla, this lesson explains what "deep" adds to machine learning: learned features trained end to end. In-page Python with NumPy pits logistic regression against a 65-parameter MLP on a curved boundary and measures test accuracy, then shows when gradient boosting is the better choice for small tabular data. It maps the 91-lesson, 14-module course with three reader paths, a warm-up self-check, and a real desktop PyTorch install run.

এই পর্বে যা শিখবেন

  • Machine learning কোর্সের পর deep learning নতুন কী যোগ করে: representation learning, end-to-end training আর ডেটা ও compute-এর মাপ
  • একটি hidden layer কীভাবে সোজা সীমানাকে বাঁকায়, হাতে আর পাতার কোডে
  • কোন সমস্যায় deep learning ভুল হাতিয়ার, আর মেপে সিদ্ধান্ত নেওয়ার উপায়
  • ১৪ মডিউলের মানচিত্র, নিজের স্তর অনুযায়ী পথ, আর শুরুর আগে নিজেকে যাচাই
  • পাতা আর ডেস্কটপের টুল, CPU বনাম GPU-র বাস্তবতা, আর “সত্যিকারের run” পড়ার নিয়ম

১ · Machine learning থেকে deep learning — “গভীর” আসলে কী যোগ করে

আগের দুই কোর্সে আপনি অনেক দূর এসেছেন। AI-এর ভিত্তি আর Python for AI কোর্সে NumPy, pandas, প্রথম model আর একটি ছোট neural network হাতে লিখেছেন। মেশিন লার্নিং কোর্সে linear algebra, optimization, SVM, tree, boosting আর মূল্যায়নের গভীরতা দেখেছেন। তাহলে নতুন কোর্স কেন? কারণ বাজারঘরের (এই কোর্সগুলোর কাল্পনিক অনলাইন দোকান) পরের প্রশ্নগুলো টেবিলের নয়। হাজার হাজার বাংলা রিভিউয়ে ক্রেতা কী বলছেন, পণ্যের ছবি থেকে কোন বিভাগ, চ্যাটে প্রশ্নের উত্তর কে দেবে। এখানে ডেটা কাঁচা: শব্দ, pixel, বাক্য।

তিনটি জিনিস যা নতুন

  • নিজে feature শেখা (representation learning). ML কোর্সে feature engineering ছিল মানুষের কাজ: “শেষ অর্ডারের পর কত দিন”, “গড় বাস্কেট”। একটি ছবির জন্য এমন feature হাতে লেখা প্রায় অসম্ভব; কোন pixel-এর মিলনে “শাড়ি” আর কোনটায় “পাঞ্জাবি”? Deep network-এর প্রতিটি hidden layer আগের স্তরের ফল থেকে নতুন feature বানায়, আর কোনটি কাজের তা training-ই ঠিক করে।
  • শুরু থেকে শেষ একসঙ্গে শেখা (end-to-end learning). আগে পাইপলাইন ছিল টুকরো টুকরো: টেক্সট পরিষ্কার, TF-IDF, তারপর classifier; প্রতিটি আলাদাভাবে ঠিক করা। এখন কাঁচা ইনপুট থেকে চূড়ান্ত loss পর্যন্ত সব weight একটি gradient দিয়ে একসঙ্গে সরে।
  • মাপ: ডেটা আর compute. নমনীয় model-এর ক্ষমতা অনেক, তাই ডেটাও লাগে অনেক, আর হিসাব লাগে বিপুল। GPU আর বড় ডেটাসেট না থাকলে আজকের deep learning হতো না; অংশ ৩-এ ইতিহাস দেখবেন।

পুরান ঢাকার একজন অভিজ্ঞ শাড়ি ব্যবসায়ীর কথা ভাবুন। নতুন কর্মচারীকে তিনি নিয়ম লিখে দেন: “জমিনে সোনালি সুতা আর পাড় চওড়া হলে কাতান।” এটা feature engineering. কিন্তু তিনি নিজে কাপড় দেখেই চেনেন, কোনো তালিকা ছাড়া; হাজার হাজার শাড়ি দেখতে দেখতে চোখ নিজের feature বানিয়ে নিয়েছে। Deep network সেই চোখ তৈরির চেষ্টা। দাম একই: অনেক উদাহরণ দেখতে হয়, আর কেন চিনল তা সবসময় বলা যায় না।

দুই রকম পাইপলাইন

Classical ML: hand-made features · Deep learning: learned features, trained end to end

  1. কাঁচা ডেটারিভিউ, ছবি
  2. মানুষের featureTF-IDF, রঙের হিস্টোগ্রাম
  3. Modellogistic, boosting
  1. কাঁচা ডেটাtoken, pixel
  2. স্তর ১…kশেখা feature
  3. শেষ স্তরএকই loss, একসঙ্গে train
ছবি ১.১ — ওপরের সারিতে মাঝের ধাপটি মানুষ বানান। নিচের সারিতে মাঝের স্তরগুলোও loss কমাতে শেখে।

যা সঙ্গে আনছেন, আর যা এখানে নতুন করে শেখানো হবে না

একটি neural network-এর মূল কথাগুলো আপনি AI-এর ভিত্তি কোর্সের পর্ব ৬৮-এ দেখেছেন: neuron, perceptron দিয়ে AND, হাতে বসানো hidden layer দিয়ে XOR, sigmoid থেকে ReLU, একটি ২-স্তরের MLP, হাতে backprop আর digits-এ MLPClassifier. Derivative আর gradient descent এসেছে পর্ব ৩৪-এ। মেশিন লার্নিং কোর্সে matrix-এর gradient (পর্ব ১১), neural network কেন non-convex (পর্ব ১২), SGD আর Adam (পর্ব ১৩, পর্ব ১৪) আর bias–variance (পর্ব ৩) পেয়েছেন। এগুলো এখানে এক-দুই লাইনে মনে করিয়ে লিংক দেওয়া হবে, নতুন করে নয়। এই কোর্স সেখান থেকে শুরু করে বড়, সত্যিকারের network-এ যায়: PyTorch, training-এর কৌশল, CNN, Transformer, LLM আর generative model.

বাজারঘর এই কোর্সে: আগের কোর্সের দোকানই, নতুন ডেটাসহ। ২-মাত্রার গ্রাহক-feature দিয়ে decision boundary আঁকা, ডেলিভারির সময়ের regression, বানানো বাংলা রিভিউয়ের sentiment, পণ্যের ছোট কৃত্রিম ছবি, আর গ্রাহক-সহায়তার চ্যাট। সব ডেটা seed দেওয়া কোডে তৈরি, তাই প্রতিটি পাঠক একই সংখ্যা পান। কোনো আসল কোম্পানি বা গ্রাহক এখানে নেই।

২ · প্রথম demo — বাঁকা সীমানা: logistic regression বনাম ছোট NumPy MLP

বাজারঘরের ৪০০ জন গ্রাহকের দুটি সংখ্যা নিন: ডেলিভারিতে কত দিন লেগেছে, আর দাম বাজারদর থেকে কত শতাংশ আলাদা। গ্রাহক সন্তুষ্ট থাকেন একটি “মিষ্টি জায়গায়”: ডেলিভারি দ্রুত আর দাম বাজারদরের কাছে। দাম খুব বেশি হলে রাগ, আবার অস্বাভাবিক সস্তা হলে আসল-নকল নিয়ে সন্দেহ। অর্থাৎ সন্তুষ্টদের অঞ্চল একটি বাঁকা, বন্ধ জায়গা। এই নিয়ম আমরা নিজে বানিয়েছি, আর ৫% label ইচ্ছা করে উল্টে দিয়েছি, যাতে বাস্তবের মতো কিছু গোলমাল থাকে।

প্রশ্ন: একটি সোজা রেখার model (logistic regression) আর একটি hidden layer-এর ছোট MLP, কে এই জায়গা ধরতে পারে? নিচের ব্লকে MLP NumPy-তে লেখা: ২টি ইনপুট, ১৬টি tanh unit, ১টি sigmoid output, ৩০০০ ধাপ full-batch gradient descent. প্রথম ৩০০ জনে train, শেষ ১০০ জনে test. ব্লকটি আপনার ব্রাউজারেই চলে (Pyodide); প্রথমবার Python আর scikit-learn নামতে প্রায় ১০ সেকেন্ড লাগতে পারে। চালানোর আগে অনুমান করুন: logistic-এর test accuracy কত হবে?

import numpy as np, matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
rng = np.random.default_rng(42)
days = rng.uniform(0, 8, 400)                     # ডেলিভারিতে কত দিন
price = rng.uniform(-35, 35, 400)                 # বাজারদর থেকে দামের পার্থক্য, %
X = np.c_[(days - 2) / 2, price / 15]             # দুটিকে কাছাকাছি মাপে আনা
y = (X[:, 0]**2 + X[:, 1]**2 < 1.3).astype(int)   # 1 = সন্তুষ্ট গ্রাহক
flip = rng.random(400) < 0.05; y[flip] = 1 - y[flip]   # ৫% এলোমেলো ভুল label
tr, te = np.arange(300), np.arange(300, 400)
print("সন্তুষ্ট গ্রাহকের অনুপাত:", y.mean().round(3))
logit = LogisticRegression().fit(X[tr], y[tr])
W1, b1 = rng.normal(0, 1, (2, 16)), np.zeros(16)  # 2 -> 16 tanh -> 1 sigmoid
w2, b2 = rng.normal(0, 0.5, 16), 0.0
def mlp(A):
    H = np.tanh(A @ W1 + b1)
    return H, 1 / (1 + np.exp(-(H @ w2 + b2)))
for step in range(3000):                          # full-batch gradient descent, lr 0.5
    H, p = mlp(X[tr]); g = (p - y[tr]) / len(tr)
    gH = np.outer(g, w2) * (1 - H**2)             # chain rule: tanh-এর derivative
    w2 -= 0.5 * H.T @ g; b2 -= 0.5 * g.sum()
    W1 -= 0.5 * X[tr].T @ gH; b1 -= 0.5 * gH.sum(0)
gd, gp = np.meshgrid(np.linspace(0, 8, 120), np.linspace(-35, 35, 120))
G = np.c_[(gd.ravel() - 2) / 2, gp.ravel() / 15]
fig, axes = plt.subplots(1, 2, figsize=(9, 3.6), sharey=True, layout="constrained")
for ax, name, f in zip(axes, ["logistic regression", "NumPy MLP 2-16-1"],
                       [lambda A: logit.predict_proba(A)[:, 1], lambda A: mlp(A)[1]]):
    acc = [((f(X[i]) > 0.5) == y[i]).mean() for i in (tr, te)]
    print(f"{name:20s} train {acc[0]:.3f} | test {acc[1]:.3f}")
    ax.contourf(gd, gp, f(G).reshape(gd.shape), levels=10, cmap="RdBu", alpha=0.7)
    ax.contour(gd, gp, f(G).reshape(gd.shape), levels=[0.5], colors="k")
    ax.scatter(days[te], price[te], c=y[te], cmap="RdBu", edgecolors="k", s=18)
    ax.set_title(name); ax.set_xlabel("delivery time (days)")
axes[0].set_ylabel("price vs market (%)")
print("parameter: logistic", logit.coef_.size + 1, "| MLP", W1.size + b1.size + w2.size + 1)
plt.show()

আসল আউটপুট (ব্রাউজারের Python; ছবিটি ব্লকের নিচে আসে):

সন্তুষ্ট গ্রাহকের অনুপাত: 0.22
logistic regression  train 0.747 | test 0.790
NumPy MLP 2-16-1     train 0.963 | test 0.940
parameter: logistic 3 | MLP 65

সন্তুষ্ট গ্রাহক ২২%, তাই “সবাই অসন্তুষ্ট” বললেই প্রায় ০.৭৮ accuracy. Logistic regression-এর train ০.৭৪৭ আর test ০.৭৯০: এই baseline-এর আশেপাশেই। ছবিতে কারণ স্পষ্ট: তার decision boundary একটি সোজা রেখা, আর সোজা রেখা একটি বন্ধ জায়গাকে ঘিরতে পারে না। MLP-র সীমানা বাঁকা, প্রায় একটি ডিম্বাকৃতির টুকরো, train ০.৯৬৩ আর test ০.৯৪০। দাম: logistic-এর ৩টি parameter, MLP-র ৬৫টি (2 × 16 + 16 + 16 + 1).

৫% label ইচ্ছা করে উল্টানো, তাই প্রায় ০.৯৫-এর বেশি পাওয়ার কথা নয়; ১০০ জনের test-এ এক জনের ভুল মানে ০.০১, তাই ০.৯৪ আর ০.৯৫-এর পার্থক্য নিয়ে মাথা ঘামানোর কারণ নেই। Training loop-এর তিনটি লাইন (output-এর gradient, tanh-এর derivative দিয়ে পেছনে যাওয়া, weight সরানো) ধাপে ধাপে বোঝানো হবে পর্ব ০৪ “Backpropagation হাতে-কলমে”-এ।

Hidden layer সীমানা বাঁকায় কীভাবে — হাতে বসানো তিনটি ভাঁজ

MLP-র ১৬টি unit কী শিখেছে, তা দেখার আগে নিজে একটি ছোট network বানাই। তিনটি ReLU unit, প্রতিটি একটি সোজা রেখা বরাবর “ভাঁজ”: রেখার এক পাশে ০, অন্য পাশে দূরত্বের সমানুপাতিক। ইনপুট আগের মতোই: z₁ = (দিন − 2) / 2, z₂ = দামের পার্থক্য / 15. পাঁচজন কাল্পনিক গ্রাহকে মানগুলো ধাপে ধাপে বসছে। “পরে” চাপুন।

A: ২ দিন, 0% · B: ৬ দিন, 0% · C: ২ দিন, −30% · F: ২ দিন, +30% · D: ৪ দিন, +15%

গ্রাহকzhs, সন্তুষ্ট?
A
B
C
F
D
  1. ইনপুট, আর সোজা রেখার সমস্যা। পাঁচজনের z বসানো হলো। C, A আর F-এর ডেলিভারি একই (২ দিন), দাম −30%, 0% আর +30%: তিনটি বিন্দু এক রেখায়, মাঝেরটি সন্তুষ্ট, দুই প্রান্ত অসন্তুষ্ট। একটি সোজা রেখা সমতলকে দুই ভাগ করে, তাই এক রেখার ওপরের বিন্দুগুলোকে সে শুধু এক জায়গায় কাটতে পারে; মাঝের বিন্দুকে দুই দিক থেকে আলাদা করা অসম্ভব। Logistic regression এখানেই আটকায়।
  2. ভাঁজ ১, দেরি: h₁ = ReLU(z₁ − 1). z₁ > 1 মানে ৪ দিনের বেশি। B-র z₁ = 2, তাই h₁ = ReLU(1) = 1; বাকিদের z₁ − 1 শূন্য বা ঋণাত্মক, তাই h₁ = 0. ReLU মানে max(0, ·): রেখার এক পাশে চুপ, অন্য পাশে সরলরেখায় বাড়ে।
  3. ভাঁজ ২, বেশি দাম: h₂ = ReLU(z₂ − 1). z₂ > 1 মানে বাজারদরের ১৫%-এর বেশি। F-এর z₂ = 2, তাই h₂ = 1. D-র z₂ ঠিক 1, তাই h₂ = ReLU(0) = 0.
  4. ভাঁজ ৩, সন্দেহজনক সস্তা: h₃ = ReLU(−z₂ − 1). z₂ < −1 মানে ১৫%-এর বেশি সস্তা। C-র z₂ = −2, তাই h₃ = ReLU(2 − 1) = 1. এখন প্রতিটি “খারাপ দিক”-এর জন্য একটি করে unit আছে।
  5. Output: s = 1 − 2(h₁ + h₂ + h₃). কোনো ভাঁজ চালু না হলে s = 1; একটি পুরো চালু হলে s = 1 − 2 = −1. s > 0 হলে সন্তুষ্ট। A আর D-র s = 1, B, C, F-এর −1. তিনটি সোজা ভাঁজের যোগফল থেকে একটি বন্ধ অঞ্চল তৈরি হলো, যা কোনো একক রেখা পারত না।
  6. রায় মেলানো, আর একটি শিক্ষা। চারজন ঠিক (✓)। D (৪ দিন, +15%) ভুল (✗): আসল নিয়মে z₁² + z₂² = 2, যা 1.3-এর বেশি, তাই অসন্তুষ্ট। তিনটি ভাঁজ দিয়ে আমরা বৃত্ত নয়, একটি কোনাওয়ালা বাক্সের মতো অঞ্চল পেয়েছি, আর কোনায় ভুল। আরও unit দিলে কোনা কাটা যায়; ব্লকের MLP-র ১৬টি unit training-এ ঠিক এই কাজ নিজে শিখেছে। অনুশীলন ৪-এ unit কমিয়ে দেখবেন।
মূল ধারণা

প্রতিটি hidden unit একটি সোজা রেখা বরাবর একটি non-linear activation. পরের স্তর সেগুলোর ওজনসহ যোগফল নেয়, তাই অনেক সরল ভাঁজ মিলে জটিল আকার হয়। Activation বাদ দিলে সব স্তর মিলে আবার একটি সোজা রেখা: অনুশীলন ৪-এ দেখবেন, তখন MLP-র accuracy হুবহু logistic-এর সমান। স্তর বাড়ালে ভাঁজের ওপর ভাঁজ পড়ে; ReLU network-এর অংশ কীভাবে বাড়ে তা গুনে দেখা হবে পর্ব ০৩ আর পর্ব ০৬-এ।

৩ · কীভাবে এখানে এলাম — perceptron থেকে Transformer আর diffusion

Neural network-এর ধারণা নতুন নয়, তবে তার পথ সোজা ছিল না: আশা, হতাশা, আবার আশা। নিচের সময়রেখার সালগুলো সাধারণভাবে উদ্ধৃত হয়; কে প্রথম করেছেন, তা নিয়ে ঐতিহাসিকদের মধ্যে মতভেদ আছে, তাই “জনপ্রিয় করেছেন” আর “প্রতীক হিসেবে” শব্দগুলো ইচ্ছা করে লেখা।

  • ১৯৫৮: Frank Rosenblatt-এর perceptron, শিখতে পারা একটি linear unit. ১৯৬৯ সালে Minsky আর Papert-এর বই একস্তরের perceptron-এর সীমা (যেমন XOR) দেখায়; এর পর আগ্রহ কমে যায় বলে সাধারণত বলা হয় (পর্ব ০২)।
  • ১৯৮৬: Rumelhart, Hinton আর Williams-এর প্রবন্ধ backpropagation-কে বহুস্তরের network-এ জনপ্রিয় করে। Reverse-mode differentiation-এর মূল ধারণা আগেই ছিল (যেমন ১৯৭০ সালে Seppo Linnainmaa, ১৯৭৪ সালে Paul Werbos-এর গবেষণাপত্রে)।
  • ১৯৮৯–১৯৯৮: Yann LeCun ও সহকর্মীদের convolutional network হাতে লেখা অঙ্ক পড়ে; তবু ২০০০-এর দশকে SVM আর boosting-ই বেশি জনপ্রিয় থাকে।
  • ২০১২: Krizhevsky, Sutskever আর Hinton-এর AlexNet ImageNet প্রতিযোগিতায় বড় ব্যবধানে জেতে (রিপোর্ট অনুযায়ী top-5 error প্রায় ১৫% বনাম পরের দলের প্রায় ২৬%), দুটি GPU-তে train করে। এটিকেই প্রায়ই deep learning-এর ফিরে আসার প্রতীক বলা হয় (পর্ব ২১)।
  • ২০১৭: Vaswani ও সহকর্মীদের “Attention Is All You Need” প্রবন্ধে Transformer: recurrence ছাড়া শুধু attention দিয়ে sequence-এর model (মডিউল ৬)।
  • ২০২০-এর দশক: বিপুল লেখায় train করা large language model আর noise সরিয়ে ছবি বানানো diffusion model (Ho ও সহকর্মীদের ২০২০ সালের DDPM প্রবন্ধ প্রায়ই উদ্ধৃত হয়) সাধারণ মানুষের হাতে আসে (মডিউল ৮, ১২)।

এই ইতিহাসের সাধারণ ব্যাখ্যা তিনটি জিনিসের মিলন: বড় লেবেলসহ ডেটা, GPU-তে দ্রুত matrix গুণ, আর ReLU, ভালো initialization, dropout, normalization-এর মতো কৌশল, যা গভীর network-কে train করা সম্ভব করেছে। কৌশলগুলো মডিউল ৩-এর বিষয়। একটি সতর্কতা: “AI এখন মানুষের মতো বোঝে” ধরনের দাবি ইতিহাস থেকে আসে না। আজকের model অসাধারণ কাজ করে, আবার আত্মবিশ্বাসের সঙ্গে ভুলও বলে; এই কোর্স দুটোই মেপে দেখাবে।

৪ · কখন deep learning নয় — ছোট টেবিলের ডেটা আর pixel

Deep learning-এর কোর্সে প্রথমেই বলা দরকার: অনেক সমস্যায় এটি ভুল হাতিয়ার। বাজারঘরের বেশিরভাগ ব্যবসার প্রশ্ন টেবিলের ডেটা: কয়েকশো থেকে কয়েক লাখ সারি, প্রতিটি কলামের আলাদা অর্থ, threshold আর interaction-ভরা সম্পর্ক। সেখানে HistGradientBoosting-এর মতো tree ensemble প্রায়ই সমান বা ভালো, আর অনেক সস্তা। কেন, আর কীভাবে বাছবেন, তা মেশিন লার্নিং কোর্সের পর্ব ৩৮-এ বিস্তারিত; এখানে একটি ছোট পরীক্ষা।

নিচের ব্লক তিনটি ডেটায় তিনটি model চালায়, একই ৭০/৩০ ভাগে: (১) বাজারঘরের ৪০০টি অর্ডার, “দেরি হবে কি না”, কয়েকটি threshold-নিয়ম আর ৬টি অকেজো কলামসহ; (২) scikit-learn-এর সঙ্গে আসা load_digits-এর ১৭৯৭টি ৮ × ৮ pixel-এর হাতে লেখা অঙ্ক (UCI-এর একটি ডেটাসেট থেকে নেওয়া), কোনো হাতে বানানো feature ছাড়া; (৩) একই অঙ্ক, প্রতিটি ছবি এলোমেলোভাবে এক pixel পর্যন্ত সরানো। অনুমান করুন, কোন সারিতে কে জিতবে।

import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
rng = np.random.default_rng(7)                     # বাজারঘরের ৪০০টি অর্ডার (বানানো)
km, kg, hour = rng.uniform(2, 400, 400), rng.exponential(2, 400), rng.integers(8, 23, 400)
rating = rng.uniform(3, 5, 400); junk = rng.normal(size=(400, 6))   # ৬টি অকেজো কলাম
late = ((km > 180) & (rating < 4.2)) | ((kg > 4) & (km > 30)) | (hour >= 21)
late = late ^ (rng.random(400) < 0.08)             # ৮% ভুল label
img = load_digits().images / 16                    # ১৭৯৭টি ৮×৮ ছবি, pixel 0 থেকে 1
digit = load_digits().target
moved = np.array([np.roll(im, tuple(rng.integers(-1, 2, 2)), (0, 1)) for im in img])  # ±১ pixel সরানো
data = {"টেবিল, ৪০০ অর্ডার": (np.c_[km, kg, hour, rating, junk], late.astype(int)),
        "pixel, ঠিক জায়গায়": (img.reshape(-1, 64), digit),
        "pixel, ±১ সরানো": (moved.reshape(-1, 64), digit)}
for name, (X, y) in data.items():
    Xa, Xb, ya, yb = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
    acc = []
    for m in [make_pipeline(StandardScaler(), LogisticRegression(max_iter=2000)),
              HistGradientBoostingClassifier(max_iter=40, random_state=42),
              make_pipeline(StandardScaler(), MLPClassifier((64,), max_iter=2000, random_state=42))]:
        acc.append(m.fit(Xa, ya).score(Xb, yb))
    print(f"{name:18s} logistic {acc[0]:.3f} | HGB {acc[1]:.3f} | MLP {acc[2]:.3f}")

আসল আউটপুট (ব্রাউজারের Python, scikit-learn 1.8.0):

টেবিল, ৪০০ অর্ডার  logistic 0.725 | HGB 0.817 | MLP 0.742
pixel, ঠিক জায়গায় logistic 0.981 | HGB 0.950 | MLP 0.978
pixel, ±১ সরানো    logistic 0.644 | HGB 0.854 | MLP 0.837

টেবিলে boosting জেতে। HGB ০.৮১৭, MLP ০.৭৪২, logistic ০.৭২৫। দেরির নিয়মগুলো threshold-এর: “১৮০ কিলোমিটারের বেশি আর courier-এর রেটিং ৪.২-এর কম”, “রাত ৯টা বা তার পরে অর্ডার”। Tree এমন কাট সরাসরি বসায়। MLP-কে মসৃণ function জুড়ে ধাপ বানাতে হয়, আর মাত্র ২৮০টি train সারি আর ৬টি অকেজো কলামে সে noise-ও শিখে ফেলে। HGB-র training-এর খরচও অনেক কম।

ঠিক জায়গার pixel-এ সবাই ভালো। load_digits-এর অঙ্কগুলো কেন্দ্রে বসানো আর মাপে মেলানো, তাই pixel-এর ওজনসহ যোগফলই যথেষ্ট: logistic ০.৯৮১, MLP ০.৯৭৮, HGB ০.৯৫০। অর্থাৎ “ছবি মানেই deep learning” নয়; এত ছোট, পরিচ্ছন্ন ছবিতে সরল model-ই কাজ সারে।

সরানো pixel-এ সোজা রেখা ভেঙে পড়ে। প্রতিটি ছবি মাত্র এক pixel সরাতেই logistic ০.৬৪৪-এ নেমে যায়: একটি pixel-এর ওজন এখন আর অঙ্কের একই অংশ বোঝায় না। HGB (০.৮৫৪) আর MLP (০.৮৩৭) টিকে থাকে, কারণ দুটিই pixel-এর মিলন থেকে non-linear feature বানায়; এটাই শেখা representation-এর মূল্য। তবে এখানে MLP tree-কে হারায়নি, পার্থক্যও একটি ভাগের মধ্যে ছোট। Pixel-এর পাশাপাশি অবস্থান কাজে লাগানো CNN (মডিউল ৪) আর অনেক বেশি ডেটা ছাড়া deep learning-এর সুবিধা স্পষ্ট হয় না; পরের মডিউলগুলো ঠিক সেটাই দেখাবে।

এগুলো একটি ডেটাভাগে একবারের run, সাধারণ নিয়ম নয়। দুই model-এর পার্থক্য ০.০২-এর কম হলে কয়েকটি seed বা fold-এ না মেপে কিছু বলা যায় না (মেশিন লার্নিং কোর্সের পর্ব ১-এর নিয়ম)। সিদ্ধান্তের প্রশ্ন একটাই: আমার ডেটায়, আমার খরচে, একটি শক্ত baseline-এর চেয়ে কতটা ভালো?

পরিস্থিতিপ্রথম প্রার্থীকেন
কয়েক হাজার সারির টেবিল, অর্থপূর্ণ কলামgradient boosting, regularized linearthreshold আর interaction ধরে, দ্রুত, ব্যাখ্যা সহজ
বাংলা রিভিউ, চ্যাট, ডকুমেন্টpretrained Transformer (মডিউল ৭–৯), সঙ্গে TF-IDF baselineশব্দের অর্থ আর প্রসঙ্গ শেখা feature-এ ধরা পড়ে
পণ্যের ছবি, স্ক্যান করা রসিদCNN বা Vision Transformer, প্রায়ই pretrained (মডিউল ৪, ৬)pixel-এর স্থানিক গঠন
নতুন লেখা বা ছবি তৈরিLLM, diffusion (মডিউল ৮, ১২)generative কাজ, অন্য পথ প্রায় নেই
খুব কম ডেটা, ব্যাখ্যা বাধ্যতামূলকসরল model, নিয়মdeep network-এর variance আর অস্বচ্ছতা দামি

৫ · ৯১ পর্বের মানচিত্র আর তিন স্তরের পাঠকের পথ

কোর্সটি ১৪টি মডিউলে ভাগ করা। ওপর থেকে নিচে পড়ুন: প্রতিটি স্তর আগের স্তরের ভাষা ব্যবহার করে। তবে পথ পুরো সরলরেখা নয়; যেমন মডিউল ১০-এর prompt engineering মডিউল ৪–৫ ছাড়াই পড়া যায়।

ডিপ লার্নিং, NLP আর Generative AI — ১৪টি মডিউল

14 modules, 91 lessons, built on two earlier courses

Deep learning course map: 14 modules in six layers AI-এর ভিত্তি আগের কোর্স · ৭৯ পর্ব মেশিন লার্নিং আগের কোর্স · ৭৭ পর্ব মডিউল ১ · পর্ব ১–৬ মানচিত্র ও ভিত্তি মডিউল ২ · পর্ব ৭–১২ PyTorch-এর ভিত্তি মডিউল ৩ · পর্ব ১৩–১৯ গভীর network শেখানো মডিউল ৪ · পর্ব ২০–২৬ CNN ও ছবি মডিউল ৫ · পর্ব ২৭–৩১ Sequence model মডিউল ৬ · পর্ব ৩২–৩৮ Attention ও Transformer মডিউল ৭ · পর্ব ৩৯–৪৫ NLP-এর ভিত্তি মডিউল ৮ · পর্ব ৪৬–৫২ Language model ও LLM মডিউল ৯ · পর্ব ৫৩–৫৯ LLM-কে খাপ খাওয়ানো মডিউল ১০ · পর্ব ৬০–৬৬ Prompt engineering মডিউল ১১ · পর্ব ৬৭–৭৩ RAG ও agent মডিউল ১২ · পর্ব ৭৪–৮১ Generative model মডিউল ১৩ · পর্ব ৮২–৮৬ Production ও ক্যাপস্টোন মডিউল ১৪ · পর্ব ৮৭–৯১ পরীক্ষা ও ইন্টারভিউ ভিত্তি ও training network-এর স্থাপত্য ভাষা ও LLM LLM দিয়ে কাজ generative ও production প্রস্তুতি
ছবি ১.২ — হলুদ তিনটি মডিউল বাকি সবার ভিত্তি; সবুজে network-এর স্থাপত্য, বেগুনিতে ভাষা, নীলে LLM দিয়ে অ্যাপ, গোলাপিতে generative model আর production.

কয়েকটি নির্ভরতা মনে রাখার মতো। Transformer (পর্ব ৩৫) বুঝতে residual connection (পর্ব ১৭) আর LayerNorm (পর্ব ১৪) লাগবে। LoRA দিয়ে fine-tuning (পর্ব ৫৫) পড়ার আগে Hugging Face-এর কাঠামো (পর্ব ৫৩) জানা চাই। RAG (পর্ব ৬৯) দাঁড়িয়ে আছে sentence embedding (পর্ব ৬৭) আর vector index (পর্ব ৬৮)-এর ওপর। VAE (পর্ব ৭৬)-এর ELBO নতুন করে প্রমাণ হবে না; তা মেশিন লার্নিং কোর্সের পর্ব ৪৮-এ আছে।

আপনার স্তর অনুযায়ী পথ

সবাইকে ১ থেকে ৯১ পর্যন্ত একইভাবে পড়তে হবে না। নিচের ডায়াগ্রামে তিন রকম পাঠকের জন্য পরামর্শ; লাল দাগ দেওয়া মডিউলগুলো সেই ধাপের মূল পথ।

M1 মানচিত্র ও ভিত্তি
M2 PyTorch
M3 network শেখানো
M4 CNN
M5 sequence
M6 Transformer
M7 NLP
M8 LLM
M9 fine-tuning
M10 prompt
M11 RAG ও agent
M12 generative
M13 production
M14 পরীক্ষা ও ইন্টারভিউ
  1. সবার শুরু: মডিউল ১. এই পর্ব, তারপর perceptron, NumPy MLP, হাতে backprop, নিজের autograd আর network কী শিখতে পারে (পর্ব ০২–০৬)। আগের কোর্সে এগুলোর প্রথম দেখা হয়েছে; এখানে গভীরে। অভিজ্ঞ পাঠকও পর্ব ০৪ আর ০৫ বাদ দেবেন না, কারণ পরের প্রতিটি ডিবাগিং এই দুটির ওপর দাঁড়িয়ে।
  2. শুরুর স্তরের পথ। নতুন বা AI-এর ভিত্তি কোর্স সদ্য শেষ করেছেন: M1 → M2 → M3 → M4, তারপর M7, M10 আর M11. মডিউল ৪-এ CNN দিয়ে প্রথম সত্যিকারের ছবি-model, মডিউল ১০–১১-এ LLM দিয়ে কাজের অ্যাপ। গণিতের প্রমাণ প্রথমবার আটকালে ছোট সংখ্যার উদাহরণে ফল মিলিয়ে এগিয়ে যান।
  3. মাঝারি স্তরের পথ। ML কোর্স শেষ, PyTorch একটু জানেন: M1 দ্রুত, M2 নিজের কোডে ঝালাই, তারপর M3 থেকে M11 পুরো। মডিউল ৫ আর ৬ (RNN থেকে Transformer) সবচেয়ে বেশি সময় চায়; পর্ব ৩৬-এ নিজে একটি ছোট বাংলা language model লিখবেন।
  4. উন্নত স্তরের পথ। Thesis, গবেষণা বা ML engineer-এর কাজ: অংশ ৬-এর নিজেকে যাচাই পরীক্ষা দিয়ে M1–M3 ঝালাই, তারপর M6, M8, M9, M11, M12 আর M13. “আরও গভীরে” বাক্সগুলোর প্রবন্ধ খুলে পড়ুন, আর প্রতিটি পর্বের desktop run নিজের মেশিনে আবার চালান।
  5. সবার শেষ ধাপ: মডিউল ১৪. Numerical সমস্যা, MCQ, লিখিত ও ভাইভা প্রশ্ন, coding আর ধারণার ইন্টারভিউ। বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষার আগে যেকোনো সময় খুলতে পারেন; প্রতিটি মডিউল শেষে সংশ্লিষ্ট অংশ ঝালিয়ে নেওয়া সবচেয়ে কাজের।

কিছু বিষয় এই কোর্সে শুধু পরিচয় পর্যায়ে: object detection আর segmentation (পর্ব ২৫), আর reinforcement learning শুধু RLHF-এর প্রসঙ্গে (পর্ব ৫৭)। Computer vision, reinforcement learning, MLOps আর AI ethics নিয়ে ABCL TECH-এ আলাদা কোর্স নতুন করে তৈরি হচ্ছে; সেগুলো আরও গভীরে যাবে।

৬ · শুরুর আগে নিজেকে যাচাই

নিচের আটটি প্রশ্ন কাগজ-কলমে করুন, তারপর ব্লক চালিয়ে উত্তর মেলান। ছয় বা তার বেশি ঠিক হলে সরাসরি এগোন; চারের কম হলে পাশের লিংকের পর্বগুলো আগে ঝালিয়ে নিন। এটা কোনো বাধা নয়, শুধু আপনার নিজের মাপকাঠি।

  1. Shape: X-এর shape (5, 2), W1-এর (2, 16), b1-এর (16,). X @ W1 + b1-এর shape? (AI-এর ভিত্তি কোর্সের পর্ব ১৭, broadcasting-এর জন্য পর্ব ১৫)
  2. Activation-এর derivative: sigmoid-এর derivative σ(z)(1 − σ(z)) আর tanh-এর 1 − tanh²(z). z = 0-তে দুটির মান? (পর্ব ৬৮)
  3. Chain rule: f(x) = (3x + 1)². f′(1) কত? (পর্ব ৩৪)
  4. Softmax: score [1, 2, 3]-এর softmax, তিন দশমিকে। (পর্ব ৬৮)
  5. Parameter গোনা: 2-16-1 আর 64-32-10 MLP-তে weight আর bias মিলিয়ে কতটি? (পর্ব ৬৮)
  6. Gradient descent: f(w) = w² − 4w, শুরু w = 1, learning rate 0.25. এক ধাপ পরে w? (মেশিন লার্নিং কোর্সের পর্ব ১৩)
  7. Loss: label 1, model-এর সম্ভাবনা 0.8. Binary cross-entropy loss −ln(0.8) কত? (পর্ব ৫৯)
  8. Axis আর transpose: a = np.arange(6).reshape(2, 3) হলে (a.T @ a).shape, a.sum(axis=1) আর (a - a.mean(axis=0)).shape? (পর্ব ১৬)
import numpy as np
X, W1, b1 = np.ones((5, 2)), np.zeros((2, 16)), np.zeros(16)
print("1) (X @ W1 + b1).shape =", (X @ W1 + b1).shape)
sig = lambda z: 1 / (1 + np.exp(-z))
print("2) sigmoid'(0) =", sig(0) * (1 - sig(0)), "| tanh'(0) =", 1 - np.tanh(0) ** 2)
f, h = (lambda x: (3 * x + 1) ** 2), 1e-5
print("3) f'(1) সংখ্যায় ≈", round((f(1 + h) - f(1 - h)) / (2 * h), 4))
z = np.array([1.0, 2.0, 3.0]); p = np.exp(z - z.max()); p = p / p.sum()
print("4) softmax([1, 2, 3]) =", p.round(3))
print("5) parameter 2-16-1 =", 2 * 16 + 16 + 16 * 1 + 1, "| 64-32-10 =", 64 * 32 + 32 + 32 * 10 + 10)
w = 1.0; w = w - 0.25 * (2 * w - 4)
print("6) এক ধাপ পরে w =", w)
print("7) -ln(0.8) =", round(float(-np.log(0.8)), 3))
a = np.arange(6).reshape(2, 3)
print("8)", (a.T @ a).shape, a.sum(axis=1), (a - a.mean(axis=0)).shape)

আসল আউটপুট (ব্রাউজারের Python):

1) (X @ W1 + b1).shape = (5, 16)
2) sigmoid'(0) = 0.25 | tanh'(0) = 1.0
3) f'(1) সংখ্যায় ≈ 24.0
4) softmax([1, 2, 3]) = [0.09  0.245 0.665]
5) parameter 2-16-1 = 65 | 64-32-10 = 2410
6) এক ধাপ পরে w = 1.5
7) -ln(0.8) = 0.223
8) (3, 3) [ 3 12] (2, 3)

১) (5, 16): পাঁচ গ্রাহক, প্রত্যেকের ১৬টি hidden মান; b1 broadcasting-এ প্রতিটি সারিতে যোগ হয়। ২) sigmoid-এর ঢাল সর্বোচ্চ ০.২৫, tanh-এর ১; এই ছোট সংখ্যা অনেক স্তরে গুণ হলে gradient মিলিয়ে যায় (পর্ব ১৭)। ৩) হাতে: 2(3x + 1) · 3 = 24; সংখ্যায় central difference একই দেয়, পর্ব ০৪-এর gradient check-এর মূল কৌশল। ৪) সবচেয়ে বড় score পায় ০.৬৬৫; কোডে z - z.max() overflow ঠেকায়। ৫) 2 × 16 + 16 + 16 + 1 = 65 আর 64 × 32 + 32 + 32 × 10 + 10 = 2410. ৬) f′(w) = 2w − 4 = −2, তাই w = 1 − 0.25 × (−2) = 1.5. ৭) ০.২২৩। ৮) (3, 3), প্রতিটি সারির যোগ [3 12], আর গড় বাদ দিলেও shape (2, 3).

৭ · টুল আর hardware — পাতায় NumPy, ডেস্কটপে PyTorch, CPU বনাম GPU

এই কোর্সের কোড দুই জায়গায় চলে। পাতায়: NumPy, SciPy, pandas, scikit-learn আর matplotlib, আপনার ব্রাউজারে, কিছু install ছাড়া। PyTorch পাতায় চলে না, তাই পাতায় যত neural network চলবে, সব NumPy-তে লেখা, ছোট আর seed দেওয়া। ডেস্কটপে: PyTorch, torchvision, Hugging Face-এর transformers আর datasets, sentence-transformers, FAISS, diffusers, ONNX Runtime. এগুলো আমরা একটি আলাদা virtual environment-এ সত্যিই চালিয়ে আউটপুট পাতায় দিই, “সত্যিকারের run” লেখা আর version-সহ। Model নামানো হয় শুধু ছোট, খোলা লাইসেন্সের checkpoint, Hugging Face Hub-এর মতো অফিশিয়াল জায়গা থেকে, নাম আর লাইসেন্সসহ। কিছু চালানো না গেলে স্পষ্ট লেখা থাকবে, আর বানানো আউটপুটে লেখা থাকবে “নমুনা”।

প্রথম সত্যিকারের run — PyTorch install আর একই ছোট MLP

নিজের কম্পিউটারে একই পরিবেশ বানাতে uv (AI-এর ভিত্তি কোর্সের পর্ব ৭; venv-এর মূল কথা Python প্রোগ্রামিং কোর্সে)। শুধু CPU-র জন্য PyTorch চাইলে তার আলাদা package index বলে দিতে হয়, নইলে অনেক বড় GPU build নামতে পারে। আমাদের pyproject.toml-এ যোগ করা অংশ:

[tool.uv.sources]
torch = { index = "pytorch-cpu" }

[[tool.uv.index]]
name = "pytorch-cpu"
url = "https://download.pytorch.org/whl/cpu"
explicit = true

তারপর uv add torch numpy. NVIDIA GPU থাকলে PyTorch-এর অফিশিয়াল install পাতায় নিজের CUDA version অনুযায়ী কমান্ড বেছে নিন; ঠিক কমান্ড সময়ের সঙ্গে বদলায়। নিচের স্ক্রিপ্ট পাতার হুবহু একই ৪০০ জন গ্রাহক বানায় (NumPy-র default_rng(42) সব মেশিনে একই সংখ্যা দেয়), আর একই 2-16-1 network PyTorch-এ train করে। Training loop-এর মূল চারটি লাইন (zero_grad, loss, backward, step) মডিউল ২-এর বিষয়।

# check_torch.py
import sys, torch, numpy as np
print("Python", sys.version.split()[0], "| torch", torch.__version__, "| numpy", np.__version__)
print("CUDA available:", torch.cuda.is_available())

# tiny_mlp.py
import time, numpy as np, torch
from torch import nn
rng = np.random.default_rng(42)                    # পাতার হুবহু একই ৪০০ জন গ্রাহক
days, price = rng.uniform(0, 8, 400), rng.uniform(-35, 35, 400)
X = np.c_[(days - 2) / 2, price / 15]
y = (X[:, 0]**2 + X[:, 1]**2 < 1.3).astype(int)
flip = rng.random(400) < 0.05; y[flip] = 1 - y[flip]
X, y = torch.tensor(X, dtype=torch.float32), torch.tensor(y, dtype=torch.float32)
torch.manual_seed(0)
model = nn.Sequential(nn.Linear(2, 16), nn.Tanh(), nn.Linear(16, 1))
opt = torch.optim.SGD(model.parameters(), lr=0.5)
loss_fn = nn.BCEWithLogitsLoss()
t = time.perf_counter()
for step in range(3000):                           # training loop-এর মূল চার লাইন
    opt.zero_grad()
    loss = loss_fn(model(X[:300]).squeeze(1), y[:300])
    loss.backward()
    opt.step()
    if step % 1000 == 0: print(f"step {step:4d}  loss {loss.item():.3f}")
with torch.no_grad():
    acc = lambda s: ((model(X[s]).squeeze(1) > 0).float() == y[s]).float().mean().item()
    print(f"train {acc(slice(0, 300)):.3f} | test {acc(slice(300, 400)):.3f}")
print(f"parameter {sum(p.numel() for p in model.parameters())} | CPU-তে {time.perf_counter() - t:.1f} s")

সত্যিকারের run (ডেস্কটপ, Windows, CPU, Python 3.14.4, PyTorch 2.15.0 CPU build, NumPy 2.5.4; লেখার সময়ের সর্বশেষ স্থিতিশীল version):

~/bazarghar-dl$ uv run python check_torch.py
Python 3.14.4 | torch 2.15.0+cpu | numpy 2.5.4
CUDA available: False
~/bazarghar-dl$ uv run python tiny_mlp.py
step    0  loss 0.706
step 1000  loss 0.189
step 2000  loss 0.159
train 0.963 | test 0.960
parameter 65 | CPU-তে 1.0 s

এ ধরনের ব্লক কীভাবে পড়বেন, নিচের ডায়াগ্রামে লাইন ধরে ধরে দেখুন।

1~/bazarghar-dl$ uv run python check_torch.py2Python 3.14.4 | torch 2.15.0+cpu | numpy 2.5.43CUDA available: False4~/bazarghar-dl$ uv run python tiny_mlp.py5step    0  loss 0.7066step 1000  loss 0.1897step 2000  loss 0.1598train 0.963 | test 0.9609parameter 65 | CPU-তে 1.0 s
যা খুঁজবেন
প্রশ্ন
উত্তর
  1. Prompt আর কমান্ড। ~/bazarghar-dl$ একটি নিরপেক্ষ প্রকল্প-ফোল্ডারের নাম; আসল মেশিনের path, ব্যবহারকারীর নাম বা hardware-এর বিবরণ আমরা কখনো দেখাই না। uv run মানে প্রকল্পের নিজের venv-এ চালানো, তাই আপনার মেশিনেও একই package পাবেন।
  2. Version লাইন। 2.15.0+cpu-এর +cpu অংশ বলছে এটি CPU-র build. প্রতিটি সত্যিকারের run-এর সঙ্গে version থাকে, কারণ deep learning library দ্রুত বদলায়, আর পুরোনো version-এ একই কোড ভিন্ন আচরণ করতে পারে। আপনার সংখ্যা না মিললে আগে version মেলান।
  3. CUDA available: False. CPU build-এ এটি সবসময় False; GPU build হলে আর driver ঠিক থাকলে True হতো। Training-এর আগে এই এক লাইন দেখে নেওয়া ভালো অভ্যাস: GPU ভেবে CPU-তে চালালে বড় কাজে ঘণ্টার পর ঘণ্টা নষ্ট হয়।
  4. Loss কমছে। ০.৭০৬ থেকে ০.১৫৯। শুরুর মান প্রায় ln 2 ≈ ০.৬৯৩, অর্থাৎ শুরুতে model প্রায় ৫০-৫০ অনুমান করছে; এটি একটি কাজের sanity check (পর্ব ১৮)। পাতার NumPy সংস্করণের সঙ্গে loss হুবহু মিলবে না, কারণ শুরুর weight আলাদা নিয়মে এসেছে।
  5. ফল মেলানো। Train ০.৯৬৩, পাতার NumPy MLP-র সমান; test ০.৯৬০, পাতার ০.৯৪০-এর চেয়ে দুইজন গ্রাহক বেশি ঠিক। একই ডেটা, একই স্থাপত্য, ভিন্ন শুরু: ১০০ জনের test-এ এমন ছোট পার্থক্য স্বাভাবিক।
  6. খরচ। ৬৫টি parameter, ৩০০০ ধাপ, CPU-তে প্রায় এক সেকেন্ড। এটি একটি মেশিনে একবারের মাপ, benchmark নয়; আপনার মেশিনে কম-বেশি হবে। Network বড় হলে এই লাইনটিই বলবে GPU লাগবে কি না।

CPU, GPU আর মেমরির হিসাব

GPU হাজার হাজার সরল হিসাব একসঙ্গে করে, আর neural network-এর বেশিরভাগ কাজ বড় matrix গুণ, তাই বড় network-এ GPU অনেক গুণ দ্রুত। কিন্তু এই কোর্সের প্রথম তিন মডিউল, আর পরের অনেক ছোট পরীক্ষা, ল্যাপটপের CPU-তেই চলে। কিছু বিনামূল্যের অনলাইন notebook সেবা সীমিত সময়ের জন্য GPU দেয়; শর্ত আর সীমা প্রায়ই বদলায়, তাই নিজে যাচাই করে নিন। কোথায় কতটা মেমরি লাগবে, তা আগে হিসাব করার একটি মোটা নিয়ম:

  • প্রতিটি parameter float32-এ ৪ byte, float16 বা bfloat16-এ ২ byte.
  • Adam দিয়ে float32-এ train করলে প্রতি parameter-এ মোটামুটি ১৬ byte: weight ৪, gradient ৪, Adam-এর দুটি moment ৮ (Adam-এর derivation মেশিন লার্নিং কোর্সের পর্ব ১৪-এ)। এর ওপর activation-এর মেমরি, যা batch-এর মাপের সঙ্গে বাড়ে।
  • উদাহরণ: ৫০ কোটি (0.5 billion) parameter-এর model. শুধু weight float16-এ প্রায় ১ GB, তাই ল্যাপটপে চালানো সম্ভব; কিন্তু পুরো fine-tuning-এ ০.৫ × ১০⁹ × ১৬ ≈ ৮ GB, activation ছাড়াই। এজন্যই LoRA-র মতো পদ্ধতি (পর্ব ৫৫) আর quantization (পর্ব ৫৯) এত গুরুত্বপূর্ণ।

আরও গভীরে: ক্ষেত্রটির একটি বহুল উদ্ধৃত সংক্ষিপ্ত পরিচিতি LeCun, Bengio আর Hinton-এর ২০১৫ সালের Nature review “Deep learning”; বিস্তারিত পাঠ্যবই হিসেবে Goodfellow, Bengio আর Courville-এর “Deep Learning” (MIT Press, ২০১৬) অনলাইনে বিনামূল্যে পড়া যায়। ImageNet প্রতিযোগিতার ইতিহাস Russakovsky ও সহকর্মীদের ২০১৫ সালের প্রবন্ধে। PyTorch-এর নকশার যুক্তি (define-by-run, Python-এর মতো আচরণ) Paszke ও সহকর্মীদের ২০১৯ সালের NeurIPS প্রবন্ধে; পর্ব ০৫ “নিজে বানানো autograd”-এ এর মূল ধারণা নিজে লিখবেন।

পরীক্ষা ও ইন্টারভিউতে: এই পর্বের বিষয়ে যে ধরনের প্রশ্ন প্রায়ই আসে:

  • Machine learning আর deep learning-এর মূল পার্থক্য? Deep learning অনেক স্তরে কাঁচা ডেটা থেকে নিজে feature শেখে আর end-to-end train হয়; classical ML-এ feature মানুষ বানান।
  • Activation ছাড়া ১০ স্তরের network কী শেখে? শুধু একটি linear function; সব W গুণ করলে একটিই matrix.
  • 2-16-1 MLP-তে কতটি parameter? 2 × 16 + 16 + 16 + 1 = 65.
  • ১০ লাখ parameter-এর model float32-এ Adam দিয়ে train করতে মোটামুটি কত মেমরি? প্রায় ১৬ MB, activation ছাড়া।
  • ৫ হাজার সারির টেবিলে প্রথম কোন model? একটি baseline, regularized linear আর gradient boosting; deep network শুধু মেপে লাভ দেখালে।

৮ · AI-এর যুগে — AI assistant দিয়ে deep learning কাজ, যাচাইসহ

Deep learning-এর কোড AI assistant দিয়ে লেখানো খুব সহজ, আর ভুলও খুব চুপচাপ। কোড চলে, loss কমে, নম্বর আসে, কিন্তু নম্বরটি ভুল। সাধারণ ভুলগুলো: পুরোনো বা বানানো library API (transformers, peft বা trl-এর বাদ পড়া argument, সরানো torch function), tensor-এর shape, dim আর dtype গুলিয়ে ফেলা, model.eval(), torch.no_grad() বা zero_grad() ভুলে যাওয়া, test ডেটা training-এ ঢুকিয়ে ফেলা, একটি ভাগ্যবান run-কে ফল বলা, LLM “বোঝে” বলে বাড়িয়ে বলা, আর বিশ্বাসযোগ্য দেখতে কিন্তু ভুল derivation বা বানানো প্রবন্ধের উদ্ধৃতি।

AI-কে কাজ দেওয়ার সময় version, ডেটার shape, যাচাইয়ের নিয়ম আর আউটপুটের রূপ বলে দিন। নিচের prompt-টি এই পর্বের demo-র জন্য:

আমি PyTorch 2.15 (CPU) আর NumPy 2.5 ব্যবহার করি। আমার ডেটা: X-এর shape (400, 2), float32; y-এর shape (400,), মান 0 বা 1. প্রথম 300 সারি train, শেষ 100 test. একটি 2-16-1 MLP (tanh hidden, BCEWithLogitsLoss) লিখে দাও। নিয়ম: ১. প্রতিটি tensor-এর shape কমেন্টে লিখবে। ২. test অংশ শুধু শেষে, torch.no_grad() আর model.eval()-এর ভেতরে। ৩. আগে একই ডেটায় logistic regression baseline দেখাবে, আর তিনটি ভিন্ন seed-এ MLP-র test accuracy-র গড় ও ছড়ানো। ৪. শুধু PyTorch 2.15-এ সত্যিই আছে এমন function; কোনোটি নিয়ে নিশ্চিত না হলে বলবে। ৫. শেষে লিখবে, কোন লাইন বাদ পড়লে চুপচাপ ভুল ফল আসত।

AI-এর লেখা deep learning কোড হাতে পেলে — যাচাইয়ের চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১Neural network-এর ধারণা ১৯৫০-এর দশকের। তাহলে ২০১২-র আগে এটি কেন সবাইকে হারায়নি?

ধারণা থাকা আর তা কাজে লাগানোর মতো পরিবেশ থাকা আলাদা জিনিস। সাধারণ ব্যাখ্যায় তিনটি বাধা ছিল।

  • ডেটা: বহুস্তরের network-এর parameter অনেক, আর অল্প ডেটায় সে মুখস্থ করে। ২০০৯ সালের দিকে ImageNet-এর মতো লাখো লেবেলসহ ছবির ডেটাসেট আসার আগে বড় network-কে খাওয়ানোর মতো ডেটা ছিল না।
  • Compute: একটি বড় network train করতে কোটি কোটি গুণ-যোগ লাগে। GPU মূলত গেমের ছবি আঁকার জন্য তৈরি, কিন্তু তার সমান্তরাল matrix গুণ neural network-এর সঙ্গে ভালো মেলে; CUDA-র মতো টুল (২০০৭ সালে প্রথম প্রকাশ) GPU-কে সাধারণ হিসাবে ব্যবহার সহজ করে। AlexNet দুটি GPU-তে train হয়েছিল।
  • Training-এর কৌশল: sigmoid-ভরা গভীর network-এ gradient স্তরে স্তরে মিলিয়ে যেত। ReLU, ভালো initialization, dropout আর পরে batch normalization আর residual connection গভীর network-কে train করা সম্ভব করে (মডিউল ৩)।

এর মাঝে ১৯৯০ আর ২০০০-এর দশকে SVM আর boosting-এর মতো পদ্ধতি ছোট ও মাঝারি ডেটায় প্রায়ই ভালো করত, তাদের তত্ত্ব পরিষ্কার ছিল (convex optimization, margin), আর network-এর অনেক সাফল্য তখন ব্যাপক মনোযোগ পায়নি। তবে network নিয়ে কাজ থেমে ছিল না: LeCun-এর convolutional network বাস্তবে চেকের লেখা পড়ার কাজে ব্যবহৃত হয়েছিল বলে বর্ণনা পাওয়া যায়, আর LSTM ১৯৯৭ সালে প্রস্তাবিত হয়।

একটি সূক্ষ্ম বিষয়: “AI winter” শব্দটি দিয়ে ইতিহাস সরল করা হয়। কোন বছরকে শীতকাল বলা হবে, তা নিয়ে ঐতিহাসিকদের মত আলাদা, আর গবেষণার অর্থায়ন দেশ ও প্রতিষ্ঠানভেদে আলাদা ছিল।

মূল উপলব্ধি: একটি পদ্ধতির সাফল্য শুধু তার ধারণার ওপর নয়, ডেটা, hardware আর কৌশলের মিলনের ওপর নির্ভর করে। আজ যে পদ্ধতি “হেরে” আছে, পরিবেশ বদলালে সে ফিরে আসতে পারে।

প্র ০২একটি hidden layer-ই যদি যেকোনো function কাছাকাছি আনতে পারে, তাহলে network-কে “গভীর” করার দরকার কী?

Universal approximation theorem (Cybenko ১৯৮৯, Hornik ও সহকর্মীরা একই সময়ে; পর্ব ০৬-এ বিস্তারিত) বলে, যথেষ্ট unit পেলে একটি hidden layer-এর network একটি সীমিত এলাকায় যেকোনো ধারাবাহিক function-এর যত কাছে চাই তত কাছে যেতে পারে। কিন্তু উপপাদ্যটি তিনটি জিনিস বলে না: কতগুলো unit লাগবে, gradient descent সেগুলো খুঁজে পাবে কি না, আর নতুন ডেটায় ভালো করবে কি না।

গভীরতার যুক্তি মূলত দক্ষতার। পাতার demo-তে দেখলেন, প্রতিটি ReLU unit একটি ভাঁজ। এক স্তরে ভাঁজগুলো শুধু যোগ হয়। কিন্তু দ্বিতীয় স্তর আগের স্তরের ফলের ওপর আবার ভাঁজ ফেলে, যেন কাগজ ভাঁজ করে আবার ভাঁজ করা; প্রতিবার ভাঁজের সংখ্যা গুণ হয়। Telgarsky-র মতো গবেষকেরা (২০১৬) দেখিয়েছেন, কিছু function গভীর network অল্প unit-এ প্রকাশ করতে পারে, যার জন্য অগভীর network-এর exponential সংখ্যক unit লাগে। পর্ব ০৬-এ এর একটি করাতের দাঁতের মতো উদাহরণ হিসাব করবেন।

দ্বিতীয় যুক্তি গঠনের। বাস্তবের ডেটা স্তরে স্তরে গড়া: ছবিতে রেখা থেকে কোনা, কোনা থেকে অংশ, অংশ থেকে বস্তু; ভাষায় অক্ষর থেকে শব্দ, শব্দ থেকে বাক্যাংশ, তা থেকে অর্থ। গভীর network-এর স্তরগুলো এই ধাপগুলো ধরতে পারে বলে মনে করা হয়, আর CNN-এর ভেতরের স্তর দেখে এমন ছবি পাওয়া গেছে (পর্ব ২৬)। তবে “প্রতিটি স্তর ঠিক একটি মানবিক ধারণা শেখে” এমন দাবি অতিরঞ্জন।

গভীরতার দামও আছে: gradient মিলিয়ে যাওয়া বা বিস্ফোরিত হওয়া, ধীর training. Residual connection (পর্ব ১৭, ২২) না আসা পর্যন্ত খুব গভীর network train করা কঠিন ছিল।

মূল উপলব্ধি: “পারে” আর “দক্ষতার সঙ্গে শিখতে পারে” এক কথা নয়। গভীরতা একই কাজ কম parameter-এ আর ডেটার স্তরভিত্তিক গঠনের সঙ্গে মিলিয়ে করার একটি উপায়, জাদু নয়।

প্র ০৩টেবিলের ডেটায় tree-ভিত্তিক model এখনো প্রায়ই deep learning-কে হারায় কেন? এটা কি বদলাতে পারে?

কয়েকটি বড় তুলনামূলক গবেষণা এই প্রশ্ন নিয়ে কাজ করেছে। Grinsztajn, Oyallon আর Varoquaux-এর ২০২২ সালের NeurIPS প্রবন্ধ “Why do tree-based models still outperform deep learning on tabular data?” মাঝারি আকারের (প্রায় দশ হাজার সারির) অনেক ডেটাসেটে দেখায়, tree ensemble সাধারণত এগিয়ে, আর tuning-এর খরচও কম। তাঁদের ব্যাখ্যা তিনটি inductive bias-এর দিকে ইঙ্গিত করে:

  • অনিয়মিত function: টেবিলের target প্রায়ই হঠাৎ লাফায় (“৪৫ দিনের বেশি হলে”), আর tree সেই threshold সরাসরি ধরে; MLP মসৃণ function-এর দিকে ঝোঁকে।
  • অকেজো কলাম: MLP অকেজো feature-এ বেশি বিভ্রান্ত হয়; অংশ ৪-এর ব্লকে ৬টি অকেজো কলাম ঠিক এটাই পরীক্ষা করে।
  • কলামের অর্থ: টেবিলের প্রতিটি কলামের আলাদা অর্থ, আর কলাম ঘুরিয়ে মেশালে (rotation) তথ্য হারায়; MLP ঘোরানোয় নিরপেক্ষ, tree নয়।

Shwartz-Ziv আর Armon-এর ২০২২ সালের “Tabular data: Deep learning is not all you need” প্রবন্ধও প্রায় একই সিদ্ধান্তে আসে, যদিও কিছু ডেটাসেটে network আর tree মেশালে ভালো হয় বলে দেখায়।

বদলাতে পারে কি? সম্প্রতি টেবিলের জন্য pretrained model নিয়ে কাজ হচ্ছে, যেমন TabPFN (Hollmann ও সহকর্মীরা), যা অনেক কৃত্রিম টেবিলে আগে থেকে train করা একটি Transformer, আর রিপোর্ট অনুযায়ী ছোট টেবিলে শক্ত ফল দেখায়। এর সীমা, খরচ আর কোন ডেটায় খাটে, তা নিয়ে আলোচনা চলছে; নিজের ডেটায় না মেপে কোনো পক্ষ নেওয়া ঠিক নয়।

বাজারঘরের কাজে এর মানে সহজ: টেবিলের প্রশ্নে আগে boosting আর একটি linear baseline চালান, তারপর network-কে একই fold-এ সুযোগ দিন। টেবিলের পাশে রিভিউয়ের লেখা বা পণ্যের ছবি থাকলে network দিয়ে সেগুলো থেকে feature বানিয়ে tree-তে দেওয়া একটি জনপ্রিয় মাঝামাঝি পথ।

মূল উপলব্ধি: Model-এর inductive bias যত বেশি ডেটার আসল গঠনের সঙ্গে মেলে, তত কম ডেটায় সে ভালো করে। ছবি আর ভাষার গঠন network-এর সঙ্গে মেলে, টেবিলের গঠন প্রায়ই গাছের সঙ্গে।

প্র ০৪“আরও ডেটা আর আরও compute দিলেই ভালো হয়” — এই কথা কতটা সত্য?

২০১৯ সালে Richard Sutton “The Bitter Lesson” নামে একটি ছোট প্রবন্ধে যুক্তি দেন: AI-এর ইতিহাসে মানুষের জ্ঞান হাতে ঢোকানো পদ্ধতির চেয়ে compute-এর সঙ্গে বাড়তে পারা সাধারণ পদ্ধতি (search আর learning) শেষ পর্যন্ত বেশি জিতেছে। ২০২০ সালে Kaplan ও সহকর্মীরা language model-এ দেখান, loss model-এর মাপ, ডেটা আর compute-এর সঙ্গে মোটামুটি power-law মেনে কমে; ২০২২ সালে Hoffmann ও সহকর্মীরা (“Chinchilla” প্রবন্ধ) দেখান, একটি নির্দিষ্ট compute-এ অনেক বড় model-এর চেয়ে ডেটা আর model-এর ভারসাম্য বেশি জরুরি। এগুলোকে বলে scaling law (পর্ব ৫১)।

কিন্তু “শুধু বড় করো” কথাটির কয়েকটি সীমা আছে:

  • ডেটার মান: গোলমেলে বা পুনরাবৃত্ত ডেটা বাড়ালে লাভ কমে; বাছাই করা ডেটা প্রায়ই বেশি কাজের বলে রিপোর্ট আছে।
  • খরচ আর শক্তি: বড় training-এর খরচ আর বিদ্যুৎ-ব্যবহার বিশাল; বেশিরভাগ প্রতিষ্ঠান, বিশেষ করে বাংলাদেশের মতো দেশের ছোট দল, এই পথে প্রতিযোগিতা করতে পারে না। তাদের জন্য pretrained model নিয়ে fine-tuning, ছোট model আর ভালো মূল্যায়নই বাস্তব পথ।
  • যা মাপা হচ্ছে: scaling law মূলত loss-এর কথা বলে। বাস্তবের কাজের দক্ষতা, নির্ভরযোগ্যতা বা নিরাপত্তা একইভাবে বাড়বে, এমন নিশ্চয়তা নেই; “emergent” ক্ষমতার দাবি নিয়েও বিতর্ক আছে (পর্ব ৫১)।
  • কম সম্পদের ভাষা: বাংলার মতো ভাষায় মানসম্মত লেখার পরিমাণ ইংরেজির তুলনায় কম, তাই tokenization আর ডেটা সংগ্রহের সমস্যা আলাদা (পর্ব ৩৯, ৪০)।

মূল উপলব্ধি: মাপ বাড়ানো একটি শক্তিশালী কৌশল, কিন্তু একমাত্র নয়। আপনার কাজের প্রশ্ন সাধারণত “সবচেয়ে বড় model কোনটি” নয়, “আমার বাজেটে আমার কাজের জন্য যথেষ্ট ভালো কোনটি, আর কীভাবে জানব”।

প্র ০৫একটি deep network ৯৯% accuracy পেল। তাহলে কি সে কাজটা “বুঝেছে”?

Accuracy বলে model কতবার ঠিক বলল, কেন ঠিক বলল তা বলে না। Deep learning-এর ইতিহাসে এর কয়েকটি শিক্ষণীয় উদাহরণ আছে।

  • Adversarial example: Szegedy ও সহকর্মীরা (২০১৩) দেখান, ছবিতে মানুষের চোখে প্রায় অদৃশ্য ছোট পরিবর্তন করলে একটি ভালো classifier আত্মবিশ্বাসের সঙ্গে ভুল শ্রেণি বলতে পারে। মানুষের দেখার সঙ্গে network-এর “দেখা” এক নয় (পর্ব ২৬)।
  • Shortcut learning: Geirhos ও সহকর্মীদের ২০২০ সালের প্রবন্ধ এমন অনেক ঘটনা একসঙ্গে আলোচনা করে, যেখানে model আসল বৈশিষ্ট্যের বদলে সহজ সংকেত শেখে, যেমন বস্তুর বদলে পটভূমি বা ছবির texture. Test ডেটায় একই সংকেত থাকলে accuracy উঁচু দেখায়, নতুন পরিবেশে ভেঙে পড়ে।
  • Distribution shift: বাজারঘরের রিভিউ-model ঢাকার ক্রেতাদের লেখায় train হলে চট্টগ্রাম বা সিলেটের আঞ্চলিক শব্দে খারাপ করতে পারে। মেশিন লার্নিং কোর্সের পর্ব ৫৯-এ এর মাপার কৌশল আছে।
  • LLM-এর hallucination: language model বিশ্বাসযোগ্য কিন্তু ভুল তথ্য বা অস্তিত্বহীন উদ্ধৃতি তৈরি করতে পারে (পর্ব ৫২)।

“বোঝা” শব্দটি নিয়ে দর্শন আর cognitive science-এ বিতর্ক চলছে, আর বড় language model আসলে কী শেখে, তা নিয়ে গবেষকদের মতও আলাদা। প্রকৌশলীর জন্য বেশি কাজের প্রশ্ন: কোন পরিস্থিতিতে model নির্ভরযোগ্য, কোথায় ভেঙে পড়ে, আর তা কীভাবে মাপব? এজন্য দরকার ভিন্ন উৎসের test ডেটা, ভুলগুলো হাতে দেখা, আর ব্যাখ্যার টুল।

বাজারঘরের একটি উদাহরণ ভাবুন: রিভিউ-classifier যদি শেখে যে অনেকগুলো বিস্ময়চিহ্ন মানেই রাগী রিভিউ, তাহলে test-এ উঁচু accuracy পেলেও উচ্ছ্বসিত প্রশংসার বিস্ময়চিহ্নে ভুল করবে। এমন shortcut ধরার সবচেয়ে সস্তা উপায় ভুল উদাহরণগুলো নিজে পড়া।

মূল উপলব্ধি: উঁচু accuracy একটি দাবি, প্রমাণ নয়। Model কী শিখেছে তা যাচাই করা এই কোর্সের প্রতিটি মডিউলের অংশ, আর model “বোঝে” বলার আগে সে কোথায় ভুল করে তা জানা জরুরি।

অনুশীলন

উত্তর খোলার আগে অন্তত পাঁচ মিনিট নিজে চেষ্টা করুন।

  1. Parameter আর মেমরির হিসাব: একটি MLP-র স্তর 784 → 256 → 128 → 10 (প্রতিটি স্তরে bias আছে)। (ক) মোট parameter কত? (খ) float32-এ শুধু weight-এর মেমরি কত? (গ) Adam দিয়ে float32-এ train করতে, activation বাদে, মোটামুটি কত?

    (ক) 784 × 256 + 256 = 200,960; 256 × 128 + 128 = 32,896; 128 × 10 + 10 = 1,290. মোট ২,৩৫,১৪৬ (235,146). (খ) 235,146 × 4 = 940,584 byte, প্রায় ০.৯৪ MB. (গ) প্রতি parameter-এ প্রায় ১৬ byte: 235,146 × 16 = 3,762,336 byte, প্রায় ৩.৮ MB. এত ছোট network ল্যাপটপে অনায়াসে চলে; একই হিসাবে ১০০ কোটি parameter-এ প্রায় ১৬ GB লাগত, activation ছাড়াই।

  2. আউটপুট অনুমান করুন: নিচের কোড কী প্রিন্ট করবে?
    import numpy as np
    rng = np.random.default_rng(0)
    X = rng.normal(size=(4, 3))
    W1, b1 = rng.normal(size=(3, 5)), np.zeros(5)
    W2, b2 = rng.normal(size=(5, 1)), np.zeros(1)
    H = np.maximum(0, X @ W1 + b1)
    out = H @ W2 + b2
    print(H.shape, out.shape, W1.size + b1.size + W2.size + b2.size)
    print(np.maximum(0, np.array([-2.0, 0.5, 3.0])))
    print((H >= 0).all(), H.dtype)

    সত্যিকারের run (ডেস্কটপ, NumPy 2.5.4):

    (4, 5) (4, 1) 26
    [0.  0.5 3. ]
    True float64

    প্রথম লাইন: (4, 3) @ (3, 5) থেকে H (4, 5); (4, 5) @ (5, 1) থেকে out (4, 1); parameter 15 + 5 + 5 + 1 = 26. দ্বিতীয় লাইন: ReLU ঋণাত্মককে ০ করে, বাকিদের রাখে। তৃতীয় লাইন: ReLU-র পর সব মান ≥ ০, তাই True; আর dtype float64, কারণ NumPy-র random normal ডিফল্টে float64 দেয়। PyTorch-এ ডিফল্ট float32, তাই দুই জগৎ মেশানোর সময় dtype মেলাতে হয় (পর্ব ০৭)।

  3. নকশা ও সমালোচনা: বাজারঘরের একজন ম্যানেজার বললেন, “কোন অর্ডার ফেরত আসবে, তা deep learning দিয়ে বের করুন। আমাদের ২,০০০টি অর্ডারের ১২টি কলাম আছে।” একজন সহকর্মী সঙ্গে সঙ্গে একটি ৮-স্তরের network লিখলেন, train accuracy ০.৯৯ দেখালেন। আপনার প্রতিক্রিয়া আর পরিকল্পনা লিখুন।
    • সমস্যা: ২,০০০ সারির টেবিলে ৮-স্তরের network-এর parameter সহজেই সারির চেয়ে বেশি; train ০.৯৯ মানে মুখস্থ হতে পারে। কোনো validation, baseline বা ফেরতের হার (imbalance) জানানো হয়নি। ফেরত ৫% হলে “কেউ ফেরত দেবে না” বললেই ০.৯৫।
    • পরিকল্পনা: আগে test আলাদা; তারপর একই stratified fold-এ majority baseline, regularized logistic আর HistGradientBoosting; metric হিসেবে PR AUC বা recall, accuracy নয়। ছোট MLP প্রার্থী হতে পারে, কিন্তু একই fold-এ, কয়েকটি seed-এ।
    • কখন deep learning: ফেরতের কারণ যদি রিভিউয়ের লেখায় বা পণ্যের ছবিতে লুকিয়ে থাকে, তখন সেই কাঁচা ডেটা থেকে শেখা feature কাজে লাগতে পারে (মডিউল ৪, ৭)।
  4. Coding: unit কমান, activation সরান। অংশ ২-এর ব্লকে (ক) ১৬-এর বদলে ২টি hidden unit দিন (W1-এর shape (2, 2), w2-এর (2,)); (খ) ১৬ unit রেখে np.tanh সরিয়ে hidden layer-কে linear করুন (derivative-এর (1 - H**2)-ও বাদ দিন)। প্রতিবার test accuracy কী হবে, আগে অনুমান করুন।

    ডেস্কটপে একই কোড (NumPy 2.5.4) একবার চালিয়ে পাওয়া ফল: ১৬ unit tanh: train ০.৯৬৩, test ০.৯৪০; ২ unit tanh: train ০.৯২৭, test ০.৯৩০; ৪ unit: ০.৯৪৭ আর ০.৯৪০; ১৬ unit linear: train ০.৭৪৭, test ০.৭৯০।

    দুটি tanh unit-ও বেশ ভালো করে: tanh-এর দুই প্রান্তে চ্যাপ্টা হওয়া দুটি বাঁকা ভাঁজ দিয়ে একটি বাঁকা ফিতার মতো অঞ্চল বানানো যায়, যদিও ডিম্বাকৃতির সব দিক নয়। আর activation সরালে accuracy হুবহু logistic regression-এর সমান: W1 আর w2 গুণ করলে একটিই linear function, তাই ৬৫টি parameter থাকা সত্ত্বেও সীমানা আবার সোজা রেখা। Non-linearity-ই hidden layer-এর আসল শক্তি; parameter-এর সংখ্যা নয়।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমNeural network-এর ইতিহাসের ঘটনাগুলো সময়ের ক্রমে সাজান (▲▼ চেপে সরান)

  1. Rosenblatt-এর perceptron
  2. Minsky ও Papert-এর বইয়ে একস্তরের perceptron-এর সীমা
  3. Rumelhart, Hinton ও Williams-এর প্রবন্ধে backpropagation জনপ্রিয়
  4. AlexNet-এর ImageNet জয়
  5. “Attention Is All You Need”-এ Transformer

Classical machine learning-এর তুলনায় deep learning-এর মূল নতুনত্ব কোনটি?

  • Gradient descent দিয়ে training
  • কাঁচা ডেটা থেকে স্তরে স্তরে feature শেখা, end-to-end training
  • Label ছাড়া শেখা
  • ফল ব্যাখ্যা করা সহজ

একটি 2-16-1 MLP-র hidden layer থেকে activation function সরিয়ে দিলে (শুধু W1, b1 আর w2, b2, output-এ sigmoid) decision boundary কেমন হবে?

  • ১৬টি unit থাকায় বাঁকা
  • একটি বৃত্ত
  • একটি সোজা রেখা, logistic regression-এর মতো
  • কোনো সীমানা থাকবে না, network শিখবে না

৩,০০০ সারি আর ১৫টি অর্থপূর্ণ কলামের একটি বিক্রির টেবিলে প্রথম কোন পরিকল্পনা সবচেয়ে যুক্তিসঙ্গত?

  • একটি baseline, regularized linear model আর gradient boosting একই fold-এ তুলনা
  • সরাসরি একটি ১০-স্তরের network
  • ছবির জন্য pretrained CNN fine-tune করা
  • যে model-এর train accuracy সবচেয়ে বেশি, সেটি নেওয়া

একটি deep learning স্ক্রিপ্টের আউটপুটে torch 2.15.0+cpu আর CUDA available: False দেখা গেল। এর সবচেয়ে সম্ভাব্য অর্থ কী?

  • মেশিনের GPU নষ্ট
  • PyTorch এই মেশিনে কাজ করবে না
  • CUDA-র version 2.15.0
  • PyTorch-এর CPU build install হয়েছে, তাই হিসাব CPU-তে হবে

১০ কোটি (100 million) parameter-এর একটি model float32-এ Adam দিয়ে পুরো train করতে activation বাদে মোটামুটি কত মেমরি লাগবে?

  • প্রায় ০.৪ GB
  • প্রায় ১.৬ GB
  • প্রায় ০.২ GB
  • প্রায় ১৬ GB

একটি binary classifier-এর training শুরুর প্রথম ধাপে loss প্রায় ০.৬৯৩ দেখা গেল। এর সবচেয়ে যুক্তিসঙ্গত ব্যাখ্যা কোনটি?

  • শুরুতে model প্রায় ৫০-৫০ সম্ভাবনা দিচ্ছে, যা স্বাভাবিক
  • Model ইতিমধ্যে পুরো শিখে ফেলেছে
  • Code-এ নিশ্চিতভাবে bug আছে
  • Learning rate খুব বড়

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Deep learning-এর মূল নতুনত্ব: কাঁচা ডেটা থেকে স্তরে স্তরে feature শেখা আর end-to-end training, যা সম্ভব হয়েছে বড় ডেটা আর GPU-র কারণে।
  2. প্রতিটি hidden unit একটি non-linear ভাঁজ; অনেক ভাঁজ মিলে বাঁকা সীমানা। Activation ছাড়া পুরো network একটি linear model.
  3. ছোট টেবিলের ডেটায় gradient boosting প্রায়ই ভালো; deep learning-এর দাম ছবি, লেখা আর শব্দে। সিদ্ধান্ত সবসময় শক্ত baseline-এর সঙ্গে মেপে।
  4. ১৪ মডিউল: ভিত্তি ও PyTorch → training-এর কৌশল → CNN, sequence, Transformer → NLP ও LLM → prompt, RAG → generative → production → প্রস্তুতি।
  5. পাতায় NumPy, ডেস্কটপে PyTorch; “সত্যিকারের run”-এ আগে version আর device দেখুন। Adam-এ float32 training ≈ ১৬ byte প্রতি parameter.

পরের পর্বে: একটি neuron-এর জ্যামিতি। Perceptron আসলে একটি সমতল দিয়ে জায়গা ভাগ করে; কখন সে নিশ্চিতভাবে শেখা শেষ করে (Novikoff-এর সীমা), আর XOR-এ কেন আটকে যায়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান