प्रवेश संभावनाओं को गुणा करने की तुलना में लॉग संभावनाओं को तेजी से क्यों जोड़ा जा रहा है?


21

कंप्यूटर विज्ञान में प्रश्न को फ्रेम करने के लिए, अक्सर हम कई संभावनाओं के उत्पाद की गणना करना चाहते हैं:

P(A,B,C) = P(A) * P(B) * P(C)

सबसे सरल दृष्टिकोण बस इन संख्याओं को गुणा करना है, और यही मैं करने जा रहा था। हालाँकि, मेरे बॉस ने कहा कि संभावनाओं के लॉग को जोड़ना बेहतर है:

log(P(A,B,C)) = log(P(A)) + log(P(B)) + log(P(C))

यह लॉग संभावना देता है, लेकिन हम यदि आवश्यक हो तो बाद में संभावना प्राप्त कर सकते हैं:

P(A,B,C) = e^log(P(A,B,C))

लॉग इन दो कारणों से बेहतर माना जाता है:

  1. यह "अंडरफ्लो" को रोकता है जिससे संभाव्यता का उत्पाद इतना छोटा हो जाता है कि यह शून्य पर गोल हो जाता है। यह अक्सर जोखिम हो सकता है क्योंकि प्रायः संभावनाएं बहुत छोटी होती हैं।
  2. यह तेज़ है क्योंकि कई कंप्यूटर आर्किटेक्चर गुणा से अधिक तेज़ी से जोड़ सकते हैं।

मेरा प्रश्न दूसरे बिंदु के बारे में है। इस तरह मैंने इसे वर्णित देखा है, लेकिन यह लॉग को प्राप्त करने की अतिरिक्त लागत को ध्यान में नहीं रखता है! हमें "लॉग की लागत + जोड़ की लागत" की तुलना "गुणन की लागत" से की जानी चाहिए। क्या इसे ध्यान में रखने के बाद भी यह छोटा है?

इसके अलावा, विकिपीडिया पृष्ठ ( लॉग संभावना ) इस संबंध में भ्रमित कर रहा है, जिसमें कहा गया है कि "लॉग फॉर्म में रूपांतरण महंगा है, लेकिन केवल एक बार ही खर्च होता है।" मुझे यह समझ में नहीं आता है, क्योंकि मुझे लगता है कि आपको जोड़ने से पहले हर शब्द का लॉग स्वतंत्र रूप से लेना होगा। मुझे किसकी याद आ रही है?

अंत में, यह औचित्य है कि "कंप्यूटर गुणा से अधिक तेजी से प्रदर्शन करते हैं" अस्पष्ट है। क्या यह x86 निर्देश सेट के लिए विशिष्ट है, या यह प्रोसेसर आर्किटेक्चर के कुछ और मौलिक गुण है?


18
पहला लाभ (अंडरफ़्लो से बचना) अक्सर प्रदर्शन लाभ की तुलना में बहुत अधिक महत्वपूर्ण होता है, इसलिए भले ही यह तेज़ न हो लेकिन हम अभी भी लॉग संभावनाओं का उपयोग करेंगे।
DW

@WW ने जो कहा, उस पर विस्तार करने के लिए, एक समान "लॉग-सम-एक्सप-ट्रिक" है जो विशेष रूप से अंडरफ्लो को संबोधित करने के लिए उपयोग किया जाता है, बिना किसी भी प्रदर्शन के। वास्तव में, यह पहली बार था जब मैंने किसी व्यक्ति को प्रदर्शन-सुधार तकनीक के रूप में लघुगणक के संबंध में देखा था!
मेहरदाद

जवाबों:


14

इसके अलावा, विकिपीडिया पृष्ठ ( https://en.wikipedia.org/wiki/Log_probability ) इस संबंध में भ्रमित कर रहा है, जिसमें कहा गया है कि "लॉग फॉर्म में रूपांतरण महंगा है, लेकिन केवल एक बार ही खर्च होता है।" मुझे यह समझ में नहीं आता है, क्योंकि मुझे लगता है कि आपको जोड़ने से पहले हर शब्द का लॉग स्वतंत्र रूप से लेना होगा। मुझे किसकी याद आ रही है?

यदि आप बस एक बार गणना करना चाहते हैं , तो आप सही हैं। आपको लघुगणक और परिवर्धन की गणना करनी होगी , जबकि भोले विधि को गुणन की आवश्यकता होती है।P(A1)P(An)nn1n1

हालाँकि, यह बहुत सामान्य है कि आप फॉर्म के प्रश्नों का उत्तर देना चाहते हैं:

कुछ सबसेट के लिए गणना करें ।iIP(Ai)I{1,n}

उस स्थिति में, आप अपने डेटा को केवल एक बार all गणना करने के लिए कर सकते हैं , और आपके द्वारा किए गए प्रश्न का उत्तर दे सकते हैंअतिरिक्त।logP(Ai)|I|

अंत में, यह औचित्य है कि "कंप्यूटर गुणा से अधिक तेजी से प्रदर्शन करते हैं" अस्पष्ट है। क्या यह x86 निर्देश सेट के लिए विशिष्ट है, या यह प्रोसेसर आर्किटेक्चर के कुछ और मौलिक गुण है?

यह एक व्यापक प्रश्न है। सामान्य तौर पर यह (शायद?) इसके अलावा गुणा की गणना करना कठिन है। गणना और (तुच्छ एल्गोरिथ्म का उपयोग करके) के आकार में रैखिक है , जबकि हम वर्तमान में ही समय की जटिलता के साथ (बार सबसे अच्छे एल्गोरिदम की जाँच करें ) की गणना करना नहीं जानते हैं ।a+baba×b

बेशक कोई निश्चित उत्तर नहीं है: उदाहरण के लिए यदि आप केवल पूर्णांकों से निपटते हैं और आप शक्तियों से गुणा करते हैं , तो आपको ऐड ऑपरेशंस के साथ शिफ्ट की तुलना करनी चाहिए।2

फिर भी यह सभी सामान्य कंप्यूटर आर्किटेक्चर पर एक उचित कथन है: फ्लोटिंग-पॉइंट नंबरों पर गुणा इसके अलावा धीमा होगा।


1
क्या आपको सभी संभावनाओं लिए लघुगणक की गणना करने के लिए आवश्यक समय जटिलता की भी आवश्यकता नहीं है ? P(Ai)
डेविड सी।

अंतिम एक्सप () के बारे में क्या? क्या यह धीमा नहीं है?
मेहरदाद

@ डेविड: मैंने समग्र समय की जटिलता की गणना करने की कोशिश नहीं की। मैंने सिर्फ इस सवाल का जवाब दिया "इसके अलावा गुणा भी तेज है"। लेकिन सॉफ्टवेयर स्केल पर फ्लोटिंग-पॉइंट नंबरों के सामान्य कंप्यूटिंग लॉगरिदम में जहाँ गुणन एल्गोरिथम की जटिलता है। तो यह एक जटिलता (जहां प्रश्नों का समूह है) को देगा। एम ( एन ) Θ ( n एम ( एन ) के लिए लॉग इन n + n Σ क्ष क्यू | मैं क्ष | ) क्यूΘ(M(n)logn)M(n)Θ(nM(n)logn+nqQ|Iq|)Q
md5

2
@ मेहरदाद: एक लघुगणक की गणना करना उतना ही कठिन है। हालांकि मुझे यकीन नहीं है कि आपको कभी ऐसा करने की आवश्यकता होगी। उदाहरण के लिए यदि आप केवल संभावनाओं की तुलना करते हैं तो आप अंतिम गणना नहीं करेंगे । में संख्याओं का गुणन जल्दी से बहुत छोटा हो सकता है, इसलिए उसी कारण से हम लॉग संभावनाओं का उपयोग करके अंडरफ्लो से बचने की कोशिश करते हैं, हमें अंत में लॉगरिदमिक रूप में रहना चाहिए (जैसे कंप्यूटिंग बेस में करके) , ताकि यह और भी "मानव-पठनीय" हो)। n ( 0 , 1 ) लॉग 10expn(0,1)log10
एमडी 5

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

4

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

यदि ऑपरेशन की संख्या केवल से थोड़ी अधिक है, तो मुझे लगता है कि लॉग स्पेस (प्रदर्शन के दृष्टिकोण से) पर स्विच करने का कोई अर्थ नहीं है। हालांकि, यदि ऑपरेशन की संख्या बहुत अधिक है, तो मुझे लगता है कि यह लॉग स्पेस पर स्विच करने के लायक है। उदाहरण के लिए, मान लें कि आपके पास 50 चर हैं, और आपकी गणना में 1000 गुणा शामिल हैं। फिर मुझे लगता है कि आपको लॉग स्पेस में काम करना चाहिए। N

अंत में, इसके अलावा मशीन वास्तुकला की वजह से गुणा की तुलना में तेजी है। जोड़ गुणन की तुलना में स्वाभाविक रूप से तेज है। जटिलता के संदर्भ में, दो -bit पूर्णांकों को जोड़ने के लिए (रैखिक) समय लगता है, जबकि गुणा (द्विघात) समय लेता है ।n O ( n 2 )O(n)nO(n2)

वैसे, यह विचार मोंटगोमरी मॉड्यूलर गुणन के समान है, जहां मोंटगोमरी फॉर्म में गुणा किया जाता है जो सामान्य गुणन और फिर कमी से काफी तेज है।



1
@ मेहरदाद, मुझे आशा है कि आपने दो संख्याओं का स्कूल गुणा सीखा है। उस अल्गोरिथम का उपयोग कंप्यूटर चिप्स पर अभी भी व्यापक रूप से किया जाता है, कृपया यहां देखें कि आपका क्या मतलब है सॉफ्टवेयर स्तर के एल्गोरिदम जो अभी भी रैखिक समय से भी बदतर हैं। क्या ये गुणन एल्गोरिदम व्यापक रूप से गुणा सर्किट पर उपयोग किए जाते हैं?
fade2black


1
उत्तर की भावना अभी भी सही है, सही है? यदि गुणन एल्गोरिदम में से कोई भी इसके अलावा रैखिक समय से मेल नहीं खा रहा है?
स्टीफन

1
@ स्टेफेन, वास्तव में सवाल यह नहीं था कि गुणन एल्गोरिथ्म की सटीक सर्वोत्तम जटिलता क्या है। यदि टिप्पणीकारों की आवश्यकता हो तो मैं इस विषय पर अतिरिक्त जानकारी प्रदान कर सकता हूं। मुझे लगता है कि उस पर एक लंबी चर्चा यहां विषय से हटकर होगी। )))
fade2black
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.