2010-05-22 16 views
9

में गणित गणना मैं एक तंत्रिका जावा में लिखा नेटवर्क इस प्रकार एक अवग्रह हस्तांतरण समारोह में परिभाषित का उपयोग करता है जो है:बढ़ाता जावा

private static double sigmoid(double x) 
{ 
    return 1/(1 + Math.exp(-x)); 
} 

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

+3

क्या एक्स के मान कभी दोहराए गए हैं या क्या यह संभव है कि जब भी विधि कहा जाता है तो वे हमेशा अलग होंगे? – DaveJohnston

+0

इसके अलावा, परिणाम कितना सटीक होना चाहिए? –

+0

@ डेव - वांछित सटीकता पर निर्भर करता है, लेकिन वे सभी फ़्लोटिंग पॉइंट नंबर हैं, इसलिए बहुत अधिक अद्वितीय – Simon

उत्तर

20

तंत्रिका नेटवर्क के लिए, आपको सिग्मोइड फ़ंक्शन के सटीक मूल्य की आवश्यकता नहीं है। तो आप 100 मानों को पूर्ववत कर सकते हैं और अपने इनपुट के सबसे नज़दीकी मूल्य का पुन: उपयोग कर सकते हैं, या इससे भी बेहतर (जैसा कि एक टिप्पणी के रूप में कहा गया है) पड़ोसी मूल्यों से एक इंटरपोलेशन करते हैं।

आप यह कैसे कर सकते हैं यह article (answer of s-lott से चोरी हुआ लिंक) में वर्णित है।

यह अवग्रह समारोह है: Sigmoid function graph

आप देख सकते हैं, -10 < एक्स < 10 में केवल मूल्यों पर सभी दिलचस्प हैं। और, जैसा कि एक और टिप्पणी ने कहा, समारोह सममित है। आपको केवल मूल्यों का आधा हिस्सा ही स्टोर करना होगा।


संपादित करें: मैं माफी चाहता हूँ कि मैं गलत ग्राफ यहाँ दिखाया। मैंने इसे सही कर दिया है।

+1

यदि आप थोड़ी अधिक सटीकता चाहते हैं तो शायद 100 से अधिक कुछ हो सकता है। 5000 (लेकिन शायद 1000 भी) मानों की लुकअप टेबल पूरी तरह से पर्याप्त IMHO होगी। – nico

+2

अधिक सटीकता के लिए, निकटतम दो मानों के बीच रैखिक इंटरपोलेशन करना शायद बेहतर है। –

+2

समस्या सममित है, इसलिए आपको केवल आधा मानों की आवश्यकता है। दूसरी तरफ की गणना तुच्छ है। –

0

गणित के दृष्टिकोण से, मुझे इसे अनुकूलित करने की कोई संभावना नहीं दिखती है।

1

यह एक बहुत ही आसान काम है, इसलिए एक लुकअप और इंटरपोलेशन योजना पर्याप्त से अधिक होने की संभावना है।

जब मैं -10 <= x <= 10 की सीमा पर फ़ंक्शन को साजिश करता हूं, तो मुझे चरम पर पांच स्थान सटीकता मिलती है। क्या यह आपके आवेदन के लिए पर्याप्त है?

5

आप नोड्स का एक बहुत है, तो जहां एक्स का मान -10 .. + 10 बॉक्स के बाहर है, तो आप सिर्फ उन मूल्यों बिल्कुल, है, तो तरह की गणना करने के उदाहरण के लिए छोड़ सकते हैं ..

if(x < -10) 
    y = 0; 
else if(x > 10) 
    y = 1; 
else 
    y = 1/(1 + Math.exp(-x)); 
return y; 

बेशक, यह प्रत्येक गणना के लिए सशर्त चेक के ऊपरी हिस्से में पड़ता है, इसलिए यह केवल सार्थक है यदि आपके पास बहुत से संतृप्त नोड्स हैं।

उल्लेख करने योग्य एक और बात यह है कि, यदि आप बैकप्रोपैगेशन का उपयोग कर रहे हैं, और आपको फ़ंक्शन की ढलान से निपटना होगा, तो इसे 'लिखित' के बजाय टुकड़ों में गणना करना बेहतर होगा।

मुझे इस समय ढलान को याद नहीं किया जा सकता है, लेकिन उदाहरण के तौर पर मैं द्विध्रुवीय सिग्मोइड का उपयोग करने के बारे में बात कर रहा हूं। के बजाय इस तरह

y = (1 - exp(-x))/(1 + exp(-x)); 

जो दो बार exp() हिट की गणना, आप अस्थायी चर में महंगा गणना अप कैश कर सकते, तो

temp = exp(-x); 
y = (1 - temp)/(1 + temp); 

जैसी जगहों के बहुत बात की इस तरह डाल करने के लिए कर रहे हैं बीपी नेट में उपयोग करने के लिए।

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