Поиск гиперпараметра для LSTM-RNN с использованием Keras (Python)

18

Из Keras RNN Tutorial: «RNNs сложны. Выбор размера пакета важен, выбор потерь и оптимизатора важен и т. Д. Некоторые конфигурации не сходятся».

Так что это более общий вопрос о настройке гиперпараметров LSTM-RNN на Keras. Я хотел бы знать о подходе к поиску лучших параметров для вашего 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 - это справедливая оценка, и что более важно, это означает, что модель, хотя и не полностью оптимизированная, работает.

Мои данные - это временные ряды, а задача - бинарный прогноз, такой же, как в примере. И теперь моя проблема выглядит так:

#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, но счет не увеличится.

Поэтому я хотел бы знать стандартный подход к настройке сети, потому что теоретически алгоритм должен работать лучше, чем многослойная сеть персептрона, особенно для данных этого временного ряда.

wacax
источник
1
Сколько данных у вас есть? Какова длина ваших последовательностей? LSTM действительно полезны только для проблем с большим количеством данных и долгосрочными зависимостями.
пир
Случайный поиск или байесовская оптимизация являются стандартными способами поиска гиперпараметров :)
pir
1
Вы уверены, что вам нужен слой для встраивания? Многим наборам данных временных рядов это не понадобится.
пир
У меня почти 100 тыс. Точек данных и вдвое больше функций, чем в примере с IMDB, так что я не думаю, что это проблема. Что касается уровня встраивания, как именно вы подключите слой LSTM к входу? Согласно документации keras.io/layers/recurrent/#lstm LSTM Keras принимает в качестве аргументов только инициализации, активации и output_dim. Если это является источником ошибки, код, описывающий, как устранить уровень внедрения, будет очень полезен.
Wacax
Пожалуйста, смотрите мой ответ. Кажется, вам не нужен внедряющий слой.
пир

Ответы:

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

PIR
источник
Чем вы предлагаете заменить слой для встраивания? Я попытался просто удалить слой встраивания, но это не работает.
Wacax
1
Посмотрите на другие примеры - начните, например, непосредственно со слоя Dense. Не забудьте установить параметр input_shape.
пир
5

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

Мутян Чжай
источник
2

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

PS: есть специальная оболочка hyperopt для keras, hyperas ( https://github.com/maxpumperla/hyperas ). Вы также можете использовать его.

ШАШАНК ГУПТА
источник
2

Талос это именно то, что вы ищете; автоматизированное решение для поиска комбинаций гиперпараметров для моделей Keras. Возможно, я не объективен, так как являюсь автором, но намерение состояло в том, чтобы предложить альтернативу с наименьшей возможной кривой обучения, полностью раскрывая функциональность Keras.

В качестве альтернативы, как уже упоминалось, вы можете посмотреть в Hyperas , а затем SKlearn или AutoKeras . Насколько мне известно, на момент написания этих 4-х вариантов специально для пользователей Keras.

mikkokotila
источник