অধ্যায় 3 · ক্যালকুলাস: মডেল কীভাবে শেখে
ফাংশন, ঢাল ও ডেরিভেটিভ
- পৃষ্ঠা 6 / 17
- 3 মিনিট পড়া
ক্যালকুলাস শুনতে কঠিন, কিন্তু AI-এর দরকার এর একটাই ধারণা: ডেরিভেটিভ, যা বলে কিছু কত দ্রুত বদলাচ্ছে। একটা পাহাড়ে দাঁড়ালে ডেরিভেটিভ হলো পায়ের নিচের খাড়াই — আর কোন দিকে নিচে নামা। মডেল ট্রেন করা মানে "আমি কতটা ভুল"-এর একটা ভূদৃশ্যে নিচের দিকে হাঁটা, তাই মেশিন লার্নিংয়ের কেন্দ্রে এই ধারণা।
একটা ফাংশন আর তার ঢাল
ফাংশন একটা ইনপুট নিয়ে আউটপুট দেয়: f(x) = x² ৩-কে ৯ বানায়। একটা বিন্দুতে এর ঢাল হলো "উচ্চতা ভাগ দূরত্ব": ইনপুটে ছোট্ট একটা বদলে আউটপুট কতটা বদলায়। ধাপটা খুব ছোট করলে পাওয়া যায় ডেরিভেটিভ। Python-এ সরাসরি এর আন্দাজ করা যায়:
def f(x):
return x ** 2
def slope(f, x, h=1e-6):
"""ছোট্ট একটা ধাপ h জুড়ে উচ্চতা ভাগ দূরত্ব।"""
return (f(x + h) - f(x)) / h
for x in [-2, 0, 1, 3]:
print(f"x = {x:2}: slope ≈ {slope(f, x):.3f} exact 2x = {2 * x}")x = -2: slope ≈ -4.000 exact 2x = -4
x = 0: slope ≈ 0.000 exact 2x = 0
x = 1: slope ≈ 2.000 exact 2x = 2
x = 3: slope ≈ 6.000 exact 2x = 6আন্দাজটা নির্ভুল নিয়মের সাথে মেলে: x²-এর ডেরিভেটিভ 2x। x = 0-তে ঢাল ০ — বক্ররেখার তলা, যেখানে এটা সমান। ঋণাত্মক x-এ ঢাল ঋণাত্মক: ডানে গেলে আউটপুট কমে। ডেরিভেটিভের চিহ্ন বলে কোন দিকে নিচে নামা।
যে নিয়মগুলো পাবেন
| ফাংশন | ডেরিভেটিভ | কথায় |
|---|---|---|
c (একটা ধ্রুবক) | 0 | সমান রেখা বদলায় না |
a·x | a | সরলরেখার ঢাল সব জায়গায় একই |
xⁿ | n·xⁿ⁻¹ | পাওয়ার রুল: x² → 2x, x³ → 3x² |
eˣ | eˣ | নিজের মানের সমান গতিতেই বাড়ে |
ln x | 1/x | ক্রমশ ধীরে বাড়ে |
f(g(x)) | f′(g(x)) · g′(x) | চেইন রুল: প্রতিটা ধাপের ঢাল গুণ করুন |
চেইন রুল: পাইপলাইনের মধ্য দিয়ে ঢাল
একটা মডেল হলো ফাংশনের একটা শিকল: একটা ডট প্রোডাক্ট, তারপর একটা অ্যাক্টিভেশন, তারপর একটা লস। ভেতরের গভীরে থাকা একটা ওয়েট শেষ লসকে কীভাবে প্রভাবিত করে জানতে শিকলের প্রতিটা আংটার ঢাল গুণ করতে হয়। এটাই চেইন রুল, আর নেটওয়ার্কের মধ্য দিয়ে লেয়ার ধরে ধরে পেছন দিকে এটা প্রয়োগ করাকে বলে ব্যাকপ্রোপাগেশন। PyTorch-এর মতো লাইব্রেরি এটা নিজে থেকেই করে — "autograd" — কিন্তু এটা তবু চেইন রুলই। এখানে সিগময়েডের জানা ডেরিভেটিভ (যা চেইন রুল থেকে আসে) সংখ্যার আন্দাজের সাথে মেলে:
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def slope(f, x, h=1e-6):
return (f(x + h) - f(x)) / h
z = 0.5
exact = sigmoid(z) * (1 - sigmoid(z)) # সিগময়েডের জানা ডেরিভেটিভ
print(round(slope(sigmoid, z), 6), round(exact, 6))0.235004 0.235004একাধিক ইনপুট: পার্শিয়াল ডেরিভেটিভ
আসল মডেলে লাখ লাখ ওয়েট থাকে। পার্শিয়াল ডেরিভেটিভ, লেখা হয় ∂L/∂w, হলো বাকি সবগুলো স্থির রেখে একটা ওয়েটের সাপেক্ষে ঢাল। সবগুলো একটা তালিকায় রাখলে পাওয়া যায় গ্রেডিয়েন্ট: এমন একটা ভেক্টর, যা একসাথে সব দিকে ওপরের দিক দেখায়। পরের পাতায় এটা কাজে লাগানো হয়েছে।
নিজে চেষ্টা করুন
f(x) = x³-এ x = 2-তেslope()ব্যবহার করুন। এটা কি 3x² = 12-এর সাথে মেলে?h = 1e-1আরh = 1e-12দিয়ে চেষ্টা করুন। দুটোই কেন1e-6-এর চেয়ে খারাপ?f(x) = (x − 4)²-এর ঢাল কোথায় শূন্য? সেই বিন্দুর বিশেষত্ব কী?