В чем разница между двунаправленным LSTM и LSTM?
может кто-нибудь объяснить это? Я знаю, что двунаправленные LSTMs имеют прямой и обратный проход, но в чем преимущество этого над однонаправленным LSTM?
для чего каждый из них лучше подходит?
3 ответов
LSTM в своем ядре сохраняет информацию из входов, которые уже прошли через него, используя скрытое состояние.
однонаправленный LSTM сохраняет только информацию о мимо потому что единственные входы, которые он видел, из прошлого.
использование двунаправленного будет запускать ваши входы двумя способами: один из прошлого в будущее и один из будущего в прошлое, и чем отличается этот подход от однонаправленного, так это тем, что в LSTM, который работает назад, вы сохраняете информация из будущее и используя два скрытых состояния в сочетании вы можете в любой момент времени, чтобы сохранить информацию от как прошлое, так и будущее.
то, что они подходят для очень сложного вопроса, но BiLSTMs показывают очень хорошие результаты, поскольку они могут лучше понять контекст, я попытаюсь объяснить на примере.
предположим, мы попытаемся предсказать следующее слово в предложении, на высоком уровне, что однонаправленный LSTM будет вижу
мальчики пошли ....
и попытается предсказать следующее слово только этим контекстом, с двунаправленным LSTM вы сможете увидеть информацию дальше по дороге, например
вперед LSTM:
мальчики пошли ...
обратная LSTM:
... а потом они выбрались из бассейна!--1-->
вы можете видеть, что, используя информацию из будущего для сети может быть проще понять, что такое следующее слово.
добавление к ответу Bluesummer, вот как вы бы реализовали двунаправленную LSTM с нуля без вызова BiLSTM
модуль. Это может лучше контрастировать разницу между однонаправленными и двунаправленными LSTMs. Как вы видите, мы сливаем два LSTMs для создания двунаправленного ЛСТМ.
вы можете объединить выходы прямой и обратной LSTMs, используя либо {'sum', 'mul', 'concat', 'ave'}
.
left = Sequential()
left.add(LSTM(output_dim=hidden_units, init='uniform', inner_init='uniform',
forget_bias_init='one', return_sequences=True, activation='tanh',
inner_activation='sigmoid', input_shape=(99, 13)))
right = Sequential()
right.add(LSTM(output_dim=hidden_units, init='uniform', inner_init='uniform',
forget_bias_init='one', return_sequences=True, activation='tanh',
inner_activation='sigmoid', input_shape=(99, 13), go_backwards=True))
model = Sequential()
model.add(Merge([left, right], mode='sum'))
model.add(TimeDistributedDense(nb_classes))
model.add(Activation('softmax'))
sgd = SGD(lr=0.1, decay=1e-5, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)
print("Train...")
model.fit([X_train, X_train], Y_train, batch_size=1, nb_epoch=nb_epoches, validation_data=([X_test, X_test], Y_test), verbose=1, show_accuracy=True)
другой вариант использования двунаправленного LSTM может быть для классификации слов в тексте. Они могут видеть прошлый и будущий контекст слова и гораздо лучше подходят для классификации слова.