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

Neuron আর perceptron — linear unit থেকে XOR-এর সমস্যা

Neurons and the Perceptron — Geometry, the Convergence Theorem, Pocket, Sigmoid and Softmax Units, and the XOR Problem

Taught in Bangla, this lesson treats the neuron geometrically: why the weight vector is normal to the boundary and how signed distance works. It runs the perceptron rule, checks Novikoff's (R/γ)² bound against actual mistake counts, shows cycling and the pocket fix on non-separable data, compares perceptron, hinge and log loss, and codes a sigmoid neuron whose gradient descent matches scikit-learn, all in in-page Python with NumPy. It ends with XOR and the hidden-layer answer.

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

  • একটি linear neuron-এর জ্যামিতি: w কেন সীমানার লম্ব, চিহ্নসহ দূরত্ব আর margin
  • ±১ label-এ perceptron নিয়ম হাতে, আর convergence theorem-এর তিন লাইনের প্রমাণ ও সংখ্যায় যাচাই
  • আলাদা করা যায় না এমন ডেটায় perceptron-এর চক্র, pocket আর averaged perceptron
  • Perceptron, hinge আর log loss-এর সম্পর্ক; sigmoid neuron (logistic regression) আর softmax neuron নিজে train করা
  • Multi-class perceptron, XOR-এর গভীর কারণ, Cover-এর গণনা আর feature map বনাম hidden layer

এই পর্ব AI-এর ভিত্তি কোর্সের পর্ব ৬৮-এর ওপর দাঁড়ানো, যেখানে একটি neuron-এর forward হিসাব, শূন্য ওজন থেকে AND শেখা, XOR-এর চার লাইনের অসম্ভবতা আর হাতে বসানো hidden layer দেখানো হয়েছে। সেগুলো আর পুনরাবৃত্তি করব না। এখানে প্রশ্ন গভীর: perceptron কেন থামে, কতগুলো ভুলের পর থামে, না থামলে কী করবেন, আর logistic regression ও softmax-এর সঙ্গে তার আত্মীয়তা কোথায়। Sigmoid আর log loss-এর মূল কথা AI-এর ভিত্তি কোর্সের পর্ব ৫৯-এ, maximum margin মেশিন লার্নিং কোর্সের পর্ব ২৭-এ আর hinge loss পর্ব ২৮-এ। চালানো যায় এমন চারটি ব্লক পাতাতেই চলে (ব্রাউজারের Python, NumPy 2.4, scikit-learn 1.8.0); scikit-learn প্রথমবার নামতে প্রায় ১০ সেকেন্ড লাগে।

১ · Neuron-কে জ্যামিতির চোখে — w কেন সীমানার লম্ব

একটি artificial neuron হিসাব করে z = w·x + b, যেখানে w হলো weight-এর vector আর b হলো bias. Classification-এ সিদ্ধান্ত z-এর চিহ্নে: ধনাত্মক হলে এক শ্রেণি, ঋণাত্মক হলে অন্যটি। তাই z = ০ সেটটিই decision boundary; দুই feature-এ একটি সরল রেখা, d feature-এ একটি সমতল (hyperplane).

দুটি সুবিধাজনক রীতি পুরো পর্বে ব্যবহার করব। প্রথমত, label হবে y ∈ {−১, +১}, ০/১ নয়। তাহলে “ঠিক দিকে আছে” কথাটি একটি শর্তে লেখা যায়: y·z > ০. এই গুণফল m = y·z-কে বলে বিন্দুটির functional margin. দ্বিতীয়ত, x-এর শেষে একটি ১ জুড়ে x̃ = (x, 1) আর w̃ = (w, b) লিখলে z = w̃·x̃; bias তখন আর আলাদা কিছু নয়, শুধু আরেকটি weight. পরীক্ষায় এই “augmented” রূপটি প্রায়ই আসে।

বান্দরবানের পাহাড়ি মানচিত্রে সমোচ্চ রেখা (contour) আঁকা থাকে: একটি রেখার ওপর সব জায়গার উচ্চতা সমান। সবচেয়ে খাড়া চড়াই সবসময় সেই রেখার লম্ব দিকে। Neuron-এর z যেন উচ্চতা, decision boundary হলো z = ০-এর সমোচ্চ রেখা, আর w হলো সবচেয়ে খাড়া চড়াইয়ের দিক। রেখা বরাবর হাঁটলে উচ্চতা বদলায় না; w-এর দিকে হাঁটলে সবচেয়ে দ্রুত বাড়ে।

Decision boundary, তার normal vector w আর চিহ্নসহ দূরত্ব

3x₁ + 4x₂ − 12 = 0 · w = (3, 4) · distance = z / ‖w‖

w হলো সীমানার লম্ব, আর দূরত্ব = z / ‖w‖ A (4, 0) B (0, 3) P (4, 3): z = 12 O: z = −12 w = (3, 4) 12/5 = 2.4 z > 0 (+1) z < 0 (−1) 3x₁ + 4x₂ − 12 = 0 x₁x₂
ছবি ২.১ — রেখা বরাবর z বদলায় না, w-এর দিকে সবচেয়ে দ্রুত বাড়ে; তাই w রেখার লম্ব।

দাবিটি ছোট একটি হিসাবে প্রমাণ হয়। নিচের stepper একটি নির্দিষ্ট রেখায় সেটি দেখায়, তারপর দূরত্বের সূত্র।

রেখা: 3x₁ + 4x₂ − 12 = 0 · ‖w‖ = √(9 + 16) = 5
ধাপ
হিসাব
ফল
  1. রেখার দুটি বিন্দু। A = (৪, ০) আর B = (০, ৩) দুটিতেই z = ০, তাই দুটিই সীমানার ওপর।
  2. রেখার দিক। রেখা বরাবর চলার দিক d = B − A = (−৪, ৩). রেখার যেকোনো দুই বিন্দুর পার্থক্য এই দিকের কোনো গুণিতক।
  3. Dot product শূন্য। w·d = −১২ + ১২ = ০. সাধারণভাবে: z(A) = z(B) = ০ হলে w·A + b = w·B + b, তাই w·(B − A) = ০. অর্থাৎ w রেখার প্রতিটি দিকের সঙ্গে লম্ব; এটিই normal vector.
  4. w-এর দিকে এক পা। A থেকে ০.২w সরলে z বাড়ে ০.২ × ‖w‖² = ০.২ × ২৫ = ৫. সাধারণভাবে z-এর gradient ঠিক w, তাই z সবচেয়ে দ্রুত বাড়ে w-এর দিকেই।
  5. চিহ্নসহ দূরত্ব। P = (৪, ৩)-এ z = ১২, তাই দূরত্ব ১২/৫ = ২.৪, w যেদিকে দেখায় সেই পাশে। মূলবিন্দুতে z = −১২, দূরত্ব −২.৪, উল্টো পাশে। এটিই signed distance (w·x + b)/‖w‖.
  6. দ্বিগুণ করলে। w আর b দুটিকেই ২ দিয়ে গুণ করলে একই রেখা, z দ্বিগুণ (২৪), কিন্তু ‖w‖-ও দ্বিগুণ (১০), তাই দূরত্ব একই ২.৪. এ কারণেই margin মাপতে ‖w‖ দিয়ে ভাগ করতে হয়; শুধু z-এর মান দেখে আত্মবিশ্বাস মাপা যায় না।

সব training বিন্দুর মধ্যে সবচেয়ে ছোট চিহ্নসহ দূরত্ব, min yi(w·xi + b)/‖w‖, হলো সেই রেখার geometric margin. এটি ধনাত্মক মানে সব বিন্দু ঠিক দিকে; তখন ডেটা linearly separable. সম্ভাব্য সব রেখার মধ্যে যার margin সবচেয়ে বড়, সেটিই SVM-এর রেখা (মেশিন লার্নিং কোর্সের পর্ব ২৭)।

২ · Perceptron নিয়ম ±১ রূপে — একটি update হাতে

±১ label আর augmented রূপে perceptron-এর পুরো নিয়ম এক লাইনের:

যদি y·(w̃·x̃) ≤ 0 হয়, তবে w̃ ← w̃ + y·x̃

AI-এর ভিত্তি কোর্সের পর্ব ৬৮-এর w ← w + η(t − out)x নিয়মের সঙ্গে এটি একই; সেখানে t − out হয় +১ বা −১, যা এখানে y. দুটি সূক্ষ্ম বিষয় পরীক্ষায় আসে। এক, “≤” চিহ্ন: ঠিক সীমানায় থাকা বিন্দুকেও (m = ০) ভুল ধরা হয়, নইলে শূন্য weight থেকে শুরু করলে কিছুই বদলাত না। দুই, শূন্য থেকে শুরু করলে learning rate η-এর মান সিদ্ধান্ত বদলায় না: প্রতিটি w̃ কেবল η দিয়ে গুণ হয়ে যায়, আর চিহ্ন একই থাকে।

Update কেন সাহায্য করে? ভুল বিন্দুর নতুন margin হয় y·(w̃ + yx̃)·x̃ = y·(w̃·x̃) + ‖x̃‖², কারণ y² = ১. অর্থাৎ প্রতিবার margin ঠিক ‖x̃‖² বাড়ে। কিন্তু এক বিন্দুকে ঠিক করতে গিয়ে অন্য বিন্দু নষ্ট হতে পারে, নিচে দেখুন।

x₁ = মাসে অর্ডার, x₂ = গড় বাস্কেট (হাজার টাকা) · x̃ = (x₁, x₂, 1)
ধাপ
হিসাব
ফল
  1. শুরু। বর্তমান weight w̃ = (১, ১, −৪), সীমানা x1 + x2 = ৪. একজন গ্রাহক মাসে ২টি অর্ডার দেন, গড় বাস্কেট ১ হাজার টাকা, আর premium membership নিয়েছেন (y = +১)।
  2. z হিসাব। z = ২ + ১ − ৪ = −১. Neuron বলছে “নেবেন না”।
  3. ভুল কি না। m = y·z = −১ ≤ ০, তাই ভুল, update হবে।
  4. Update. y = +১, তাই x̃ যোগ: w̃ = (৩, ২, −৩). নতুন সীমানা 3x1 + 2x2 = ৩; w ঘুরে এই গ্রাহকের দিকে হেলেছে।
  5. নতুন margin. z = ৬ + ২ − ৩ = ৫, অর্থাৎ m = −১ + ‖x̃‖² = −১ + ৬ = ৫. এই গ্রাহক এখন ঠিক দিকে, বেশ দূরে।
  6. পার্শ্বপ্রতিক্রিয়া। আরেক গ্রাহক (১, ০.৫), যিনি নেননি (y = −১), আগে z = −২.৫ পেয়ে ঠিক ছিলেন; নতুন weight-এ z = +১, এখন ভুল। তাই এক epoch-এ সব ঠিক হয় না, বারবার ডেটা ঘুরতে হয়। থামবে কি না, সেই প্রশ্নের উত্তর পরের অংশে।

৩ · Convergence theorem — Novikoff-এর (R/γ)² সীমা

Rosenblatt নিজে perceptron থামার একটি প্রমাণ দিয়েছিলেন; যে পরিষ্কার রূপটি আজ পাঠ্যবইয়ে চলে, তার জন্য সাধারণত Albert Novikoff-এর ১৯৬২ সালের একটি symposium-প্রবন্ধ উদ্ধৃত হয় (একই সময়ে H. D. Block-ও একটি প্রমাণ দেন বলে উল্লেখ পাওয়া যায়)। উপপাদ্যটি এরকম:

উপপাদ্য

ধরুন একটি একক দৈর্ঘ্যের vector u আছে (‖u‖ = ১), যার জন্য প্রতিটি বিন্দুতে yi(u·x̃i) ≥ γ > ০ (ডেটা margin γ নিয়ে আলাদা), আর প্রতিটি ‖x̃i‖ ≤ R. তাহলে শূন্য থেকে শুরু করা perceptron, ডেটা যে ক্রমেই আসুক, মোট k ≤ (R/γ)² বারের বেশি ভুল করে না।

প্রমাণ তিন লাইনের, আর পরীক্ষায় প্রায়ই চাওয়া হয়। k-তম ভুলের পর weight wk:

  • u-এর দিকে অগ্রগতি: wk·u = wk−1·u + y(x̃·u) ≥ wk−1·u + γ. শূন্য থেকে শুরু, তাই wk·u ≥ kγ.
  • দৈর্ঘ্যের বৃদ্ধি সীমিত: ‖wk‖² = ‖wk−1‖² + 2y(wk−1·x̃) + ‖x̃‖². মাঝের পদ ≤ ০, কারণ ভুল হয়েছিল বলেই update. তাই ‖wk‖² ≤ kR².
  • জোড়া দেওয়া: Cauchy–Schwarz অসমতায় wk·u ≤ ‖wk‖. সুতরাং kγ ≤ √k·R, অর্থাৎ k ≤ (R/γ)².

লক্ষ করুন, সীমায় feature-এর সংখ্যা d বা বিন্দুর সংখ্যা N নেই; আছে শুধু ডেটার “আকার” R আর “ফাঁক” γ. আবার সীমাটি বলে না perceptron কোন রেখায় থামবে; মেশিন লার্নিং কোর্সের পর্ব ২৭-এ দেখা গেছে, ক্রম বদলালে থামার রেখা আর তার margin বদলায়।

এবার সংখ্যায় যাচাই। ডেটা: বাজারঘরের ৪০ জন কাল্পনিক গ্রাহক, seed দিয়ে বানানো। x1 = মাসে অর্ডার (০–৮), x2 = গড় বাস্কেট (হাজার টাকা, ০–৪), y = +১ যদি premium membership নেন। একটি লুকানো রেখার দুই পাশে একটু ফাঁক রেখে বিন্দু বাছা হয়েছে, তাই ডেটা আলাদা করা যায়। প্রথম তিনটি ব্লক এই module থেকে ডেটা নেয়।

# bazar_customers.py — বাজারঘরের কাল্পনিক গ্রাহক (seed দিয়ে বানানো)
import numpy as np

def make_customers(n=40, flip=0.0, seed=7):
    """x1 = মাসে অর্ডার, x2 = গড় বাস্কেট (হাজার টাকা); y = +1 premium নেন, -1 নেন না"""
    rng = np.random.default_rng(seed)
    X, y = [], []
    while len(y) < n:
        x = rng.uniform([0, 0], [8, 4])
        s = 0.5 * x[0] + 1.0 * x[1] - 4.0          # লুকানো আসল নিয়ম
        if abs(s) < 0.5 and flip == 0:            # পরিষ্কার ফাঁক রাখা
            continue
        X.append(x); y.append(1 if s > 0 else -1)
    X, y = np.round(np.array(X), 2), np.array(y)
    k = int(flip * n)                             # কিছু label উল্টে দেওয়া
    if k:
        idx = rng.choice(n, k, replace=False)
        y[idx] = -y[idx]
    return X, y

নিচের ব্লক perceptron-কে পাঁচটি আলাদা ক্রমে ভুল-শূন্য না হওয়া পর্যন্ত চালায় আর মোট ভুল গোনে। γ নেওয়া হয় maximum-margin (SVM) রেখা থেকে, augmented জগতে মেপে: উপপাদ্য যেকোনো আলাদা-করা u-এর জন্য খাটে, আর SVM-এর রেখা একটি ভালো u. ছবিতে perceptron-এর রেখা, SVM-এর রেখা আর বেগুনি তির হিসেবে w-এর দিক।

import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from bazar_customers import make_customers
X, y = make_customers()                       # ৪০ জন গ্রাহক, আলাদা করা যায়
Xa = np.c_[X, np.ones(len(y))]                # x̃ = (x1, x2, 1): bias এখন একটি weight

def perceptron(order):
    w, mistakes = np.zeros(3), 0
    while True:                               # ভুল-শূন্য epoch না আসা পর্যন্ত
        changed = False
        for i in order:
            if y[i] * (w @ Xa[i]) <= 0:       # ভুল দিকে বা ঠিক সীমানায়
                w, mistakes, changed = w + y[i] * Xa[i], mistakes + 1, True
        if not changed:
            return w, mistakes
svm = SVC(kernel="linear", C=1e6).fit(X, y)   # maximum-margin রেখা
u = np.r_[svm.coef_[0], svm.intercept_[0]]
gamma = (y * (Xa @ u)).min() / np.linalg.norm(u)   # x̃-এর জগতে margin
R = np.linalg.norm(Xa, axis=1).max()
print(f"R = {R:.3f}, gamma = {gamma:.4f}, bound (R/gamma)^2 = {(R/gamma)**2:.0f}")
rng = np.random.default_rng(0)
for k in range(5):                            # ৫টি আলাদা ক্রম
    w, m = perceptron(rng.permutation(len(y)) if k else range(len(y)))
    print(f"order {k}: mistakes = {m:3d}, w = {np.round(w, 2)}")
w, _ = perceptron(range(len(y)))
gx = np.linspace(0, 8, 2)
plt.scatter(*X[y > 0].T, marker="^", c="tab:red", label="premium (+1)")
plt.scatter(*X[y < 0].T, c="tab:blue", label="no (-1)")
plt.plot(gx, -(w[0] * gx + w[2]) / w[1], "k", label="perceptron")
plt.plot(gx, -(u[0] * gx + u[2]) / u[1], "g--", label="max margin")
p = -w[2] * w[:2] / (w[:2] @ w[:2])           # রেখার ওপর একটি বিন্দু, সেখান থেকে w-এর তির
plt.arrow(*p, *(w[:2] / np.linalg.norm(w[:2])), width=0.03, color="purple")
plt.gca().set_aspect("equal"); plt.ylim(0, 5.4); plt.legend(fontsize=7, ncol=2, loc="upper left")
plt.xlabel("orders per month"); plt.ylabel("avg basket (thousand taka)")

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

R = 8.626, gamma = 0.1553, bound (R/gamma)^2 = 3087
order 0: mistakes = 105, w = [  3.48   7.49 -29.  ]
order 1: mistakes =  31, w = [  1.2    3.21 -11.  ]
order 2: mistakes =  61, w = [  2.82   4.81 -19.  ]
order 3: mistakes =  67, w = [  3.41   6.72 -23.  ]
order 4: mistakes =  35, w = [  2.08   2.45 -13.  ]

সীমা খাটে, কিন্তু ঢিলা। পাঁচটি ক্রমেই perceptron থেমেছে, ভুল ৩১ থেকে ১০৫টি, সীমা ৩০৮৭-এর অনেক নিচে। উপপাদ্য সবচেয়ে খারাপ ক্রমের নিশ্চয়তা দেয়, সাধারণ ক্রমের পূর্বাভাস নয়। ক্রম বদলালে ভুলের সংখ্যা তিন গুণের বেশি বদলায়, আর শেষ w-ও আলাদা।

γ এত ছোট কেন? SVM-এর রেখার সাধারণ geometric margin প্রায় ০.৫৭ (আলাদা হিসাবে মাপা), কিন্তু augmented জগতে bias-ও ‖u‖-এ ঢোকে, আর এখানে b ≈ −৬.২ বড়। ফলে γ নেমে ০.১৫৫, আর R-ও বড় (৮.৬২৬), কারণ বিন্দুগুলো মূলবিন্দু থেকে দূরে। ডেটা মাঝখানে আনলে (centering) দুটোই বদলায়; অনুশীলন ৪-এ সেটি করবেন। ছবিতে বেগুনি তির কালো রেখার লম্ব, premium গ্রাহকদের দিকে: ঠিক অংশ ১-এর জ্যামিতি।

৪ · ডেটা আলাদা না হলে — চক্র, pocket আর গড়

বাস্তব ডেটায় কিছু label ভুল থাকে, কিছু গ্রাহক নিয়ম মানেন না। তখন কোনো রেখাই সব বিন্দু ঠিক ভাগ করে না, আর perceptron-এর উপপাদ্যের শর্ত ভাঙে। নিয়মটি তখন কখনো থামে না; weight একটি সীমিত এলাকায় ঘুরতে থাকে (এই “cycling” ফলটি Minsky–Papert-এর বইয়ে আর ১৯৭০-এর দিকে Block ও Levin-এর কাজে আলোচিত বলে জানা যায়)। শেষ epoch-এর weight তাই অনেকটা লটারি।

দুটি সহজ সমাধান। Pocket algorithm (Stephen Gallant, ১৯৯০): চলতে চলতে প্রতিবার পুরো ডেটায় ভুল গুনে এখন পর্যন্ত সেরা weight “পকেটে” রাখা। Averaged perceptron: প্রতিটি ধাপের weight যোগ করে গড় নেওয়া; Yoav Freund আর Robert Schapire ১৯৯৯ সালে এর ভোটভিত্তিক রূপ বিশ্লেষণ করেন, আর Michael Collins ২০০২ সালে NLP-র tagging-এ এর একটি structured রূপ জনপ্রিয় করেন। নিচের ব্লকে ৬০ জন গ্রাহক, যার ১০% (৬ জনের) label উল্টে দেওয়া, ৪০ epoch.

import numpy as np
import matplotlib.pyplot as plt
from bazar_customers import make_customers

X, y = make_customers(n=60, flip=0.1, seed=3)   # ৬টি label উল্টানো: আলাদা করা যায় না
Xa = np.c_[X - X.mean(0), np.ones(len(y))]       # মাঝখানে আনা + bias-এর 1
errors = lambda w: int((y * (Xa @ w) <= 0).sum())

rng = np.random.default_rng(1)
w, avg = np.zeros(3), np.zeros(3)
pocket_w, pocket_err = w.copy(), errors(w)
history, best = [], []
for epoch in range(40):
    for i in rng.permutation(len(y)):
        if y[i] * (w @ Xa[i]) <= 0:
            w = w + y[i] * Xa[i]
            e = errors(w)                        # নতুন w পুরো ডেটায় কত ভুল
            if e < pocket_err:                   # ভালো হলে পকেটে রাখি
                pocket_w, pocket_err = w.copy(), e
        avg += w                                 # averaged perceptron-এর যোগফল
    history.append(errors(w)); best.append(pocket_err)

print("শেষ ১০ epoch-এ সাধারণ perceptron-এর ভুল:", history[-10:])
print("সাধারণ perceptron: সর্বনিম্ন", min(history), "সর্বোচ্চ", max(history),
      "| শেষ w-এর ভুল", history[-1])
print("averaged perceptron-এর ভুল:", errors(avg))
print("pocket-এর ভুল:", pocket_err, "of", len(y), "| w =", np.round(pocket_w, 2))
plt.plot(history, label="plain perceptron (end of epoch)")
plt.plot(best, label="pocket (best so far)", lw=2.5)
plt.xlabel("epoch"); plt.ylabel("training mistakes"); plt.legend()

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

শেষ ১০ epoch-এ সাধারণ perceptron-এর ভুল: [32, 18, 15, 12, 21, 15, 15, 35, 15, 16]
সাধারণ perceptron: সর্বনিম্ন 8 সর্বোচ্চ 35 | শেষ w-এর ভুল 16
averaged perceptron-এর ভুল: 11
pocket-এর ভুল: 6 of 60 | w = [1.47 2.96 0.  ]

সাধারণ perceptron-এর epoch-শেষের ভুল ৮ থেকে ৩৫-এর মধ্যে লাফায়; শেষ w-এ ১৬টি ভুল, কিন্তু অন্য দিন এক epoch কম-বেশি চালালে ১২ বা ৩৫ হতে পারত। Averaged perceptron-এর ১১টি ভুল অনেক স্থির। Pocket পৌঁছেছে ৬টিতে, যা উল্টে দেওয়া label-এর সংখ্যার সমান: পকেটের রেখা আসল লুকানো নিয়মের কাছাকাছি। ছবিতে pocket-এর রেখা সিঁড়ির মতো শুধু নামে (ভুল কখনো বাড়ে না), আর সাধারণ perceptron-এর রেখা দোলে।

একটি সতর্কতা: এখানে ভুল গোনা হয়েছে training ডেটাতেই। বাস্তবে pocket-এর “সেরা” বাছাই একটি আলাদা validation অংশে করা উচিত, নইলে ভুল label-এর সঙ্গে খাপ খাওয়ানো রেখাকেও “সেরা” মনে হতে পারে।

আরও গভীরে: সবচেয়ে কম ভুলের রেখা খোঁজা (০-১ loss সরাসরি কমানো) সাধারণভাবে NP-hard বলে প্রমাণিত, তাই pocket একটি heuristic, গ্যারান্টি নয়। Freund আর Schapire দেখান, voted perceptron-এর generalisation-এর সীমাও ভুলের সংখ্যা আর margin দিয়ে লেখা যায়, যা SVM-এর তত্ত্বের কাছাকাছি। আর perceptron শুধু dot product ব্যবহার করে বলে x·z-এর জায়গায় kernel বসিয়ে “kernel perceptron” বানানো যায়; এর ধারণা Aizerman, Braverman আর Rozonoer-এর ১৯৬৪ সালের potential function পদ্ধতিতে পাওয়া যায় (মেশিন লার্নিং কোর্সের পর্ব ২৯)।

৫ · Perceptron, hinge আর log loss — একই পরিবারের তিনটি loss

আসলে আমরা যা চাই, তা হলো কম ভুল: ০-১ loss, ভুলে ১, ঠিকে ০. কিন্তু এর ঢাল প্রায় সবখানে শূন্য, তাই gradient কোনো দিক দেখায় না। সমাধান একটি surrogate loss: margin m = y·z-এর একটি মসৃণ বা অন্তত ঢালু function. তিনটি পরিচিত বিকল্প:

  • Perceptron loss max(0, −m): ভুল দিকে থাকলেই শাস্তি। একটি উদাহরণে এর ওপর SGD (η = ১) চালালে update হয় w̃ ← w̃ + yx̃, শুধু m ≤ ০ হলে: হুবহু perceptron নিয়ম।
  • Hinge loss max(0, 1 − m): ঠিক দিকে থাকলেও margin ১-এর কম হলে শাস্তি। L2 শাস্তির সঙ্গে এটিই soft-margin SVM (মেশিন লার্নিং কোর্সের পর্ব ২৮)।
  • Log loss log(1 + e−m): কখনো পুরো শূন্য নয়; ঠিক দিকে দূরে গেলে খুব ছোট। এটিই logistic regression-এর loss, ±১ label-এ লেখা।
margin m = y·z−2−100.512
০-১ loss111000
perceptron max(0, −m)210000
hinge max(0, 1 − m)3210.500
log loss log(1 + e−m)2.12691.31330.69310.47410.31330.1269
log loss-এর টান σ(−m)0.88080.73110.50.37750.26890.1192

শেষ সারিটি গুরুত্বপূর্ণ। প্রতিটি loss-এর gradient হলো −(টান)·y·x̃; perceptron-এ টান ১ শুধু m ≤ ০ হলে, hinge-এ ১ শুধু m < ১ হলে, আর log loss-এ টান σ(−m), যা কখনো শূন্য নয়। তাই logistic regression সব বিন্দুর কথা শোনে, ভুলগুলোর কথা বেশি জোরে। Perceptron loss-এর একটি অদ্ভুত দিকও আছে: w̃ = ০-তে সব m = ০, loss শূন্য, অর্থাৎ “কিছু না শেখা”-ই এর সর্বনিম্ন বিন্দু। Perceptron কাজ করে কারণ নিয়মটি m = ০-কেও ভুল ধরে update করে; একটি loss হিসেবে এটি একা দাঁড়ায় না। Hinge-এর “১” ঠিক এই ফাঁকটি বন্ধ করে।

৬ · Sigmoid neuron মানেই logistic regression — gradient descent নিজে লেখা

Neuron-এর activation যদি sigmoid σ(z) = 1/(1 + e−z) হয় আর loss হয় log loss, তাহলে neuron আর logistic regression একই জিনিস। ০/১ label t আর p = σ(z) ধরলে, chain rule-এ (AI-এর ভিত্তি কোর্সের পর্ব ৩৪) ঢালটি দাঁড়ায় খুব সরল রূপে:

∂L/∂w̃ = (p − t)·x̃, গড় নিলে ∇L = X̃ᵀ(p − t)/N

Perceptron-এর update (t − out)·x̃-এর সঙ্গে মিলিয়ে দেখুন: আকার একই, পার্থক্য শুধু out-এর জায়গায় p. Perceptron শক্ত ০/১ উত্তর দেয় আর শুধু ভুলে নড়ে; sigmoid neuron নরম সম্ভাবনা দেয় আর প্রতিটি বিন্দুতে তার ভুলের মাপ অনুযায়ী নড়ে। এই ধারাবাহিকতাই পরের পর্বগুলোতে বহুস্তরের network-এ chain rule চালানো সম্ভব করে। নিচের ব্লক আগের ব্লকের একই ডেটায় gradient descent নিজে লেখে, scikit-learn-এর সঙ্গে মেলায়, আর pocket-এর রেখার সঙ্গে তিনটি loss পাশাপাশি দেখায়।

import numpy as np
from sklearn.linear_model import LogisticRegression
from bazar_customers import make_customers

X, y = make_customers(n=60, flip=0.1, seed=3)   # আগের ব্লকের একই ডেটা
Xc = X - X.mean(0)
Xa = np.c_[Xc, np.ones(len(y))]
t = (y + 1) // 2                                 # label 0/1, sigmoid-এর জন্য
sigmoid = lambda z: 1 / (1 + np.exp(-z))

w, eta = np.zeros(3), 0.5
for step in range(2001):
    p = sigmoid(Xa @ w)                          # সব গ্রাহকের সম্ভাবনা
    if step in (0, 10, 100, 500, 2000):
        loss = -np.mean(t * np.log(p) + (1 - t) * np.log(1 - p))
        print(f"step {step:4d}: log loss {loss:.4f}, w = {np.round(w, 3)}")
    w -= eta * Xa.T @ (p - t) / len(t)           # gradient: (p − t)·x-এর গড়

sk = LogisticRegression(C=1e10).fit(Xc, y)       # প্রায় শাস্তিহীন, তুলনার জন্য
print("scikit-learn:", np.round(np.r_[sk.coef_[0], sk.intercept_], 3))
pocket = np.array([1.47, 2.96, 0.0])             # আগের ব্লকের pocket-এর w
for name, v in [("sigmoid neuron", w), ("pocket perceptron", pocket)]:
    m = y * (Xa @ v)                             # প্রতিটি বিন্দুর margin y·z
    print(f"{name:17s} ভুল {int((m <= 0).sum())}/60 | মোট loss:"
          f" perceptron {np.maximum(0, -m).mean():.3f},"
          f" hinge {np.maximum(0, 1 - m).mean():.3f},"
          f" log {np.logaddexp(0, -m).mean():.3f}")

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

step    0: log loss 0.6931, w = [0. 0. 0.]
step   10: log loss 0.4691, w = [0.532 0.687 0.269]
step  100: log loss 0.4399, w = [0.72  1.331 0.584]
step  500: log loss 0.4399, w = [0.724 1.342 0.59 ]
step 2000: log loss 0.4399, w = [0.724 1.342 0.59 ]
scikit-learn: [0.724 1.342 0.59 ]
sigmoid neuron    ভুল 12/60 | মোট loss: perceptron 0.184, hinge 0.497, log 0.440
pocket perceptron ভুল 6/60 | মোট loss: perceptron 0.420, hinge 0.646, log 0.578

শূন্য weight-এ loss ০.৬৯৩১ = ln ২, অর্থাৎ সবার জন্য সম্ভাবনা ০.৫. ১০০ ধাপেই loss ০.৪৩৯৯-এ পৌঁছায়, ৫০০ ধাপে w-ও থিতু হয়, আর আমাদের w তিন দশমিক পর্যন্ত scikit-learn-এর সমান। Log loss convex (মেশিন লার্নিং কোর্সের পর্ব ১২), তাই একটিই সর্বনিম্ন বিন্দু।

মজার উল্টো ফল: sigmoid neuron-এর ভুল ১২টি, pocket-এর ৬টি। Logistic regression ভুলের সংখ্যা নয়, log loss কমায়; ভুল label-এর ছয় গ্রাহক তাকে নিজেদের দিকে টানে। তবু তার log loss কম (০.৪৪০ বনাম ০.৫৭৮), অর্থাৎ সম্ভাবনা হিসেবে সে ভালো। কোন model “ভালো”, তা নির্ভর করে আপনি কী মাপছেন। আরেকটি সাবধানতা: perceptron আর hinge loss w-এর মাপে বদলায় (w দ্বিগুণ করলে perceptron loss দ্বিগুণ), তাই দুই model-এর এই দুটি সংখ্যা সরাসরি তুলনীয় নয়।

Rosenblatt-এর প্রায় একই সময়ে, ১৯৬০ সালে Stanford-এ Bernard Widrow আর Ted Hoff তৈরি করেন ADALINE. এটির output-এ step থাকলেও শেখা হতো threshold-এর আগের linear মানের squared error কমিয়ে, ছোট ছোট gradient ধাপে (LMS বা Widrow–Hoff নিয়ম)। ভুল না হলেও শেখা, ভুলের মাপ অনুযায়ী শেখা: আজকের gradient-ভিত্তিক training-এর একটি পূর্বসূরি হিসেবে এটি প্রায়ই উল্লেখ করা হয়।

৭ · অনেক শ্রেণি — multi-class perceptron আর softmax neuron

বাজারঘর গ্রাহকদের তিন দলে ভাগ করতে চায়: বাজেট, নিয়মিত আর প্রিমিয়াম। এটি multiclass classification. মেশিন লার্নিং কোর্সের পর্ব ২৫-এ one-vs-rest দেখেছেন, যেখানে তিনটি আলাদা binary model. এখানে একটি model-ই সব শ্রেণি দেখে:

  • Multi-class perceptron: প্রতিটি শ্রেণি c-এর জন্য একটি weight সারি Wc; অনুমান ŷ = argmaxc Wc·x̃. ভুল হলে Wy ← Wy + x̃ (ঠিক শ্রেণিকে কাছে টানা) আর Wŷ ← Wŷ − x̃ (ভুল করে বাছা শ্রেণিকে দূরে ঠেলা)। এর পেছনে একটি সুন্দর কৌশল আছে (পাঠ্যবইয়ে প্রায়ই Kesler-এর construction নামে): K শ্রেণির সমস্যাকে একটি বড় binary perceptron-এ লেখা যায়, তাই আলাদা করা যায় এমন ডেটায় একই ধরনের ভুলের সীমা খাটে।
  • Softmax neuron: প্রতিটি শ্রেণির score zc = Wc·x̃, তারপর softmax দিয়ে সম্ভাবনা pc = ezc/∑j ezj, আর loss cross-entropy. Gradient আবার একই আকারের: (P − Y)ᵀ-এর সঙ্গে x̃, যেখানে Y হলো one-hot label. দুই শ্রেণিতে softmax হুবহু sigmoid. P − Y-এর পুরো derivation পর্ব ০৪ (Backpropagation হাতে-কলমে)-এ আসবে।

দুটির সম্পর্ক binary ক্ষেত্রের মতোই: multi-class perceptron শুধু সবচেয়ে বড় score দেখে আর ভুলে নড়ে; softmax সব score থেকে নরম সম্ভাবনা বানায়, প্রতিটি উদাহরণে নড়ে। নিচের ব্লকে দুটিকে তিন দলের ৯০ জন গ্রাহকে চালানো হয়েছে, আর শেষে একই softmax trainer (K = ২) XOR-এর চারটি বিন্দুতে, প্রথমে শুধু x1, x2 দিয়ে, তারপর x1x2 যোগ করে। শেষ লাইনের ফলের ব্যাখ্যা অংশ ৮-এ।

import numpy as np

rng = np.random.default_rng(5)                   # বাজারঘরের ৩ ধরনের গ্রাহক
centers = np.array([[1.5, 0.8], [4.0, 1.5], [6.0, 3.2]])   # বাজেট, নিয়মিত, প্রিমিয়াম
X = np.vstack([c + rng.normal(0, 0.6, (30, 2)) for c in centers])
y = np.repeat(np.arange(3), 30)
Xa = np.c_[X - X.mean(0), np.ones(len(y))]

W = np.zeros((3, 3))                             # প্রতি শ্রেণির জন্য একটি weight সারি
for epoch in range(20):
    for i in rng.permutation(len(y)):
        guess = np.argmax(W @ Xa[i])
        if guess != y[i]:                        # ভুল: ঠিক শ্রেণি কাছে, ভুলটি দূরে
            W[y[i]] += Xa[i]; W[guess] -= Xa[i]
print("multi-class perceptron: ভুল", int((np.argmax(Xa @ W.T, 1) != y).sum()), "of 90")

def softmax_fit(F, labels, K, steps=3000, eta=0.5):
    V, Y = np.zeros((F.shape[1], K)), np.eye(K)[labels]
    for _ in range(steps):
        Z = F @ V
        P = np.exp(Z - Z.max(1, keepdims=True)); P /= P.sum(1, keepdims=True)
        V -= eta * F.T @ (P - Y) / len(F)        # cross-entropy-র gradient: P − Y
    return P
P = softmax_fit(Xa, y, 3)
j = P.max(1).argmin()                            # সবচেয়ে দ্বিধার গ্রাহক
print("softmax neuron: ভুল", int((P.argmax(1) != y).sum()), "of 90 | গ্রাহক", j,
      X[j].round(2), "আসল", y[j], "সম্ভাবনা", P[j].round(3))

S = np.array([[-1, -1], [-1, 1], [1, -1], [1, 1]])  # XOR, ±1 রূপে
t = np.array([0, 1, 1, 0])
for name, F in [("x1, x2", np.c_[S, np.ones(4)]),
                ("x1, x2, x1*x2", np.c_[S, S[:, 0] * S[:, 1], np.ones(4)])]:
    p = softmax_fit(F, t, 2)[:, 1]
    print(f"features [{name}]: P(XOR=1) = {np.round(p, 3)}")

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

multi-class perceptron: ভুল 1 of 90
softmax neuron: ভুল 1 of 90 | গ্রাহক 47 [2.9  1.38] আসল 1 সম্ভাবনা [0.435 0.565 0.   ]
features [x1, x2]: P(XOR=1) = [0.5 0.5 0.5 0.5]
features [x1, x2, x1*x2]: P(XOR=1) = [0. 1. 1. 0.]

তিন দলে দুই model-ই ৯০-এ ১টি ভুল করে; দলগুলো প্রায় আলাদা, তবে কিনারায় কিছু মিশে আছে। Softmax একটি বাড়তি জিনিস দেয়: দ্বিধা। গ্রাহক ৪৭ (মাসে ২.৯টি অর্ডার, বাস্কেট ১.৩৮ হাজার) “নিয়মিত” দলের, আর model তাঁকে নিয়মিত ০.৫৬৫, বাজেট ০.৪৩৫ দিয়েছে: সীমানার একদম কাছে। Perceptron এই তথ্য দিতে পারে না।

XOR-এ শুধু x1, x2 দিয়ে চারটি বিন্দুতেই ঠিক ০.৫: model কিছুই শেখেনি। x1x2 যোগ করলেই চারটি সম্ভাবনা ০ বা ১-এর কাছে (তিন দশমিকে)। প্রথম ফলটি কেন ঠিক ০.৫, পরের অংশ তা দেখায়।

৮ · XOR, Minsky–Papert আর দুটি পথ — feature map বনাম hidden layer

AI-এর ভিত্তি কোর্সের পর্ব ৬৮-এ ০/১ রূপে চারটি অসমতা যোগ করে XOR-এর অসম্ভবতা দেখানো হয়েছে। ±১ রূপে একই সত্যটি আরও গভীর একটি কারণে দাঁড়ায়, যা উপরের ০.৫-এরও ব্যাখ্যা:

z = w₁x₁ + w₂x₂ + b · y = +1 যখন x₁ ≠ x₂
ধাপ
হিসাব
ফল
  1. চারটি বিন্দু। ±১ রূপে XOR: দুই input আলাদা হলে y = +১. এক দলের দুটি বিন্দু বর্গের কোণাকুণি, অন্য দলের দুটি অন্য কোণাকুণিতে।
  2. +১ দলের z যোগ। যেকোনো w1, w2, b নিন। (1, −1) আর (−1, 1)-এর z যোগ করলে w-এর পদগুলো কেটে যায়, থাকে 2b. দুটিই ধনাত্মক হতে হলে যোগফলও ধনাত্মক, তাই b ধনাত্মক।
  3. −১ দলের z যোগ। (1, 1) আর (−1, −1)-এ আবার যোগফল 2b. দুটিই ঋণাত্মক হতে হলে b ঋণাত্মক।
  4. দ্বন্দ্ব। b একসঙ্গে ধনাত্মক আর ঋণাত্মক হতে পারে না। গভীর কারণ: দুই দলের গড় একই বিন্দু (০, ০), আর linear function-এর গড় মানে গড় বিন্দুর মান। তাই যেকোনো রেখা দুই দলকে গড়ে একই z দেয়। Softmax neuron ঠিক এই কারণে আটকে ছিল: শূন্য weight-এ gradient ∑(p − t)x̃ শূন্য, তাই প্রথম ধাপেই থেমে সবাইকে ০.৫ দেয়।
  5. নতুন feature. x3 = x1x2 যোগ করি। +১ দলে x3 = −১, −১ দলে +১. এখন দুই দলের গড় আর এক নয়।
  6. একটি সমতলই যথেষ্ট। z = −x3 নিলে +১ দলে z = ১, −১ দলে z = −১: তিন মাত্রায় সরল সমতল। মূল সমতলে সীমানা x1x2 = ০, অর্থাৎ দুটি অক্ষ, যা মোটেও একটি সরল রেখা নয়। এটিই feature map-এর জাদু।

XOR কতটা ব্যতিক্রম? Thomas Cover ১৯৬৫ সালে গুনে দেখান, d-মাত্রায় “সাধারণ অবস্থানের” N বিন্দুর ২N রকম label-এর মধ্যে কতগুলো একটি সমতলে আলাদা করা যায় (Cover-এর theorem). Bias-সহ দুই input মানে d = ৩, আর চারটি কোণে সূত্র দেয় ১৬-এর মধ্যে ১৪; বাকি দুটি ঠিক XOR আর তার উল্টো। আমাদের একটি scratch হিসাবে (scipy-র linprog দিয়ে প্রতিটি label-সমষ্টির জন্য আলাদা-করা রেখা খুঁজে) ঠিক এই ১৪ এসেছে, আর তিন input-এর ২৫৬টি Boolean function-এর মধ্যে ১০৪টি। ফলটির শিক্ষা: বিন্দু বাড়লে linear model-এর পক্ষে আলাদা করা সম্ভব এমন label-এর ভাগ দ্রুত কমে, আর মাত্রা বাড়ালে বাড়ে। Feature map ঠিক এই কাজটি করে।

Minsky আর Papert আসলে কী দেখান। তাঁদের ১৯৬৯ সালের বই Perceptrons শুধু XOR নয়; তাঁরা perceptron-এর input-এ বসা “স্থানীয়” feature-গুলোর “order” (একটি feature কতগুলো pixel একসঙ্গে দেখে) নিয়ে প্রমাণ দেন। যেমন n টি input-এর parity (একের সংখ্যা জোড় না বিজোড়; দুই input-এ এটিই XOR) বুঝতে অন্তত একটি feature-কে সব n টি input একসঙ্গে দেখতে হয়, আর ছবির “সংযুক্ত কি না” ধরনের বৈশিষ্ট্যও সীমিত order-এ ধরা যায় না। অর্থাৎ সমস্যা ছিল feature-এ: ঠিক feature দিলে এক স্তরই যথেষ্ট, কিন্তু সেই feature কে দেবে? বইটির ঐতিহাসিক প্রভাব নিয়ে মতভেদ আছে; সেই বিতর্ক AI-এর ভিত্তি কোর্সের পর্ব ২ আর পর্ব ৬৮-এ।

দুটি পথ। প্রথম পথ: মানুষ feature বানায়, বা kernel দিয়ে অসীম মাত্রার feature-এ অন্তর্নিহিতভাবে যায় (মেশিন লার্নিং কোর্সের পর্ব ২৯)। দ্বিতীয় পথ: একটি hidden layer feature map-টি নিজেই ডেটা থেকে শেখে; XOR-এর জন্য কয়েকটি ReLU unit-ই x1x2-এর কাজ করতে পারে। Deep learning দ্বিতীয় পথ, আর পর্ব ০৩ (NumPy-তে multilayer perceptron) সেটি vectorised রূপে লিখবে; পর্ব ০৬ (Network কী শিখতে পারে) দেখাবে এই পথের তাত্ত্বিক ক্ষমতা আর সীমা।

পরীক্ষা ও ইন্টারভিউতে:

  • w কেন সীমানার লম্ব? সীমানার দুই বিন্দু A, B-তে z সমান, তাই w·(B − A) = ০.
  • Novikoff-এর সীমা আর তার প্রমাণ? k ≤ (R/γ)²; w·u ≥ kγ, ‖w‖² ≤ kR², Cauchy–Schwarz.
  • R = ৪, γ = ০.৫ হলে সর্বোচ্চ ভুল? (৪/০.৫)² = ৬৪.
  • Perceptron আর logistic regression-এর update-এর পার্থক্য? (t − out)x বনাম (t − p)x: শক্ত উত্তরে শুধু ভুলে বনাম নরম সম্ভাবনায় প্রতিটি বিন্দুতে।
  • XOR-এ এক স্তর কেন ব্যর্থ, সমাধান কী? দুই দলের গড় একই, তাই কোনো রেখা নেই; x1x2 feature বা একটি hidden layer.

৯ · জীবন্ত নিউরনের সঙ্গে তুলনা — মিল কোথায়, সীমা কোথায়

“Neuron” নামটি জীববিজ্ঞান থেকে ধার করা। McCulloch আর Pitts (১৯৪৩)-এর যুক্তির একক আর Rosenblatt-এর perceptron দুটিই মস্তিষ্ক থেকে অনুপ্রাণিত। তুলনাটি কোথায় খাটে আর কোথায় খাটে না, সংক্ষেপে:

বিষয়জীবন্ত নিউরনকৃত্রিম neuron
সংকেতবৈদ্যুতিক spike, সময়ের ধারা গুরুত্বপূর্ণএকটি বাস্তব সংখ্যা, সময় নেই
Input জোড়াDendrite-এ নিজস্ব non-linear হিসাব হতে পারেশুধু weighted sum
শেখাSynapse-এর শক্তি বদলায়; পুরো নিয়ম এখনো গবেষণার বিষয়Gradient বা perceptron নিয়মে weight বদল
ধরনবহু ধরনের নিউরন, রাসায়নিক নিয়ন্ত্রণসাধারণত একই রকম unit-এর স্তর

সবচেয়ে চমকপ্রদ পার্থক্যটি XOR-এর সঙ্গেই জড়িত। ২০২০ সালে Science-এ Albert Gidon ও সহকর্মীরা মানুষের cortex-এর কিছু নিউরনের dendrite-এ এক ধরনের বৈদ্যুতিক সংকেত বর্ণনা করেন, যা মাঝারি input-এ সবচেয়ে জোরালো আর বেশি input-এ দুর্বল হয়; লেখকদের মতে এর ফলে একটি নিউরনের অংশ XOR-ধরনের হিসাব করতে পারে। ২০২১ সালে Neuron পত্রিকায় Beniaguev, Segev আর London একটি বিস্তারিত নিউরন-model-এর আচরণ নকল করতে কয়েক স্তরের একটি deep network দরকার বলে রিপোর্ট করেন। দুটিই সক্রিয় গবেষণা, শেষ কথা নয়। কিন্তু শিক্ষাটি পরিষ্কার: “একটি কৃত্রিম neuron = একটি জীবন্ত নিউরন” ধরে নেওয়া ভুল; একটি জীবন্ত নিউরন সম্ভবত অনেক বেশি কিছু করে। তাই এই কোর্সে neuron মানে একটি গাণিতিক unit, মস্তিষ্কের দাবি নয়।

১০ · AI-এর যুগে — AI-এর লেখা perceptron আর neuron কোড যাচাই

“একটি perceptron লিখে দাও” বললে AI সাধারণত চলার মতো কোড দেয়। ভুল থাকে ছোট জায়গায়, যা আউটপুট দেখে ধরা কঠিন:

AI-এর ভুলযা ঘটেকীভাবে ধরবেন
শর্তে < 0, <= 0 নয়শূন্য weight থেকে কিছুই শেখে নাপ্রথম epoch-এ update-এর সংখ্যা গুনুন
০/১ label-এ w += y*xy = ০ হলে ভুলে কোনো update নেইlabel-এর মান আর নিয়মের রূপ মিলিয়ে দেখুন
Bias বাদ বা আলাদা update ভুলে যাওয়ারেখা মূলবিন্দু দিয়ে যেতে বাধ্যশেষ w-এ bias-এর মান দেখুন
Non-separable ডেটায় “converged” দাবিশেষ epoch-এর লটারির weightপ্রতি epoch-এর ভুল আঁকুন, pocket বা গড় নিন
Sigmoid-এ np.log(p) সরাসরিp = ০ হলে অসীম lossnp.logaddexp বা clip
Novikoff বা Minsky–Papert নিয়ে বানানো উদ্ধৃতিভুল বছর, ভুল দাবিমূল উৎস বা নির্ভরযোগ্য পাঠ্যবই

AI-কে কোড লিখতে বলার চেয়ে নিজের কোড যাচাই করাতে বলা বেশি কাজের। প্রশ্নে label-এর রূপ, ডেটার আকার আর যা মিলিয়ে দেখতে চান, তা স্পষ্ট বলুন:

নিচে NumPy-তে লেখা আমার perceptron কোড। Label y ∈ {−1, +1}, bias আমি x-এর শেষে 1 জুড়ে weight হিসেবে রেখেছি। [এখানে কোড পেস্ট করুন] ১. update-এর শর্ত আর রূপ ঠিক আছে কি না যাচাই করো, বিশেষ করে ঠিক সীমানায় (y·z = 0) থাকা বিন্দুর ক্ষেত্রে। ২. একটি ৪ বিন্দুর ছোট উদাহরণ নিয়ে প্রথম দুটি update হাতে হিসাব করে দেখাও, যাতে আমি কোডের আউটপুটের সঙ্গে মেলাতে পারি। ৩. ডেটা আলাদা করা না গেলে এই কোড কী করবে বলো, আর নতুন কোনো library ফাংশন বানিয়ে দিও না; যা ব্যবহার করবে তার নাম আর NumPy version বলো।

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

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

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

প্র ০১১৯৫৮ সালের perceptron-কে ঘিরে যে প্রচার হয়েছিল, তার সঙ্গে আজকের AI-প্রচারের মিল কোথায়, আর একজন প্রকৌশলী কী শিখতে পারেন?

Rosenblatt-এর perceptron শুধু একটি সূত্র ছিল না; Cornell Aeronautical Laboratory-তে Mark I Perceptron নামে একটি যন্ত্রও তৈরি হয়, যাতে ২০ × ২০ = ৪০০টি আলো-সংবেদী কোষ ক্যামেরার মতো ছবি নিত আর weight হিসেবে মোটরচালিত potentiometer ব্যবহার হতো বলে বর্ণনা পাওয়া যায়। প্রকল্পটির অর্থায়ন করে মার্কিন নৌবাহিনীর Office of Naval Research.

১৯৫৮ সালের জুলাইয়ে একটি সংবাদ সম্মেলনের পর New York Times-এ প্রকাশিত প্রতিবেদনে বলা হয়, নৌবাহিনী আশা করছে যন্ত্রটির উত্তরসূরি একদিন হাঁটতে, কথা বলতে, দেখতে, লিখতে, নিজের প্রতিলিপি বানাতে আর নিজের অস্তিত্ব সম্পর্কে সচেতন হতে পারবে। এই উদ্ধৃতি আজও প্রায়ই AI-প্রচারের প্রথম উদাহরণ হিসেবে দেখানো হয়। সে সময়ের যন্ত্র আসলে সরল আকৃতি আলাদা করতে শিখত।

মিলটি স্পষ্ট: একটি সত্যিকারের, সীমিত সাফল্য থেকে সাধারণ বুদ্ধিমত্তার ভবিষ্যদ্বাণী। Novikoff-এর উপপাদ্য যা নিশ্চিত করে, তা হলো আলাদা করা যায় এমন ডেটায় সীমিত ভুলে থামা; কোন সমস্যা আলাদা করা যায়, সে প্রশ্নের উত্তর উপপাদ্য দেয় না। Minsky আর Papert-এর গণিত ঠিক সেই ফাঁকটি দেখায়।

প্রকৌশলীর জন্য শিক্ষা তিনটি। এক, একটি demo একটি উপপাদ্য নয়; কোন শর্তে কাজ করে, তা লিখে রাখুন। দুই, সীমা জানাই শক্তি: XOR-এর ব্যর্থতা থেকেই hidden layer আর feature শেখার প্রশ্ন এসেছে। তিন, আজকের বড় language model-এর ক্ষমতা নিয়ে দাবি পড়ার সময়ও একই প্রশ্ন করুন: কোন ডেটায়, কোন মাপকাঠিতে, কতবার চালিয়ে?

মূল উপলব্ধি: প্রচার আর গণিতের মাঝে ফাঁক নতুন নয়; শর্ত আর সীমা স্পষ্ট করে বলাই পেশাদারিত্ব।

প্র ০২Novikoff-এর সীমায় feature-এর সংখ্যা নেই। এটি এত গুরুত্বপূর্ণ কেন, আর এর সীমাবদ্ধতা কোথায়?

(R/γ)² সীমায় আছে শুধু ডেটার ব্যাসার্ধ R আর margin γ. Feature দুটি হোক বা দশ লাখ, margin বড় থাকলে ভুল কম। এটি একটি বড় ধারণার বীজ: জটিলতা মাত্রায় নয়, margin-এ। এ কারণেই অনেক উঁচু মাত্রার feature map-এও linear classifier শেখা সম্ভব, যদি ডেটা বড় ফাঁক রেখে আলাদা হয়।

এই চিন্তার দুটি ঐতিহাসিক শাখা আছে। Aizerman, Braverman আর Rozonoer ১৯৬৪ সালে perceptron-কে শুধু dot product দিয়ে লিখে আজকের kernel ধারণার পূর্বসূরি দেন; উঁচু মাত্রায় কাজ করেও খরচ মাত্রার ওপর নির্ভর করে না। আর Freund ও Schapire ১৯৯৯ সালে দেখান, voted বা averaged perceptron-এর ভুলের সীমা থেকে নতুন ডেটায় ভুলের একটি সীমাও পাওয়া যায়; SVM-এর maximum margin-এর তত্ত্বের সঙ্গে এর মিল আছে।

সীমাবদ্ধতাও স্পষ্ট। প্রথমত, এটি সবচেয়ে খারাপ ক্রমের সীমা; বাজারঘরের ৪০ জন গ্রাহকে সীমা ৩০৮৭ কিন্তু আসল ভুল ৩১ থেকে ১০৫, অর্থাৎ ৩০ গুণের বেশি ঢিলা। দ্বিতীয়ত, R আর γ মাপের ওপর নির্ভর করে: bias-কে weight বানালে মূলবিন্দু থেকে দূরের ডেটায় R বাড়ে আর γ কমে; মাঝখানে আনলে সীমা অনেক কমে। তৃতীয়ত, ডেটা আলাদা না হলে γ-ই নেই, আর উপপাদ্য কিছু বলে না। চতুর্থত, এটি training-এর ভুল গোনে; নতুন ডেটায় কেমন করবে, তার জন্য আলাদা যুক্তি লাগে।

Deep learning-এও margin-এর ধারণা ফিরে এসেছে: বড় network-এর generalisation বোঝাতে কিছু গবেষণা margin-ভিত্তিক সীমা ব্যবহার করে, যদিও সেগুলো এখনো ঢিলা বলে সমালোচিত।

মূল উপলব্ধি: একটি তাত্ত্বিক সীমা প্রশ্ন করার ভাষা দেয়, সঠিক সংখ্যা নয়; তাই সীমা আর মাপা ফল সবসময় পাশাপাশি দেখুন।

প্র ০৩Perceptron-এর শক্ত step-এর বদলে deep learning sigmoid আর cross-entropy-র পথে গেল কেন? Hinge loss কি তাহলে হেরে গেছে?

মূল কারণ বহুস্তরের network. একস্তরে perceptron নিয়ম কাজ করে, কারণ ভুল হলে কোন weight কোন দিকে নড়বে, তা সরাসরি জানা। কিন্তু মাঝে hidden layer থাকলে প্রশ্ন ওঠে: শেষের ভুলের দায় ভেতরের কোন weight-এর? Chain rule দিয়ে এই দায় ভাগ করতে প্রতিটি স্তরের derivative লাগে, আর step function-এর derivative প্রায় সবখানে শূন্য। ১৯৮৬ সালে Rumelhart, Hinton আর Williams-এর পরিচিত প্রবন্ধে backpropagation জনপ্রিয় হয় মসৃণ sigmoid unit দিয়েই।

দ্বিতীয় কারণ সম্ভাবনা। Sigmoid আর softmax-এর output-কে সম্ভাবনা হিসেবে পড়া যায়, আর cross-entropy maximum likelihood-এর সমান (মেশিন লার্নিং কোর্সের পর্ব ১৮)। বাজারঘরের তিন দলের উদাহরণে softmax বলেছে গ্রাহক ৪৭-এর ক্ষেত্রে model দ্বিধায়; perceptron তা বলতে পারে না। ভাষা model-এর পরের শব্দ বাছাইয়ের মতো কাজে এই সম্ভাবনাই মূল জিনিস।

তবে গল্পটি “মসৃণ জিতেছে” নয়। Widrow আর Hoff ১৯৬০ সালেই gradient-ভিত্তিক শেখা দেখিয়েছিলেন। আর আজকের সবচেয়ে প্রচলিত activation ReLU, max(0, z), নিজেই hinge-এর মতো ভাঙা রেখা, শূন্যে derivative নেই; বাস্তবে সেখানে একটি subgradient বেছে নিলেই চলে। Hinge loss-ও হারায়নি: margin-ভিত্তিক loss face recognition-এর মতো metric learning আর কিছু ranking কাজে নানা রূপে ব্যবহৃত হয়। আর আমাদের run দেখিয়েছে, ভুলের সংখ্যায় pocket (৬টি) logistic-কে (১২টি) হারাতে পারে।

মূল উপলব্ধি: loss বাছাই একটি প্রকৌশল সিদ্ধান্ত: train করা যায় কি না, সম্ভাবনা দরকার কি না, আর শেষে আপনি আসলে কী মাপবেন।

প্র ০৪XOR সমাধানের দুটি পথ: মানুষের বানানো feature (বা kernel) আর network-এর শেখা feature. ইতিহাসে কে কখন এগিয়েছে, আর বাজারঘরের মতো প্রকল্পে আজ কোনটি বাছবেন?

Feature map-এর পথ পুরোনো আর গাণিতিকভাবে পরিষ্কার। Cover-এর ১৯৬৫ সালের গণনা দেখায়, মাত্রা বাড়ালে আলাদা করা যায় এমন label-এর ভাগ বাড়ে। ১৯৯০-এর দশকে SVM আর kernel পদ্ধতি এই চিন্তায় ভর করে বহু কাজে neural network-কে পিছনে ফেলে: convex সমস্যা, একটিই সমাধান, শক্ত তত্ত্ব। হাতে লেখা অঙ্ক চেনা, লেখা শ্রেণিবিন্যাস আর bioinformatics-এর মতো কাজে সে সময় এগুলো খুব জনপ্রিয় ছিল বলে জানা যায়।

শেখা feature-এর পথ জিততে শুরু করে যখন ডেটা আর গণনা দুটোই অনেক বেড়ে যায়। ২০১২ সালে ImageNet প্রতিযোগিতায় AlexNet-এর বড় ব্যবধানের সাফল্য প্রায়ই মোড় ঘোরানো মুহূর্ত হিসেবে বলা হয়। ছবি, শব্দ আর ভাষায় কাঁচা ডেটার গঠন জটিল; মানুষের পক্ষে সব দরকারি feature লেখা কঠিন, আর hidden layer স্তরে স্তরে সেগুলো শিখতে পারে। Kernel পদ্ধতির খরচও ডেটার সংখ্যার সঙ্গে দ্রুত বাড়ে।

কিন্তু এটি সব ক্ষেত্রে সত্য নয়। কয়েক হাজার সারির tabular ডেটায় ভালো হাতে-বানানো feature আর gradient boosting প্রায়ই সমান বা ভালো ফল দেয় বলে কয়েকটি তুলনামূলক গবেষণায় দেখা গেছে (মেশিন লার্নিং কোর্সের পর্ব ৩৮)। বাজারঘরে মাসে অর্ডার আর বাস্কেটের মতো কয়েকটি কলাম হলে আগে logistic regression আর একটি gradient boosting baseline; বাংলা review বা পণ্যের ছবি হলে শেখা feature-এর পথ, এই কোর্সের মূল বিষয়।

আরেকটি সূক্ষ্মতা: দুই পথ পুরো আলাদা নয়। খুব চওড়া network কিছু অবস্থায় একটি নির্দিষ্ট kernel-এর মতো আচরণ করে বলে তাত্ত্বিক কাজ আছে, যার আলোচনা পর্ব ০৬-এর প্রসঙ্গে আসবে।

মূল উপলব্ধি: প্রশ্ন “কোন পথ সেরা” নয়; প্রশ্ন হলো ডেটার গঠন কে ভালো জানে: আপনি, না network.

প্র ০৫গবেষণা বলছে একটি জীবন্ত নিউরনের অংশও XOR-ধরনের হিসাব করতে পারে। তাহলে “neural network মস্তিষ্কের মতো” দাবিটি কি আরও শক্ত হলো, না দুর্বল?

বরং দুর্বল হলো, অন্তত সরল রূপে। ১৯৪৩ সালে McCulloch আর Pitts নিউরনকে একটি threshold-এর যুক্তি-একক ধরেছিলেন, আর perceptron সেই ছবি নিয়েই এক স্তরে XOR পারে না। ২০২০ সালে Gidon ও সহকর্মীরা মানুষের cortex-এর দ্বিতীয়-তৃতীয় স্তরের কিছু নিউরনে এমন dendrite-সংকেত বর্ণনা করেন যার শক্তি একটি মাঝারি input-এ সবচেয়ে বেশি আর বেশি input-এ কমে; লেখকদের ব্যাখ্যায়, এমন সংকেত দিয়ে একটি নিউরনের অংশই XOR-এর মতো non-monotone হিসাব করতে পারে, যা আমাদের এক-স্তরের unit পারে না।

২০২১ সালে Beniaguev, Segev আর London একটি বিস্তারিত cortical নিউরন-model-এর input থেকে output নকল করতে কয়েক স্তরের temporal convolutional network লাগে বলে রিপোর্ট করেন; dendrite-এর একটি বিশেষ receptor বাদ দিলে অনেক সরল network-ই যথেষ্ট হয়েছিল। ব্যাখ্যাটি সাবধানে পড়া দরকার: এটি একটি simulation-model নিয়ে, আর ফল নির্ভর করে কোন model আর কতটা নির্ভুলতা চাওয়া হয়েছে তার ওপর।

এর অর্থ দুই দিকে। একদিকে, “একটি কৃত্রিম neuron একটি জীবন্ত নিউরনের সমান” ধরে মস্তিষ্কের নিউরনের সংখ্যার সঙ্গে network-এর unit তুলনা করা বিভ্রান্তিকর। অন্যদিকে, deep learning-এর সাফল্য মস্তিষ্কের নকল হওয়ার ওপর নির্ভর করেনি; gradient, ডেটা আর গণনাই মূল চালিকা। Neuroscience আর AI-এর মাঝে ধারণার আদান-প্রদান চলছে, কিন্তু কোনোটি অন্যটির প্রমাণ নয়।

মূল উপলব্ধি: “neural” শব্দটি একটি ঐতিহাসিক অনুপ্রেরণা; model কী পারে, তা বিচার করুন তার গণিত আর পরীক্ষা দিয়ে, নামের মিল দিয়ে নয়।

অনুশীলন

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

  1. হাতে হিসাব (সংখ্যার প্রশ্ন): w̃ = (2, −1, 0) থেকে শুরু। পরপর দুই গ্রাহক আসেন: (ক) x = (1, 3), y = +১; (খ) x = (2, 1), y = −১. প্রতিটিতে update হবে কি না বলুন আর নতুন w̃ লিখুন। শেষে (1, 3)-এর চিহ্নসহ দূরত্ব কত? আর যদি কোনো ডেটায় R = ৫ আর γ = ০.৫ হয়, ভুলের সর্বোচ্চ সীমা কত?

    (ক) x̃ = (1, 3, 1): z = ২ − ৩ + ০ = −১, m = −১ ≤ ০, ভুল। w̃ = (2 + 1, −1 + 3, 0 + 1) = (3, 2, 1).

    (খ) x̃ = (2, 1, 1): z = ৬ + ২ + ১ = ৯, m = (−১)(৯) = −৯, ভুল। y = −১, তাই বিয়োগ: w̃ = (3 − 2, 2 − 1, 1 − 1) = (1, 1, 0).

    শেষে (1, 3)-এ z = ১ + ৩ + ০ = ৪, ‖w‖ = √২ ≈ ১.৪১৪, দূরত্ব ৪/১.৪১৪ ≈ ২.৮৩, ঠিক দিকে। সীমা (৫/০.৫)² = ১০০টি ভুল।

  2. আউটপুট অনুমান: নিচের কোড কী ছাপবে? বিশেষ করে প্রথম লাইনটি ভাবুন।
    W = np.zeros((3, 3)); x = np.array([1., 2., 1.]); y = 2
    g = np.argmax(W @ x); print(g)
    if g != y: W[y] += x; W[g] -= x
    print(W); print(np.argmax(W @ x))

    সত্যিকারের run-এ (NumPy):

    0
    [[-1. -2. -1.]
     [ 0.  0.  0.]
     [ 1.  2.  1.]]
    2

    সব score শূন্য, আর np.argmax সমান মানের মধ্যে প্রথম index দেয়, তাই অনুমান ০. এটি ভুল (y = ২), তাই সারি ২-এ x যোগ আর সারি ০ থেকে বিয়োগ। এখন score (−৬, ০, ৬), অনুমান ২. Multi-class perceptron-এ শুরুর tie-break সবসময় শ্রেণি ০-এর দিকে ঝোঁকে; শুরুর দিকের ভুল গোনার সময় এটি মনে রাখুন।

  3. সমালোচনা ও নকশা: একজন সহকর্মী বাজারঘরের “পণ্য ফেরত আসবে কি না” ডেটায় perceptron চালিয়ে রিপোর্ট করলেন: “৫০ epoch পরে model converged, accuracy ৭১%.” Accuracy মাপা হয়েছে শেষ epoch-এর weight দিয়ে, training ডেটাতেই। এই দাবির কোথায় সমস্যা, আর আপনি কীভাবে নতুন করে নকশা করবেন?

    সমস্যা: ৭১% মানে ভুল আছে, তাই ডেটা সম্ভবত আলাদা করা যায় না; সেক্ষেত্রে perceptron থামে না, “converged” কথাটি ভুল। শেষ epoch-এর weight লটারির মতো: বাজারঘরের run-এ একই ডেটায় epoch-শেষের ভুল ৮ থেকে ৩৫-এর মধ্যে দুলেছে। Training ডেটায় মাপা accuracy নতুন ডেটার কথা বলে না, আর একটি ক্রম বা seed-এর ফল একটি ভাগ্যবান run হতে পারে। ফেরতের মতো অসম শ্রেণিতে accuracy নিজেও বিভ্রান্তিকর।

    নকশা: train/validation/test ভাগ; প্রতি epoch-এ validation-এ ভুল আঁকা; pocket বা averaged perceptron, সেরা weight validation দিয়ে বাছাই; logistic regression baseline, যা সম্ভাবনাও দেয়; কয়েকটি seed-এ গড় আর বিস্তার; precision, recall বা খরচভিত্তিক metric.

  4. কোডিং: Novikoff যাচাইয়ের ব্লকে X-কে মাঝখানে আনুন (X - X.mean(0), ছবির অংশ বাদ দিয়ে) আর আবার চালান। চালানোর আগে অনুমান করুন R, γ, সীমা আর ভুলের সংখ্যা কোন দিকে যাবে, আর কেন।

    অনুমান: মাঝখানে আনলে বিন্দুগুলো মূলবিন্দুর কাছে আসে, তাই R কমে; সীমানার bias প্রায় শূন্য হয়, তাই augmented জগতে u-এর দৈর্ঘ্যে bias-এর ভাগ কমে আর γ প্রায় সাধারণ geometric margin-এর সমান হয়। সীমা আর ভুল দুটিই কমবে।

    ডেস্কটপে একটি সত্যিকারের run (Python 3.14, NumPy 2.5.4, scikit-learn 1.8.0):

    R = 4.334, gamma = 0.5683, bound (R/gamma)^2 = 58
    order 0: mistakes =   4, w = [2.77 3.27 0.  ]
    order 1: mistakes =   2, w = [1.31 2.56 0.  ]
    order 2: mistakes =   9, w = [3.93 5.3  1.  ]
    order 3: mistakes =   9, w = [2.83 5.41 3.  ]
    order 4: mistakes =   6, w = [2.62 4.13 0.  ]

    R ৮.৬২৬ থেকে ৪.৩৩৪, γ ০.১৫৫৩ থেকে ০.৫৬৮৩, সীমা ৩০৮৭ থেকে ৫৮, আর আসল ভুল ৩১–১০৫ থেকে ২–৯. Preprocessing যে শুধু “সুবিধা” নয়, শেখার গতিও বদলায়, এটি তার পরিষ্কার উদাহরণ।

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

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

ক্রমPerceptron convergence theorem-এর প্রমাণের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. একক দৈর্ঘ্যের u ধরা, যাতে প্রতিটি বিন্দুতে y(u·x̃) ≥ γ
  2. প্রতিটি ভুলে w·u অন্তত γ বাড়ে, তাই k ভুলের পর w·u ≥ kγ
  3. প্রতিটি ভুলে ‖w‖² বড়জোর R² বাড়ে, তাই ‖w‖² ≤ kR²
  4. Cauchy–Schwarz: w·u ≤ ‖w‖
  5. জোড়া দিয়ে kγ ≤ √k·R, অর্থাৎ k ≤ (R/γ)²

সীমানা 3x1 + 4x2 − 12 = 0. নিচের কোন vector এই রেখার লম্ব?

  • (4, −3)
  • (3, 4)
  • (0, 3)
  • (1, 1)

Perceptron-এ w̃ = (1, 1, −4), আর একজন গ্রাহক x̃ = (2, 1, 1), y = +1 (শেষ ঘরটি bias-এর জন্য)। নিয়ম “y·z ≤ 0 হলে w̃ ← w̃ + y·x̃” মানলে নতুন w̃ কত?

  • (1, 1, −4), কোনো update নেই
  • (−1, 0, −5)
  • (3, 2, −3)
  • (3, 2, −4)

একটি ডেটায় প্রতিটি augmented বিন্দুর দৈর্ঘ্য বড়জোর R = 4, আর একটি একক vector u margin γ = 0.5 নিয়ে সব বিন্দু ঠিক ভাগ করে। Perceptron convergence theorem অনুযায়ী মোট ভুল সর্বোচ্চ কত?

  • 64
  • 8
  • 32
  • অসীম, কারণ বিন্দুর সংখ্যা জানা নেই

কিছু label ভুল থাকায় ডেটা linearly separable নয়। সাধারণ perceptron আর pocket algorithm-এর আচরণ সম্পর্কে কোনটি ঠিক?

  • সাধারণ perceptron শেষে সবচেয়ে কম ভুলের রেখায় থামে
  • Learning rate ছোট করলেই সাধারণ perceptron থামে
  • Pocket সবসময় সবচেয়ে কম ভুলের রেখা খুঁজে পায় বলে প্রমাণিত
  • সাধারণ perceptron দুলতে থাকে, pocket এ পর্যন্ত সেরা weight রেখে দেয়

Sigmoid activation আর log loss-এর একটি neuron (০/১ label t, p = σ(z), z = w̃·x̃)। একটি উদাহরণে loss-এর w̃-এর সাপেক্ষে gradient কোনটি?

  • (t − out)·x̃, যেখানে out = step(z)
  • (p − t)·x̃
  • (p − t)·p(1 − p)·x̃
  • ঠিক দিকে থাকলে সবসময় শূন্য

±1 রূপে XOR: (1, −1) আর (−1, 1) এক দল, (1, 1) আর (−1, −1) অন্য দল। কোনো linear z = w₁x₁ + w₂x₂ + b কেন এদের আলাদা করতে পারে না?

  • কারণ bias নেই; bias যোগ করলেই পারবে
  • কারণ বিন্দু খুব কম, ডেটা বাড়ালেই পারবে
  • কারণ দুই দলের গড় একই বিন্দু, তাই যেকোনো linear function দুই দলে গড়ে একই মান দেয়
  • কারণ step function ব্যবহার হয়েছে; sigmoid দিলেই পারবে

শব্দকোষ

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

মনে রাখুন

  1. w সীমানার লম্ব, আর (w·x + b)/‖w‖ চিহ্নসহ দূরত্ব; bias-কে x̃ = (x, 1) দিয়ে weight বানানো যায়।
  2. Perceptron: y·z ≤ 0 হলে w̃ ← w̃ + y·x̃; আলাদা করা যায় এমন ডেটায় ভুল ≤ (R/γ)², যা নিশ্চয়তা, পূর্বাভাস নয়।
  3. ডেটা আলাদা না হলে perceptron দোলে; pocket বা averaged perceptron, আর বাছাই validation-এ।
  4. Perceptron, hinge আর log loss একই margin-এর তিনটি surrogate; sigmoid neuron = logistic regression, gradient (p − t)·x̃; softmax-এ P − Y.
  5. XOR-এ দুই দলের গড় একই, তাই কোনো রেখা নেই; feature map বা hidden layer দরকার, আর deep learning শেখে hidden layer দিয়ে।

পরের পর্বে: পর্ব ০৩ (NumPy-তে multilayer perceptron — forward pass আর activation function). একটি neuron থেকে স্তরে স্তরে অনেক neuron, প্রতিটি tensor-এর shape-সহ, আর কোন activation কেন।

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

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