Chapter 3 of 28
Refreshing perceptrons and MLPs before going deeper
যেকোনো CNN, তা যতই গভীর বা অদ্ভুত হোক না কেন, দিনশেষে তৈরি হয় সাধারণ নিউরাল নেটওয়ার্কের সেই একই পরিচিত লেগো ব্লক বা ইট দিয়ে: একটি নিউরন যা কিছু ইনপুট গ্রহণ করে, সেগুলোকে ওয়েট দিয়ে গুণ করে, বায়াস যোগ করে এবং চূড়ান্ত ফলাফলকে একটি অ্যাক্টিভেশন ফাংশনের মধ্য দিয়ে প্রবাহিত করে। কনভোলিউশন নিয়ে গভীরভাবে কথা বলার আগে, আমরা সেই লেগো ব্লক, তা দিয়ে তৈরি হওয়া fully connected বা ডেন্স নেটওয়ার্ক এবং কীভাবে একটি ছবি আসলে কম্পিউটারে সংখ্যা আকারে রিপ্রেজেন্ট বা উপস্থাপিত হয় — সে সম্পর্কে একটি সংক্ষিপ্ত ও সরাসরি রিফ্রেশার বা রিভিশন দিয়ে নেব। কারণ এই প্রতিটি আইডিয়াই কনভোলিউশনাল লেয়ারে গিয়ে সামান্য পরিবর্তিত রূপে বারবার ফিরে আসবে।
যেখানে: হলো ইনপুটসমূহ, হলো লার্নেবল বা শিক্ষণীয় ওয়েটসমূহ, হলো বায়াস, হলো একটি নন-লিনিয়ার অ্যাক্টিভেশন ফাংশন, হলো প্রি-অ্যাক্টিভেশন (raw ওয়েটেড সাম), এবং হলো নিউরনের চূড়ান্ত আউটপুট।
সহজ কথা: নিউরনটি তার সমস্ত ইনপুটের ওপর একটি ওয়েটেড ভোটের হিসাব করে, সেই ভোটকে একটি লার্নেবল বায়াস দিয়ে শিফট বা স্থানান্তরিত করে, এবং শেষমেশ ফলাফলটিকে একটি নন-লিনিয়ার অ্যাক্টিভেশন ফাংশনে পাঠায় যা সিদ্ধান্ত নেয় নিউরনটি ঠিক কতটা শক্তিশালীভাবে (অথবা আদৌ) "সক্রিয় বা ফায়ার" হবে। এই কোর্সের প্রতিটি নেটওয়ার্কের প্রতিটি লেয়ার, তা কনভোলিউশনাল হোক বা না হোক, ঠিক এই রেসিপি মেনে চলা নিউরন দিয়েই তৈরি।

পারসেপ্ট্রন (perceptron) (Rosenblatt, 1958) হলো সবচেয়ে সহজ ও মৌলিক নিউরাল একক: এটি একটি ওয়েটেড সাম বা যোগফল ক্যালকুলেট করে এবং একটি হার্ড স্টেপ ফাংশন (hard step function) প্রয়োগ করে একটি বাইনারি সিদ্ধান্ত আউটপুট দেয়। এটি একটি চমৎকার লিনিয়ার ক্লাসিফায়ার, তবে এটি শুধুমাত্র লিনিয়ারলি সেপারেবল ডেটাই আলাদা করতে পারে — যা XOR ফাংশন শিখতে না পারার অযোগ্যতার মাধ্যমে ঐতিহাসিকভাবে প্রমাণিত হয়েছিল।
একটি MLP নিউরনের একাধিক স্তর বা লেয়ার সাজায় — একটি ইনপুট লেয়ার, এক বা একাধিক হিডেন লেয়ার এবং একটি আউটপুট লেয়ার — যেখানে এক লেয়ারের প্রতিটি নিউরন পরবর্তী লেয়ারের প্রতিটি নিউরনের সাথে সরাসরি সংযুক্ত থাকে (যাকে "fully connected" বা "dense" লেয়ার বলা হয়)। লেয়ারগুলোর মাঝখানে থাকা নন-লিনিয়ার অ্যাক্টিভেশন ফাংশনগুলো একটি MLP-কে যেকোনো জটিল, নন-লিনিয়ার ফাংশনকে অ্যাপ্রক্সিমেট বা অনুমান করার ক্ষমতা দেয়, যা Universal Approximation Theorem দ্বারা গাণিতিকভাবে প্রমাণিত।

আগের চ্যাপ্টারে যেমনটি বিস্তারিতভাবে বলা হয়েছে, সরাসরি raw পিক্সেল ইনপুটের ওপর ডেন্স কানেকশন প্রয়োগ করলে তা প্যারামিটারের অবাস্তব বিস্ফোরণ ঘটায়, ছবির স্থানিক বা স্পেশাল কাঠামো নষ্ট করে দেয় এবং কোনো ট্রান্সলেশন ইনভ্যারিয়েন্স দেয় না। CNN একই নিউরন এবং লেয়ার সাজানোর ধারণাটি বজায় রাখে ঠিকই, কিন্তু ডেন্স কানেকশনের জায়গায় লোকাল ও শেয়ারড কনভোলিউশনাল কানেকশন ব্যবহার করে — যা আমাদের এই কোর্সের মূল বিষয়বস্তু।
কনভোলিউশন কীভাবে কাজ করে তা বোঝার আগে, এটি জানা দরকার যে একটি CNN আসলে ঠিক কোন জিনিসের ওপর কনভোলিউশন অপারেশনটি চালায়।
একটি পিক্সেল (pixel বা picture element) হলো একটি ডিজিটাল ছবির সবচেয়ে ক্ষুদ্রতম একক, যা একটি নির্দিষ্ট ব্রাইটনেস বা কালার ভ্যালু ধারণ করে। একটি গ্রে-স্কেল (grayscale) ছবি হলো পিক্সেল ভ্যালুর একটি 2D ম্যাট্রিক্স (যার মান সাধারণত ০-২৫৫ পর্যন্ত হয়); আর একটি রঙিন ছবি হলো একটি 3D টেন্সর — উচ্চতা × প্রস্থ × কালার চ্যানেল।
একটি রঙিন ছবি সাধারণত তিনটি স্তুপীকৃত চ্যানেল — লাল (Red), সবুজ (Green) এবং নীল (Blue) — আকারে জমা থাকে। প্রতিটি চ্যানেল নিজেই আলোর তীব্রতার বা intensities-এর একটি সম্পূর্ণ 2D ম্যাট্রিক্স, যার মান ০ (কোনো আলো নেই) থেকে ২৫৫ (সবচেয়ে তীব্র আলো) পর্যন্ত হয়, এবং এই তিনটি চ্যানেলকে একটির ওপর আরেকটি বসালে আমরা চূড়ান্ত রঙিন ছবিটি দেখতে পাই।

একটি রঙিন ছবিকে আকারের একটি 3D টেন্সর হিসেবে উপস্থাপন করা হয়, যেখানে হলো উচ্চতা (সারি), হলো প্রস্থ (কলাম), এবং হলো চ্যানেলের সংখ্যা — RGB ইমেজের জন্য ৩, এবং গ্রে-স্কেল ইমেজের জন্য ১।
সহজ কথা: একটি CNN যা কিছু করে, তার একদম প্রথম লেয়ার থেকে শুরু করে শেষ পর্যন্ত সবকিছুই এই আকারের টেন্সরের ওপর কাজ করে। এই টেন্সরের আকারটি বুঝতে পারাই হলো একটি কনভোলিউশন ফিল্টার আসলে ছবির কোন অংশের ওপর দিয়ে স্লাইড করে যাচ্ছে তা বোঝার প্রধানতম পূর্বশর্ত।
ফিচার এক্সট্র্যাকশন হলো raw পিক্সেল ডেটাকে অর্থপূর্ণ প্যাটার্ন-এর একটি ছোট সেটে — যেমন কিনারা, কোণ, টেক্সচার, আকৃতি — রূপান্তর করার প্রক্রিয়া, যা পরবর্তী ক্লাসিফিকেশনের মতো কাজের জন্য অত্যন্ত উপযোগী।
ঐতিহ্যবাহী কম্পিউটার ভিশন মূলত নিজে হাতে ডিজাইন করা ফিচারের (hand-crafted features) ওপর নির্ভর করত: যেমন SIFT, HOG এবং Canny edge detection-এর মতো অ্যালগরিদম, যার প্রতিটি মানব বিশেষজ্ঞরা ছবিতে নির্দিষ্ট ধরনের ভিজ্যুয়াল স্ট্রাকচার সনাক্ত করার জন্য বহু কষ্টে ডিজাইন করেছিলেন। bittersweet বা সেই ফিক্সড ফিচারগুলোর ওপর একটি ক্লাসিফায়ার (সাধারণত SVM) ট্রেন করা হতো। CNN এই পাইপলাইনের দুটি অংশকেই একটি স্বয়ংক্রিয় প্রক্রিয়ায় প্রতিস্থাপন করে: যেখানে ফিচার এক্সট্র্যাক্ট করা কনভোলিউশন ফিল্টার এবং সেটিকে ব্যবহার করা ক্লাসিফায়ার উভয়েই সরাসরি লেবেলযুক্ত ডেটা থেকে শুরু থেকে শেষ পর্যন্ত একসাথে ট্রেন হয়।
পুরনো কম্পিউটার ভিশন পাইপলাইন: নিজে হাতে ডিজাইন করা ফিচার → আলাদা ক্লাসিফায়ার (SVM ইত্যাদি), যা আলাদাভাবে টিউন করতে হতো। CNN পাইপলাইন: স্বয়ংক্রিয়ভাবে শিখে নেওয়া ফিচার → ক্লাসিফায়ার, যা ব্যাকপ্রোপাগেশন ব্যবহার করে এন্ড-টু-এন্ড একসাথে ট্রেন করা হয়।
কনভোলিউশনে যাওয়ার আগে, এই চ্যাপ্টারের শুরুতে আলোচনা করা নিউরনের সমীকরণটি কোডে দেখে নেওয়া যাক — এটি ঠিক একই ডট-প্রোডাক্ট-প্লাস-বায়াস-প্লাস-অ্যাক্টিভেশন প্যাটার্ন যা প্রতিটি কনভোলিউশন ফিল্টার বারবার ব্যবহার করবে।
import numpy as np
def relu(z):
return np.maximum(0, z)
def neuron_output(x, w, b, activation=relu):
"""একটি একক কৃত্রিম নিউরন: ওয়েটেড সাম, বায়াস এবং অ্যাক্টিভেশন।"""
z = np.dot(w, x) + b
return activation(z)
x = np.array([0.5, -1.2, 3.0]) # ইনপুটসমূহ
w = np.array([0.8, 0.4, -0.6]) # লার্নেবল ওয়েটস
b = 0.1 # বায়াস
a = neuron_output(x, w, b)
print(f"z = {np.dot(w, x) + b:.3f}, a = {a:.3f}")পরের চ্যাপ্টারগুলোতে আপনি যে কনভোলিউশন ফিল্টারগুলোর মুখোমুখি হবেন, সেগুলোর মূলে রয়েছে ঠিক একই হিসাব — একটি ডট প্রোডাক্ট এবং একটি বায়াস — যা একটি ফ্ল্যাট ফিচার ভেক্টরের ওপর একবার প্রয়োগ করার বদলে ছবির ছোট ছোট লোকাল প্যাচ বা অঞ্চলের ওপর বারবার প্রয়োগ করা হয়।
এটি মোটেও কোনো ভিন্ন নিউরন ব্যবহার করে না। প্রতিটি কনভোলিউশন ফিল্টার এখনও ওয়েট, বায়াস এবং একটি অ্যাক্টিভেশন ফাংশন নিয়েই কাজ করে — CNN শুধু নিউরনগুলো তাদের ইনপুটের সাথে কীভাবে কানেক্টেড বা সংযুক্ত হবে (লোকাল ও শেয়ারড ওয়েটের সাহায্যে) সেই প্রক্রিয়াটি বদলে দেয়, নিউরনের ভেতরের হিসাবটি নয়।
তাত্ত্বিকভাবে একটি গ্রে-স্কেল ছবিও একটি 3D টেন্সর, যা শুধু থাকে — কোড লেখার সময় এই চ্যানেল ডাইমেনশনটিকে স্পষ্ট বা এক্সপ্লিসিট রাখা উচিত, একে সাধারণ 2D ম্যাট্রিক্স হিসেবে দেখলে পরে ডাইমেনশন মিসম্যাচের বাগ হতে পারে।
আপনি যে ডিপ লার্নিং ফ্রেমওয়ার্কই ব্যবহার করেন না কেন — PyTorch, TensorFlow বা JAX — ছবিগুলোকে তাদের ভেতরে ঠিক এই চ্যাপ্টারের বলা টেন্সরের আকার (অথবা ব্যাচের জন্য ) হিসেবেই রিপ্রেজেন্ট করা হয়, যা আপনার পরিচিত ওয়েটেড-সাম-প্লাস-অ্যাক্টিভেশন নিউরন দিয়েই তৈরি। এই পরিভাষাগুলো স্পষ্টভাবে জানার পর, আমরা পরবর্তী চ্যাপ্টারগুলোতে কনভোলিউশন নিজে কীভাবে কাজ করে তার গাণিতিক রূপগুলো খুব সহজেই আয়ত্ত করতে পারব।