केआरएस (पायथन) का उपयोग करते हुए LSTM-RNN के लिए हाइपरपरमेट सर्च


18

केर आरएनएन ट्यूटोरियल से: " आरएनएन मुश्किल हैं। बैच आकार की पसंद महत्वपूर्ण है, नुकसान की पसंद और ऑप्टिमाइज़र महत्वपूर्ण है, आदि। कुछ विन्यास अभिसरण नहीं करेंगे।"

इसलिए यह केरस पर एक LSTM-RNN के हाइपरपैरमीटर को ट्यून करने के बारे में एक सामान्य प्रश्न है। मैं आपके RNN के सर्वोत्तम मापदंडों को खोजने के लिए एक दृष्टिकोण के बारे में जानना चाहूंगा।

मैंने Keras के गितुब पर IMDB उदाहरण के साथ शुरू किया ।

मुख्य मॉडल इस तरह दिखता है:

(X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words=max_features,
                                                      test_split=0.2)

max_features = 20000
maxlen = 100  # cut texts after this number of words (among top max_features most common words)
batch_size = 32

model = Sequential()
model.add(Embedding(max_features, 128, input_length=maxlen))
model.add(LSTM(128))  
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
          optimizer='adam',
          class_mode="binary")

print("Train...")
model.fit(X_train, y_train, batch_size=batch_size, nb_epoch=3,
      validation_data=(X_test, y_test), show_accuracy=True)
score, acc = model.evaluate(X_test, y_test,
                        batch_size=batch_size,
                        show_accuracy=True)

print('Test accuracy:', acc)
Test accuracy:81.54321846

81.5 एक उचित स्कोर है और अधिक महत्वपूर्ण बात यह है कि इसका मतलब है कि मॉडल, भले ही पूरी तरह से अनुकूलित नहीं है, यह काम करता है।

मेरा डेटा टाइम सीरीज़ है और कार्य बाइनरी भविष्यवाणी है, उदाहरण के समान। और अब मेरी समस्या इस तरह दिखती है:

#Training Data
train = genfromtxt(os.getcwd() + "/Data/trainMatrix.csv", delimiter=',', skip_header=1)
validation = genfromtxt(os.getcwd() + "/Data/validationMatrix.csv", delimiter=',', skip_header=1)

#Targets
miniTrainTargets = [int(x) for x in genfromtxt(os.getcwd() + "/Data/trainTarget.csv", delimiter=',', skip_header=1)]
validationTargets = [int(x) for x in genfromtxt(os.getcwd() + "/Data/validationTarget.csv", delimiter=',', skip_header=1)]

#LSTM
model = Sequential()
model.add(Embedding(train.shape[0], 64, input_length=train.shape[1]))
model.add(LSTM(64)) 
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
          optimizer='adam',
          class_mode="binary")

model.fit(train, miniTrainTargets, batch_size=batch_size, nb_epoch=5,
      validation_data=(validation, validationTargets), show_accuracy=True)
valid_preds = model.predict_proba(validation, verbose=0)
roc = metrics.roc_auc_score(validationTargets, valid_preds)
print("ROC:", roc)
ROC:0.5006526

मॉडल मूल रूप से IMDB एक के समान है। हालांकि परिणाम का मतलब है कि यह कुछ भी नहीं सीख रहा है। हालांकि, जब मैं एक वेनिला एमएलपी-एनएन का उपयोग करता हूं तो मुझे समान समस्या नहीं होती है, मॉडल सीखता है और स्कोर बढ़ता है। मैंने युगों की संख्या बढ़ाने और एलटीएसएम इकाइयों की संख्या को बढ़ाने और घटने की कोशिश की लेकिन स्कोर नहीं बढ़ेगा।

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


1
आपके पास कितना डेटा है? आपके दृश्यों की लंबाई क्या है? LSTM केवल बहुत सारी डेटा और दीर्घकालिक निर्भरता वाली समस्याओं के लिए वास्तव में उपयोगी है।
पीर

रैंडम सर्च या बायेसियन ऑप्टिमाइज़ेशन हाइपरपरमेटर्स खोजने के मानक तरीके हैं :)
पीर

1
क्या आप सुनिश्चित हैं कि आपको एम्बेडिंग परत की आवश्यकता है? कई बार श्रृंखला डेटासेट को इसकी आवश्यकता नहीं होती।
पीर

मेरे पास लगभग 100k डेटा पॉइंट्स हैं और IMDB उदाहरण के रूप में कई सुविधाएँ हैं इसलिए मुझे नहीं लगता कि यह समस्या है। एम्बेडिंग लेयर के लिए, आप LSTM लेयर को इनपुट से कैसे कनेक्ट करेंगे? प्रलेखन के अनुसार keras.io/layers/recurrent/#lstm Keras 'LSTM केवल तर्क, सक्रियता और आउटपुट_dim को तर्क के रूप में लेता है। यदि वह त्रुटि का स्रोत है, तो कोड का वर्णन कैसे एम्बेडिंग परत को खत्म करने के लिए बहुत सराहना की जाएगी।
वॅक्सैक्स

कृपया मेरा उत्तर देखें। ऐसा लगता है कि आपको एम्बेडिंग परत की आवश्यकता नहीं है।
पीर

जवाबों:


5

एक एम्बेडिंग परत सकारात्मक पूर्णांक (अनुक्रमित) को निश्चित आकार के घने वैक्टर में बदल देती है। उदाहरण के लिए, [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]। यह प्रतिनिधित्व रूपांतरण स्वचालित रूप से केरस में एम्बेडिंग परत ( प्रलेखन देखें ) के साथ सीखा जाता है ।

हालाँकि, ऐसा लगता है कि रूपांतरण करने के लिए आपके डेटा को ऐसी किसी भी एम्बेडिंग परत की आवश्यकता नहीं है। एक अनावश्यक एम्बेडिंग परत होने की संभावना है कि आप अपने LSTM को ठीक से काम करने के लिए क्यों नहीं प्राप्त कर सकते हैं। अगर ऐसा है तो आपको बस एम्बेडिंग परत को हटा देना चाहिए।

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


वैसे, हाइपरपरमेटर्स को अक्सर यादृच्छिक खोज या बायेसियन अनुकूलन का उपयोग करके ट्यून किया जाता है। मैं RMSProp का उपयोग करता हूं और ट्यूनिंग बैच आकार (32, 64, 128, 256 और 512 जैसे आकार), ग्रेडिएंट क्लिपिंग (अंतराल 0.1-10 पर) और ड्रॉपआउट (0.1-0.6 के अंतराल पर) पर ध्यान केंद्रित करता हूं। पाठ्यक्रम की बारीकियों आपके डेटा और मॉडल वास्तुकला पर निर्भर करती हैं।


आप एम्बेडिंग परत को बदलने के लिए क्या प्रस्ताव देते हैं? मैं बस एम्बेडिंग परत को हटाने की कोशिश की, लेकिन वह काम नहीं करता है।
वैक्सक्स

1
अन्य उदाहरणों को देखें - घने परत के साथ सीधे उदा। Input_shape पैरामीटर सेट करना याद रखें।
पीर

5

मैं हाइपर पैरामीटर खोज के लिए बायेसियन ऑप्टिमाइज़ेशन की सिफारिश करूंगा और स्पीयरमिंट के साथ अच्छे परिणाम थे। https://github.com/HIPS/Spearmint आपको व्यावसायिक उपयोग के लिए एक पुराने संस्करण का उपयोग करना पड़ सकता है।


2

मैं हाइपरॉप्ट ( https://github.com/hyperopt/hyperopt ) का उपयोग करने का सुझाव दूंगा , जो कि ऑब्जेक्टिव फंक्शन को देखते हुए हाइपरपरमेटर्स के इष्टतम मूल्यों की खोज के लिए एक तरह के बायेसियन ऑप्टिमाइज़ेशन का उपयोग करता है। यह Spearmint की तुलना में उपयोग करने के लिए अधिक सहज है।

पुनश्च: वहाँ kirs, hyperas ( https://github.com/maxpumperla/hyperas ) के लिए speifically हाइपरटॉप का एक आवरण है । आप भी इसे उपयोग कर सकते हैं।


2

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

वैकल्पिक रूप से, जैसा कि पहले ही उल्लेख किया गया था, आप हाइपरस , या फिर स्केलेर या ऑटोकेरस में देख सकते हैं । मेरी जानकारी के लिए, लेखन के समय, ये 4 विशेष रूप से केरस उपयोगकर्ताओं के लिए विकल्प हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.