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.
Jawaban:
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_shape
argumen 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.
sumber
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.
sumber
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.
sumber
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.
sumber