Towards Bottom-Up Enumeration in miniKanren via Pruning and Memoization
यह शोध पत्र दो miniKanren लाइब्रेरी कॉम्बिनेटर्स, `prute` और `defrel/bank` को प्रस्तुत करता है, जो गहरे लक्ष्यों (deep targets) पर रिलेशनल प्रोग्राम सिंथेसिस के प्रदर्शन को महत्वपूर्ण रूप से सुधारने के लिए ऑब्जर्वेशनल डिडुप्लिकेशन (observational deduplication) और मेमोइज़ेशन (memoization) के साथ बॉटम-अप एन्यूमरेशन को सक्षम करते हैं, साथ ही उन मामलों को संबोधित करने के लिए एक वेटेड वेरिएंट का भी प्रस्ताव देते हैं जहाँ कैनोनिकल डेप्थ-फर्स्ट ऑर्डरिंग कॉम्पैक्ट रिप्रेजेंटेटिव्स खोजने में विफल रहती है।
मूल पेपर CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) के तहत लाइसेंस किया गया है। नीचे दिए गए पेपर की यह व्याख्या AI से तैयार की गई है। इसे लेखकों ने न तो लिखा है, न इसका समर्थन किया है। तकनीकी सटीकता के लिए मूल पेपर देखें। पूरा डिस्क्लेमर पढ़ें
कल्पना कीजिए कि आप एक जासूस हैं जो एक रहस्य सुलझाने की कोशिश कर रहे हैं, लेकिन सुराग खोजने के बजाय, आप एक ऐसी मशीन बनाने की कोशिश कर रहे हैं जो एक विशिष्ट काम कर सके, जैसे संख्या 2 को 4 में, 3 को 9 में और 4 को 16 में बदलना। आप सटीक फॉर्मूला नहीं जानते कि मशीन क्या उपयोग करती है; आप केवल परिणाम जानते हैं। इसे "प्रोग्रामिंग बाय एग्जांपल" (उदाहरण द्वारा प्रोग्रामिंग) कहा जाता है। उत्तर खोजने के लिए, आप हर संभव मशीन को एक-एक करके, सबसे सरल गियर और लीवरों से शुरू करते हुए बनाने की कोशिश कर सकते हैं और प्रत्येक का परीक्षण कर सकते हैं कि क्या वह काम करती है। यह एक शेफ की तरह है जो आटे, चीनी और अंडों के हर संभावित संयोजन को तब तक बेक करके गुप्त रेसिपी खोजने की कोशिश करता है जब तक कि एक सही स्वाद न मिल जाए।
कंप्यूटर विज्ञान की दुनिया में, सोचने का एक विशेष तरीका है जिसे "रिलेशनल प्रोग्रामिंग" कहा जाता है। यह बताने के बजाय कि कंप्यूटर को चरण-दर-चरण उत्तर कैसे खोजना है, आप वर्णन करते हैं कि उत्तर कैसा दिखता है, और कंप्यूटर को रास्ता खोजने देते हैं। यह एक रोबोट को बताने जैसा है, "मेरे लिए भूलभुलैया के माध्यम से एक रास्ता खोजो," बजाय इसके कि "बाएं मुड़ें, फिर तीन कदम चलें, फिर दाएं मुड़ें।" कंप्यूटर एक साथ कई रास्तों को खोजने में बहुत अच्छा है, लेकिन इसकी एक अजीब आदत है: यह बार-बार एक ही डेड एंड (बंद रास्ते) को खोजने या एक लंबे, घुमावदार टनल में फंस जाने की प्रवृत्ति रखता है, जबकि उसके ठीक बगल में एक छोटा, चतुर शॉर्टकट मौजूद हो सकता है। यह पेपर इसी समस्या को हल करता है, यह सिखाकर कि कंप्यूटर को एक स्मार्ट और अधिक व्यवस्थित खोजकर्ता कैसे बनाया जाए।
समस्या: भूलभुलैया में खो जाना
कल्पना कीजिए कि आप लाखों चाबियों से भरी एक विशाल, अस्त-व्यस्त अटारी में एक विशिष्ट चाबी खोजने की कोशिश कर रहे हैं। इनमें से अधिकांश चाबियाँ अलग दिखती हैं, लेकिन वे सभी एक ही दरवाजे को खोलती हैं। यदि आप एक अनाड़ी खोजकर्ता हैं, तो आप एक चाबी उठा सकते हैं, उसे आजमा सकते हैं, एहसास कर सकते हैं कि यह काम करती है, और फिर यह सुनिश्चित करने के लिए अन्य चाबियाँ उठाने में घंटों बिता सकते हैं जो अलग दिखती हैं लेकिन फिर भी काम करती हैं। आप उन चाबियों की जांच करने में समय बर्बाद कर रहे हैं जो बिल्कुल एक ही काम करती हैं।
कंप्यूटर प्रोग्रामों की दुनिया में, यह हमेशा होता है। जब एक कंप्यूटर इनपुट को आउटपुट में बदलने के लिए एक प्रोग्राम बनाने की कोशिश करता है, तो वह हजारों अलग-अलग दिखने वाले कोड स्निपेट्स (कोड के टुकड़े) बनाता है। इनमें से कई स्निपेट्स "जुड़वां" होते हैं—वे अंदर से अलग दिखने के बावजूद बिल्कुल एक ही काम करते हैं। एक मानक कंप्यूटर खोज विधि, जो एक गहरे गोता लगाने वाले खोजकर्ता की तरह काम करती है, एक जुड़वां को चेक करेगी, फिर दूसरे को, फिर अगले को, जिससे वह धीरे-धीरे धीमी होती जाएगी। यह घास के ढेर में सुई खोजने जैसा है, लेकिन घास का ढेर लाखों सुइयों से बना है जो सभी थोड़ी अलग दिखती हैं।
समाधान: "प्रून" (छंटनी) और "बैंक"
इस पेपर के लेखक, निकोलाई कुडासोव ने इस गड़बड़ी को ठीक करने के लिए दो चतुर उपकरण दिए हैं। इन्हें एक जादुई फिल्टर और एक स्मार्ट लाइब्रेरी के रूप में सोचें।
1. "प्रून" टूल (द फिल्टर)
कल्पना कीजिए कि एक मशीन से बाहर आती चाबियों का एक कन्वेयर बेल्ट है। "प्रून" टूल उस बेल्ट के पास खड़ा एक गार्ड है। जैसे ही प्रत्येक चाबी आती है, गार्ड यह जांचता है कि वह कौन सा दरवाजा खोलती है। यदि गार्ड ने पहले ही एक ऐसी चाबी देख ली है जो वही दरवाजा खोलती है, तो वह उस नई चाबी को बिना टेस्ट किए ही कचरे में फेंक देता है। वे केवल उस विशिष्ट दरवाजे को खोलने वाली पहली चाबी को रखते हैं। इस तरह, कन्वेयर बेल्ट केवल अद्वितीय, उपयोगी चाबियाँ ले जाता है। कंप्यूटर डुप्लिकेट्स पर समय बर्बाद करना बंद कर देता है।
2. "बैंक" टूल (द स्मार्ट लाइब्रेरी)
अब, कल्पना कीजिए कि हर बार जब आपको एक चाबी की आवश्यकता होती है, तो उसे शून्य से बनाने के बजाय, आपके पास एक जादुई लाइब्रेरी है। जब आप लाइब्रेरी से एक चाबी मांगते हैं, तो वह केवल एक नहीं देती; बल्कि वह एक बार, नीचे से ऊपर की ओर बढ़ते हुए, अद्वितीय चाबियों की एक पूरी शेल्फ बनाती है और उन्हें सहेज लेती है। यदि आप बाद में फिर से किसी चाबी के लिए पूछते हैं, तो लाइब्रेरी बस वही चाबी आपको थमा देती है जो उसने पहले ही बना ली थी।
पेपर की भाषा में, इसे defrel/bank कहा जाता है। यह कंप्यूटर को अपने उम्मीदवार प्रोग्रामों की सूची एक विशिष्ट, व्यवस्थित तरीके से बनाने (सबसे सरल से शुरू करते हुए) और परिणामों को सहेजने के लिए मजबूर करता है। यदि कंप्यूटर को बाद में एक प्रोग्राम के छोटे हिस्से का उपयोग करने की आवश्यकता होती है, तो वह उसे फिर से नहीं बनाता है; वह बस उस हिस्से को "बैंक" से उठा लेता है। यह बहुत सारा समय बचाता है क्योंकि कंप्यूटर को कभी भी एक ही काम दोबारा नहीं करना पड़ता।
ट्विस्ट: कभी-कभी "तेज़" होना "सर्वश्रेष्ठ" नहीं होता
लेखकों ने यह भी महसूस किया कि केवल व्यवस्थित होना हमेशा पर्याप्त नहीं होता है। कभी-कभी, "बैंक" अपनी शेल्फ को ऐसे क्रम में बनाता है जो कंप्यूटर के लिए तेज़ है लेकिन इंसान के लिए धीमा है। उदाहरण के लिए, बैंक पहले सभी "गुणा" (multiplication) वाली मशीनें बना सकता है, और बहुत बाद में "जोड़" (addition) वाली मशीनें बना सकता है। यदि आप जिस उत्तर की तलाश कर रहे हैं वह एक "जोड़" वाली मशीन है, तो कंप्यूटर को उस एक को खोजने से पहले हजारों गुणा मशीनों को चेक करने में समय लग सकता है।
इसे ठीक करने के लिए, उन्होंने तीसरा उपकरण बनाया जिसे defrel/bank-w ("वेटेड" बैंक) कहा जाता है। यह टूल एक ऐसे लाइब्रेरियन की तरह है जो जानता है कि कुछ प्रकार की चाबियाँ उत्तर होने की अधिक संभावना रखती हैं। यह यह तय करने के लिए एक विशेष "स्कोर" का उपयोग करता है कि कौन सी चाबियाँ आपको पहले दिखानी हैं। यह आपको सबसे सरल, सबसे संक्षिप्त चाबियाँ पहले दिखाने की कोशिश करता है, भले ही वे लाइब्रेरी में गहराई में दबी हों। यह बहुत अच्छा है यदि आप सबसे सुंदर समाधान चाहते हैं, लेकिन यह धीमा हो सकता है यदि उत्तर वास्तव में एक जटिल, गहरी मशीन है।
उन्होंने क्या पाया: गति बनाम रणनीति
लेखकों ने गणित और स्ट्रिंग पहेलियों (जैसे "Hello" को "Hello, World!" में बदलना) के एक सेट पर इन उपकरणों का परीक्षण किया। यहाँ उन्होंने क्या खोजा:
- "बैंक" एक स्पीड डेमन (गति का दैत्य) है: 8 कठिन गणितीय समस्याओं में से 6 पर,
defrel/bankटूल पुराने, मानक खोज तरीके की तुलना में 9 से 99 गुना तेज़ था। यह इतना तेज़ था कि इसने उन समस्याओं को सेकंड के एक अंश में हल कर दिया जिन्हें पुराने तरीके को पूरा करने में मिनटों लग जाते थे। - लेकिन इसकी एक कमजोरी है: बैंक इतना व्यवस्थित है कि यह कभी-कभी उत्तर को मिस कर देता है यदि वह उत्तर लाइब्रेरी के उस हिस्से में छिपा है जिसे वह देर से देखता है। उदाहरण के लिए, यदि उत्तर में संख्याओं को एक विशिष्ट तरीके से जोड़ना शामिल है (जैसे ), तो बैंक हजारों गुणा उदाहरणों को चेक करने में फंस सकता है। इन मामलों में, पुराना, धीमा तरीका वास्तव में जीत जाता है क्योंकि वह एक अलग क्रम में चीजें चेक करता है।
- "वेटेड" बैंक एक समझौता है:
defrel/bank-wटूल सबसे संक्षिप्त, सुंदर उत्तर खोजने में उत्कृष्ट है। इसने एक पेचीदा स्ट्रिंग पहेली के लिए सही उत्तर 10.4 मिलीसेकंड में खोज लिया, जो मानक पद्धति के 31.5 मिलीसेकंड को हरा देता है। हालाँकि, बहुत गहरी गणितीय समस्याओं के लिए, यह बहुत सारी संभावनाओं को चेक करने की कोशिश में फंस गया और टाइम आउट हो गया।
निष्कर्ष
यह पेपर यह दावा नहीं करता कि इसने कंप्यूटर विज्ञान की हर समस्या को हल कर लिया है। इसके बजाय, यह दिखाता है कि थोड़ा सा "प्रूनिंग" (डुप्लिकेट्स को फ़िल्टर करना) और "बैंकिंग" (काम को बाद के लिए सहेजना) जोड़कर, हम अन्य प्रोग्राम बनाने वाले कंप्यूटर प्रोग्रामों को बहुत, बहुत तेज़ बना सकते हैं।
लेखक सुझाव देते हैं कि यदि आप पहेलियाँ सुलझाने के लिए एक सिस्टम बना रहे हैं, तो आपको Bank टूल को अपना डिफ़ॉल्ट बनाना चाहिए क्योंकि यह आमतौर पर सबसे तेज़ होता है। हालाँकि, यदि आप एक बहुत ही विशिष्ट, संक्षिप्त समाधान की तलाश में हैं, या यदि समस्या उथली और सरल है, तो आप Weighted Bank या पुराने तरीके का उपयोग करना चाह सकते हैं। यह केवल एक उपकरण के पूर्ण होने के बारे में नहीं है; यह इस बारे में है कि आपके द्वारा हल की जाने वाली पहेली के आकार के लिए सही उपकरण कौन सा है। पेपर इस सुझाव के साथ समाप्त होता है कि भविष्य के कार्य इन उपकरणों का और भी अधिक जटिल पहेलियों, जैसे कि लिस्ट या टाइप किए गए डेटा को समझने वाले प्रोग्राम बनाने पर परीक्षण करेंगे, ताकि यह देखा जा सके कि क्या यह गति-वृद्धि वास्तविक दुनिया में भी बनी रहती है।
अपने क्षेत्र के पेपरों की भीड़ में उलझे हुए हैं?
आपके रिसर्च कीवर्ड से मेल खाने वाले सबसे नए और अलग सोच वाले पेपरों का रोज़ाना Digest पाएँ—तकनीकी सारांश के साथ, आपकी भाषा में।