2010-05-22 18 views
12

मैं कार्यात्मक प्रोग्रामिंग में नौसिखिया हूं।कार्यात्मक प्रोग्रामिंग में बिग डेटास्ट्रक्चर

मेरे पास हजारों न्यूरॉन्स के साथ एक विशाल तंत्रिका नेटवर्क है और न्यूरॉन्स के बीच हर कनेक्शन का वजन है। मुझे इन वजनों को अक्सर सीखना है, सीखने के सत्र में कई हज़ार बार।

क्या एफपी अभी भी लागू है? मेरा मतलब है कि एफपी में हम वैरिएबल को संशोधित नहीं कर सकते हैं और केवल नए वैरिएबल को वापस करने में सक्षम हैं जो पिछले मानों को नहीं बदल रहे हैं। क्या इसका मतलब है कि मुझे हर वजन अद्यतन पर पूरे नेटवर्क को फिर से बनाना है?

उत्तर

18

क्या एफपी अभी भी लागू है?

आप निश्चित रूप से सभ्य asymptotic एल्गोरिथम दक्षता के साथ एक कार्यात्मक शैली में यह लिख सकते हैं, लेकिन आप 10 × एक सभ्य जरूरी समाधान के प्रदर्शन से प्राप्त होने की संभावना है क्योंकि विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग यह मुश्किल सीपीयू कैश प्रभावी ढंग से उपयोग करने के लिए बनाता है नहीं कर रहे हैं।

मेरा मतलब है fp में हम चर को संशोधित नहीं कर सकते हैं और केवल नए मानों को वापस करने में सक्षम नहीं हैं जो पिछले मानों को नहीं बदलते हैं। क्या इसका मतलब है कि मुझे हर वजन अद्यतन पर पूरे नेटवर्क को फिर से बनाना है?

नहीं है, दो कारणों के लिए:

  1. पूरी तरह कार्यात्मक डेटा संरचनाओं कुशलतापूर्वक अद्यतन किया जा सकता है क्योंकि वे कई छोटे रिकर्सिवली परिभाषित संरचनाओं में बड़ी संरचनाओं (जैसे एक हैश तालिका) विघटित (जैसे एक संतुलित बाइनरी पेड़)। जब आप एक अपरिवर्तनीय पेड़ के भीतर एक एकल नोड को अपडेट करते हैं, तो आप रूट से गंतव्य तक पथ में प्रत्येक नोड से डेटा कॉपी करते हैं, लेकिन ज्ञान के संदर्भ में सभी अन्य शाखाओं को संदर्भ में सुरक्षित करते हैं कि उन्हें आपके नीचे बदला नहीं जा सकता क्योंकि वे अपरिवर्तनीय हैं । तो आप केवल ओ (लॉग एन) ओ (एन) के बजाय काम करते हैं।

  2. शुद्ध रूप से कार्यात्मक डेटा संरचनाएं आमतौर पर map जैसे कार्यों की पेशकश करती हैं जो प्रत्येक तत्व को उसी तरह अद्यतन करने की अनुमति देती हैं और स्रोत पेड़ की संरचना की प्रतिलिपि बनाकर पुनर्वितरण से बचती हैं। तो n के लिए समय O (n) ओ (एन लॉग एन) के बजाय अद्यतन है।

तो तुम लेकिन निरपेक्ष दृष्टि से, आप अधिक स्थान और एक अनिवार्य समाधान के रूप में समय के रूप में कई बार उपयोग किया जाएगा समान या भी बराबर asymptotic समय जटिलता को प्राप्त करने में सक्षम होना चाहिए। मैंने इन मूलभूत बातें को मेरी पुस्तक Visual F# 2010 for Technical Computing में विस्तार से वर्णित किया है और मैंने Artificial Intelligence: Neural Networks (8th May 2010) को OCaml Journal के लिए आलेख लिखा था।

2

Haskell arrays में देखें जिसमें एक मोनड में परिवर्तनीय रूप शामिल हैं।

1

वजन घटाने के हर बार आपको पूरे नेटवर्क को फिर से बनाने की आवश्यकता नहीं है। संभवतः, आपके न्यूरॉन्स को व्यक्तिगत वस्तुओं के रूप में मॉडलिंग किया जाता है - इसका मतलब है कि एक व्यक्तिगत न्यूरॉन को "अपडेट" करने के लिए, आप वास्तव में अद्यतन वजन के साथ एक नया न्यूरॉन बनायेंगे। फिर इस न्यूरॉन को पुराने स्थान के स्थान पर नेटवर्क में डाला जाएगा, जो बदले में कचरा कलेक्टर द्वारा पुनर्विचार के लिए स्वतंत्र होगा।

मैं परिवर्तनीय स्थिति का उपयोग करने के विचार से सहमत नहीं हूं। कार्यात्मक भाषाओं को पता है कि वे कार्यात्मक हैं, इसलिए वे कार्यात्मक प्रोग्रामिंग के लिए अनुकूलन करते हैं। यदि एक कार्यात्मक भाषा वास्तव में नौकरी के लिए सबसे अच्छा उपकरण है, तो इसके लाभों का लाभ उठाएं।

+0

मान लें कि मुझे सरल पेड़ मिला है: रूट | \ नोड 1 नोड 2 तो अगर मैं नोड 3 बना देता हूं और नोड 3 को नोड 3 के साथ बदलता हूं, तो इसका मतलब यह नहीं है कि मैं पूरे पेड़ को बदल रहा हूं? –

+0

आपके उदाहरण के साथ दो चीजें गलत हैं। सबसे पहले, आपकी पोस्ट पूछती है कि क्या आपको प्रत्येक वजन अपडेट के लिए पूरे नेटवर्क को फिर से बनाने की आवश्यकता है, भले ही यह "परिवर्तन" न हो। मैंने इस मुद्दे को मेरे जवाब में संबोधित किया। दूसरा, आपने इसे इतना छोटा बना दिया कि प्रत्येक नोड में कुछ बदलाव आया है। कल्पना करें कि आपके पास 1000 नोड्स का नेटवर्क है, और उनमें से केवल एक को प्रतिस्थापित करने की आवश्यकता है। क्या आप अभी भी पूरे पेड़ को बदल रहे हैं? – danben

+0

अपने शब्दों को न करें "फिर इस न्यूरॉन को पुराने स्थान पर नेटवर्क में डाला जाएगा" मतलब है कि तंत्रिका नेटवर्क वास्तव में बदलता है? मेरा मतलब है कि पूरे हिस्से को बदलना - क्या यह वैरिएबल में बदलाव नहीं है (इस मामले में तंत्रिका नेट)? –

1

यदि आप अपने डेटा को इस तरह से बनाते हैं कि आप अपने तंत्रिका नेटवर्क को मॉडल करने के लिए एक सतत डेटा संरचना का उपयोग कर सकते हैं, तंत्रिका नेटवर्क के कार्यात्मक अपडेट सस्ते होंगे (कम से कम पूरी चीज की प्रतिलिपि बनाने की तुलना में)।

यदि यह अभी भी पर्याप्त तेज़ नहीं है, तो आपकी भाषा अन्य तकनीकों (जैसे उत्परिवर्तन के सावधानीपूर्वक उपयोग) को गति देने की अनुमति दे सकती है; उदाहरण के लिए, यदि आप क्लोजर का उपयोग कर रहे थे, तो आप ट्रांजिस्टर का उपयोग कुछ अतिरिक्त गति से कर सकते हैं।

संबंधित मुद्दे