Pencarian Hyperparameter untuk LSTM-RNN menggunakan Keras (Python)

18

Dari Keras RNN Tutorial: "RNN itu rumit. Pilihan ukuran batch penting, pilihan kehilangan dan pengoptimal sangat penting, dll. Beberapa konfigurasi tidak akan bertemu."

Jadi ini lebih merupakan pertanyaan umum tentang menyetel hyperparameter dari LSTM-RNN pada Keras. Saya ingin tahu tentang pendekatan untuk menemukan parameter terbaik untuk RNN ​​Anda.

Saya mulai dengan contoh IMDB di Keras 'Github .

model utama terlihat seperti ini:

(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 adalah skor yang adil dan yang lebih penting itu berarti model tersebut, meskipun tidak sepenuhnya dioptimalkan, berfungsi

Data saya adalah Time Series dan tugasnya adalah prediksi biner, sama seperti contohnya. Dan sekarang masalah saya terlihat seperti ini:

#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

Model ini pada dasarnya sama dengan yang IMDB. Padahal hasilnya berarti tidak belajar apa-apa. Namun, ketika saya menggunakan vanilla MLP-NN saya tidak memiliki masalah yang sama, model belajar dan skor meningkat. Saya mencoba meningkatkan jumlah zaman dan meningkatkan-penurunan jumlah unit LTSM tetapi skor tidak akan meningkat.

Jadi saya ingin tahu pendekatan standar untuk tuning jaringan karena secara teori algoritma harus berkinerja lebih baik daripada jaringan perceptron multilayer khusus untuk data deret waktu ini.

wacax
sumber
1
Berapa banyak data yang Anda miliki? Berapa panjang urutan Anda? LSTM hanya sangat berguna untuk masalah dengan banyak data dan ketergantungan jangka panjang.
pir
Pencarian acak atau optimasi Bayesian adalah cara standar untuk menemukan hyperparameter :)
pir
1
Anda yakin membutuhkan lapisan penyematan? Banyak dataset deret waktu tidak membutuhkannya.
pir
Saya memiliki poin data hampir 100k dan fitur dua kali lebih banyak dari contoh IMDB jadi saya tidak berpikir itu masalahnya. Sedangkan untuk lapisan embedding, bagaimana tepatnya Anda menghubungkan lapisan LSTM ke input? Menurut dokumentasi keras.io/layers/recurrent/#lstm Keras 'LSTM hanya mengambil inisialisasi, aktivasi dan output_dim sebagai argumen. Jika itu adalah sumber kesalahan, kode yang menjelaskan cara menghilangkan lapisan embedding akan sangat dihargai.
wacax
Tolong lihat jawaban saya. Sepertinya Anda tidak perlu lapisan penyematan.
pir

Jawaban:

5

Lapisan penyisipan mengubah bilangan bulat positif (indeks) menjadi vektor padat ukuran tetap. Misalnya [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]],. Konversi representasi ini dipelajari secara otomatis dengan lapisan embedding di Keras (lihat dokumentasi ).

Namun, tampaknya data Anda tidak memerlukan lapisan penyematan semacam itu untuk melakukan konversi. Memiliki lapisan penyematan yang tidak perlu kemungkinan besar menyebabkan Anda tidak bisa membuat LSTM Anda berfungsi dengan baik. Jika itu yang terjadi maka Anda cukup menghapus lapisan embedding.

Lapisan pertama di jaringan Anda kemudian harus memiliki input_shapeargumen yang ditambahkan dengan informasi tentang dimensi data Anda (lihat contoh ). Perhatikan bahwa Anda dapat menambahkan argumen ini ke lapisan mana pun - itu tidak akan ada dalam dokumentasi untuk lapisan tertentu.


Omong-omong, hiperparameter sering disetel menggunakan pencarian acak atau optimasi Bayesian. Saya akan menggunakan RMSProp dan fokus pada ukuran batch tuning (ukuran seperti 32, 64, 128, 256 dan 512), kliping gradien (pada interval 0,1-10) dan dropout (pada interval 0,1-0,6). Spesifikasinya tentu tergantung pada arsitektur data dan model Anda.

pir
sumber
Apa yang Anda usulkan untuk mengganti lapisan embedding? Saya mencoba hanya menghapus lapisan embedding tetapi itu tidak berhasil.
wacax
1
Lihatlah contoh-contoh lain - mulai misalnya langsung dengan layer Dense. Ingatlah untuk mengatur parameter input_shape.
pir
5

Saya akan merekomendasikan Bayesian Optimization untuk pencarian parameter hyper dan memiliki hasil yang baik dengan Spearmint. https://github.com/HIPS/Spearmint Anda mungkin harus menggunakan versi yang lebih lama untuk penggunaan komersial.

Mutian Zhai
sumber
2

Saya akan menyarankan menggunakan hyperopt ( https://github.com/hyperopt/hyperopt ), yang menggunakan semacam Bayesian Optimization untuk mencari nilai optimal dari hyperparameters mengingat fungsi objektif. Ini lebih intuitif untuk digunakan daripada Spearmint.

PS: Ada bungkus hyperopt khusus untuk keras, hyperas ( https://github.com/maxpumperla/hyperas ). Anda juga bisa menggunakannya.

SHASHANK GUPTA
sumber
2

Talos persis seperti yang Anda cari; solusi otomatis untuk mencari kombinasi hyperparameter untuk model Keras. Saya mungkin tidak objektif karena saya penulisnya, tetapi tujuannya adalah untuk memberikan alternatif dengan kurva belajar serendah mungkin sambil mengekspos fungsionalitas Keras sepenuhnya.

Atau, seperti yang telah disebutkan, Anda dapat melihat ke Hyperas , atau kemudian SKlearn atau AutoKeras . Setahu saya, pada saat penulisan, 4 ini adalah opsi untuk pengguna Keras secara khusus.

mikkokotila
sumber