मूल कोड मैं अब PyTorch वेबसाइट पर नहीं मिला है।
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])
यह संचायक है।
जैसा कि आप सुन सकते हैं PyTorch ऑटोग्रैड सिस्टम गणना जैकोबियन उत्पाद के बराबर है।
यदि आपके पास कोई कार्य है, तो जैसे हमने किया:
y=3*a + 2*b*b + torch.log(c)
जैकबियन होगा [3, 4*b, 1/c]
। हालांकि, इस Jacobian नहीं कैसे PyTorch बातें निश्चित बिंदु पर ढ़ाल गणना करने के लिए कर रही है है।
PyTorch फॉरवर्ड पास और बैकवर्ड मोड ऑटोमैटिक भेदभाव का उपयोग करता है (AD) ।
इसमें कोई सांकेतिक गणित शामिल नहीं है और कोई संख्यात्मक अंतर नहीं है।
संख्यात्मक विभेदन की गणना के लिए होगी δy/δb
, जहां b=1
और b=1+ε
जहां would छोटा है।
यदि आप ग्रेडिएंट का उपयोग नहीं करते हैं 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.)
PyTorch उपयोग की शर्तों पर अंतिम कुछ सुझाव:
PyTorch एक गतिशील कम्प्यूटेशनल ग्राफ बनाता हैआगे पास में ग्रेडिएंट्स की गणना करते समय । यह काफी हद तक पेड़ जैसा दिखता है।
इसलिए आप अक्सर सुनेंगे पत्ते इस पेड़ के हैं इनपुट tensors और जड़ है उत्पादन टेन्सर ।
ग्रेड को रूट से पत्ती तक ग्राफ को ट्रेस करके और श्रृंखला के नियम का उपयोग करके प्रत्येक ढाल को गुणा करके गणना की जाती है । यह गुणा भाग पिछड़े दर्रे में होता है।