Keras: хороший результат с MLP, но плохой с двунаправленным LSTM - PullRequest
1 голос
/ 18 апреля 2020

Я обучил две нейронные сети с Keras: MLP и Bidirectional LSTM.

Моя задача - предсказать порядок слов в предложении, поэтому для каждого слова нейронная сеть имеет вывести реальное число. Когда предложение с N словами обрабатывается, N действительных чисел в выходных данных ранжируются для получения целых чисел, представляющих положение слов.

Я использую тот же набор данных и ту же предварительную обработку в наборе данных. Единственное отличие состоит в том, что в наборе данных LSTM я добавил заполнение для получения последовательностей одинаковой длины.

На этапе прогнозирования с LSTM я исключаю предсказания, созданные из векторов заполнения, поскольку Я замаскировал их на этапе обучения.

Архитектура MLP:

mlp = keras.models.Sequential()

# add input layer
mlp.add(
    keras.layers.Dense(
        units=training_dataset.shape[1],
        input_shape = (training_dataset.shape[1],),
        kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
        activation='relu')
    )

# add hidden layer
mlp.add(
    keras.layers.Dense(
        units=training_dataset.shape[1] + 10,
        input_shape = (training_dataset.shape[1] + 10,),
        kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
        bias_initializer='zeros',
        activation='relu')
    )

# add output layer
mlp.add(
    keras.layers.Dense(
        units=1,
        input_shape = (1, ),
        kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
        bias_initializer='zeros',
        activation='linear')
    )

Архитектура двунаправленного LSTM:

model = tf.keras.Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(Bidirectional(LSTM(units=20, return_sequences=True), input_shape=(timesteps, features)))
model.add(Dropout(0.2))
model.add(Dense(1, activation='linear'))

Задача гораздо лучше решается с помощью LSTM, который должен хорошо фиксировать зависимости между словами.

Однако с MLP я добиваюсь хороших результатов, но с LSTM результаты очень плохие.

Поскольку я новичок, могу кто-то понимает, что не так с моей LSTM архитектурой? Я выхожу из головы.

Заранее спасибо.

1 Ответ

1 голос
/ 19 апреля 2020

Для этой проблемы я на самом деле не удивлен, что MLP работает лучше.

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

Но для вашей проблемы вы удалили местность и пытаетесь ее восстановить. Для этой проблемы MLP, имеющая глобальную информацию, может лучше выполнять сортировку.

Тем не менее, я думаю, что еще есть что сделать для улучшения модели LSTM.


Одна вещь, которую вы можете сделать, это убедиться, что сложность каждой модели одинакова. Вы можете сделать это легко с помощью count_params .

mlp.count_params()
model.count_params()

Если бы мне пришлось угадывать, ваш LSTM намного меньше. Есть только 20 units, что кажется небольшим для проблемы НЛП. Я использовал 512 для задачи Классификация продукта для обработки информации на уровне персонажа (словарь размера 128, вложение размера 50). Модели уровня слова, обученные на больших наборах данных, таких как AWD-LSTM , получают тысячи units.

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

...