Autograd এবং Backpropagation দুটি অত্যন্ত গুরুত্বপূর্ণ কনসেপ্ট যা PyTorch এবং অন্যান্য ডিপ লার্নিং লাইব্রেরিতে ব্যবহৃত হয়, যাতে নিউরাল নেটওয়ার্ক মডেল ট্রেনিং ও অপটিমাইজেশন প্রক্রিয়া স্বয়ংক্রিয়ভাবে পরিচালিত হয়। নিচে এই দুটি কনসেপ্টের বিস্তারিত ব্যাখ্যা দেওয়া হলো।
১. Autograd (অটোগ্র্যাড)
Autograd হল PyTorch এর একটি স্বয়ংক্রিয় গ্র্যাডিয়েন্ট ক্যালকুলেশন সিস্টেম, যা গ্র্যাডিয়েন্ট ডেসেন্ট অ্যালগরিদমের জন্য ব্যবহার করা হয়। এটি নিউরাল নেটওয়ার্কের প্রতিটি প্যারামিটার (ওজন ও বায়াস) জন্য গ্র্যাডিয়েন্ট ক্যালকুলেট করে, যা মডেলকে অপটিমাইজ করতে সাহায্য করে।
Autograd এর কাজ কীভাবে হয়?
টেনসর ডিফাইনেশন:
- PyTorch এ টেনসর একটি মাল্টি-ডাইমেনশনাল অ্যারে, যা গাণিতিক গণনা ও অপারেশনের জন্য ব্যবহৃত হয়।
requires_grad=Trueদিয়ে আপনি PyTorch কে বলতে পারেন যে এই টেনসরটি গ্র্যাডিয়েন্ট ক্যালকুলেশন করতে চায়।
import torch x = torch.ones(2, 2, requires_grad=True)- PyTorch এ টেনসর একটি মাল্টি-ডাইমেনশনাল অ্যারে, যা গাণিতিক গণনা ও অপারেশনের জন্য ব্যবহৃত হয়।
অপারেশন:
- আপনি যদি কোনো অপারেশন করেন, যেমন যোগফল বা গুণফল, তাহলে PyTorch ওই অপারেশনগুলো ট্র্যাক করে রাখে এবং একটি কম্পিউটেশনাল গ্রাফ তৈরি করে।
y = x + 2 z = y * y * 3 out = z.mean()গ্র্যাডিয়েন্ট ক্যালকুলেশন:
- যখন আপনি
.backward()মেথড ব্যবহার করেন, এটি গ্র্যাডিয়েন্ট ক্যালকুলেশন শুরু করে এবং সমস্ত নোডের জন্য গ্র্যাডিয়েন্ট গণনা করে। এই গ্র্যাডিয়েন্ট গুলি পরে মডেলের প্যারামিটার আপডেটের জন্য ব্যবহৃত হয়।
out.backward() # গ্র্যাডিয়েন্ট ক্যালকুলেট করবে print(x.grad) # x এর গ্র্যাডিয়েন্ট প্রিন্ট করবে- যখন আপনি
Autograd এর সুবিধা:
- স্বয়ংক্রিয় গ্র্যাডিয়েন্ট ক্যালকুলেশন: কোড লেখা এবং ব্যাকপ্রোপাগেশন করতে অনেক সহজ হয়ে যায়।
- কম্পিউটেশনাল গ্রাফ: প্রতিটি অপারেশন ট্র্যাক করে এবং গ্রাফ তৈরি করে, যাতে গ্র্যাডিয়েন্ট গুলি পরবর্তী পর্যায়ে সঠিকভাবে ক্যালকুলেট করা যায়।
২. Backpropagation (ব্যাকপ্রোপাগেশন)
Backpropagation হল একটি অ্যালগরিদম যা নিউরাল নেটওয়ার্কের গ্র্যাডিয়েন্ট ডেসেন্ট পদ্ধতিতে ব্যবহৃত হয়। এটি মডেলের আউটপুট এবং প্রকৃত আউটপুটের মধ্যে ত্রুটি পরিমাপ করে এবং এই ত্রুটিটি নেটওয়ার্কের সমস্ত স্তরের মধ্যে ব্যাকপ্রোপাগেট করে। এই প্রক্রিয়ায়, মডেলের প্যারামিটারগুলো (ওজন ও বায়াস) আপডেট করার জন্য গ্র্যাডিয়েন্ট ক্যালকুলেট করা হয়।
Backpropagation এর প্রক্রিয়া:
- ফিডফরোয়ার্ড পাস (Forward Pass):
- প্রথমে ইনপুট ডেটা নেটওয়ার্কের মাধ্যমে যায় এবং আউটপুট তৈরি হয়। এখানে, কোনো গ্র্যাডিয়েন্ট ক্যালকুলেশন হয় না; শুধু আউটপুট তৈরি হয়।
ত্রুটি হিসাব (Error Calculation):
- আউটপুট এবং প্রকৃত আউটপুট (ট্যাগেট) এর মধ্যে ত্রুটি পরিমাপ করা হয়। সাধারণত ক্রস-এন্ট্রপি লস বা মিন স্কয়ার্ড এরর (MSE) ব্যবহার করা হয়।
যেখানে
y_predহল মডেলের আউটপুট এবংy_trueহল প্রকৃত আউটপুট।গ্র্যাডিয়েন্ট ক্যালকুলেশন (Gradient Calculation):
- ব্যাকপ্রোপাগেশন শুরু হলে, ত্রুটি থেকে গ্র্যাডিয়েন্ট বের করতে চেইন রুল ব্যবহার করা হয়। প্রতিটি স্তরের জন্য গ্র্যাডিয়েন্ট ক্যালকুলেট করা হয়, যেটি পরবর্তী স্তরের জন্য গ্র্যাডিয়েন্ট প্রপাগেট করে।
ওজন আপডেট (Weight Update):
- একবার গ্র্যাডিয়েন্ট ক্যালকুলেট হলে, গ্র্যাডিয়েন্ট ডেসেন্ট বা অন্য অপটিমাইজার ব্যবহার করে মডেলের ওজন আপডেট করা হয়। সাধারণত, স্টোকাস্টিক গ্র্যাডিয়েন্ট ডেসেন্ট (SGD) ব্যবহার করা হয়।
যেখানে
ηহল শিখন হার (learning rate)।
Autograd এবং Backpropagation এর সম্পর্ক
- Autograd হল PyTorch এর অটোমেটিক গ্র্যাডিয়েন্ট ক্যালকুলেশন সিস্টেম যা ব্যাকপ্রোপাগেশনের জন্য ব্যবহৃত গ্র্যাডিয়েন্টগুলো বের করে।
- Backpropagation হল একটি অ্যালগরিদম যা ত্রুটি পরিমাপ করে এবং গ্র্যাডিয়েন্ট ডেসেন্ট ব্যবহার করে মডেলের প্যারামিটারগুলো আপডেট করে।
- Autograd ব্যাকপ্রোপাগেশনকে সহজ করে তোলে কারণ এটি স্বয়ংক্রিয়ভাবে গ্র্যাডিয়েন্ট ক্যালকুলেট করে, যা মডেল ট্রেনিং প্রক্রিয়া দ্রুত এবং নির্ভুল করে।
সারাংশ
- Autograd হল PyTorch এর এক ধরনের সুবিধা যা গ্র্যাডিয়েন্ট ক্যালকুলেশন স্বয়ংক্রিয়ভাবে পরিচালনা করে।
- Backpropagation হল সেই অ্যালগরিদম যা গ্র্যাডিয়েন্ট ক্যালকুলেশন করে এবং মডেলের প্যারামিটার আপডেট করতে সাহায্য করে।
- Autograd এবং Backpropagation একসাথে কাজ করে, যাতে মডেলের ট্রেনিং সহজ ও কার্যকর হয়, এবং দ্রুত অপটিমাইজেশন সম্পন্ন হয়।
Autograd হলো PyTorch এর একটি অত্যন্ত গুরুত্বপূর্ণ বৈশিষ্ট্য যা অটোমেটিক ডিফারেনশিয়েশন (Automatic Differentiation) পরিচালনা করে। এটি মেশিন লার্নিং এবং ডিপ লার্নিং মডেলগুলোতে গ্র্যাডিয়েন্ট ক্যালকুলেশন স্বয়ংক্রিয়ভাবে পরিচালনা করতে সহায়ক। বিশেষত, এটি ব্যাকপ্রোপাগেশন (Backpropagation) প্রক্রিয়ায় ব্যবহৃত হয়, যা মডেলটির প্যারামিটার আপডেটের জন্য গ্র্যাডিয়েন্ট ক্যালকুলেট করে।
Autograd মূলত PyTorch এর মধ্য দিয়ে একটি কম্পিউটেশনাল গ্রাফ তৈরি করে এবং এই গ্রাফের মাধ্যমে সহজে গ্র্যাডিয়েন্ট ক্যালকুলেশন করা যায়। এটি বিশেষভাবে নিউরাল নেটওয়ার্ক ট্রেনিং এর জন্য অপরিহার্য, কারণ এটি গ্র্যাডিয়েন্ট ডেসেন্ট অ্যালগরিদমের জন্য গ্র্যাডিয়েন্ট গণনা করতে সহায়ক।
Autograd এর কাজের প্রক্রিয়া
Autograd মূলত দুটি প্রধান কাজ করে:
- কম্পিউটেশনাল গ্রাফ তৈরি করা: যখন PyTorch কোনো অপারেশন বা গণনা সম্পাদন করে, তখন এটি একটি কম্পিউটেশনাল গ্রাফ তৈরি করে, যেখানে প্রতিটি গাণিতিক অপারেশন (যেমন গুণফল, যোগফল, ইত্যাদি) একটি নোড হিসেবে প্রতিনিধিত্ব করে এবং এই অপারেশনগুলির মধ্যে সম্পর্ক এজ দ্বারা চিহ্নিত হয়।
- গ্র্যাডিয়েন্ট ক্যালকুলেশন: গ্র্যাডিয়েন্ট ক্যালকুলেশন করার সময়, এটি চেইন রুল (Chain Rule) ব্যবহার করে প্রতিটি স্তরের জন্য গ্র্যাডিয়েন্ট ক্যালকুলেট করে।
Autograd এর ভূমিকা
- গ্র্যাডিয়েন্ট ক্যালকুলেশন:
- Autograd মডেল ট্রেনিংয়ের জন্য প্রয়োজনীয় গ্র্যাডিয়েন্ট ক্যালকুলেশন স্বয়ংক্রিয়ভাবে করে। এর মাধ্যমে ইনপুট এবং আউটপুট এর মধ্যে গ্র্যাডিয়েন্ট গণনা করা হয়, যা পরবর্তী স্তরের প্যারামিটার আপডেট করতে সাহায্য করে।
- উদাহরণস্বরূপ, যখন মডেলের আউটপুট এবং টার্গেটের মধ্যে ত্রুটি পরিমাপ করা হয়, তখন ব্যাকপ্রোপাগেশন দ্বারা এই ত্রুটির গ্র্যাডিয়েন্ট ক্যালকুলেশন করা হয়।
- ব্যাকপ্রোপাগেশন:
- Autograd গ্র্যাডিয়েন্ট ক্যালকুলেশনের জন্য ব্যাকপ্রোপাগেশন ব্যবহারের মাধ্যমে নিউরাল নেটওয়ার্কের প্রতিটি স্তরের ওজন আপডেট করে।
- গ্র্যাডিয়েন্ট ডেসেন্ট অ্যালগরিদমের মাধ্যমে এই আপডেট প্রক্রিয়া সহজ এবং দ্রুত হয়।
- স্বয়ংক্রিয় এবং নমনীয়:
- Autograd একটি ডাইনামিক কম্পিউটেশন গ্রাফ তৈরি করে, যার মাধ্যমে কোডে পরিবর্তন বা ডিবাগ করা সহজ হয়। এটি যে কোনো গণনা করা বা অপারেশন সম্পাদন করার পর অটোমেটিকভাবে গ্র্যাডিয়েন্ট ক্যালকুলেট করে, সুতরাং ম্যানুয়ালি গ্র্যাডিয়েন্ট ক্যালকুলেট করার প্রয়োজন নেই।
- নিউরাল নেটওয়ার্ক ট্রেনিং:
- নিউরাল নেটওয়ার্ক ট্রেনিংয়ের জন্য গ্র্যাডিয়েন্ট ক্যালকুলেশন খুবই গুরুত্বপূর্ণ। Autograd এই প্রক্রিয়ায় সাহায্য করে, যাতে মডেলের ভুল সংশোধন করতে এবং তার আউটপুট আরও নির্ভুল করতে গ্র্যাডিয়েন্ট আপডেট করা যায়।
Autograd এর উদাহরণ
ধরা যাক, আমাদের একটি সহজ গাণিতিক এক্সপ্রেশন আছে:
এটি PyTorch তে কোডের মাধ্যমে গণনা করা হতে পারে:
import torch
# ইনপুট টেনসর
x = torch.tensor(2.0, requires_grad=True)
y = torch.tensor(3.0, requires_grad=True)
# গাণিতিক অপারেশন
z = (x + y) * (x - y)
# গ্র্যাডিয়েন্ট ক্যালকুলেট করা
z.backward()
# x এবং y এর গ্র্যাডিয়েন্ট বের করা
print(x.grad)
print(y.grad)
এখানে:
xএবংyহল টেনসর, যাদের জন্যrequires_grad=Trueসেট করা হয়েছে, অর্থাৎ PyTorch এই ভেরিয়েবলগুলির গ্র্যাডিয়েন্ট ক্যালকুলেট করবে।z.backward()কমান্ডটি ব্যাকপ্রোপাগেশন শুরু করে এবংx.gradএবংy.gradদিয়ে তাদের গ্র্যাডিয়েন্ট ক্যালকুলেট করে।
এটি PyTorch এর Autograd ব্যবহারের একটি সরল উদাহরণ, যেখানে চেইন রুল (Chain Rule) ব্যবহার করে গ্র্যাডিয়েন্ট ক্যালকুলেট করা হচ্ছে।
Autograd এর সুবিধা
- স্বয়ংক্রিয় গ্র্যাডিয়েন্ট ক্যালকুলেশন: Autograd প্রতিটি অপারেশন শেষে গ্র্যাডিয়েন্ট ক্যালকুলেশন করে, যা ব্যাকপ্রোপাগেশন প্রক্রিয়াকে সহজ ও দ্রুত করে তোলে।
- ডাইনামিক গ্রাফ: PyTorch এর ডাইনামিক কম্পিউটেশন গ্রাফ ব্যবহার করে, যখন আপনি কোডে কোন পরিবর্তন করবেন, তখন গ্রাফও পরিবর্তিত হবে। এটি কোডে পরিবর্তন বা ডিবাগিং করার সময় অনেক বেশি নমনীয়তা প্রদান করে।
- কমপ্লেক্স ক্যালকুলেশন: Autograd কেবল সরল গাণিতিক অপারেশন নয়, বরং জটিল ডিপ লার্নিং মডেলেও কার্যকর। নিউরাল নেটওয়ার্ক ট্রেনিং এবং উন্নয়ন সহজ হয়ে যায়।
সারাংশ
Autograd হল PyTorch এর একটি শক্তিশালী ফিচার, যা অটোমেটিক ডিফারেনশিয়েশন এবং ব্যাকপ্রোপাগেশন প্রক্রিয়াগুলোকে স্বয়ংক্রিয়ভাবে পরিচালনা করে। এটি মডেল ট্রেনিং এবং অপ্টিমাইজেশনে গ্র্যাডিয়েন্ট ক্যালকুলেশন সহজ ও দ্রুত করে তোলে, যা নিউরাল নেটওয়ার্কের উন্নতি এবং নির্ভুলতা নিশ্চিত করতে সাহায্য করে।
Gradient Calculation এবং Backpropagation ডিপ লার্নিং মডেল ট্রেনিং প্রক্রিয়ার অত্যন্ত গুরুত্বপূর্ণ দুটি ধাপ। এই দুটি প্রক্রিয়া একে অপরের সাথে সম্পর্কিত এবং একসাথে কাজ করে, যাতে মডেলের প্যারামিটারগুলো সঠিকভাবে আপডেট করা যায় এবং মডেলটি শিখতে পারে। চলুন, এই দুটি প্রক্রিয়া এবং তাদের ভূমিকা বিস্তারিতভাবে আলোচনা করি।
১. Gradient Calculation
গ্র্যাডিয়েন্ট হল একটি প্যারামিটার বা ভেরিয়েবলের পরিবর্তনের জন্য তার আউটপুট বা ফাংশনের অনুভূতির হার (rate of change)। মেশিন লার্নিং এবং ডিপ লার্নিংয়ের মধ্যে, গ্র্যাডিয়েন্ট ক্যালকুলেশন হলো ত্রুটি বা লস ফাংশনের প্রতি মডেলের প্যারামিটার (যেমন, ওজন) এর আংশিক ডেরিভেটিভ ক্যালকুলেট করা।
গ্র্যাডিয়েন্ট ক্যালকুলেশনের ভূমিকা:
- প্যারামিটার আপডেট: ডিপ লার্নিং মডেলগুলিতে, প্যারামিটারগুলির (যেমন, লেয়ারের ওজন এবং বায়াস) মান পরিবর্তন করতে গ্র্যাডিয়েন্ট ক্যালকুলেট করা হয়।
- লস ফাংশন: গ্র্যাডিয়েন্ট সাধারণত লস ফাংশনের প্রতি প্যারামিটারটির ডেরিভেটিভ হিসাবে গণনা করা হয়। লস ফাংশন (যেমন, Mean Squared Error বা Cross-Entropy Loss) হল সেই পরিমাপ যা আমাদের মডেলটির ত্রুটি বা ভুল নির্দেশ করে।
গ্র্যাডিয়েন্ট ক্যালকুলেশন কিভাবে কাজ করে?
- ফরওয়ার্ড পাস: ইনপুট ডেটা মডেলের মাধ্যমে পাস করা হয় এবং একটি আউটপুট তৈরি হয়। তারপর আউটপুট এবং টার্গেট আউটপুটের মধ্যে ত্রুটি পরিমাপ করা হয়।
- গ্র্যাডিয়েন্ট ক্যালকুলেশন: আউটপুট এবং টার্গেটের মধ্যে ত্রুটির ভিত্তিতে, গ্র্যাডিয়েন্ট ক্যালকুলেশন করা হয়। এটি প্রক্রিয়া করে এবং প্রতিটি প্যারামিটার (যেমন, মডেলের ওজন) কিভাবে আপডেট করা হবে তা নির্ধারণ করে।
গ্র্যাডিয়েন্ট ক্যালকুলেশনটি ডিপ লার্নিং অ্যালগরিদমের জন্য অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি আমাদের মডেলের পারফরম্যান্স উন্নত করার জন্য প্যারামিটার আপডেট করার উপায় প্রদান করে।
২. Backpropagation (ব্যাকপ্রোপাগেশন)
Backpropagation হল একটি প্রশিক্ষণ প্রক্রিয়া যা গ্র্যাডিয়েন্ট ক্যালকুলেশন এর উপর ভিত্তি করে, মডেলের প্যারামিটারগুলো আপডেট করতে ব্যবহৃত হয়। এটি মডেলের আউটপুট এবং টার্গেট আউটপুটের মধ্যে ত্রুটি পরিমাপ করে এবং সেই ত্রুটিটি "ব্যাকওয়ার্ড" পথে ছড়িয়ে দেয় (অথাৎ, ব্যাকপ্রোপাগেশন)। এর মাধ্যমে, মডেলটির ওজন এবং বায়াস আপডেট করা হয়।
ব্যাকপ্রোপাগেশন প্রক্রিয়া কীভাবে কাজ করে?
- ত্রুটি হিসাব: প্রথমে, মডেলের আউটপুট এবং টার্গেটের মধ্যে ত্রুটি পরিমাপ করা হয়। সাধারণত লস ফাংশন ব্যবহার করে ত্রুটি পরিমাপ করা হয়।
- গ্র্যাডিয়েন্ট ক্যালকুলেশন: পরবর্তী পদক্ষেপে, ব্যাকপ্রোপাগেশন ত্রুটি প্রপাগেট (backpropagate) করে এবং গ্র্যাডিয়েন্ট ক্যালকুলেশন করা হয়। এই প্রক্রিয়া চেইন রুল (Chain Rule) ব্যবহার করে, যা মডেলের প্রতিটি স্তরের জন্য গ্র্যাডিয়েন্ট হিসাব করে।
- ব্যাকওয়ার্ড পাস: গ্র্যাডিয়েন্ট ক্যালকুলেশনের পর, এই গ্র্যাডিয়েন্টগুলি ব্যাকওয়ার্ড (পিছনের দিকে) প্রপাগেট করা হয় এবং প্রতিটি স্তরের ওজন আপডেট করা হয়।
- ওজন আপডেট: স্টোকাস্টিক গ্র্যাডিয়েন্ট ডেসেন্ট (SGD) বা অন্যান্য অপটিমাইজার ব্যবহার করে গ্র্যাডিয়েন্টের বিপরীতে ওজন আপডেট করা হয়।
ব্যাকপ্রোপাগেশন এর ভূমিকা:
- প্যারামিটার আপডেট: ব্যাকপ্রোপাগেশন মডেলের প্যারামিটারগুলির (যেমন, ওজন এবং বায়াস) গ্র্যাডিয়েন্ট ক্যালকুলেট করে এবং তারপর সেই গ্র্যাডিয়েন্টের বিপরীতে প্যারামিটারগুলির মান আপডেট করে। এই আপডেটগুলি মডেলটি আরও সঠিক ভবিষ্যদ্বাণী করতে সাহায্য করে।
- চেইন রুল: ব্যাকপ্রোপাগেশন চেইন রুল ব্যবহার করে প্রতিটি লেয়ারের জন্য গ্র্যাডিয়েন্ট ক্যালকুলেট করে। এটি মডেলের প্রতিটি স্তরে ত্রুটির প্রভাব বিশ্লেষণ করতে সহায়ক।
৩. Gradient Descent Optimization
ব্যাকপ্রোপাগেশন প্রক্রিয়া গ্র্যাডিয়েন্ট ক্যালকুলেশনের মাধ্যমে, স্টোকাস্টিক গ্র্যাডিয়েন্ট ডেসেন্ট (SGD) বা অন্যান্য অপটিমাইজেশন অ্যালগরিদম (যেমন Adam, RMSprop) ব্যবহার করে মডেলের প্যারামিটারগুলো আপডেট করে।
স্টোকাস্টিক গ্র্যাডিয়েন্ট ডেসেন্ট (SGD) হল একটি জনপ্রিয় অপটিমাইজেশন অ্যালগরিদম, যা গ্র্যাডিয়েন্টের বিপরীতে ওজন আপডেট করতে ব্যবহৃত হয়:
এখানে:
- হল আগের ওজন,
- হল শিখন হার (learning rate),
- হল গ্র্যাডিয়েন্ট।
এই প্রক্রিয়া মডেলটির ওজন আপডেট করতে সহায়ক এবং মডেলকে সঠিক আউটপুট তৈরি করতে সাহায্য করে।
সারাংশ
Gradient Calculation এবং Backpropagation হল মডেল ট্রেনিংয়ের দুটি অত্যন্ত গুরুত্বপূর্ণ প্রক্রিয়া। গ্র্যাডিয়েন্ট ক্যালকুলেশন মডেলের প্যারামিটার আপডেট করার জন্য লস ফাংশনের প্রতি আংশিক ডেরিভেটিভ হিসাব করে। এরপর, ব্যাকপ্রোপাগেশন সেই গ্র্যাডিয়েন্ট ব্যবহার করে মডেলের ওজন আপডেট করে, যাতে মডেলটি আরো সঠিকভাবে শিখতে পারে। এই দুটি প্রক্রিয়া একসাথে কাজ করে মডেলের পারফরম্যান্স উন্নত করার জন্য।
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 এর মাধ্যমে গ্র্যাডিয়েন্ট হ্যান্ডলিং মডেল ট্রেনিংয়ের জন্য অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে ডিপ লার্নিং মডেলগুলির জন্য।
Computational Graphs (গণনা গ্রাফ) একটি অত্যন্ত গুরুত্বপূর্ণ ধারণা মেশিন লার্নিং এবং ডিপ লার্নিং মডেল ট্রেনিংয়ের জন্য। এটি গণনা এবং গ্র্যাডিয়েন্ট ক্যালকুলেশন প্রক্রিয়া সহজ করে তোলে। আসুন আমরা একটি বাস্তব উদাহরণ দেখি যেখানে Computational Graph ব্যবহার করা হয়, বিশেষ করে নিউরাল নেটওয়ার্কের জন্য ফিডফরোয়ার্ড এবং ব্যাকপ্রোপাগেশন প্রক্রিয়ায়।
উদাহরণ: সাধারণ নিউরাল নেটওয়ার্ক
ধরা যাক, আমাদের একটি সাধারণ নিউরাল নেটওয়ার্ক আছে যেখানে একটি ইনপুট, একটি হিডেন লেয়ার, এবং একটি আউটপুট লেয়ার রয়েছে। আমাদের লক্ষ্য হল ইনপুট x এবং টার্গেট আউটপুট y ব্যবহার করে মডেলটিকে ট্রেন করা।
১. নিউরাল নেটওয়ার্ক আর্কিটেকচার
- ইনপুট:
x - লুকানো লেয়ার:
h = w1 * x + b1 - আউটপুট:
y_pred = w2 * h + b2
এখানে, w1, w2 হল ওজন (weights) এবং b1, b2 হল বায়াস (bias)।
২. ফিডফরোয়ার্ড প্রক্রিয়া (Forward Pass)
ফিডফরোয়ার্ডে, ইনপুট ডেটা x প্রথমে ইনপুট স্তরে প্রবাহিত হয় এবং গ্রাফে মডেলের মধ্য দিয়ে চলতে থাকে।
প্রথম স্তর (লুকানো স্তর):
এখানে,
w1হল প্রথম লেয়ারের ওজন,xহল ইনপুট, এবংb1হল বায়াস।দ্বিতীয় স্তর (আউটপুট স্তর):
এখানে,
w2হল দ্বিতীয় স্তরের ওজন এবংb2হল বায়াস।
৩. কোস্ট ফাংশন (Loss Function)
ফিডফরোয়ার্ডে, মডেলের আউটপুট y_pred এবং আসল আউটপুট y এর মধ্যে ত্রুটি (error) পরিমাপ করতে হবে। আমরা মিন স্কোয়ার্ড এরর (Mean Squared Error, MSE) ব্যবহার করব:
এটি আমাদের মডেলের আউটপুট এবং আসল আউটপুটের মধ্যে ত্রুটি পরিমাপ করবে।
৪. ব্যাকপ্রোপাগেশন (Backpropagation)
ব্যাকপ্রোপাগেশন হল সেই প্রক্রিয়া যেখানে মডেলটি তার আউটপুট এবং আসল আউটপুটের মধ্যে ত্রুটি (error) পরিমাপ করে এবং সেই ত্রুটি ব্যবহার করে মডেলের ওজন (weights) আপডেট করে। ব্যাকপ্রোপাগেশন সময় চেইন রুল (Chain Rule) ব্যবহার করা হয়, যাতে গ্র্যাডিয়েন্ট ক্যালকুলেশন করা যায়।
লস ফাংশন এর গ্র্যাডিয়েন্ট ক্যালকুলেশন:
- প্রথমে, আউটপুট স্তরের জন্য গ্র্যাডিয়েন্ট ক্যালকুলেট করা হয়:
লুকানো স্তরের জন্য গ্র্যাডিয়েন্ট ক্যালকুলেশন:
- এরপর, লুকানো স্তরের জন্য গ্র্যাডিয়েন্ট ক্যালকুলেট করা হয়:
ওজন আপডেট (Weight Update):
- একটি অপটিমাইজেশন অ্যালগরিদম (যেমন, SGD বা Adam) ব্যবহার করে, আমরা আমাদের ওজন আপডেট করি:
এখানে,
ηহল শিখন হার (learning rate), যা ওজন আপডেটের গতি নির্ধারণ করে।
৫. Computational Graph
এখন এই সমস্ত গাণিতিক অপারেশনগুলির জন্য একটি Computational Graph তৈরি করা যেতে পারে, যেখানে প্রতিটি নোড একটি গাণিতিক অপারেশন (যেমন গুণফল, যোগফল) বা অ্যাক্টিভেশন ফাংশন উপস্থাপন করে এবং এজগুলি সম্পর্কগুলি নির্ধারণ করে।
Computational Graph এর উপাদান:
- নোড (Nodes): প্রতিটি গাণিতিক অপারেশন বা ফাংশন।
- এজ (Edges): ইনপুট এবং আউটপুট এর মধ্যে সম্পর্ক।
- গ্র্যাডিয়েন্ট ক্যালকুলেশন: ব্যাকপ্রোপাগেশন এর মাধ্যমে গ্র্যাডিয়েন্ট ক্যালকুলেশন এবং ওজন আপডেট।
উদাহরণ Computational Graph
+--------+ +--------+ +--------+
| x | ----> | w1 | ----> | h |
+--------+ +--------+ +--------+
|
v
+------------+
| Activation |
+------------+
|
v
+--------+
| w2 |
+--------+
|
v
+-------------+
| y_pred (output) |
+-------------+
এই গ্রাফের মাধ্যমে প্রতিটি স্তরের অপারেশন এবং সম্পর্ক দেখতে পারবেন, যেখানে x (ইনপুট), w1, w2 (ওজন), এবং y_pred (আউটপুট) এর মধ্যে সমস্ত গাণিতিক অপারেশন চিহ্নিত।
সারাংশ
Computational Graph হল একটি গ্রাফিকাল উপস্থাপনা যা গাণিতিক অপারেশন, ইনপুট এবং আউটপুট এর সম্পর্ক প্রদর্শন করে। এটি ফিডফরোয়ার্ড এবং ব্যাকপ্রোপাগেশন প্রক্রিয়াতে গুরুত্বপূর্ণ ভূমিকা পালন করে, যেখানে ইনপুট থেকে আউটপুট পর্যন্ত তথ্য প্রবাহিত হয় এবং পরবর্তী ধাপে গ্র্যাডিয়েন্ট ক্যালকুলেশন ও ওজন আপডেট করা হয়। Computational Graph গুলি মডেলের ট্রেনিং প্রক্রিয়া সহজ এবং স্বয়ংক্রিয় করে তোলে।
Read more