পাঠ ০১ · ৪০-এর মধ্যে · মডিউল ১

Perceptron — একক নিউরন

The perceptron — a single artificial neuron
৬ মিনিট পড়া মাঝারি · Intermediate NumPy + PyTorch

এই পাঠে যা শিখবেন

  • একটি কৃত্রিম নিউরন কীভাবে গাণিতিকভাবে কাজ করে — ওজন, bias, activation
  • Perceptron-এর ইতিহাস ও কেন এটিকে DL-এর ভিত্তি বলা হয়
  • Perceptron learning rule — কীভাবে নিজে নিজে ওজন adjust করে
  • NumPy ও PyTorch দিয়ে নিজের হাতে একটি perceptron বানানো

১ · কৃত্রিম নিউরন — মস্তিষ্কের অনুপ্রেরণায়

মানুষের মস্তিষ্কে ৮৬ বিলিয়ন নিউরনNeuronমস্তিষ্কের মৌলিক একক — অন্য নিউরন থেকে সংকেত গ্রহণ করে, যোগ করে, ও threshold পেরোলে নিজে fire করে। কৃত্রিম নিউরন এই behavior-এর গাণিতিক রূপ। আছে। প্রতিটি নিউরন অনেকগুলো ইনপুট নেয় (dendrite-এ), যোগ করে, এবং একটা সীমা পেরোলে নিজে fire করে (axon-এ সংকেত পাঠায়)। ১৯৪৩ সালে McCulloch ও Pitts প্রথম এই idea-কে গণিতে রূপ দেন। ১৯৫৮-তে Frank Rosenblatt তা থেকে তৈরি করলেন perceptron — প্রথম "শেখা যায়" এমন কৃত্রিম নিউরন।

Perceptron-এর তিন উপাদান

১) ইনপুট ভেক্টর: $\mathbf{x} = (x_1, x_2, \ldots, x_n)$ — যেমন একটি ছবির পিক্সেল।
২) ওজন ভেক্টর: $\mathbf{w} = (w_1, w_2, \ldots, w_n)$ — প্রতিটি ইনপুট কতটা গুরুত্বপূর্ণ।
৩) Bias: $b$ — একটি threshold shift। নিউরন সহজে বা কঠিনে fire করবে কিনা তা নিয়ন্ত্রণ করে।

২ · Perceptron-এর সূত্র

একটি perceptron-এর আউটপুট ক্যালকুলেট হয় দু'টি ধাপে।

ধাপ ১ — ওজনযুক্ত যোগফল (linear combination):

$$z = w_1 x_1 + w_2 x_2 + \ldots + w_n x_n + b = \mathbf{w} \cdot \mathbf{x} + b$$

ধাপ ২ — Activation (step function):

$$y = \begin{cases} 1 & \text{যদি } z \geq 0 \\ 0 & \text{যদি } z < 0 \end{cases}$$

ভাবুন একজন ছাত্র পরীক্ষার জন্য পড়বে কিনা সিদ্ধান্ত নিচ্ছে। তিনটি ইনপুট: ১) পরীক্ষা কাল কিনা ($x_1$), ২) বন্ধু পড়ছে কিনা ($x_2$), ৩) ঘুম পেয়েছে কিনা ($x_3$)। প্রতিটির ওজন ভিন্ন — পরীক্ষা কাল হলে ওজন বেশি ($w_1 = 5$), ঘুম পেলে ওজন ঋণাত্মক ($w_3 = -3$)। সব মিলিয়ে threshold পেরোলে — পড়বে। এটাই perceptron।

৩ · একটি বাস্তব উদাহরণ — AND গেট

Logical AND-এর truth table: দু'টি ইনপুট দু'টোই ১ হলে আউটপুট ১, নাহলে ০। একটি perceptron দিয়ে এটি সমাধান করা যায়। ধরুন $w_1 = 1, w_2 = 1, b = -1.5$।

$x_1$$x_2$$z = x_1+x_2-1.5$$y$ (step)
00−1.50
01−0.50
10−0.50
11+0.51

মাত্র তিনটি সংখ্যা ($w_1, w_2, b$) দিয়ে — AND function পুরোপুরি কোডেড।

Perceptron — ভেতরে কী ঘটে y = step(w·x + b) x₁ x₂ x₃ ইনপুট w₁ w₂ w₃ bias b Σ যোগফল z z Activation step(z) y আউটপুট 0 বা 1
Perceptron — ইনপুট ওজনে গুণ হয়, যোগ হয়, bias যোগ হয়, তারপর step function পেরোলে আউটপুট ১।

৪ · Perceptron Learning Rule — কীভাবে শেখে

শুরুতে ওজনগুলো random। প্রতিটি training example দেখে — perceptron নিজের ভুল ঠিক করে। নিয়ম সহজ:

$$w_i \leftarrow w_i + \eta \cdot (y_{\text{true}} - y_{\text{pred}}) \cdot x_i$$

  • $\eta$ (eta) = learning rate — কত দ্রুত adjust হবে। সাধারণত ০.১ বা ০.০১।
  • যদি prediction সঠিক হয় ($y_{\text{true}} = y_{\text{pred}}$) — ওজন অপরিবর্তিত।
  • যদি ভুল হয় — ভুলের দিকে $x_i$-এর মান অনুসারে ওজন adjust হয়।
Rosenblatt প্রমাণ করেছিলেন — যদি ডেটা linearly separable হয় (একটি সরলরেখা দিয়ে দু'ভাগে ভাগ করা যায়), perceptron সীমিত সংখ্যক step-এ অবশ্যই সঠিক উত্তরে পৌঁছাবে। এটাই Perceptron Convergence Theorem।

৫ · NumPy দিয়ে নিজের হাতে Perceptron

Python · NumPy
import numpy as np

# AND গেট-এর data
X = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([0, 0, 0, 1])

# ওজন ও bias শুরু — random
w = np.random.randn(2) * 0.1
b = 0.0
lr = 0.1

# Perceptron training loop
for epoch in range(10):
    for xi, target in zip(X, y):
        z = np.dot(w, xi) + b
        pred = 1 if z >= 0 else 0
        error = target - pred
        w += lr * error * xi
        b += lr * error

# পরীক্ষা
print("শেষ ওজন:", w)
print("শেষ bias:", b)
for xi in X:
    z = np.dot(w, xi) + b
    print(f"{xi} -> {1 if z >= 0 else 0}")

    
মাত্র ১০ epoch-এ — perceptron AND function শিখে ফেলে। ওজন ও bias automatic adjust হয়েছে। কোনো গাণিতিক সমাধান হাতে দেওয়া হয়নি — শুধু ডেটা ও learning rule।

৬ · PyTorch দিয়ে আধুনিক রূপ

PyTorch-এ একই perceptron — মাত্র কয়েক লাইনে। nn.Linear হলো ওজন ও bias-এর container, এটি pre-built।

Python · PyTorch
import torch
import torch.nn as nn

# একটি perceptron — 2 ইনপুট, 1 আউটপুট
neuron = nn.Linear(in_features=2, out_features=1)

# input ভেক্টর (batch=1)
x = torch.tensor([[1.0, 1.0]])

# forward pass
z = neuron(x)
y = (z >= 0).float()  # step activation

print("ওজন:", neuron.weight)
print("bias:", neuron.bias)
print("z =", z.item())
print("y =", y.item())

    
nn.Linear(2, 1) মানে — ২টি ইনপুট, ১টি আউটপুট। ভেতরে ২টি ওজন + ১টি bias। আধুনিক DL-এর প্রতিটি neuron এই Linear layer-এর উপর গড়া।

৭ · ইতিহাস ও সীমাবদ্ধতা

  • ১৯৫৮: Rosenblatt-এর Mark I Perceptron — ৪০০ পিক্সেলের ক্যামেরা থেকে অক্ষর চিনত। NYT-এ "ভবিষ্যতের ইলেকট্রনিক মানুষ" বলা হয়েছিল।
  • ১৯৬৯: Minsky ও Papert তাদের বই "Perceptrons"-এ দেখালেন — single perceptron XOR সমাধান করতে পারে না।
  • প্রথম AI Winter (১৯৭৪-১৯৮০): এই সমালোচনার পর neural network research-এ funding বন্ধ।
  • ১৯৮৬: Multi-layer perceptron + backpropagation-এর reinvention সব বদলে দেয় — যা পরের পাঠগুলোতে।
Perceptron নিজে সীমিত — শুধু linear সমস্যা পারে। কিন্তু এটাই আধুনিক DL-এর ভিত্তি ইট। GPT-৪-ও ভেতরে কোটি কোটি perceptron-জাতীয় unit-এর সমষ্টি। তাই এই পাঠে শক্ত বুঝ — পরের সব পাঠের জন্য জরুরি।

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

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ মস্তিষ্কের জৈবিক নিউরনের সাথে perceptron-এর কী মিল ও কী অমিল? এই metaphor কতটুকু সঠিক, কতটুকু বিভ্রান্তিকর?

এই প্রশ্নটি AI-এর philosophy-র কেন্দ্রে। "Brain-inspired" শব্দটা প্রায়ই overstated।

মিল (যা সত্যিই inspire করেছিল):

  • একাধিক ইনপুট, একটি আউটপুট: জৈবিক নিউরন dendrite-এ অনেক সংকেত পায়, axon-এ একটি পাঠায়।
  • Threshold behavior: জৈবিক নিউরন সংকেত যোগ করে — একটা electrical threshold (~ -55 mV) পেরোলেই fire করে। Perceptron-এর step function এই idea-র mathematical version।
  • Synaptic strength = ওজন: মস্তিষ্কে synapse-গুলো দুর্বল বা শক্তিশালী হতে পারে। শেখা = synapse adjustment। Perceptron-এর ওজনও তাই।

অমিল (যা গভীর ও গুরুত্বপূর্ণ):

  • Action potential continuous না: জৈবিক নিউরন spike train পাঠায় — সময়-নির্ভর ০ বা ১। Perceptron continuous সংখ্যা।
  • Learning rule সম্পূর্ণ ভিন্ন: মস্তিষ্ক gradient descent করে না। STDP (spike-timing-dependent plasticity), Hebbian rules — সম্পূর্ণ আলাদা।
  • জৈবিক নিউরন অসংখ্য জটিল: ৩০+ ধরনের নিউরন, neurotransmitter-এর বিচিত্রতা, glial cells, neuromodulation — এর কিছুই ANN-এ নেই।
  • Energy efficiency: মস্তিষ্ক ২০ watt-এ চলে। GPT-৪ training-এ মেগাওয়াট লাগে।
  • Backprop জৈবিকভাবে অসম্ভব: Backpropagation-এর জন্য দরকার ওজনের symmetric path — মস্তিষ্কে এমন কাঠামো নেই।

Metaphor কতটুকু সঠিক?

  • "নিউরাল নেটওয়ার্ক" = "মস্তিষ্কের simulation" — এটা marketing হাইপ। বাস্তবে এটি একটি function approximator যার গাণিতিক structure মস্তিষ্কের আসল mechanism থেকে বহু দূরে।
  • Yann LeCun, Geoffrey Hinton-রাও স্বীকার করেন — DL শব্দ "neural" বরং historic accident।
  • Neuroscience গবেষণায় ANN-এর সাহায্য আছে — কিন্তু একটি ANN সঠিকভাবে মস্তিষ্ক বুঝায় না।

মূল উপলব্ধি: Inspiration ছিল মস্তিষ্ক, কিন্তু DL এখন স্বাধীন ক্ষেত্র। মেটাফর-এ আটকে না থেকে — গণিতই deep learning বুঝতে যথেষ্ট।

প্র ০২ OR ও NAND গেট-এর জন্য $w_1, w_2, b$ কী হতে পারে? AND/OR/NAND সব সম্ভব হলেও XOR কেন একটি perceptron দিয়ে অসম্ভব?

এই প্রশ্নই Minsky-Papert-এর বিখ্যাত সমালোচনার সারমর্ম — এবং multi-layer-এর প্রয়োজনীয়তার বীজ।

সমাধানগুলো:

  • OR: $w_1 = 1, w_2 = 1, b = -0.5$ — যেকোনো একটি ১ হলেই $z \geq 0$, আউটপুট ১।
  • NAND: $w_1 = -1, w_2 = -1, b = 1.5$ — শুধু (১,১)-তে $z = -0.5 < 0$, আউটপুট ০। বাকি সব ১।
  • NOT: $w_1 = -1, b = 0.5$ — single-input perceptron।

কেন এগুলো সম্ভব?

  • একটি perceptron হলো একটি linear separator — ২-D-তে একটি সরল রেখা যা space-কে দু'ভাগে ভাগ করে।
  • AND-এ — (১,১) point একদিকে, বাকি তিন point আরেকদিকে। একটি রেখা টানলেই হয়।
  • OR-এ — (০,০) একদিকে, বাকি তিনটি অন্যদিকে। আবার সম্ভব।

XOR-এ কী ঘটে?

  • Truth table: (০,০)→০, (০,১)→১, (১,০)→১, (১,১)→০।
  • Plot করলে — ০ ক্লাসের point দু'টি (০,০) ও (১,১) — diagonal-এ। ১ ক্লাসের point (০,১) ও (১,০) — অন্য diagonal-এ।
  • একটি সরল রেখা দিয়ে এদের ভাগ করা অসম্ভব। যা perceptron-এর গাণিতিক ক্ষমতার বাইরে।

প্রমাণ (sketch):

  • ধরা যাক $w_1 \cdot 0 + w_2 \cdot 0 + b < 0$ ⇒ $b < 0$।
  • $w_1 \cdot 1 + w_2 \cdot 0 + b \geq 0$ ⇒ $w_1 \geq -b > 0$।
  • $w_1 \cdot 0 + w_2 \cdot 1 + b \geq 0$ ⇒ $w_2 \geq -b > 0$।
  • $w_1 \cdot 1 + w_2 \cdot 1 + b < 0$ ⇒ $w_1 + w_2 < -b$ — কিন্তু আমরা প্রমাণ করেছি $w_1 \geq -b$ এবং $w_2 \geq -b$, তাই $w_1 + w_2 \geq -2b > -b$। Contradiction।

মূল উপলব্ধি: Perceptron-এর সীমা = linear separability। বাস্তব জগতের প্রায় সব সমস্যা non-linear। এই কারণেই multi-layer ও non-linear activation দরকার — যা পরের পাঠ।

প্র ০৩ Learning rate $\eta$ কী ভূমিকা রাখে? অনেক বড় বা অনেক ছোট $\eta$-এ কী সমস্যা হয়? Perceptron training-এ সঠিক value কীভাবে বাছবেন?

Learning rate — DL-এর সবচেয়ে গুরুত্বপূর্ণ hyperparameterHyperparameterমডেলের সেই parameters যা training-এর আগে set করা হয় (learning rate, batch size, layer count) — model নিজে শিখে না। ভাল hyperparameter বাছাই = ভাল মডেল।। ভুল মান নিলে — train একদমই হবে না।

$\eta$ অনেক বড় (যেমন ১০):

  • প্রতিটি step-এ ওজন বিশাল লাফ দেয়।
  • সমাধান-এর কাছে গিয়ে — পেরিয়ে অন্যদিকে চলে যায়।
  • Oscillation বা divergence — ওজন infinity-তে স্ফীত হতে পারে।
  • Loss curve এলোমেলো — কখনো converge না।

$\eta$ অনেক ছোট (যেমন ০.০০০১):

  • প্রতিটি step অতি সামান্য।
  • হাজার হাজার epoch লাগে — যা compute-এ ব্যয়বহুল।
  • Local minimum-এ আটকে যাওয়ার ঝুঁকি বেশি।
  • Practical-এ usable নয়।

Perceptron-এর বিশেষত্ব:

  • Perceptron Convergence Theorem অনুযায়ী — যদি ডেটা linearly separable হয়, যেকোনো $\eta > 0$-এ একদিন সমাধান পাবে।
  • $\eta$ শুধু কতদ্রুত পাবে তা নির্ধারণ করে।
  • Practical-এ ০.০১ থেকে ০.১ ভাল starting point।

$\eta$ বাছাইয়ের কৌশল:

  • LR Range Test (Smith ২০১৭): ছোট থেকে বড় $\eta$-এ training run — যেখানে loss দ্রুত কমে কিন্তু diverge করেনি, তার সামান্য নিচে।
  • Grid search: [0.001, 0.01, 0.1, 1.0] try করুন।
  • Learning rate scheduler: শুরুতে বড়, পরে ছোট — Adam/AdamW automatic এটি করে।
  • Validation loss দেখা: training loss না, validation loss-এ ভিত্তি করে decide।

আধুনিক DL-এ:

  • Transformer (BERT, GPT) — $\eta$ সাধারণত ১e-৪ থেকে ৫e-৪।
  • CNN — সাধারণত ১e-৩ থেকে ১e-২।
  • Fine-tuning — মূল pretraining-এর তুলনায় ১০-১০০x ছোট।

মূল উপলব্ধি: $\eta$ একটি art + science combo। ভাল ML engineer "feel" develop করেন কোন domain-এ কী range কাজ করে। এটাই অভিজ্ঞতা।

প্র ০৪ Perceptron-এর step function-এর বদলে continuous activation (যেমন sigmoid) ব্যবহার করলে কী লাভ? কেন আজকের DL-এ step function প্রায় কখনোই ব্যবহার হয় না?

এই প্রশ্নটি modern DL-এর একটি ঐতিহাসিক turning point। উত্তরের কেন্দ্রে — differentiability।

Step function-এর সমস্যা:

  • Derivative প্রায় সর্বত্র শূন্য: step function-এর $z = 0$ ছাড়া সব জায়গায় derivative = ০। ০-এ undefined।
  • Backpropagation কাজ করে না: Gradient descent-এর জন্য দরকার gradient। Gradient = ০ মানে ওজন কখনো update হবে না।
  • Multi-layer training অসম্ভব: একটি single perceptron-এ Rosenblatt-এর rule কাজ করে (special case), কিন্তু stacked perceptrons-এ বিকল্প নেই।
  • Information loss: $z = 0.001$ ও $z = 1000$ — দু'টোই output ১। Magnitude হারায়।

Sigmoid যা সমাধান করে:

  • $\sigma(z) = 1/(1+e^{-z})$ — সর্বত্র differentiable।
  • Derivative: $\sigma'(z) = \sigma(z)(1-\sigma(z))$ — সরল ও non-zero।
  • Continuous output ০ থেকে ১ — যা probability হিসেবে interpret করা যায়।
  • Backprop possible — পুরো DL revolution-এর গাণিতিক ভিত্তি।

কিন্তু sigmoid-ও আজ অপ্রিয়:

  • Vanishing gradient: বড় $|z|$-এ derivative শূন্যের কাছে। Deep network-এ gradient প্রায় শূন্যে নামে।
  • Not zero-centered: output ০ থেকে ১, sgn ১ থেকে ০ পরিবর্তন অসম।
  • Computationally expensive: exponential calculation slow।

আজকের choice — ReLU:

  • $\text{ReLU}(z) = \max(0, z)$ — সরল, দ্রুত।
  • Positive region-এ gradient = ১ — vanishing gradient সমাধান।
  • Sparse activation — অর্ধেক neuron শূন্য, energy efficient।
  • Deep network train করা সম্ভব হলো — DL revolution-এর অপরিহার্য অংশ।

Step function কি একদমই ব্যবহার হয় না?

  • Inference-এর সময় final output-এ — class prediction-এ argmax বা threshold এক ধরনের step।
  • Spiking Neural Networks (SNN) — যেখানে biological accuracy চাই, সেখানে।
  • Quantized networks (INT8 inference) — কিছু special case।
  • কিন্তু training-এ — কখনোই না।

মূল উপলব্ধি: Activation function-এর evolution = DL-এর evolution। Step → sigmoid → ReLU → GELU/Swish — প্রতিটি ধাপ নতুন capability খুলেছে। পরবর্তী পাঠ L04-এ এই journey বিস্তারিত।

অনুশীলন

  1. হিসাব করুন: একটি perceptron-এর $w_1 = 0.5, w_2 = -0.3, b = 0.1$।
    • $\mathbf{x} = (2, 1)$ ইনপুটের জন্য $z$ ও $y$ কত?
    • $\mathbf{x} = (-1, 4)$ ইনপুটের জন্য $z$ ও $y$ কত?
    • $z = 0.5 \times 2 + (-0.3) \times 1 + 0.1 = 1 - 0.3 + 0.1 = 0.8$, $z \geq 0$ তাই $y = 1$।
    • $z = 0.5 \times (-1) + (-0.3) \times 4 + 0.1 = -0.5 - 1.2 + 0.1 = -1.6$, $z < 0$ তাই $y = 0$।
  2. NumPy-তে চেষ্টা: উপরের NumPy কোডটি OR গেটের জন্য পরিবর্তন করুন। একই কোড — শুধু target $y = [0, 1, 1, 1]$।
    X = np.array([[0,0],[0,1],[1,0],[1,1]])
    y = np.array([0, 1, 1, 1])  # OR
    # বাকি কোড একই
    # শেষে w1 ≈ w2 ≈ 0.1+, b ≈ -0.05 আশা করুন
  3. ভাবুন: একটি email spam classifier তৈরিতে — ৩টি input ও তাদের ওজন কী হতে পারে?

    উদাহরণ:

    • $x_1$ = "ফ্রি" শব্দের সংখ্যা, $w_1 = 1.5$ (positive — spam indicator)
    • $x_2$ = sender পরিচিত? (0/1), $w_2 = -2.0$ (পরিচিত হলে spam কম)
    • $x_3$ = লিংকের সংখ্যা, $w_3 = 0.8$ (অনেক লিংক spammy)
    • $b = -1.0$ (default — spam নয়)

    বাস্তবে — production spam filter-এ হাজার হাজার feature ও deep network। কিন্তু idea একই।

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

কোড রানার কাজ না করলে? ব্রাউজারে কাজ না করলে Google Colab ব্যবহার করুন — Google-এর ফ্রি অনলাইন Python পরিবেশ, শুধু Gmail অ্যাকাউন্ট লাগে।
কোর্স হোম
ডিপ লার্নিং — ৪০টি পাঠের তালিকা