2012-02-21 17 views
8

मैं जीएलएम पर प्रोफेसर एंड्रयू एनजी के व्याख्यान देखने के बाद के-क्लासिफायर समस्या को हल करने के लिए सॉफ़्टमैक्स रिग्रेशन एल्गोरिदम लागू करने की कोशिश कर रहा हूं। मैं सोचा मैं सब कुछ समझ गया वह कह रहे थे जब तक यह अंत में इस प्रकार Softmax प्रतिगमन के लिए लागत समारोह है, जो लागू करने के लिए कोड लिखने के लिए आया था:समीकरणों को सदिश कैसे करें?

Cost function for Softmax Regression with Weight Decay

समस्या मैं कर रहा हूँ आंकड़ा करने के लिए कोशिश कर रहा है इसे सदिश बनाने के लिए एक रास्ता बाहर। दोबारा मैं सोचा मुझे समझ में आया कि इस तरह वेक्टरिंग समीकरणों के बारे में कैसे जाना है क्योंकि मैं इसे रैखिक और लॉजिस्टिक रिग्रेशन के लिए करने में सक्षम था, लेकिन उस सूत्र को देखने के बाद मैं फंस गया हूं।

जबकि मुझे इसके लिए एक सदिश समाधान पता लगाना अच्छा लगेगा (मुझे एहसास है कि पहले से ही एक ही प्रश्न पोस्ट किया गया है: Vectorized Implementation of Softmax Regression), मुझे इसमें अधिक दिलचस्पी है कि आप में से कोई भी मुझे एक रास्ता बता सकता है (आपका तरीका) विधिवत इस तरह के समीकरणों को वेक्टरकृत रूपों में परिवर्तित करें। उदाहरण के लिए, आप में से उन लोगों के लिए जो एमएल में विशेषज्ञ या अनुभवी दिग्गजों हैं, जब आप पहली बार साहित्य में नए एल्गोरिदम पढ़ते हैं, और उन्हें उपरोक्त समीकरण के समान नोटेशन में लिखा गया है, तो आप उन्हें कैसे परिवर्तित करने के बारे में जाते हैं वेक्टरकृत रूपों?

मुझे एहसास है कि मैं मोजार्ट से पूछ रहे छात्र की तरह होने के नाते आ रहा हूं, "आप पियानो को कितनी अच्छी तरह खेलते हैं?" लेकिन मेरा सवाल बस इस सामग्री में बेहतर बनने की इच्छा से प्रेरित है, और यह मानते हुए कि सभी को समीकरणों को सदिश बनाने के बारे में नहीं पता था, और इसलिए वहां से किसी ने अपनी प्रणाली तैयार करनी होगी, और यदि ऐसा है, तो कृपया साझा करें! अग्रिम में बहुत धन्यवाद!

चीयर्स

+0

आप GLM पर व्याख्यान लिए एक लिंक प्रदान कर सकते हैं? – justis

+1

स्टैनफोर्ड में प्रोफेसर एंड्रयू एनजी की एमएल कक्षा की सौजन्य: http://cs229.stanford.edu/materials.html - जीएलएम और सॉफ्टमैक्स रिग्रेशन सामग्री लेक्चर 1 के अंत में पाई जाती है – oort

उत्तर

1

यह एक vectorize करने के बाद आप अपने summations के अंदर exponentials कर रहे हैं बहुत मुश्किल लग रहा है। मुझे लगता है कि आप मनमाने ढंग से शक्तियों को बढ़ा रहे हैं। आप क्या सदिश कर सकते हैं अभिव्यक्ति का दूसरा शब्द \ sum \ sum theta^2 बस उपयोग करना सुनिश्चित करें। * मैटलैब enter link description here में कंप्यूटर \ theta^2

समान अनुपात के अनुपात के भीतर जाता है जो लॉगरिदम में जाता है। \ theta 'x^(i) वेक्टरिज़ेबल अभिव्यक्ति है।

आपको एक ज्ञापन या गतिशील प्रोग्रामिंग तकनीक से लाभ भी हो सकता है और e^\ theta 'x^(i) की गणना के परिणामों का पुन: उपयोग करने का प्रयास कर सकता है।

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

2

मदद फ़ाइलों कि सप्टक के साथ आते हैं इस प्रविष्टि है:

19.1 बेसिक vectorization

एक बहुत अच्छा पहली सन्निकटन करने के लिए, vectorization में लक्ष्य लिखने कोड है कि छोरों से बचा जाता है और पूरे सरणी का उपयोग करता है संचालन।एक तुच्छ उदाहरण के रूप में, पर विचार

for i = 1:n 
    for j = 1:m 
    c(i,j) = a(i,j) + b(i,j); 
    endfor 
endfor 

बहुत सरल

c = a + b; 

यह लिखने के लिए न केवल आसान है की तुलना में; यह अनुकूलन के लिए भी आंतरिक रूप से बहुत आसान है। ऑक्टवे इस ऑपरेशन को अंतर्निहित कार्यान्वयन के लिए प्रतिनिधि करता है, जो अन्य अनुकूलन के बीच विशेष वेक्टर हार्डवेयर निर्देशों का उपयोग कर सकता है या अनुमानतः समानांतर में जोड़ों को भी निष्पादित कर सकता है। सामान्य रूप से, यदि कोड वेक्टरकृत है, अंतर्निहित कार्यान्वयन में में तेजी से निष्पादन प्राप्त करने के लिए किए गए अनुमानों के बारे में अधिक स्वतंत्रता है।

यह "सस्ते" निकायों के साथ लूप के लिए विशेष रूप से महत्वपूर्ण है। प्रायः स्वीकार्य प्रदर्शन प्राप्त करने के लिए केवल सबसे ऊपर लूप को सदिश बनाने के लिए पर्याप्त है। अंगूठे का एक सामान्य नियम यह है कि वेक्टरकृत निकाय का "ऑर्डर" लूप संलग्न करने के "ऑर्डर" के बराबर या बराबर होना चाहिए।

एक कम तुच्छ उदाहरण के रूप में, के बजाय

for i = 1:n-1 
    a(i) = b(i+1) - b(i); 
endfor 

लिखने

a = b(2:n) - b(1:n-1); 

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

for i = 1:n 
    if (a(i) > 5) 
    a(i) -= 20 
    endif 
endfor 

लिखने

a(a>5) -= 20; 

जो तथ्य यह है कि 'एक> 5' एक बूलियन सूचकांक का उत्पादन कारनामे के बजाय के लिए।

लूपिंग (ऑपरेटरों जैसे '। *' और '। ^') से बचने के लिए जब भी संभव हो, तत्व वार वेक्टर ऑपरेटरों का उपयोग करें।  अंकगणित ओपीएस। सरल इनलाइन फ़ंक्शंस के लिए, 'वेक्टरize' फ़ंक्शन स्वचालित रूप से ऐसा कर सकता है।

- निर्मित फंक्शन: vectorize (मज़ा) , '', '/', आदि के सभी घटनाओं की जगह के साथ 'द्वारा इनलाइन समारोह मज़ा की एक vectorized संस्करण बनाएं। ',' ./ ', आदि

This may be useful, for example, when using inline functions with 
numerical integration or optimization where a vector-valued 
function is expected. 

     fcn = vectorize (inline ("x^2 - 1")) 
     => fcn = f(x) = x.^2 - 1 
     quadv (fcn, 0, 3) 
     => 6 

See also:  inline,  formula, 
 argnames. 

इसके अलावा इन elementwise ऑपरेटरों दोनों को से बचने के पाशन और अनावश्यक मध्यवर्ती स्मृति आवंटन में प्रसारण शोषण करते हैं।
 प्रसारण।

यदि संभव हो तो अंतर्निहित और लाइब्रेरी फ़ंक्शंस का उपयोग करें। अंतर्निर्मित और संकलित कार्य बहुत तेज़ हैं। यहां तक ​​कि एक एम-फाइल लाइब्रेरी फ़ंक्शन के साथ, संभावनाएं अच्छी हैं कि यह पहले से ही अनुकूलित है, या भविष्य में रिलीज में को अनुकूलित किया जाएगा।

उदाहरण के लिए, यहां तक ​​कि अधिक से

a = b(2:n) - b(1:n-1); 

बेहतर

a = diff (b); 

अधिकांश सप्टक कार्यों मन में वेक्टर और सरणी तर्क के साथ लिखा जाता है। यदि आप अपने आप को एक बहुत ही सरल ऑपरेशन के साथ लूप लिखते हैं, तो संभावना है कि ऐसा फ़ंक्शन पहले से मौजूद है। निम्नलिखित कार्यों vectorized कोड में अक्सर होते हैं:

  • सूचकांक हेरफेर

    * find 
    
    * sub2ind 
    
    * ind2sub 
    
    * sort 
    
    * unique 
    
    * lookup 
    
    * ifelse/merge 
    
  • दोहराव

    * repmat 
    
    * repelems 
    
  • vectorized अंकगणित

    * sum 
    
    * prod 
    
    * cumsum 
    
    * cumprod 
    
    * sumsq 
    
    * diff 
    
    * dot 
    
    * cummax 
    
    * cummin 
    
  • उच्च आयामी सरणियों

    * reshape 
    
    * resize 
    
    * permute 
    
    * squeeze 
    
    * deal 
    

भी उदाहरण के साथ कुछ और मार्गदर्शन के लिए एक स्टैनफोर्ड एमएल विकि से इन पृष्ठों को देखने के आकार।

http://ufldl.stanford.edu/wiki/index.php/Vectorization

http://ufldl.stanford.edu/wiki/index.php/Logistic_Regression_Vectorization_Example

http://ufldl.stanford.edu/wiki/index.php/Neural_Network_Vectorization

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