การค้นหาพารามิเตอร์หลายระดับสำหรับ LSTM-RNN โดยใช้ Keras (Python)


18

จากการสอนของ Keras RNN: "RNN นั้นยุ่งยากการเลือกขนาดแบตช์เป็นสิ่งสำคัญตัวเลือกการสูญเสียและออพติไมเซอร์เป็นสิ่งสำคัญ ฯลฯ การกำหนดค่าบางอย่างจะไม่มาบรรจบกัน"

ดังนั้นนี่เป็นคำถามทั่วไปเกี่ยวกับการปรับพารามิเตอร์ไฮเปอร์พารามิเตอร์ของ LSTM-RNN บน Keras ฉันต้องการทราบวิธีการในการค้นหาพารามิเตอร์ที่ดีที่สุดสำหรับ RNN ของคุณ

ผมเริ่มต้นด้วยตัวอย่างเช่นไอเอ็มบน Keras' Github

โมเดลหลักมีลักษณะดังนี้:

(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 แม้ว่าผลลัพธ์จะหมายความว่ามันไม่ได้เรียนรู้อะไรเลย อย่างไรก็ตามเมื่อฉันใช้วานิลลา MLP-NN ฉันไม่มีปัญหาเดียวกันโมเดลเรียนรู้และเพิ่มคะแนน ฉันพยายามเพิ่มจำนวนของยุคและเพิ่มจำนวนหน่วย LTSM ที่ลดลง แต่คะแนนจะไม่เพิ่มขึ้น

ดังนั้นฉันอยากจะรู้วิธีการมาตรฐานในการปรับแต่งเครือข่ายเพราะในทางทฤษฎีแล้วอัลกอริทึมควรทำงานได้ดีกว่าเครือข่ายแบบหลายจุดโดยเฉพาะสำหรับข้อมูลอนุกรมเวลานี้


1
คุณมีข้อมูลมากแค่ไหน? ความยาวของลำดับของคุณคืออะไร? LSTM นั้นมีประโยชน์จริง ๆ สำหรับปัญหาเกี่ยวกับข้อมูลจำนวนมากและการพึ่งพาระยะยาว
pir

ค้นหาแบบสุ่มหรือการเพิ่มประสิทธิภาพคชกรรมเป็นวิธีมาตรฐานในการหา hyperparameters :)
pir

1
คุณแน่ใจหรือว่าต้องการชั้นการฝัง ชุดข้อมูลอนุกรมเวลาจำนวนมากไม่ต้องการ
pir

ฉันมีจุดข้อมูลเกือบ 100k และมีคุณสมบัติมากเป็นสองเท่าของตัวอย่าง IMDB ดังนั้นฉันไม่คิดว่านั่นเป็นปัญหา สำหรับเลเยอร์การฝังคุณจะเชื่อมต่อเลเยอร์ LSTM กับอินพุตได้อย่างไร ตามเอกสารkeras.io/layers/recurrent/#lstm Keras 'LSTM ใช้การเริ่มต้นการเปิดใช้งานและ output_dim เป็นอาร์กิวเมนต์เท่านั้น หากเป็นแหล่งที่มาของข้อผิดพลาดรหัสที่อธิบายถึงวิธีการกำจัดเลเยอร์การฝังจะได้รับการชื่นชมอย่างมาก
wacax

โปรดดูคำตอบของฉัน ดูเหมือนว่าคุณไม่ต้องการเลเยอร์การฝัง
pir

คำตอบ:


5

เลเยอร์การฝังจะเปลี่ยนจำนวนเต็มบวก (ดัชนี) ไปเป็นเวกเตอร์ที่หนาแน่นซึ่งมีขนาดคงที่ [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]ยกตัวอย่างเช่น การแปลงการเป็นตัวแทนนี้จะเรียนรู้โดยอัตโนมัติด้วยเลเยอร์การฝังใน Keras (ดูเอกสารประกอบ )

อย่างไรก็ตามดูเหมือนว่าข้อมูลของคุณไม่ต้องการเลเยอร์การฝังใด ๆ เพื่อทำการแปลง การมีเลเยอร์การฝังที่ไม่จำเป็นอาจเป็นไปได้ว่าทำไมคุณไม่สามารถทำให้ LSTM ทำงานได้อย่างถูกต้อง หากเป็นเช่นนั้นคุณควรลบเลเยอร์การฝังออก

เลเยอร์แรกในเครือข่ายของคุณควรinput_shapeเพิ่มอาร์กิวเมนต์ด้วยข้อมูลเกี่ยวกับมิติข้อมูลของคุณ (ดูตัวอย่าง ) โปรดทราบว่าคุณสามารถเพิ่มอาร์กิวเมนต์นี้ลงในเลเยอร์ใดก็ได้ - มันจะไม่ปรากฏในเอกสารประกอบสำหรับเลเยอร์เฉพาะใด ๆ


โดยวิธีการนั้นพารามิเตอร์หลายมิติมักถูกปรับโดยใช้การค้นหาแบบสุ่มหรือการปรับให้เหมาะสมแบบเบย์ ฉันจะใช้ RMSProp และมุ่งเน้นไปที่การปรับขนาดแบทช์ (ขนาดเช่น 32, 64, 128, 256 และ 512), การไล่ระดับสี (ในช่วง 0.1-10) และการเลื่อนออก (ในช่วง 0.1-0.6) ข้อมูลเฉพาะของหลักสูตรขึ้นอยู่กับข้อมูลและสถาปัตยกรรมของคุณ


คุณเสนออะไรเพื่อแทนที่เลเยอร์การฝังด้วย ฉันพยายามลบเลเยอร์การฝังออก แต่ก็ไม่ได้ผล
wacax

1
ดูตัวอย่างอื่น ๆ - เริ่มต้นเช่นโดยตรงกับเลเยอร์หนาแน่น อย่าลืมตั้งค่าพารามิเตอร์ input_shape
pir

5

ฉันอยากจะแนะนำ Bayesian Optimization สำหรับการค้นหาพารามิเตอร์แบบไฮเปอร์และให้ผลลัพธ์ที่ดีกับ Spearmint https://github.com/HIPS/Spearmintคุณอาจต้องใช้รุ่นที่เก่ากว่าเพื่อการใช้งานเชิงพาณิชย์


2

ฉันขอแนะนำให้ใช้ hyperopt ( https://github.com/hyperopt/hyperopt ) ซึ่งใช้การเพิ่มประสิทธิภาพแบบเบย์เพื่อค้นหาค่าที่ดีที่สุดของพารามิเตอร์ที่กำหนดฟังก์ชันการทำงาน มันใช้งานง่ายกว่า Spearmint

PS: มีไฮเปอร์พร็อพเพอร์ตี้สำหรับ keras, hyperas ( https://github.com/maxpumperla/hyperas ) คุณสามารถใช้มันได้


2

Talosเป็นสิ่งที่คุณต้องการอย่างแน่นอน โซลูชันอัตโนมัติสำหรับการค้นหาชุดพารามิเตอร์แบบไฮเปอร์พารามิเตอร์สำหรับรุ่น Keras ฉันอาจไม่ได้เป็นเป้าหมายอย่างที่ฉันเป็นผู้เขียน แต่ความตั้งใจที่จะให้ทางเลือกกับช่วงการเรียนรู้ที่ต่ำที่สุดเท่าที่จะเป็นไปได้ในขณะที่แสดงการทำงานของ Keras ทั้งหมด

หรืออีกทางหนึ่งขณะที่มันได้รับการกล่าวถึงอยู่แล้วคุณสามารถมองเข้าไปในHyperasหรือแล้วSKlearnหรือAutoKeras สำหรับความรู้ของฉันในขณะที่เขียนนี้ทั้งสี่เป็นตัวเลือกสำหรับผู้ใช้ Keras โดยเฉพาะ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.