মূল কোড আমি পাইটর্চ ওয়েবসাইটে আর পাই নি।
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)
উপরের কোডটিতে সমস্যাটি গ্রেডিয়েন্টগুলি গণনা করতে হবে তার ভিত্তিতে কোনও ফাংশন নেই। এর অর্থ আমরা জানি না যে কতগুলি পরামিতি (আর্গুমেন্টটি ফাংশনটি নেয়) এবং পরামিতিগুলির মাত্রা।
এটি পুরোপুরি বুঝতে আমি মূলটির কাছাকাছি একটি উদাহরণ তৈরি করেছি:
উদাহরণ 1:
a = torch.tensor([1.0, 2.0, 3.0], requires_grad = True)
b = torch.tensor([3.0, 4.0, 5.0], requires_grad = True)
c = torch.tensor([6.0, 7.0, 8.0], requires_grad = True)
y=3*a + 2*b*b + torch.log(c)
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients,retain_graph=True)
print(a.grad) # tensor([3.0000e-01, 3.0000e+00, 3.0000e-04])
print(b.grad) # tensor([1.2000e+00, 1.6000e+01, 2.0000e-03])
print(c.grad) # tensor([1.6667e-02, 1.4286e-01, 1.2500e-05])
আমি ধরে নিলাম যে আমাদের ফাংশনটি রয়েছে y=3*a + 2*b*b + torch.log(c)
এবং পরামিতিগুলি ভিতরে তিনটি উপাদান সহ টেনারগুলি।
আপনি gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
এটির মতো ভাবতে পারেন এটি সঞ্চালক।
আপনি যেমন শুনতে পাচ্ছেন পাইটর্চ অটোগ্রাড সিস্টেম গণনা জ্যাকবিয়ান পণ্যের সমান।
আপনার মতো কোনও ফাংশন থাকলে যেমন আমরা করেছি:
y=3*a + 2*b*b + torch.log(c)
জ্যাকবিয়ান হবে [3, 4*b, 1/c]
। যাইহোক, এই জ্যাকবীয় নয় যে পাইটর্চ কীভাবে নির্দিষ্ট সময়ে গ্রেডিয়েন্টগুলি গণনা করার জন্য জিনিসগুলি করছে।
পাইটর্চ ফরওয়ার্ড পাস এবং ব্যাকওয়ার্ড মোড স্বয়ংক্রিয় পার্থক্য ব্যবহার করে (AD) ব্যবহার করে।
কোনও প্রতীকী গণিত জড়িত নেই এবং কোনও সাংখ্যিক পার্থক্য নেই।
সংখ্যাগত পার্থক্য গণনা করা হবে δy/δb
, যেখানে b=1
এবং b=1+ε
যেখানে ε ছোট।
আপনি যদি এখানে গ্রেডিয়েন্ট ব্যবহার না করেন y.backward()
:
উদাহরণ 2
a = torch.tensor(0.1, requires_grad = True)
b = torch.tensor(1.0, requires_grad = True)
c = torch.tensor(0.1, requires_grad = True)
y=3*a + 2*b*b + torch.log(c)
y.backward()
print(a.grad) # tensor(3.)
print(b.grad) # tensor(4.)
print(c.grad) # tensor(10.)
আপনি সহজ কিভাবে আপনি আপনার সেট উপর ভিত্তি করে কোনো সময়ে ফলাফলের পাবেন a
, b
, c
tensors প্রাথমিকভাবে।
সতর্কতা অবলম্বন করা আবশ্যক কিভাবে আপনি আপনার আরম্ভ a
, b
, c
:
উদাহরণ 3:
a = torch.empty(1, requires_grad = True, pin_memory=True)
b = torch.empty(1, requires_grad = True, pin_memory=True)
c = torch.empty(1, requires_grad = True, pin_memory=True)
y=3*a + 2*b*b + torch.log(c)
gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(a.grad) # tensor([3.3003])
print(b.grad) # tensor([0.])
print(c.grad) # tensor([inf])
আপনি যদি ব্যবহার করেন torch.empty()
এবং ব্যবহার না করেন তবে pin_memory=True
আপনার প্রতিবার বিভিন্ন ফলাফল হতে পারে।
এছাড়াও, নোট গ্রেডিয়েন্টগুলি সংগ্রহকারীর মতো তাই যখন প্রয়োজন হয় তখন সেগুলি শূন্য করে।
উদাহরণ 4:
a = torch.tensor(1.0, requires_grad = True)
b = torch.tensor(1.0, requires_grad = True)
c = torch.tensor(1.0, requires_grad = True)
y=3*a + 2*b*b + torch.log(c)
y.backward(retain_graph=True)
y.backward()
print(a.grad) # tensor(6.)
print(b.grad) # tensor(8.)
print(c.grad) # tensor(2.)
পাইটর্চ শর্তাদি ব্যবহারের সর্বশেষে কয়েকটি টিপস:
পাইটর্চ একটি ডায়নামিক কম্পিউটেশনাল গ্রাফ তৈরি করেফরোয়ার্ড পাসে গ্রেডিয়েন্টগুলি গণনা করার সময় । এটি দেখতে অনেকটা গাছের মতো।
তাই আপনি যদি প্রায়ই শুনতে পাবে পাতার এ গাছের হয় ইনপুট tensors এবং রুট হল আউটপুট টেন্সর ।
গ্রেডিয়েন্টগুলি গ্রাফটিকে শিকড় থেকে পাতায় ট্রেস করে এবং চেইন বিধিটি ব্যবহার করে প্রতিটি গ্রেডিয়েন্টকে গুণের মাধ্যমে গণনা করা হয় । পিছনের পাসে এই গুণটি ঘটে।