torch.autograd হলো PyTorch এর একটি গুরুত্বপূর্ণ মডিউল, যা মেশিন লার্নিং মডেল ট্রেনিংয়ের জন্য গ্র্যাডিয়েন্ট ক্যালকুলেশন এবং ব্যাকপ্রোপাগেশন পরিচালনা করে। এটি autonomous differentiation (স্বয়ংক্রিয় গ্র্যাডিয়েন্ট ক্যালকুলেশন) এবং টেনসর গ্র্যাডিয়েন্ট হিসাবের জন্য ব্যবহৃত হয়, যা ডিপ লার্নিং মডেলগুলির জন্য অপরিহার্য।
এটি সাধারণত ট্রেনিংয়ের সময়, ফিডফরওয়ার্ড এবং ব্যাকপ্রোপাগেশন প্রক্রিয়ায় ব্যবহৃত হয়, যেখানে গ্র্যাডিয়েন্টগুলো ক্যালকুলেট এবং অপটিমাইজ করা হয়।
torch.autograd এর মৌলিক ধারণা
- Autograd Engine: PyTorch এর autograd engine একটি কম্পিউটেশন গ্রাফ তৈরি করে, যা সমস্ত টেনসর অপারেশন ট্র্যাক করে এবং গ্র্যাডিয়েন্ট ক্যালকুলেশন স্বয়ংক্রিয়ভাবে সম্পন্ন করে।
- তিনটি প্রধান উপাদান:
- Tensors:
torch.autogradএর সাথে কাজ করতে হলে টেনসরগুলিrequires_grad=Trueদিয়ে তৈরি করতে হবে, যা জানায় যে এই টেনসরগুলির জন্য গ্র্যাডিয়েন্ট ক্যালকুলেশন করতে হবে। - Backward Pass: একবার আউটপুট পাওয়া গেলে,
backward()মেথড ব্যবহার করে গ্র্যাডিয়েন্ট ক্যালকুলেট করা হয়। gradattribute: ক্যালকুলেট করা গ্র্যাডিয়েন্ট গুলি টেনসর এরgradঅ্যাট্রিবিউটের মধ্যে সঞ্চিত হয়।
- Tensors:
গ্র্যাডিয়েন্ট ক্যালকুলেশন এর প্রক্রিয়া
১. requires_grad ব্যবহার করে টেনসর তৈরি
প্রথমে, আপনাকে যেসব টেনসরের গ্র্যাডিয়েন্ট প্রয়োজন, তাদের requires_grad=True দিয়ে তৈরি করতে হবে।
import torch
# requires_grad=True থাকলে গ্র্যাডিয়েন্ট ট্র্যাক হবে
x = torch.tensor([2.0, 3.0], requires_grad=True)
y = torch.tensor([5.0, 6.0], requires_grad=True)
২. টেনসর অপারেশন এবং গ্র্যাডিয়েন্ট ক্যালকুলেশন
এখন যদি আমরা x এবং y এর সাথে কোন গাণিতিক অপারেশন করি, যেমন তাদের যোগফল, তাহলে PyTorch autograd স্বয়ংক্রিয়ভাবে গাণিতিক গ্রাফ তৈরি করবে এবং গ্র্যাডিয়েন্ট ক্যালকুলেশন প্রস্তুত করবে।
# অপারেশন
z = x + y
# গ্র্যাডিয়েন্ট ক্যালকুলেশন
z.sum().backward()
# গ্র্যাডিয়েন্ট প্রদর্শন
print(x.grad) # x এর গ্র্যাডিয়েন্ট
print(y.grad) # y এর গ্র্যাডিয়েন্ট
এখানে, z = x + y তে x এবং y এর জন্য গ্র্যাডিয়েন্ট ক্যালকুলেট করা হবে এবং আমরা backward() ব্যবহার করে তাদের গ্র্যাডিয়েন্ট বের করে নিব।
৩. ব্যাকওয়ার্ড পাস (Backward Pass)
যখন backward() মেথড চালানো হয়, তখন এটি কম্পিউটেশন গ্রাফ ব্যবহার করে গ্র্যাডিয়েন্ট ক্যালকুলেট করে এবং প্রতিটি টেনসর এর grad অ্যাট্রিবিউটে সংরক্ষণ করে। backward() শুধুমাত্র স্কেলার ভ্যালু (একটি একক মান) থেকে কাজ করবে, তাই আমরা এখানে sum() মেথড ব্যবহার করেছি।
৪. grad অ্যাট্রিবিউট
এখন, আপনি x.grad এবং y.grad দেখতে পাবেন, যা তাদের জন্য গ্র্যাডিয়েন্ট নির্দেশ করে।
print(x.grad) # tensor([1., 1.])
print(y.grad) # tensor([1., 1.])
এখানে, যেহেতু অপারেশনটি ছিল যোগফল (Addition), তাই x এবং y এর জন্য গ্র্যাডিয়েন্ট একক মান 1 হবে। অর্থাৎ, dz/dx = 1 এবং dz/dy = 1।
গ্র্যাডিয়েন্ট ক্যালকুলেশনের জন্য অগ্রসর কোড
import torch
# টেনসর তৈরি করা
a = torch.tensor([3.0, 4.0], requires_grad=True)
b = torch.tensor([5.0, 6.0], requires_grad=True)
# অপারেশন
c = a * b + b
# আউটপুটের উপর ব্যাকওয়ার্ড পাস
c.sum().backward()
# গ্র্যাডিয়েন্ট প্রদর্শন
print("a এর গ্র্যাডিয়েন্ট:", a.grad)
print("b এর গ্র্যাডিয়েন্ট:", b.grad)
এই কোডে, c = a * b + b গাণিতিক এক্সপ্রেশনটির জন্য ব্যাকপ্রোপাগেশন চালানো হয়েছে এবং আমরা a এবং b এর গ্র্যাডিয়েন্ট পাব।
গ্র্যাডিয়েন্ট ক্লিয়ার করা
কখনও কখনও, আপনি যদি পূর্ববর্তী গ্র্যাডিয়েন্টের উপর ভিত্তি করে নতুন গ্র্যাডিয়েন্ট ক্যালকুলেট করতে চান, তবে আপনাকে optimizer.zero_grad() বা x.grad.zero_() ব্যবহার করে গ্র্যাডিয়েন্ট ক্লিয়ার করতে হতে পারে।
# পূর্ববর্তী গ্র্যাডিয়েন্ট ক্লিয়ার করা
x.grad.zero_()
y.grad.zero_()
এটি খুবই গুরুত্বপূর্ণ, কারণ যদি আপনি গ্র্যাডিয়েন্ট ক্লিয়ার না করেন, তাহলে পুরানো গ্র্যাডিয়েন্টগুলি নতুন গ্র্যাডিয়েন্টের সাথে যোগ হতে থাকবে, যা আপনার মডেল ট্রেনিংকে প্রভাবিত করতে পারে।
গ্র্যাডিয়েন্ট ক্লিপিং (Gradient Clipping)
গ্র্যাডিয়েন্ট ক্লিপিং একটি কৌশল যা ট্রেনিংয়ের সময় বড় গ্র্যাডিয়েন্টকে সীমিত করে, বিশেষ করে গ্র্যাডিয়েন্ট ভ্যানিশিং বা এক্সপ্লোডিং সমস্যার ক্ষেত্রে। PyTorch তে এটি করতে পারেন:
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
এই কোডটি মডেলের সব প্যারামিটারদের গ্র্যাডিয়েন্টের নরমালাইজেশন সীমাবদ্ধ করে max_norm এর মানের মধ্যে।
সারাংশ
torch.autogradএকটি অত্যন্ত শক্তিশালী টুল যা ব্যাকপ্রোপাগেশন এবং গ্র্যাডিয়েন্ট ক্যালকুলেশন অটোমেটিকভাবে পরিচালনা করে।requires_grad=Trueব্যবহার করে টেনসর তৈরি করলে, আপনি PyTorch কে জানাতে পারেন যে আপনি ওই টেনসরের জন্য গ্র্যাডিয়েন্ট ক্যালকুলেট করতে চান।backward()মেথড ব্যবহার করে, কম্পিউটেশন গ্রাফের মাধ্যমে গ্র্যাডিয়েন্ট ক্যালকুলেট করা হয় এবংgradঅ্যাট্রিবিউটে সংরক্ষিত হয়।- গ্র্যাডিয়েন্ট ক্লিয়ার করা গুরুত্বপূর্ণ, কারণ এটি পূর্ববর্তী গ্র্যাডিয়েন্টের সাথে নতুন গ্র্যাডিয়েন্ট যোগ হতে দেয় না।
torch.autograd এর মাধ্যমে গ্র্যাডিয়েন্ট হ্যান্ডলিং মডেল ট্রেনিংয়ের জন্য অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে ডিপ লার্নিং মডেলগুলির জন্য।
Read more