Гіперпараметр пошуку для LSTM-RNN за допомогою Keras (Python)


18

Із підручника Keras RNN: "RNN - складний. Вибір розміру партії важливий, вибір втрат та оптимізатор є критично важливими тощо. Деякі конфігурації не збігаються".

Отже, це більш загальне питання про налаштування гіперпараметрів LSTM-RNN на Керасі. Я хотів би знати про підхід до пошуку найкращих параметрів для вашої RNN.

Я почав із прикладу IMDB на 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 - це справедлива оцінка, і що ще важливіше, це означає, що модель, хоча і не повністю оптимізована, працює.

Мої дані - Time Series, а завдання - бінарне прогнозування, те саме, що і в прикладі. І тепер моя проблема виглядає так:

#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

1
Ви впевнені, що вам потрібен шар для вставки? Багатьом наборам даних часових рядів це не потрібно.
бенкет

У мене майже 100 тис. Точок даних і вдвічі більше функцій, ніж приклад IMDB, тому я не думаю, що це проблема. Що стосується вбудовуваного шару, то як саме ви підключите LSTM шар до входу? Згідно з документацією keras.io/layers/recurrent/#lstm LSTM Keras приймає лише ініціалізацію, активацію та output_dim в якості аргументів. Якщо це джерело помилки, буде дуже вдячний код, що описує, як усунути вкладений шар.
воск

Будь ласка, дивіться мою відповідь. Здається, вам не потрібен шар вставки.
бенкет

Відповіді:


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). Специфіка звичайно залежить від ваших даних та архітектури моделі.


На що ви пропонуєте замінити вкладений шар? Я спробував просто видалити вкладений шар, але це не працює.
воск

1
Подивіться на інші приклади - почніть, наприклад, безпосередньо із шару Густий. Не забудьте встановити параметр вхідної форми.
пір

5

Я б рекомендував Bayesian Optimization для пошуку гіпер параметрів і мав хороші результати зі застосуванням Spearmint. https://github.com/HIPS/Spearmint Можливо, вам доведеться використовувати старішу версію для комерційного використання.


2

Я б запропонував використовувати hyperopt ( https://github.com/hyperopt/hyperopt ), який використовує своєрідну байєсівську оптимізацію для пошуку оптимальних значень гіперпараметрів з урахуванням цільової функції. Використовувати його більш інтуїтивно, ніж Морська м'ята.

PS: Існує обгортка гіперопту спеціально для керас, гіпера ( https://github.com/maxpumperla/hyperas ). Ви також можете використовувати його.


2

Талос - саме те, що ви шукаєте; автоматизоване рішення для пошуку комбінацій гіперпараметрів для моделей Кераса. Я, можливо, не є об'єктивним, оскільки я автор, але наміром було запропонувати альтернативу з найменшою можливою кривою навчання, при цьому піддаючи керасу функціональність повністю.

Крім того, як уже згадувалося, ви можете заглянути в Hyperas , а потім у SKlearn або AutoKeras . Наскільки мені відомо, на момент написання цих 4 цих варіантів є спеціально для користувачів Keras.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.