2017-01-17 14 views
10

को समझना मैं आरएनएन/एलएसटीएम पर इस tutorial के माध्यम से जा रहा हूं और मुझे राज्यव्यापी एलएसटीएम को समझने में काफी कठिन समय है। मेरे सवालों का इस प्रकार हैं:राज्यव्यापी एलएसटीएम

1. प्रशिक्षण बैचिंग आकार

RNNs पर Keras डॉक्स में, मुझे पता चला है कि बैच के भीतर i वें स्थिति में नमूना की छिपी राज्य इनपुट छुपा के रूप में खिलाया जा जाएगा अगले बैच में i -th स्थिति में नमूना के लिए राज्य। क्या इसका मतलब यह है कि अगर हम छिपे हुए राज्य को नमूना से सैंपल में पास करना चाहते हैं तो हमें आकार 1 के बैचों का उपयोग करना होगा और इसलिए ऑनलाइन ढाल वंश का प्रदर्शन करना होगा? क्या छुपा राज्य को आकार> 1 के बैच के भीतर पास करने का कोई तरीका है और उस बैच पर ढाल वाले वंश को निष्पादित करना है?

2. एक-चार का मिलान समस्याएं

'एक-चार का मिलान करने के लिए एक एक-चार के लिए स्टेटफुल LSTM' ट्यूटोरियल के पैरा में एक कोड batch_size = 1 और stateful = True का उपयोग करता है के अगले पत्र भविष्यवाणी करने के लिए सीखने के लिए दिए गए थे वर्णमाला के एक अक्षर दिए वर्णमाला। कोड के अंतिम भाग (पूर्ण कोड के अंत तक लाइन 53) में, मॉडल का परीक्षण एक यादृच्छिक अक्षर ('के') से शुरू होता है और भविष्यवाणी 'बी' होता है, फिर 'बी' दिया जाता है, यह भविष्यवाणी करता है 'सी', आदि। ऐसा लगता है कि 'के' को छोड़कर अच्छा काम करता है। हालांकि, मैं कोड के लिए निम्न ट्वीक (अंतिम भाग भी, मैं लाइनों 52 और इसके बाद के संस्करण रखा) की कोशिश की:

# demonstrate a random starting point 
    letter1 = "M" 
    seed1 = [char_to_int[letter1]] 
    x = numpy.reshape(seed, (1, len(seed), 1)) 
    x = x/float(len(alphabet)) 
    prediction = model.predict(x, verbose=0) 
    index = numpy.argmax(prediction) 
    print(int_to_char[seed1[0]], "->", int_to_char[index]) 
    letter2 = "E" 
    seed2 = [char_to_int[letter2]] 
    seed = seed2 
    print("New start: ", letter1, letter2) 
    for i in range(0, 5): 
     x = numpy.reshape(seed, (1, len(seed), 1)) 
     x = x/float(len(alphabet)) 
     prediction = model.predict(x, verbose=0) 
     index = numpy.argmax(prediction) 
     print(int_to_char[seed[0]], "->", int_to_char[index]) 
     seed = [index] 
    model.reset_states() 

and these outputs: 

    M -> B 
    New start: M E 
    E -> C 
    C -> D 
    D -> E 
    E -> F 

It looks like the LSTM did not learn the alphabet but just the positions of the letters, and that regardless of the first letter we feed in, the LSTM will always predict B since it's the second letter, then C and so on. 

इसलिए, कैसे वर्तमान छिपा राज्य के लिए प्रारंभिक छिपा राज्य के रूप में पिछले छिपा राज्य रखने में हमारी मदद करता है सीखने के साथ कि परीक्षण के दौरान यदि हम पत्र 'के' से शुरू करते हैं, उदाहरण के लिए, पत्र ए से जे को पहले खिलाया नहीं जाएगा और शुरुआती छुपा राज्य प्रशिक्षण के दौरान समान नहीं होगा?

3. वाक्य पीढ़ी

मैं एक पूरी किताब पर मेरे LSTM प्रशिक्षित करने के लिए जानने के लिए कैसे वाक्य उत्पन्न करने के लिए और शायद भी लेखकों शैली सीखना चाहते हैं के लिए एक किताब पर एक LSTM प्रशिक्षण, मैं कैसे स्वाभाविक रूप से मेरी LSTM प्रशिक्षित कर सकते हैं उस पाठ पर (पूरे पाठ को इनपुट करें और एलएसटीएम शब्दों के बीच निर्भरताओं को समझने दें) 'कृत्रिम रूप से' होने के बजाय उस पुस्तक से वाक्यों के बैचों को अपने एलएसटीएम को प्रशिक्षित करने के लिए? मेरा मानना ​​है कि मुझे राज्य के एलएसटीएम का उपयोग करना चाहिए, लेकिन मुझे यकीन नहीं है कि कैसे।

+1

भविष्य के संदर्भ के लिए, इसे तीन अलग-अलग प्रश्नों में विभाजित किया जा सकता था। इसके अतिरिक्त, अंतिम प्रश्न figures.stackexchange.com के लिए अधिक उपयुक्त होगा। अंत में, आपको टैग शीर्षक में टैग नहीं डालना चाहिए। – Seanny123

उत्तर

12
  1. Keras में स्टेटफुल LSTM होने का मतलब है कि एक Keras चर (स्टोर और राज्य को अद्यतन करने के लिए इस्तेमाल किया जाएगा, और वास्तव में आप किसी भी समय राज्य वेक्टर (ओं) के मूल्य की जांच कर सकता है कि है जब तक आप reset_states() पर कॉल नहीं करते)। एक गैर-राज्य मॉडल, दूसरी ओर, बैच को संसाधित करते समय हर बार प्रारंभिक शून्य स्थिति का उपयोग करेगा, इसलिए ऐसा लगता है कि train_on_batch, test_on_batch और predict_on_batch के बाद आपको हमेशा reset_states() कहा जाता है। राज्य के मॉडल पर अगले बैच के लिए राज्य का पुन: उपयोग करने के बारे में स्पष्टीकरण गैर-राज्य के साथ उस अंतर के बारे में है; निश्चित रूप से राज्य हमेशा बैच के भीतर बह जाएगा और आप ऐसा होने के लिए आकार 1 के बैच होने की आवश्यकता है। मैं दो स्थितियों जहां स्टेटफुल मॉडल उपयोगी होते हैं देखते हैं:

    • आप डेटा के विभाजन दृश्यों पर प्रशिक्षित करने के लिए है, क्योंकि ये बहुत लंबे होते हैं चाहते हैं और यह उनकी पूरी लंबाई पर प्रशिक्षित करने के लिए व्यावहारिक नहीं होगा।
    • पूर्वानुमान समय पर, आप अनुक्रम में प्रत्येक समय बिंदु के लिए आउटपुट पुनर्प्राप्त करना चाहते हैं, न केवल अंत में (या तो क्योंकि आप इसे नेटवर्क में वापस फ़ीड करना चाहते हैं या क्योंकि आपके एप्लिकेशन को इसकी आवश्यकता है)।मैं व्यक्तिगत रूप से उन मॉडलों में करता हूं जिन्हें मैं बाद में एकीकरण के लिए निर्यात करता हूं (जो 1 के बैच आकार के साथ प्रशिक्षण मॉडल की "प्रतियां" हैं)।
  2. मैं मानता हूं कि वर्णमाला के लिए आरएनएन का उदाहरण वास्तव में अभ्यास में बहुत उपयोगी नहीं लगता है; यह केवल तब काम करेगा जब आप अक्षर ए से शुरू करेंगे। यदि आप किसी भी पत्र से शुरू होने वाले वर्णमाला को पुन: पेश करना सीखना चाहते हैं, तो आपको उस तरह के उदाहरणों (वर्णमाला के बाद या घूर्णन) के साथ नेटवर्क को प्रशिक्षित करने की आवश्यकता होगी। लेकिन मुझे लगता है कि एक नियमित फीड-फॉरवर्ड नेटवर्क (ए, बी), (बी, सी) इत्यादि जैसे जोड़ों पर वर्णमाला प्रशिक्षण के अगले अक्षर की भविष्यवाणी करना सीख सकता है। मुझे लगता है कि उदाहरण किसी अन्य चीज़ से अधिक प्रदर्शनकारी उद्देश्यों के लिए है ।

  3. शायद आप इसे पहले ही पढ़ चुके हैं, लेकिन लोकप्रिय पोस्ट The Unreasonable Effectiveness of Recurrent Neural Networks कुछ दिलचस्प परिणाम दिखाता है जो आप करना चाहते हैं (हालांकि यह वास्तव में कार्यान्वयन विनिर्देशों में गोता नहीं लगाता है)। मेरे पास टेक्स्टुअल डेटा के साथ व्यक्तिगत अनुभव प्रशिक्षण आरएनएन नहीं है, लेकिन वहां कई दृष्टिकोण हैं जिन पर आप शोध कर सकते हैं। आप चरित्र-आधारित मॉडल (पोस्ट में वाले लोगों की तरह) बना सकते हैं, जहां आपका इनपुट और एक समय में एक वर्ण प्राप्त होता है। ग्रंथों पर कुछ प्रीप्रोकैसिंग करने और उन्हें संख्याओं के क्रम में बदलने के लिए एक और उन्नत दृष्टिकोण है; ऐसा करने के लिए केरा में कुछ text preprocessing functions शामिल हैं। फीचर स्पेस के रूप में एक सिंगल नंबर होने के कारण शायद यह सब ठीक से काम नहीं करेगा, इसलिए आप प्रत्येक शब्द को वेक्टर में एक-हॉट एन्कोडिंग के साथ बदल सकते हैं या अधिक दिलचस्प बात यह है कि नेटवर्क प्रत्येक के लिए सर्वश्रेष्ठ वेक्टर प्रतिनिधित्व सीखता है, वे embedding पर कॉल करते हैं। आप प्रीप्रोकैसिंग के साथ और भी आगे जा सकते हैं और NLTK जैसे कुछ में देख सकते हैं, विशेष रूप से यदि आप स्टॉप शब्द, विराम चिह्न और ऐसी चीजों को हटाना चाहते हैं। अंत में, यदि आपके पास विभिन्न आकारों के अनुक्रम हैं (उदाहरण के लिए आप एक निश्चित आकार के अंशों के बजाय पूर्ण ग्रंथों का उपयोग कर रहे हैं, जो आपके लिए महत्वपूर्ण हो सकते हैं या नहीं भी हो सकते हैं) आपको थोड़ा और सावधान रहना होगा और masking और/या sample weighting का उपयोग करना होगा । सटीक समस्या के आधार पर, आप तदनुसार प्रशिक्षण स्थापित कर सकते हैं। यदि आप समान पाठ उत्पन्न करना सीखना चाहते हैं, तो "वाई" "एक्स" (एक गर्म एन्कोडेड) के समान होगा, केवल एक (या अधिक) स्थितियों द्वारा स्थानांतरित किया जाएगा (इस मामले में आपको return_sequences=True का उपयोग करने की आवश्यकता हो सकती है और TimeDistributed layers)। यदि आप ऑटोर निर्धारित करना चाहते हैं, तो आपका आउटपुट softmax Dense layer हो सकता है।

आशा है कि मदद करता है।

+0

हां, प्रश्न 2 केवल सीखने के लिए है, लेकिन मैं उस उदाहरण के दौरान सोच रहा था कि पिछले छिपे हुए राज्य को अगले नमूने के लिए प्रारंभिक छिपी स्थिति के रूप में कैसे रखा जाए, यह देखते हुए कि परीक्षण के दौरान हमें उस संदर्भ में जरूरी नहीं होगा। वास्तव में यह सुधारने के बजाय प्रदर्शन को कम करना प्रतीत होता है क्योंकि हम सीखने वाले वजन गलत छिपे हुए राज्य (विशेष रूप से अनुक्रमों के पहले कुछ तत्वों के लिए) के साथ सीखे जाते हैं। –

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