2015-06-25 10 views
10

मैं प्रति पंक्ति एक वाक्य के साथ लगभग 170K लाइनों वाली फ़ाइल का उपयोग करके एक word2vec मॉडल को प्रशिक्षित करने की कोशिश कर रहा हूं।1002 वाक्यों के बाद gensim का उपयोग करके Word2vec प्रशिक्षण स्वैपिंग शुरू होता है

मुझे लगता है कि मैं एक विशेष उपयोग केस का प्रतिनिधित्व कर सकता हूं क्योंकि "वाक्यों" शब्दकोष शब्दों के बजाय मनमाने ढंग से तार हैं। प्रत्येक वाक्य (रेखा) में लगभग 100 शब्द होते हैं और प्रत्येक "शब्द" में लगभग 20 वर्ण होते हैं, जैसे "/" और संख्याओं के साथ।

प्रशिक्षण कोड बहुत सरल है:

# as shown in http://rare-technologies.com/word2vec-tutorial/ 
import gensim, logging, os 

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) 

class MySentences(object): 
    def __init__(self, dirname): 
     self.dirname = dirname 

    def __iter__(self): 
     for fname in os.listdir(self.dirname): 
      for line in open(os.path.join(self.dirname, fname)): 
       yield line.split() 

current_dir = os.path.dirname(os.path.realpath(__file__)) 

# each line represents a full chess match 
input_dir = current_dir+"/../fen_output" 
output_file = current_dir+"/../learned_vectors/output.model.bin" 

sentences = MySentences(input_dir) 

model = gensim.models.Word2Vec(sentences,workers=8) 

बात है, चीजों को जल्दी ऊपर 100K वाक्य (मेरी रैम तेजी से ऊपर जा रहा है), लेकिन फिर मैं रैम से बाहर चलाने के लिए और मैं देख सकता हूँ मेरे पीसी है करने के लिए वास्तविक काम स्वैपिंग शुरू कर दी, और प्रशिक्षण रोक दिया गया। मेरे पास बहुत सी रैम उपलब्ध नहीं है, केवल 4 जीबी और word2vec स्वैप करना शुरू करने से पहले इसका उपयोग करता है।

मुझे लगता है कि मैं सही ढंग से OpenBLAS numpy से जुड़ा हुआ है:

blas_info: 
    libraries = ['blas'] 
    library_dirs = ['/usr/lib'] 
    language = f77 
lapack_info: 
    libraries = ['lapack'] 
    library_dirs = ['/usr/lib'] 
    language = f77 
atlas_threads_info: 
    NOT AVAILABLE 
blas_opt_info: 
    libraries = ['openblas'] 
    library_dirs = ['/usr/lib'] 
    language = f77 
openblas_info: 
    libraries = ['openblas'] 
    library_dirs = ['/usr/lib'] 
    language = f77 
lapack_opt_info: 
    libraries = ['lapack', 'blas'] 
    library_dirs = ['/usr/lib'] 
    language = f77 
    define_macros = [('NO_ATLAS_INFO', 1)] 
openblas_lapack_info: 
    NOT AVAILABLE 
lapack_mkl_info: 
    NOT AVAILABLE 
atlas_3_10_threads_info: 
    NOT AVAILABLE 
atlas_info: 
    NOT AVAILABLE 
atlas_3_10_info: 
    NOT AVAILABLE 
blas_mkl_info: 
    NOT AVAILABLE 
mkl_info: 
    NOT AVAILABLE 

मेरा प्रश्न है: इस एक मशीन है कि उपलब्ध रैम का एक बहुत (नहीं मिला है पर उम्मीद है कि इसका क्या numpy.show_config() मुझसे कहता है मेरी तरह) और मुझे मॉडल को छोटे टुकड़ों में अधिक रैम या ट्रेन करना चाहिए? या ऐसा लगता है कि मेरा सेटअप ठीक से कॉन्फ़िगर नहीं किया गया है (या मेरा कोड अक्षम है)?

अग्रिम धन्यवाद।

उत्तर

2

ऐसा लगता है कि मेरा सेटअप ठीक से कॉन्फ़िगर नहीं किया गया है (या मेरा कोड अक्षम है)?

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

2) आप स्टेमिंग या बेहतर प्रयास कर सकते हैं: लेमैमैटिज़ेशन। उदाहरण के लिए, आप शब्दों की संख्या को कम कर देंगे, उदाहरण के लिए, एकवचन और बहुवचन रूपों को एक ही शब्द

3) हालांकि, मुझे लगता है कि 4 जीबी रैम शायद आपकी मुख्य समस्या है (आपके ओएस से अलग, आप शायद केवल 1-2 जीबी है जो वास्तव में प्रक्रियाओं/धागे द्वारा उपयोग की जा सकती है। मैं वास्तव में अधिक रैम में निवेश करने के बारे में सोचूंगा। उदाहरण के लिए, आजकल आप < $ 100 के लिए 16 जीबी रैम किट प्राप्त कर सकते हैं, हालांकि, अगर आपके पास कुछ है आम एमएल/"डेटा साइंस" कार्य के लिए एक सभ्य रैम में निवेश करने के लिए पैसा, मैं अनुशंसा करता हूं> 64 जीबी

3

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

दूसरा, यह स्पष्ट नहीं है कि यदि आप 100K से अधिक वाक्यों के डेटासेट पर हैं, तो पहले 100K वाक्यों का सामना करने के बाद प्रशिक्षण धीमा होना शुरू हो जाता है, या यदि आपका मतलब है कि 100K वाक्यों से बड़े किसी भी डेटासेट का उपयोग मंदी का अनुभव करता है। मुझे संदेह है कि यह बाद वाला है, क्योंकि ...

Word2Vec स्मृति उपयोग शब्दावली आकार (टोकन गिनती) का एक कार्य है - और ट्रेन करने के लिए उपयोग किए जाने वाले डेटा की कुल मात्रा नहीं। इसलिए प्रशिक्षण के दौरान राम उपयोग को कैप करने के लिए, शब्दों की ट्रैक की गई संख्या को पतला करने के लिए, आप min_count का उपयोग करना चाह सकते हैं।(मॉडल द्वारा ट्रैक किए गए शब्दों को चुपचाप प्रशिक्षण के दौरान छोड़ दिया जाएगा, जैसे कि वे वहां नहीं थे - और दुर्लभ शब्दों के लिए ऐसा करने से ज्यादा नुकसान नहीं होता है और कभी-कभी अन्य शब्दों को एक-दूसरे के करीब डालकर भी मदद मिलती है।)

अंत में, आप कन्स्ट्रक्टर में कॉर्पस वाक्यों को प्रदान करने से बचने की इच्छा कर सकते हैं - जो स्वचालित रूप से स्कैन और ट्रेन करता है - और इसके बजाय मॉडल निर्माण के बाद build_vocab() और train() स्वयं को मॉडल के आकार/मॉडल के आकार की जांच करने और अपने पैरामीटर समायोजित करने के लिए स्पष्ट रूप से कॉल करें जैसी जरूरत थी।

विशेष रूप से, gensim के नवीनतम संस्करण में, आप भी build_vocab(corpus) कदम तीन चरणों scan_vocab(corpus), scale_vocab(...), और finalize_vocab() में विभाजित कर सकते हैं।

scale_vocab(...) कदम एक dry_run=True पैरामीटर कि पूर्वावलोकन कितना बड़ा अपने शब्दावली, subsampled कोष, और उम्मीद स्मृति-उपयोग min_count और sample मापदंडों के विभिन्न मूल्यों की कोशिश कर के बाद हो जाएगा के साथ कहा जा सकता है। जब आपको प्रबंधित मानने वाले मान मिलते हैं, तो आप उन चयनित पैरामीटर के साथ scale_vocab(...) पर कॉल कर सकते हैं, और dry_run के बिना, उन्हें अपने मॉडल पर लागू करने के लिए (और फिर finalize_vocab() बड़े सरणी शुरू करने के लिए) पर कॉल कर सकते हैं।

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