स्वचालित भेदभाव: Difference between revisions
Line 263: | Line 263: | ||
नए अंकगणित में क्रमित जोड़े, | जहां <math>P^{(1)}</math> अपने पहले तर्क के संबंध में <math>P</math> के अवकलज को दर्शाता है, और <math>x'</math>, जिसे सीड कहा जाता है, उसको स्वेच्छ रूप से चुना जा सकता है। | ||
नए अंकगणित में क्रमित जोड़े, <math>\langle x, x' \rangle</math> लिखे तत्व, पहले घटक पर सामान्य अंकगणित और दूसरे घटक पर प्रथम क्रम अवकलन अंकगणित के साथ सम्मिलित हैं, जैसा कि ऊपर वर्णित है। बहुपदों पर उपरोक्त परिणामों को [[विश्लेषणात्मक कार्य|विश्लेषणात्मक फलनो]] तक विस्तारित करने से बुनियादी अंकगणित और नए अंकगणित के लिए कुछ मानक फलनो की एक सूची मिलती है, | |||
<math display="block">\begin{align} | <math display="block">\begin{align} | ||
\left\langle u,u'\right\rangle + \left\langle v,v'\right\rangle &= \left\langle u + v, u' + v' \right\rangle \\ | \left\langle u,u'\right\rangle + \left\langle v,v'\right\rangle &= \left\langle u + v, u' + v' \right\rangle \\ | ||
Line 278: | Line 279: | ||
\left| \left\langle u,u'\right\rangle \right| &= \left\langle \left| u \right| , u' \operatorname{sign} u \right\rangle \quad (u \ne 0) | \left| \left\langle u,u'\right\rangle \right| &= \left\langle \left| u \right| , u' \operatorname{sign} u \right\rangle \quad (u \ne 0) | ||
\end{align}</math> | \end{align}</math> | ||
और सामान्य तौर पर आदिम | और सामान्य तौर पर आदिम फलन के लिए <math>g</math>, | ||
<math display="block">g(\langle u,u' \rangle , \langle v,v' \rangle ) = \langle g(u,v) , g_u(u,v) u' + g_v(u,v) v' \rangle</math> | <math display="block">g(\langle u,u' \rangle , \langle v,v' \rangle ) = \langle g(u,v) , g_u(u,v) u' + g_v(u,v) v' \rangle</math> | ||
जहां <math>g_u</math> और <math>g_v</math> क्रमशः के इसके पहले और दूसरे तर्क के संबंध में <math>g</math> के अवकलज हैं। | |||
जब एक द्विआधारी बुनियादी अंकगणितीय | जब एक द्विआधारी बुनियादी अंकगणितीय संचालन को मिश्रित तर्कों पर अनुप्रयुक्त किया जाता है - जोड़ी <math>\langle u, u' \rangle</math> और वास्तविक संख्या <math>c</math>- तो वास्तविक संख्या को पहले <math>\langle c, 0 \rangle</math> तक उत्थापित कर दिया जाता है। बिंदु <math>x_0</math>पर फलन <math>f : \R\to\R</math> का अवकलज अब उपरोक्त अंकगणित का उपयोग करके <math>f(\langle x_0, 1 \rangle)</math> की गणना करके पाया जाता है, जो परिणाम के रूप में <math>\langle f ( x_0 ) , f' ( x_0 ) \rangle </math> देता है। | ||
===वेक्टर तर्क और कार्य=== | ===वेक्टर तर्क और कार्य=== |
Revision as of 05:44, 26 July 2023
गणित और कंप्यूटर बीजगणित में, स्वचालित अवकलन (स्व-अवकलन, ऑटोडिफ़, या एआडी), जिसे कलनविधीय अवकलन तथा अभिकलनीय अवकलन भी कहा जाता है,[1][2] और यह कंप्यूटर प्रोग्राम द्वारा निर्दिष्ट फलन के आंशिक अवकलज का मूल्यांकन करने के लिए तकनीकों का एक समुच्चय है।
स्वचालित अवकलन इस तथ्य का फायदा उठाता है कि प्रत्येक कंप्यूटर प्रोग्राम, चाहे कितना भी जटिल क्यों न हो, प्राथमिक अंकगणितीय संचालन (जोड़, घटाव, गुणा, भाग, आदि) और प्राथमिक फलनो (ऍक्स्प, लॉग, साइन, कॉस, आदि) के अनुक्रम को निष्पादित करता है। इन परिचालनों में श्रृंखला नियम को बार-बार लागू करने से, यादृच्छिक रूप से क्रम के आंशिक अवकलज की गणना स्वचालित रूप से, सटीकता से काम करने के लिए की जा सकती है, और मूल प्रोग्राम की तुलना में अधिक अंकगणितीय संचालन के एक छोटे स्थिर कारक का उपयोग किया जा सकता है।
अन्य अवकलन विधियों से अंतर
स्वचालित अवकलन प्रतीकात्मक अवकलन और संख्यात्मक अवकलन से भिन्न है। प्रतीकात्मक अवकलन से कंप्यूटर प्रोग्राम को एकल गणितीय व्यंजक में परिवर्तित करने में कठिनाई का सामना करना पड़ता है और इससे अकुशल कोड हो सकता है। संख्यात्मक अवकलन (परिमित अंतर की विधि) विवेकीकरण प्रक्रिया और निरस्तीकरण में निकटन त्रुटियां प्रस्तुत कर सकता है। इन दोनों चिरप्रतिष्ठित विधियों में उच्च अवकलज की गणना करने में समस्याएं होती हैं, जहां जटिलता और त्रुटियां बढ़ जाती हैं। अंत में, ये दोनों चिरप्रतिष्ठित विधियां कई निविष्ट के संबंध में किसी फलन के आंशिक अवकलज की गणना करने में धीमी हैं, जैसा कि प्रवणता-आधारित इष्टमीकरण कलन विधि के लिए आवश्यक है। स्वचालित अवकलन इन सभी समस्याओं का समाधान करता है।
अग्रगामी और उत्क्रम संचयन
समग्र फलनों के आंशिक अवकलजों का श्रृंखला नियम
स्वचालित अवकलन के लिए मूल, संयुक्त फलनो के आंशिक अवकलज के श्रृंखला नियम द्वारा प्रदान किए गए अंतर का अपघटन है। सरल संयोजन
दो प्रकार के स्वचालित अवकलन
आमतौर पर, स्वचालित अवकलन के दो अलग-अलग तरीके प्रस्तुत किए जाते हैं।
- अग्रगामी संचयन (जिसे समानयन, अग्रगामी मोड या स्पर्शी मोड भी कहा जाता है)
- उत्क्रम संचयन (जिसे अधोशीर्ष, उत्क्रम मोड या सहखंडज मोड भी कहा जाता है)
अग्रगामी संचयन निर्दिष्ट करता है कि कोई व्यक्ति श्रृंखला नियम को अंदर से (अर्थात, पहले की गणना करें और फिर की तथा अंत में की गणना करें) बाहर तक चंक्रमण करता है, जबकि उत्क्रम संचयन में बाहर से अंदर (पहले की गणना करें और फिर की और अंत में की गणना करें) तक चंक्रमण करता है।
- अग्रगामी संचयन पुनरावर्ती संबंध की गणना करता है, के साथ , और,
- उत्क्रम संचयन पुनरावर्ती संबंध की गणना करता है, के साथ ।
आंशिक अवकलज का मूल्य, जिसे सीड कहा जाता है, अग्रगामी या पश्चगामी प्रसारित होता है और प्रारंभ में या होता है। अग्रगामी संचयन फलन का मूल्यांकन करता है और एक पास में एक स्वतंत्र चर के संबंध में अवकलज की गणना करता है। प्रत्येक स्वतंत्र चर के लिए एक अलग पास आवश्यक है जिसमें उस स्वतंत्र चर के संबंध में अवकलज को एक () और अन्य सभी को शून्य () पर निर्धारित किया जाता है। इसके उत्क्रम, उत्क्रम संचयन के लिए आंशिक अवकलज के लिए मूल्यांकन किए गए आंशिक फलनो की आवश्यकता होती है। इसलिए उत्क्रम संचयन पहले फलन का मूल्यांकन करता है और एक अतिरिक्त पास में सभी स्वतंत्र चर के संबंध में अवकलज की गणना करता है।
इन दोनों प्रकारों में से किसका उपयोग किया जाना चाहिए यह स्वीप गणना पर निर्भर करता है। एक स्वीप का अभिकलनीय जटिलता मूल कोड की जटिलता के समानुपाती होती है।
- n ≫ m के साथ फलन f : Rn → Rm के लिए उत्क्रम संचयन की तुलना में अग्रगामी संचयन अधिक कुशल है क्योंकि उत्क्रम संचयन के लिए m स्वीप की तुलना में केवल n स्वीप आवश्यक हैं।
- फलन f : Rn → Rm के लिए n ≪ m के साथ अग्रगामी संचयन की तुलना में उत्क्रम संचयन अधिक कुशल है क्योंकि अग्रगामी संचयन के लिए n स्वीप की तुलना में केवल m स्वीप आवश्यक है।
बहुपरतीय परसेप्ट्रॉन में त्रुटियों की पश्चसंचरण, यंत्र अधिगम में उपयोग की जाने वाली तकनीक, उत्क्रम संचयन की एक विशेष स्थिति है।[2]
अग्रगामी संचयन की शुरुआत 1964 में आर.ई. वेंगर्ट द्वारा की गई थी।।[3] एंड्रियास ग्रिवैंक के अनुसार, 1960 के दशक के उत्तरार्ध से उत्क्रम संचयन का सुझाव दिया गया है, लेकिन आविष्कारक अज्ञात है।[4] सेप्पो लिन्नैनमा ने 1976 में उत्क्रम संचयन प्रकाशित किया।[5]
अग्रगामी संचयन
अग्रगामी संचयन एडी में, व्यक्ति पहले स्वतंत्र चर को निर्धारित करता है जिसके संबंध में अवकलन किया जाता है और प्रत्येक उप-व्यंजक के अवकलज की पुनरावर्ती गणना करता है। कलम और कागज की गणना में, इसमें श्रृंखला नियम में आंतरिक फलनो के अवकलज को बार-बार प्रतिस्थापित करना सम्मिलित है,
उत्क्रम संचयन की तुलना में, अग्रगामी संचयन स्वाभाविक रूप से लागू करना आसान है क्योंकि अवकलज सूचना का प्रवाह मूल्यांकन के क्रम के साथ मेल खाता है। प्रत्येक चर को इसके अवकलज (संख्यात्मक मान के रूप में संग्रहीत, प्रतीकात्मक व्यंजक नहीं),
उदाहरण के तौर पर, फलन पर विचार करें,
जिस स्वतंत्र चर का विभेदीकरण किया जाता है उसका चयन सीड मूल्यों ẇ1 और ẇ2 को प्रभावित करता है। x1 के संबंध में इस फलन के अवकलज में रुचि को देखते हुए, सीड मान को इस पर निर्धारित किया जाना चाहिए,
मूल्य की गणना करने के लिए संचालन अवकलज की गणना करने के लिए संचालन (seed) (seed)
इस उदाहरण फलन की प्रवणता की गणना करने के लिए, जिसके लिए न केवल बल्कि की भी आवश्यकता होती है, सीड मान का उपयोग करके अभिकलनीय ग्राफ़ पर एक अतिरिक्त स्वीप किया जाता है।
कार्यान्वयन
छद्म कोड
अग्रगामी संचयन एक पास में, फलन और अवकलज (लेकिन केवल एक स्वतंत्र चर के लिए) की गणना करता है। संबंधित विधि कॉल एक चर V के संबंध में व्यंजक Z को प्राप्त करने की अपेक्षा करती है। विधि मूल्यांकन किए गए फलन और इसके अवकलन की एक जोड़ी की पुनरावृत्ति है। यह विधि एक चर तक पहुंचने तक व्यंजक वृक्ष को पुनरावर्ती रूप से चंक्रमण करती है। यदि इस चर के संबंध में अवकलज का अनुरोध किया जाता है, तो इसका अवकलज 1, 0 होगा अन्यथा। फिर आंशिक फलन के साथ-साथ आंशिक अवकलज का मूल्यांकन किया जाता है।[6]
tuple<float,float>eval(Expression Z, Expression V) { यदि चर(Z) है यदि (Z=V) पुनरावृत्ति {valueOf(Z),1}; अन्यथा पुनरावृत्ति {valueOf(Z),0}; अन्यथा यदि (Z = X + Y) {x,x'} = eval(X,V); {y,y'} = eval(Y,V); पुनरावृत्ति {x+y, x'+y'}; अन्यथा यदि (Z = X - Y) {x,x'} = eval(X,V); {y,y'} = eval(Y,V); पुनरावृत्ति {x-y, x'-y'}; अन्यथा यदि (Z = X * Y) {x,x'} = eval(X,V); {y,y'} = eval(Y,V); पुनरावृत्ति {x*y, x'*y+x*y'};
सी++
#include <iostream> #include <string> #include <map> typedef struct dual { float v,d; } dual; struct Expression { virtual dual eval(std::map<std::string,float> &vals, Expression *v) { return {0,0}; }; }; struct Plus: public Expression { Expression *a, *b; Plus(Expression *a, Expression *b): a{a}, b{b} {} dual eval(std::map<std::string,float> &vals, Expression *v) { dual x=a->eval(vals,v); dual y=b->eval(vals,v); return {x.v+y.v, x.d+y.d}; } }; struct Var: public Expression { std::string s; Var(std::string s) : s{s} {} dual eval(std::map<std::string,float> &vals, Expression *v) { return {vals[s], this==v?1.0f:0.0f}; } }; int main (){ std,,map<std,,string,float> dict; dict.insert(std,,pair<std,,string,int>( x ,1)); dict.insert(std,,pair<std,,string,int>( y ,-3)); dict.insert(std,,pair<std,,string,int>( z ,4)); Var x( x ), y( y ), z( z ); Mul m1(&x,&z); Mul m2(&y,&z); Plus p(&m1,&m2); // x*z+y*z std,,cout << x, << p.eval(dict,&x).d << , << y, << p.eval(dict,&y).d << , << z, << p. eval(dict,&z).d << std,,endl; पुनरावृत्ति 0;
उत्क्रम संचयन
उत्क्रम संचयन एडी में, अवकलित किए जाने वाले आश्रित चर को तय किया जाता है और अवकलज की गणना प्रत्येक उप-व्यंजक के संबंध में पुनरावर्ती रूप से की जाती है। कलम और कागज की गणना में, बाहरी फलनो के अवकलज को श्रृंखला नियम में बार-बार प्रतिस्थापित किया जाता है,
उत्क्रम संचयन श्रृंखला नियम को बाहर से अंदर तक, या चित्र 3 में अभिकलनीय ग्राफ की स्थिति में, ऊपर से नीचे तक चंक्रमण करता है। उदाहरण फलन अदिश-मूल्यवान है, और इस प्रकार अवकलज गणना के लिए केवल एक सीड है, और (दो-घटक) प्रवणता की गणना करने के लिए अभिकलनीय ग्राफ के केवल एक स्वीप की आवश्यकता होती है। अग्रगामी संचयन की तुलना में यह केवल आधा काम है, लेकिन उत्क्रम संचयन के लिए मध्यवर्ती चर wi के भंडारण की आवश्यकता होती है जो उन्हें टेप या वेंगर्ट सूची[7] (हालाँकि, वेंगर्ट ने अग्रगामी संचयन प्रकाशित किया, न कि उत्क्रम संचय[3]) के रूप में ज्ञात डेटा संरचना में उत्पन्न करते हैं, जो अभिकलनीय ग्राफ़ बड़ा होने पर महत्वपूर्ण मेमोरी का उपभोग कर सकता है। मध्यवर्ती चरों के केवल एक उपसमूह को संग्रहीत करके और फिर मूल्यांकन को दोहराकर आवश्यक कार्य चरों का पुनर्निर्माण करके इसे कुछ हद तक कम किया जा सकता है, एक तकनीक जिसे पुनर्भौतिकीकरण के रूप में जाना जाता है। जाँच बिन्दु का उपयोग मध्यस्थ अवस्थाओ को बचाने के लिए भी किया जाता है।
उत्क्रम संचयन का उपयोग करके अवकलज की गणना करने के संचालन को नीचे दी गई तालिका में दिखाया गया है (उत्क्रमित क्रम पर ध्यान दें),
- अवकलज की गणना करने के लिए संचालन
किसी गणना के डेटा प्रवाह ग्राफ़ को उसकी मूल गणना की प्रवणता की गणना करने के लिए प्रकलित किया जा सकता है। यह प्रत्येक प्रारंभिक नोड के लिए एक सहखंडज नोड जोड़कर किया जाता है, जो सहखंडज किनारों से जुड़ा होता है जो कि प्रारंभिक किनारों के समानांतर होता है लेकिन उत्क्रम दिशा में बहता है। निकटवर्ती ग्राफ में नोड्स प्रारंभिक में नोड्स द्वारा गणना किए गए फलनो के अवकलज द्वारा गुणन का प्रतिनिधित्व करते हैं। उदाहरण के लिए, मूल में जोड़ के कारण जोड़ में बहिर्गमांक हो जाता है, सहखंडज में बहिर्गमांक के कारण जोड़ में वृद्धि होती है,[lower-alpha 1] प्रारंभिक कारणों में एक एकल फलन y = f(x), सहखंडज में x̄ = ȳ f′(x) आदि होते है।
कार्यान्वयन
छद्म कोड
उत्क्रम संचयन के लिए दो पास की आवश्यकता होती है, अग्रगामी पास में, फलन का पहले मूल्यांकन किया जाता है और आंशिक परिणाम कैश किए जाते हैं। उत्क्रम पास में, आंशिक अवकलज की गणना की जाती है और पहले से प्राप्त मूल्य को पृष्ठ संचरण किया जाता है। संबंधित विधि कॉल से अपेक्षा की जाती है कि व्यंजक Z को व्युत्पन्न किया जाए और मूल व्यंजक के व्युत्पन्न मूल्य के साथ सीड किया जाए। शीर्ष व्यंजक के लिए, Z, Z के संबंध में व्युत्पन्न, यह 1 है। यह विधि एक चर तक पहुंचने तक व्यंजक वृक्ष को पुनरावर्ती रूप से चंक्रमण करती है और अवकलज व्यंजक में वर्तमान सीड मान जोड़ती है।[8][9]
void derive(Expression Z, float seed) { यदि (Z = X + Y) अवकलज (X, सीड); अवकलज (Y, सीड); अन्यथा यदि (Z = X - Y) अवकलज (X, सीड); अवकलज(Y,-सीड); अन्यथा यदि (Z = X * Y) अवकलज(X,valueOf(X)*seed); अवकलज(Y,seed*valueOf(Y)); अन्यथा यदि वैरिएबल (जेड) है आंशिकDerivativeOf(Z) += बीज; }
पायथन
बिना टेप के पायथन में कार्यान्वयन।
import math
class Var:
def __init__(self, value, children=None):
self.value = value
self.children = children or []
self.grad = 0
def __add__(self, other):
return Var(self.value + other.value, [(1, self), (1, other)])
def __mul__(self, other):
return Var(self.value * other.value, [(other.value, self), (self.value, other)])
def sin(self):
return Var(math.sin(self.value), [(math.cos(self.value), self)])
def calc_grad(self, grad=1):
self.grad += grad
for coef, child in self.children:
child.calc_grad(grad * coef)
# Example: f(x, y) = x * y + sin(x)
x = Var(2)
y = Var(3)
f = x * y + x.sin()
# Calculation of partial derivatives
f.calc_grad()
print("f =", f.value)
print("∂f/∂x =", x.grad)
print("∂f/∂y =", y.grad)
सी++
#include <iostream> #include <string> #include <map> struct Expression { float forward=0, backward=0; virtual float eval(std::map<std::string,float> &vals) = 0; virtual void back(float seed) { backward+=seed; }; }; struct Plus: public Expression { व्यंजक *a, *b; Plus(Expression *a, Expression *b): a{a}, b{b} {} float eval(std::map<std::string,float> &vals) { backward=0; forward=a->eval(vals); forward+=b->eval(vals); return forward; } void back(float seed) { Expression::back(seed); a->back(seed); b->back(seed); } }; struct Mul: public Expression { व्यंजक *a, *b; Mul(Expression *a, Expression *b): a{a}, b{b} {} float eval(std::map<std::string,float> &vals) { backward=0; forward=a->eval(vals); forward*=b->eval(vals); return forward; } void back(float seed) { Expression::back(seed); a->back(seed * b->forward); b->back(seed * a->forward); } }; struct Var: public Expression { std::string s; Var(std,,string s)), s{s} {} float eval(std::map<std::string,float> &vals) { forward=vals[s]; backward=0; return forward; } void back(float seed) { Expression::back(seed); std::cout << s << ": " << backward << ", "; } }; int main (){ std,,map<std,,string,float> dict; dict.insert(std,,pair<std,,string,int>( x ,1)); dict.insert(std,,pair<std,,string,int>( y ,-3)); dict.insert(std,,pair<std,,string,int>( z ,4)); Var x( x ), y( y ), z( z ); Mul m1(&x,&z); Mul m2(&y,&z); Plus p(&m1,&m2); // x*z+y*z std,,cout << p.eval(dict) << std,,endl; p.back(1); std,,cout << std,,endl; return 0; }
अग्रगामी और उत्क्रम संचयन के अतिरिक्त
अग्रगामी और उत्क्रम संचयन श्रृंखला नियम को चंक्रमण करने के केवल दो (चरम) तरीके हैं। अंकगणितीय संक्रियाओं की न्यूनतम संख्या के साथ f : Rn → Rm के पूर्ण जैकोबियन की गणना करने की समस्या को इष्टतम जैकोबियन संचयन (ओजेए) समस्या के रूप में जाना जाता है, जो एनपी-पूर्ण है।।[10] इस प्रमाण के केंद्र में यह विचार है कि ग्राफ़ के किनारों को लेबल करने वाले स्थानीय आंशिक भागों के बीच बीजगणितीय निर्भरताएँ उपस्थित हो सकती हैं। विशेष रूप से, दो या दो से अधिक एज लेबल को बराबर के रूप में पहचाना जा सकता है। समस्या की जटिलता अभी भी विवृत है यदि यह मान लिया जाए कि सभी किनारे के लेबल अद्वितीय और बीजगणितीय रूप से स्वतंत्र हैं।
दोहरी संख्याओं का उपयोग करके स्वचालित अवकलन
वास्तविक संख्याओं के वास्तविक संख्याओं के बीजगणित को बढ़ाकर और एक नया अंकगणित प्राप्त करके अग्रगामी मोड स्वचालित अवकलन पूरा किया जाता है। संख्या पर किसी फलन के अवकलज का प्रतिनिधित्व करने के लिए प्रत्येक संख्या में एक अतिरिक्त घटक जोड़ा जाता है, और सभी अंकगणितीय संचालको को संवर्धित बीजगणित के लिए विस्तारित किया जाता है। संवर्धित बीजगणित दोहरी संख्याओं का बीजगणित है।
प्रत्येक संख्या को संख्या से बदलें, जहाँ एक वास्तविक संख्या है, लेकिन गुण के साथ एक अमूर्त संख्या है (एक अतिसूक्ष्म, सहज अतिसूक्ष्म विश्लेषण देखें)। इसके प्रयोग से ही नियमित अंकगणित मिलता है
अब, इस संवर्धित अंकगणित में बहुपदों की गणना की जा सकती है। यदि, तब
जहां अपने पहले तर्क के संबंध में के अवकलज को दर्शाता है, और , जिसे सीड कहा जाता है, उसको स्वेच्छ रूप से चुना जा सकता है।
नए अंकगणित में क्रमित जोड़े, लिखे तत्व, पहले घटक पर सामान्य अंकगणित और दूसरे घटक पर प्रथम क्रम अवकलन अंकगणित के साथ सम्मिलित हैं, जैसा कि ऊपर वर्णित है। बहुपदों पर उपरोक्त परिणामों को विश्लेषणात्मक फलनो तक विस्तारित करने से बुनियादी अंकगणित और नए अंकगणित के लिए कुछ मानक फलनो की एक सूची मिलती है,
जब एक द्विआधारी बुनियादी अंकगणितीय संचालन को मिश्रित तर्कों पर अनुप्रयुक्त किया जाता है - जोड़ी और वास्तविक संख्या - तो वास्तविक संख्या को पहले तक उत्थापित कर दिया जाता है। बिंदु पर फलन का अवकलज अब उपरोक्त अंकगणित का उपयोग करके की गणना करके पाया जाता है, जो परिणाम के रूप में देता है।
वेक्टर तर्क और कार्य
दिशात्मक अवकलज ऑपरेटर को अपनाकर बहुभिन्नरूपी कार्यों को अविभाज्य कार्यों के समान दक्षता और तंत्र के साथ संभाला जा सकता है। अर्थात्, यदि यह गणना करने के लिए पर्याप्त है , दिशात्मक अवकलज का पर दिशा में के रूप में गणना की जा सकती है उपरोक्त के समान अंकगणित का उपयोग करना। यदि के सभी तत्व तो वांछित हैं फलन मूल्यांकन की आवश्यकता है. ध्यान दें कि कई अनुकूलन अनुप्रयोगों में, दिशात्मक अवकलज वास्तव में पर्याप्त है।
उच्च क्रम और कई चर
उपरोक्त अंकगणित को दूसरे क्रम और बहुभिन्नरूपी कार्यों के उच्च अवकलज की गणना करने के लिए सामान्यीकृत किया जा सकता है। हालाँकि, अंकगणित के नियम तेजी से जटिल हो जाते हैं, जटिलता उच्चतम अवकलज डिग्री में द्विघात है। इसके बजाय, काटे गए टेलर श्रृंखला बीजगणित का उपयोग किया जा सकता है। परिणामी अंकगणित, सामान्यीकृत दोहरी संख्याओं पर परिभाषित, कार्यों का उपयोग करके कुशल गणना की अनुमति देता है जैसे कि वे एक डेटा प्रकार थे। एक बार किसी फलन का टेलर बहुपद ज्ञात हो जाने पर, अवकलज आसानी से निकाले जा सकते हैं।
कार्यान्वयन
अग्रगामी-मोड एआई को प्रोग्राम की एक गैर-मानक व्याख्या द्वारा कार्यान्वित किया जाता है जिसमें वास्तविक संख्याओं को दोहरी संख्याओं द्वारा प्रतिस्थापित किया जाता है, स्थिरांक को शून्य ईपीएसलॉन गुणांक के साथ दोहरी संख्याओं में उठाया जाता है, और संख्यात्मक प्राइमेटिव्स को दोहरी संख्याओं पर काम करने के लिए उठाया जाता है। यह गैरमानक व्याख्या आम तौर पर दो रणनीतियों में से एक का उपयोग करके कार्यान्वित की जाती है, स्रोत कोड परिवर्तन या ऑपरेटर ओवरलोडिंग।
स्रोत कोड परिवर्तन (एससीटी)
किसी फलन के स्रोत कोड को स्वचालित रूप से उत्पन्न स्रोत कोड द्वारा प्रतिस्थापित किया जाता है जिसमें मूल निर्देशों के साथ जुड़े अवकलज की गणना के लिए विवरण सम्मिलित होते हैं।
स्रोत कोड परिवर्तन को सभी प्रोग्रामिंग भाषाओं के लिए लागू किया जा सकता है, और कंपाइलर के लिए संकलन समय अनुकूलन करना भी आसान है। हालाँकि, एआई टूल का कार्यान्वयन स्वयं अधिक कठिन है और निर्माण प्रणाली अधिक जटिल है। स्रोत कोड परिवर्तन टूल के उदाहरणों में Enzyme टूल सम्मिलित है[11] एलएलवीएम/एमएलआईआर के लिए (और इस प्रकार सी/सी++, जूलिया, रस्ट, फोरट्रान, पायथन, आदि को अलग करता है) और टेपेनेड टूल[12] फोरट्रान/सी के लिए.
ऑपरेटर ओवरलोडिंग (ओओ)
ऑपरेटर ओवरलोडिंग कर रहा है के कारण स्रोत कोड का समर्थन करने वाली भाषा में लिखे जाने की संभावना है। ऊपर दर्शाए गए संवर्धित अंकगणित को पूरा करने के लिए वास्तविक संख्याओं और प्राथमिक गणितीय परिचालनों के लिए वस्तुओं को अतिभारित किया जाना चाहिए। फलन को अवकलित करने के लिए मूल स्रोत कोड में संचालन के रूप या अनुक्रम में कोई बदलाव की आवश्यकता नहीं होती है, लेकिन अक्सर ओवरलोडिंग का समर्थन करने के लिए संख्याओं और वैक्टरों के लिए बुनियादी डेटा प्रकारों में बदलाव की आवश्यकता होती है और अक्सर विशेष फ़्लैगिंग संचालन को सम्मिलित करना भी सम्मिलित होता है। प्रत्येक लूप पर अंतर्निहित ऑपरेटर ओवरहेड ओवरलोडिंग के कारण, यह दृष्टिकोण आमतौर पर कमजोर गति प्रदर्शन को प्रदर्शित करता है।
C++ में स्वचालित अवकलन के ऑपरेटर-ओवरलोडिंग कार्यान्वयन के उदाहरण हैं,
- निपुण (सी++ लाइब्रेरी)
- एनएजी की डीसीओ लाइब्रेरी
- स्टेन (सॉफ्टवेयर) पुस्तकालय
- Xएआई ओपन-सोर्स टूल
ऑपरेटर ओवरलोडिंग और स्रोत कोड परिवर्तन
ओवरलोडेड ऑपरेटर्स का उपयोग वैल्यूएशन ग्राफ़ निकालने के लिए किया जा सकता है, जिसके बाद रन-टाइम पर प्रारंभिक फलन के एडी-संस्करण की स्वचालित पीढ़ी होती है। क्लासिक OO Aएआई के उत्क्रम, ऐसा एआई-फलन एक पुनरावृत्ति से अगले में नहीं बदलता है। इसलिए प्रति Xi नमूने में कोई OO या टेप व्याख्या रन-टाइम ओवरहेड है।
रनटाइम पर एडी-फलन उत्पन्न होने के साथ, इसे प्रोग्राम की वर्तमान स्थिति को ध्यान में रखने और कुछ मानों की पूर्व-गणना करने के लिए अनुकूलित किया जा सकता है। इसके अलावा, इसे उपयोगकर्ता डेटा के 4(8)-दोगुने टुकड़ों (AVX2\AVX512 गति x4-x8) को संसाधित करने के लिए देशी सीपीयू वेक्टराइजेशन का लगातार उपयोग करने के तरीके से उत्पन्न किया जा सकता है। मल्टीथ्रेडिंग को ध्यान में रखते हुए, इस तरह के दृष्टिकोण से पारंपरिक Aएआई टूल की तुलना में ऑर्डर 8 × #Cores का अंतिम त्वरण हो सकता है। GitHub पर एक संदर्भ कार्यान्वयन उपलब्ध है।[13]
यह भी देखें
- विभिन्न प्रोग्रामिंग
टिप्पणियाँ
संदर्भ
- ↑ Neidinger, Richard D. (2010). "स्वचालित विभेदन और MATLAB ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का परिचय" (PDF). SIAM Review. 52 (3): 545–563. CiteSeerX 10.1.1.362.6580. doi:10.1137/080743627. S2CID 17134969.
- ↑ 2.0 2.1 Baydin, Atilim Gunes; Pearlmutter, Barak; Radul, Alexey Andreyevich; Siskind, Jeffrey (2018). "Automatic differentiation in machine learning: a survey". Journal of Machine Learning Research. 18: 1–43.
- ↑ 3.0 3.1 R.E. Wengert (1964). "एक सरल स्वचालित व्युत्पन्न मूल्यांकन कार्यक्रम". Comm. ACM. 7 (8): 463–464. doi:10.1145/355586.364791. S2CID 24039274.
- ↑ Griewank, Andreas (2012). "Who Invented the Reverse Mode of Differentiation?" (PDF). Optimization Stories, Documenta Matematica. Extra Volume ISMP: 389–400.
- ↑ Linnainmaa, Seppo (1976). "संचित गोलाई त्रुटि का टेलर विस्तार". BIT Numerical Mathematics. 16 (2): 146–160. doi:10.1007/BF01931367. S2CID 122357351.
- ↑ Maximilian E. Schüle, Maximilian Springer, Alfons Kemper, Thomas Neumann (2022). "स्वचालित विभेदन के लिए एलएलवीएम कोड अनुकूलन". DEEM '22: Proceedings of the Sixth Workshop on Data Management for End-To-End Machine Learning (in English). doi:10.1145/3533028.3533302.
{{cite journal}}
: CS1 maint: multiple names: authors list (link) - ↑ Bartholomew-Biggs, Michael; Brown, Steven; Christianson, Bruce; Dixon, Laurence (2000). "एल्गोरिदम का स्वचालित विभेदन". Journal of Computational and Applied Mathematics. 124 (1–2): 171–190. Bibcode:2000JCoAM.124..171B. doi:10.1016/S0377-0427(00)00422-2. hdl:2299/3010.
- ↑ Maximilian E. Schüle, Harald Lang, Maximilian Springer, Alfons Kemper, Thomas Neumann, Stephan Günnemann (2021). "जीपीयू पर एसक्यूएल के साथ इन-डेटाबेस मशीन लर्निंग". 33rd International Conference on Scientific and Statistical Database Management (in English). doi:10.1145/3468791.3468840.
{{cite journal}}
: CS1 maint: multiple names: authors list (link) - ↑ Maximilian E. Schüle, Harald Lang, Maximilian Springer, Alfons Kemper, Thomas Neumann, Stephan Günnemann (2022). "इन-डेटाबेस मशीन लर्निंग के लिए पुनरावर्ती एसक्यूएल और जीपीयू-समर्थन". Distributed and Parallel Databases (in English). doi:10.1007/s10619-022-07417-7.
{{cite journal}}
: CS1 maint: multiple names: authors list (link) - ↑ Naumann, Uwe (April 2008). "इष्टतम जैकोबियन संचय एनपी-पूर्ण है". Mathematical Programming. 112 (2): 427–441. CiteSeerX 10.1.1.320.5665. doi:10.1007/s10107-006-0042-z. S2CID 30219572.
- ↑ Moses, William; Churavy, Valentin (December 2020). "मशीन लर्निंग के लिए विदेशी कोड को फिर से लिखने के बजाय, स्वचालित रूप से तेज़ ग्रेडिएंट्स को संश्लेषित करें". Proceedings of the 34th International Conference on Neural Information Processing Systems.
- ↑ Hascoet, Laurent; Pascual, Valérie (April 2013). "The Tapenade automatic differentiation tool: Principles, model, and specification". ACM Transactions on Mathematical Software. 39 (3): 1–43. doi:10.1145/2450153.2450158.
- ↑ "एएडीसी प्रोटोटाइप लाइब्रेरी". June 22, 2022 – via GitHub.
अग्रिम पठन
- Rall, Louis B. (1981). Automatic Differentiation: Techniques and Applications. Lecture Notes in Computer Science. Vol. 120. Springer. ISBN 978-3-540-10861-0.
- Griewank, Andreas; Walther, Andrea (2008). Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation. Other Titles in Applied Mathematics. Vol. 105 (2nd ed.). SIAM. ISBN 978-0-89871-659-7.
- Neidinger, Richard (2010). "Introduction to Automatic Differentiation and MATLAB Object-Oriented Programming" (PDF). SIAM Review. 52 (3): 545–563. CiteSeerX 10.1.1.362.6580. doi:10.1137/080743627. S2CID 17134969. Retrieved 2013-03-15.
- Naumann, Uwe (2012). The Art of Differentiating Computer Programs. Software-Environments-tools. SIAM. ISBN 978-1-611972-06-1.
- Henrard, Marc (2017). Algorithmic Differentiation in Finance Explained. Financial Engineering Explained. Palgrave Macmillan. ISBN 978-3-319-53978-2.
बाहरी संबंध
- www.autodiff.org, An "entry site to everything you want to know about automatic differentiation"
- Automatic Differentiation of Parallel OpenMP Programs
- Automatic Differentiation, C++ Templates and Photogrammetry
- Automatic Differentiation, Operator Overloएआईing Approach
- Compute analytic derivatives of any Fortran77, Fortran95, or C program through a web-based interface Automatic Differentiation of Fortran programs
- Description and example code for forward Automatic Differentiation in Scala
- finmath-lib stochastic automatic differentiation, Automatic differentiation for random variables (Java implementation of the stochastic automatic differentiation).
- एआईjoint Algorithmic Differentiation, Calibration and Implicit Function Theorem
- C++ Template-based automatic differentiation article and implementation
- Tangent Source-to-Source Debuggable Derivatives
- Exact First- and Second-Order Greeks by Algorithmic Differentiation
- एआईjoint Algorithmic Differentiation of a GPU Accelerated Application
- एआईjoint Methods in Computational Finance Software Tool Support for Algorithmic Differentiationop
- More than a Thousand Fold Speed Up for xVA Pricing Calculations with Intel Xeon Scalable Processors