स्वचालित भेदभाव: Difference between revisions
No edit summary |
|||
| Line 30: | Line 30: | ||
* {{math|''n'' ≫ ''m''}} के साथ फलन {{math|''f'' : '''R'''<sup>''n''</sup> → '''R'''<sup>''m''</sup>}} के लिए उत्क्रम संचयन की तुलना में अग्रगामी संचयन अधिक कुशल है क्योंकि उत्क्रम संचयन के लिए {{math|''m''}} स्वीप की तुलना में केवल {{math|''n''}} स्वीप आवश्यक हैं। | * {{math|''n'' ≫ ''m''}} के साथ फलन {{math|''f'' : '''R'''<sup>''n''</sup> → '''R'''<sup>''m''</sup>}} के लिए उत्क्रम संचयन की तुलना में अग्रगामी संचयन अधिक कुशल है क्योंकि उत्क्रम संचयन के लिए {{math|''m''}} स्वीप की तुलना में केवल {{math|''n''}} स्वीप आवश्यक हैं। | ||
*फलन {{math|''f'' : '''R'''<sup>''n''</sup> → '''R'''<sup>''m''</sup>}} के लिए {{math|''n'' ≪ ''m''}} के साथ अग्रगामी संचयन की तुलना में उत्क्रम संचयन अधिक कुशल है क्योंकि अग्रगामी संचयन के लिए {{math|''n''}} स्वीप की तुलना में केवल {{math|''m''}} स्वीप आवश्यक है। | *फलन {{math|''f'' : '''R'''<sup>''n''</sup> → '''R'''<sup>''m''</sup>}} के लिए {{math|''n'' ≪ ''m''}} के साथ अग्रगामी संचयन की तुलना में उत्क्रम संचयन अधिक कुशल है क्योंकि अग्रगामी संचयन के लिए {{math|''n''}} स्वीप की तुलना में केवल {{math|''m''}} स्वीप आवश्यक है। | ||
बहुपरतीय परसेप्ट्रॉन में त्रुटियों | बहुपरतीय परसेप्ट्रॉन में त्रुटियों की [[ पश्चप्रचार |पश्चसंचरण]], [[ यंत्र अधिगम |यंत्र अधिगम]] में उपयोग की जाने वाली तकनीक, उत्क्रम संचयन की एक विशेष स्थिति है।<ref name="baydin2018automatic" /> | ||
अग्रगामी संचयन की शुरुआत 1964 में आर.ई. वेंगर्ट द्वारा की गई थी।।<ref name="Wengert1964"/> एंड्रियास ग्रिवैंक के अनुसार, 1960 के दशक के उत्तरार्ध से उत्क्रम संचयन का सुझाव दिया गया है, लेकिन आविष्कारक अज्ञात है।<ref name="grie2012">{{cite journal |last=Griewank |first=Andreas |year=2012 |title=Who Invented the Reverse Mode of Differentiation? |journal=Optimization Stories, Documenta Matematica |volume=Extra Volume ISMP |pages=389–400 |url=https://ftp.gwdg.de/pub/misc/EMIS/journals/DMJDMV/vol-ismp/52_griewank-andreas-b.pdf }}</ref> [[सेप्पो लिन्नैनमा]] ने 1976 में उत्क्रम संचयन प्रकाशित किया।<ref name="lin1976">{{cite journal |last=Linnainmaa |first=Seppo |year=1976 |title=संचित गोलाई त्रुटि का टेलर विस्तार|journal=BIT Numerical Mathematics |volume=16 |issue=2 |pages=146–160 |doi=10.1007/BF01931367 |s2cid=122357351 }}</ref> | |||
=== आगे संचय === | === आगे संचय === | ||
Revision as of 23:22, 25 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, बीज मान इस पर सेट किया जाना चाहिए,
Operations to compute value Operations to compute derivative (seed) (seed)
इस उदाहरण फलन के ग्रेडियेंट की गणना करने के लिए, जिसकी न केवल आवश्यकता है लेकिन , बीज मानों का उपयोग करके अभिकलनीय ग्राफ़ पर एक अतिरिक्त स्वीप किया जाता है .
कार्यान्वयन
छद्म कोड
अग्रगामी संचयनन एक पास में फलन और व्युत्पन्न (लेकिन केवल एक स्वतंत्र चर के लिए) की गणना करता है। संबंधित विधि कॉल एक चर V के संबंध में अभिव्यक्ति Z को प्राप्त करने की अपेक्षा करती है। विधि मूल्यांकन किए गए फलन और इसकी व्युत्पत्ति की एक जोड़ी लौटाती है। यह विधि एक चर तक पहुंचने तक अभिव्यक्ति वृक्ष को पुनरावर्ती रूप से पार करती है। यदि इस चर के संबंध में व्युत्पन्न का अनुरोध किया जाता है, तो इसका व्युत्पन्न 1, 0 है अन्यथा। फिर आंशिक फलन के साथ-साथ आंशिक अवकलज का मूल्यांकन किया जाता है।[6] <सिंटैक्सहाइलाइट लैंग= सी++ > टपल<फ्लोट,फ्लोट> eval(अभिव्यक्ति Z, अभिव्यक्ति 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'};
} </सिंटैक्सहाइलाइट>
सी++
<सिंटैक्सहाइलाइट लैंग= सी++ >
- शामिल करें <iostream>
- शामिल <स्ट्रिंग>
- शामिल <मानचित्र>
टाइपडिफ स्ट्रक्चर डुअल {फ्लोट वी,डी; } दोहरा; संरचना अभिव्यक्ति {
वर्चुअल डुअल इवल(std,,map<std,,string,float> &vals, Expression *v) { return {0,0}; };
}; स्ट्रक्चर प्लस, सार्वजनिक अभिव्यक्ति {
अभिव्यक्ति *ए, *बी;
प्लस(अभिव्यक्ति *ए, अभिव्यक्ति *बी), ए{ए}, बी{बी} {}
दोहरी eval(std,,map<std,,string,float> &vals, अभिव्यक्ति *v) {
दोहरी x=a->eval(vals,v);
दोहरी y=b->eval(vals,v);
वापसी {x.v+y.v, x.d+y.d};
}
}; संरचना मूल, सार्वजनिक अभिव्यक्ति {
अभिव्यक्ति *ए, *बी;
मूल(अभिव्यक्ति *ए, अभिव्यक्ति *बी), ए{ए}, बी{बी} {}
दोहरी eval(std,,map<std,,string,float> &vals, अभिव्यक्ति *v) {
दोहरी x=a->eval(vals,v);
दोहरी y=b->eval(vals,v);
वापसी {x.v*y.v, x.d*y.v+x.v*y.d};
}
}; संरचना वार, सार्वजनिक अभिव्यक्ति {
एसटीडी,,स्ट्रिंग एस;
Var(std,,string s)), s{s} {}
दोहरी eval(std,,map<std,,string,float> &vals, अभिव्यक्ति *v) {
वापसी {vals[s], this==v?1.0f,0.0f};
}
}; मुख्य प्रवेश बिंदु (){
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)); वर x( x ), y( y ), z( z ); मूल m1(&x,&z); मूल m2(&y,&z); प्लस 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;
} </सिंटैक्सहाइलाइट>
विपरीत संचय
फ़ाइल,AutoDiff.webp|अंगूठा उत्क्रम संचयन एडी में, विभेदित किए जाने वाले आश्रित चर को तय किया जाता है और व्युत्पन्न की गणना प्रत्येक उप-अभिव्यक्ति (गणित) के संबंध में पुनरावर्ती रूप से की जाती है। कलम और कागज की गणना में, बाहरी कार्यों के व्युत्पन्न को श्रृंखला नियम में बार-बार प्रतिस्थापित किया जाता है,
उत्क्रम संचयन श्रृंखला नियम को बाहर से अंदर तक, या चित्र 3 में अभिकलनीय ग्राफ के मामले में, ऊपर से नीचे तक पार करता है। उदाहरण फलन स्केलर-मूल्यवान है, और इस प्रकार व्युत्पन्न गणना के लिए केवल एक बीज है, और (दो-घटक) ग्रेडिएंट की गणना करने के लिए अभिकलनीय ग्राफ के केवल एक स्वीप की आवश्यकता होती है। अग्रगामी संचयन की तुलना में यह केवल स्पेस-टाइम ट्रेडऑफ़ है, लेकिन उत्क्रम संचयन के लिए मध्यवर्ती चर के भंडारण की आवश्यकता होती है wi साथ ही वे निर्देश जो उन्हें डेटा संरचना में उत्पादित करते हैं जिन्हें टेप या वेंगर्ट सूची के रूप में जाना जाता है[7] (हालाँकि, वेंगर्ट ने आगे संचयन प्रकाशित किया, न कि उत्क्रम संचय[3]), जो अभिकलनीय ग्राफ़ बड़ा होने पर महत्वपूर्ण मेमोरी का उपभोग कर सकता है। मध्यवर्ती चरों के केवल एक उपसमूह को संग्रहीत करके और फिर मूल्यांकन को दोहराकर आवश्यक कार्य चरों का पुनर्निर्माण करके इसे कुछ हद तक कम किया जा सकता है, एक तकनीक जिसे पुनर्भौतिकीकरण के रूप में जाना जाता है। चेकपॉइंटिंग योजना का उपयोग मध्यस्थ राज्यों को बचाने के लिए भी किया जाता है।
रिवर्स संचय का उपयोग करके व्युत्पन्न की गणना करने के संचालन को नीचे दी गई तालिका में दिखाया गया है (उल्टे क्रम पर ध्यान दें):
- Operations to compute derivative
किसी गणना के डेटा प्रवाह ग्राफ़ को उसकी मूल गणना के ग्रेडिएंट की गणना करने के लिए हेरफेर किया जा सकता है। यह प्रत्येक प्राइमल नोड के लिए एक एडजॉइंट नोड जोड़कर किया जाता है, जो एडजॉइंट किनारों से जुड़ा होता है जो कि प्राइमल किनारों के समानांतर होता है लेकिन विपरीत दिशा में बहता है। निकटवर्ती ग्राफ में नोड्स प्रारंभिक में नोड्स द्वारा गणना किए गए कार्यों के अवकलज द्वारा गुणा का प्रतिनिधित्व करते हैं। उदाहरण के लिए, मूल में जोड़ के कारण जोड़ में फैनआउट हो जाता है; मूल में फ़ैनआउट के कारण जोड़ में वृद्धि होती है;[lower-alpha 1] एक यूनरी ऑपरेशन फलन y = f(x) मौलिक कारणों में x̄ = ȳ f′(x) सन्निकट में; वगैरह।
कार्यान्वयन
छद्म कोड
उत्क्रम संचयन के लिए दो पास की आवश्यकता होती है, फॉरवर्ड पास में, फलन का पहले मूल्यांकन किया जाता है और आंशिक परिणाम कैश किए जाते हैं। उत्क्रम पास में, आंशिक अवकलज की गणना की जाती है और पहले से प्राप्त मूल्य को बैकप्रोपेगेट किया जाता है। संबंधित विधि कॉल से अपेक्षा की जाती है कि अभिव्यक्ति Z को व्युत्पन्न किया जाए और मूल अभिव्यक्ति के व्युत्पन्न मूल्य के साथ बीजित किया जाए। शीर्ष अभिव्यक्ति के लिए, Z, Z के संबंध में व्युत्पन्न, यह 1 है। विधि अभिव्यक्ति वृक्ष को पुनरावर्ती रूप से पार करती है जब तक कि एक चर तक नहीं पहुंच जाता है और व्युत्पन्न अभिव्यक्ति में वर्तमान बीज मान जोड़ता है।[8][9] <सिंटैक्सहाइलाइट लैंग= सी++ > शून्य व्युत्पन्न (अभिव्यक्ति Z, फ्लोट बीज) {
यदि (Z = X + Y)
व्युत्पन्न (एक्स, बीज);
व्युत्पन्न (वाई, बीज);
अन्यथा यदि (Z = X - Y)
व्युत्पन्न (एक्स, बीज);
व्युत्पन्न(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)
सी++
<सिंटैक्सहाइलाइट लैंग= सी++ >
- शामिल करें <iostream>
- शामिल <स्ट्रिंग>
- शामिल <मानचित्र>
संरचना अभिव्यक्ति {
आगे तैरना = 0, पीछे = 0;
वर्चुअल फ्लोट eval(std,,map<std,,string,float> &vals) = 0;
आभासी शून्य वापस(फ्लोट बीज) {पिछड़ा+=बीज; };
}; स्ट्रक्चर प्लस, सार्वजनिक अभिव्यक्ति {
अभिव्यक्ति *ए, *बी;
प्लस(अभिव्यक्ति *ए, अभिव्यक्ति *बी), ए{ए}, बी{बी} {}
फ्लोट eval(std,,map<std,,string,float> &vals) {
पिछड़ा=0;
फॉरवर्ड=a->eval(vals); फॉरवर्ड+=बी->ईवल(वैल);
आगे लौटें;
}
शून्य वापस (फ्लोट बीज) {
अभिव्यक्ति,,वापस(बीज);
ए->वापस(बीज);
बी->वापस(बीज);
}
}; संरचना मूल, सार्वजनिक अभिव्यक्ति {
अभिव्यक्ति *ए, *बी;
मूल(अभिव्यक्ति *ए, अभिव्यक्ति *बी), ए{ए}, बी{बी} {}
फ्लोट eval(std,,map<std,,string,float> &vals) {
पिछड़ा=0;
फॉरवर्ड=a->eval(vals); आगे*=b->eval(vals);
आगे लौटें;
}
शून्य वापस (फ्लोट बीज) {
अभिव्यक्ति,,वापस(बीज);
a->पीछे(बीज * b->आगे);
बी->पीछे(बीज * ए->आगे);
}
}; संरचना वार, सार्वजनिक अभिव्यक्ति {
एसटीडी,,स्ट्रिंग एस;
Var(std,,string s)), s{s} {}
फ्लोट eval(std,,map<std,,string,float> &vals) {
फॉरवर्ड=वैल्स[एस];
पिछड़ा=0;
आगे लौटें;
}
शून्य वापस (फ्लोट बीज) {
अभिव्यक्ति,,वापस(बीज);
std,,cout << s <<t, << पिछड़ा << ,�;
}
}; मुख्य प्रवेश बिंदु (){
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)); वर x( x ), y( y ), z( z ); मूल m1(&x,&z); मूल m2(&y,&z); प्लस p(&m1,&m2); // x*z+y*z std,,cout << p.eval(dict) << std,,endl; पी.बैक(1); std,,cout << std,,endl; वापसी 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