পার্শিয়াল ডেরিভেটিভ ও গ্রেডিয়েন্ট ভেক্টর
এই পাঠে যা শিখবেন
- পার্শিয়াল ডেরিভেটিভের সংজ্ঞা ও হিসাব করার পদ্ধতি
- গ্রেডিয়েন্ট ভেক্টরের সংজ্ঞা ও নোটেশন
- কেন গ্রেডিয়েন্ট সবচেয়ে খাড়া বৃদ্ধির দিক নির্দেশ করে — directional derivative-এর স্বজ্ঞা দিয়ে
- দুটি গুরুত্বপূর্ণ গ্রেডিয়েন্ট বের করা: $\|\mathbf{x}\|^2$ ও $\mathbf{w}^T\mathbf{x}$
১ · পার্শিয়াল ডেরিভেটিভ — একটি সময়ে একটি ভ্যারিয়েবল
পাঠ ১৩-তে আমরা এক-ভ্যারিয়েবলের ফাংশনের ডেরিভেটিভ দেখেছি। কিন্তু ML-এর প্রায় সব ফাংশন — লস ফাংশন, নিউরনের আউটপুট — একাধিক ভ্যারিয়েবলের (প্যারামিটার) উপর নির্ভর করে, যেমন $f(x_1, x_2, \dots, x_n)$। এমন ফাংশনে "$x_1$-এর সাপেক্ষে পরিবর্তনের হার" জিজ্ঞেস করতে হলে বাকি সব ভ্যারিয়েবলকে সাময়িকভাবে ধ্রুবক ধরে নিতে হয় — একেই বলে পার্শিয়াল ডেরিভেটিভPartial Derivativeএকাধিক ভ্যারিয়েবলের ফাংশনে একটি নির্দিষ্ট ভ্যারিয়েবলের সাপেক্ষে ডেরিভেটিভ, বাকি সবগুলোকে ধ্রুবক ধরে।।
$$ \frac{\partial f}{\partial x_i} = \lim_{h \to 0} \frac{f(x_1,\dots,x_i+h,\dots,x_n) - f(x_1,\dots,x_i,\dots,x_n)}{h} $$
ব্যবহারিকভাবে — শুধু $x_i$ ছাড়া বাকি সব চিহ্নকে সংখ্যার মতো (ধ্রুবক) ধরে সাধারণ এক-ভ্যারিয়েবলের নিয়মে ডেরাইভ করলেই হয়ে যায়।
উদাহরণ — $f(x,y) = x^2 y + 3y^2$। এখানে $\partial f/\partial x = 2xy$ ($y$ ধ্রুবক ধরে পাওয়ার রুল), এবং $\partial f/\partial y = x^2 + 6y$ ($x^2$ একটি ধ্রুবক গুণাঙ্ক হিসেবে থাকল, আর $3y^2$-এর ডেরিভেটিভ $6y$)।
২ · গ্রেডিয়েন্ট ভেক্টর
একটি ফাংশন $f: \mathbb{R}^n \to \mathbb{R}$-এর সব পার্শিয়াল ডেরিভেটিভ একসাথে একটি ভেক্টরে সাজালে পাওয়া যায় গ্রেডিয়েন্ট ভেক্টরGradientএকটি স্কেলার-মানের ফাংশনের সব পার্শিয়াল ডেরিভেটিভের ভেক্টর — সবচেয়ে খাড়া বৃদ্ধির দিক নির্দেশ করে।:
$$ \nabla f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \dots, \frac{\partial f}{\partial x_n} \right) $$
গ্রেডিয়েন্ট এমন একটি ভেক্টর যার প্রতিটি উপাদান বলে দেয় সংশ্লিষ্ট ইনপুট ডাইমেনশন সামান্য বাড়ালে ফাংশনটি কতটা বাড়বে (বা কমবে)। এই একক গাণিতিক বস্তুটিই — যেমন পাঠ ০১-এ উল্লেখ করা হয়েছিল — নিউরাল নেটওয়ার্ক ট্রেনিং-এর কেন্দ্রীয় ধারণা।
৩ · গ্রেডিয়েন্ট কেন সবচেয়ে খাড়া বৃদ্ধির দিক নির্দেশ করে
কোনো দিক $\mathbf{u}$ (একক ভেক্টর) বরাবর $f$ কতটা বদলায় তা মাপে ডিরেকশনাল ডেরিভেটিভDirectional Derivativeএকটি নির্দিষ্ট দিক বরাবর ফাংশনের পরিবর্তনের হার — গ্রেডিয়েন্ট ও দিক-ভেক্টরের ডট প্রোডাক্ট।, যা লেখা যায়:
$$ D_{\mathbf{u}} f = \nabla f \cdot \mathbf{u} $$
পাঠ ০৪-এর ডট প্রোডাক্ট সূত্র মনে করুন: $\nabla f \cdot \mathbf{u} = \|\nabla f\| \|\mathbf{u}\| \cos\theta$, যেখানে $\theta$ হলো $\nabla f$ ও $\mathbf{u}$-এর মধ্যকার কোণ। যেহেতু $\mathbf{u}$ একক ভেক্টর ($\|\mathbf{u}\|=1$), এই রাশি সর্বোচ্চ হয় যখন $\cos\theta = 1$, অর্থাৎ $\mathbf{u}$ ঠিক $\nabla f$-এর দিকেই থাকে। তাই:
গ্রেডিয়েন্ট $\nabla f$ ঠিক সেই দিকে নির্দেশ করে যেদিকে $f$ সবচেয়ে দ্রুত বাড়ে (steepest ascent)। বিপরীত দিক $-\nabla f$ তাই সবচেয়ে দ্রুত হ্রাসের দিক — যা পাঠ ১৭-এ গ্রেডিয়েন্ট ডিসেন্টের ভিত্তি হয়ে দাঁড়াবে।
৪ · দুটি গুরুত্বপূর্ণ গ্রেডিয়েন্ট — বারবার ফিরে আসবে
উদাহরণ ১ — $f(\mathbf{x}) = \|\mathbf{x}\|^2 = \sum_i x_i^2$।
প্রতিটি উপাদানের সাপেক্ষে আলাদা করে ডেরাইভ করলে: $\partial f/\partial x_i = 2x_i$। তাই সম্পূর্ণ গ্রেডিয়েন্ট:
$$ \nabla \|\mathbf{x}\|^2 = 2\mathbf{x} $$
উদাহরণ ২ — $f(\mathbf{x}) = \mathbf{w}^T\mathbf{x} = \sum_i w_i x_i$ ($\mathbf{w}$ ধ্রুবক, $\mathbf{x}$-এর সাপেক্ষে গ্রেডিয়েন্ট)।
$\partial f/\partial x_i = w_i$ (কারণ $\sum_i w_i x_i$-এ শুধু $w_i x_i$ পদটিতে $x_i$ আছে, বাকি সব পদ ধ্রুবক)। তাই:
$$ \nabla_{\mathbf{x}} (\mathbf{w}^T\mathbf{x}) = \mathbf{w} $$
এই ফলাফলটি বিশেষভাবে গুরুত্বপূর্ণ — একটি নিউরনের গণনা $z=\mathbf{w}^T\mathbf{x}+b$-এর ইনপুট বা ওজনের সাপেক্ষে গ্রেডিয়েন্ট বের করার সময় এটি বারবার ফিরে আসবে (মডিউল ৫)।
৫ · কোড দিয়ে যাচাই
নিচে $f(\mathbf{x}) = \|\mathbf{x}\|^2$-এর গ্রেডিয়েন্ট দুইভাবে হিসাব করা হলো — অ্যানালিটিক্যাল সূত্র $2\mathbf{x}$ দিয়ে, এবং প্রতিটি উপাদানের জন্য আলাদাভাবে finite-difference দিয়ে সংখ্যাগত অনুমান করে।
import numpy as np
def f(x):
return np.sum(x ** 2)
# অ্যানালিটিক্যাল গ্রেডিয়েন্ট: ∇f = 2x
def grad_analytical(x):
return 2 * x
# প্রতিটি উপাদানের জন্য আলাদাভাবে finite-difference দিয়ে সংখ্যাগত গ্রেডিয়েন্ট
def grad_numerical(x, step=1e-6):
grad = np.zeros_like(x)
for i in range(len(x)):
x_plus = x.copy()
x_plus[i] += step
grad[i] = (f(x_plus) - f(x)) / step
return grad
x = np.array([1.0, -2.0, 3.0])
print("অ্যানালিটিক্যাল গ্রেডিয়েন্ট:", grad_analytical(x))
print("সংখ্যাগত গ্রেডিয়েন্ট: ", grad_numerical(x))
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ গ্রেডিয়েন্ট ভেক্টরের "দৈর্ঘ্য" ($\|\nabla f\|$) কী বোঝায়?
গ্রেডিয়েন্টের দিক বলে দেয় কোন দিকে বাড়লে ফাংশন সবচেয়ে দ্রুত বাড়বে, আর দৈর্ঘ্য বলে দেয় সেই সবচেয়ে দ্রুত বৃদ্ধির হার কত। $\|\nabla f\|$ যত বড়, সেই বিন্দুতে ফাংশনটি তত বেশি "খাড়া" — অর্থাৎ সামান্য পরিবর্তনে ফলাফল বেশি বদলায়। $\|\nabla f\| = 0$ হলে সেই বিন্দুতে কোনো দিকেই ফাংশন বাড়ছে না — এটি একটি critical point (পাঠ ১৬-এ গুরুত্বপূর্ণ হয়ে উঠবে)।
প্র ০২ $\nabla_{\mathbf{x}}(\mathbf{w}^T\mathbf{x}) = \mathbf{w}$ কেন ব্যবহারিকভাবে এত গুরুত্বপূর্ণ?
কারণ নিউরাল নেটওয়ার্কের প্রায় প্রতিটি লেয়ারের মূল গণনাই এই ধরনের একটি রৈখিক পদ ($\mathbf{w}^T\mathbf{x}$)। ব্যাকপ্রপাগেশনে যখন লসকে ইনপুটের সাপেক্ষে ডেরাইভ করতে হয়, তখন এই নির্দিষ্ট ফলাফল — গ্রেডিয়েন্ট সরাসরি ওজন ভেক্টর $\mathbf{w}$-এর সমান — বারবার প্রয়োগ হয়, প্রায় প্রতিটি লেয়ারে।
প্র ০৩ পার্শিয়াল ডেরিভেটিভ বের করার সময় "বাকি সব ভ্যারিয়েবল ধ্রুবক ধরা" — এটি গাণিতিকভাবে বৈধ কেন?
কারণ পার্শিয়াল ডেরিভেটিভের সংজ্ঞাই এমন যে শুধু একটি ভ্যারিয়েবল ($x_i$) পরিবর্তন করে বাকি সব একই রেখে লিমিট নেওয়া হয় (উপরের লিমিট সংজ্ঞা দেখুন)। যেহেতু বাকি ভ্যারিয়েবলগুলো এই নির্দিষ্ট লিমিট প্রক্রিয়ায় সত্যিই বদলাচ্ছে না, তাদের ধ্রুবক হিসেবে গণ্য করা কোনো "শর্টকাট" নয় — এটি সংজ্ঞারই সরাসরি ফলাফল।
অনুশীলন
-
পার্শিয়াল ডেরিভেটিভ বের করুন: $f(x,y) = 3x^2y^3 + 5x$-এর $\partial f/\partial x$ ও
$\partial f/\partial y$ হাতে বের করুন।
$\partial f/\partial x = 6xy^3 + 5$ ($y^3$ ধ্রুবক ধরে); $\partial f/\partial y = 9x^2y^2$ ($3x^2$ ধ্রুবক ধরে, $y^3$-এর ডেরিভেটিভ $3y^2$)।
-
গ্রেডিয়েন্ট লিখুন: উপরের ফাংশনের জন্য সম্পূর্ণ গ্রেডিয়েন্ট ভেক্টর $\nabla f$ লিখুন।
$$ \nabla f = (6xy^3+5,\ 9x^2y^2) $$
-
কোড বাড়ান: উপরের code cell-এ
f(x)-কে $f(\mathbf{x})=\sum x_i^3$-এ বদলে (গ্রেডিয়েন্ট $3\mathbf{x}^2$, উপাদান-ভিত্তিক বর্গ)grad_analyticalফাংশনটিও যথাযথভাবে বদলে সংখ্যাগত ও অ্যানালিটিক্যাল ফলাফল মিলিয়ে দেখুন।def f(x): return np.sum(x ** 3)এবংdef grad_analytical(x): return 3 * x ** 2— এই দুটি বদলালেই সংখ্যাগত ও অ্যানালিটিক্যাল গ্রেডিয়েন্ট একে অপরের কাছাকাছি আসবে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পাঠ ১৫ — জ্যাকোবিয়ান ও হেসিয়ান পরবর্তী পাঠ গ্রেডিয়েন্টকে ভেক্টর-মানের ফাংশনে সম্প্রসারিত করলে জ্যাকোবিয়ান, আর দ্বিতীয় ডেরিভেটিভ নিলে হেসিয়ান পাওয়া যায়।
- সব AI Courses দেখুন ABCL TECH AI Foundations, Python for AI, Machine Learning, Deep Learning, Math for AI ও আরও অনেক কিছু — সব এক জায়গায়।
- Deep Learning কোর্স প্রয়োগ দেখুন গ্রেডিয়েন্ট ভেক্টর বাস্তবে কীভাবে PyTorch autograd-এ ব্যবহৃত হয় তা দেখতে।