首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双向LSTM和LSTM有什么区别?

双向LSTM和LSTM有什么区别?
EN

Stack Overflow用户
提问于 2017-03-26 23:31:47
回答 5查看 84.4K关注 0票数 92

有人能解释一下吗?我知道双向LSTM有向前和向后传球,但是这比单向LSTM有什么优势呢?

他们中的每一个更适合做什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-05-20 06:51:24

LSTM在其核心中,使用隐藏状态从已经通过它的输入中保存信息。

单向LSTM只保存过去的信息,因为它看到的唯一输入来自过去。

使用双向将以两种方式运行您的输入,一种是从过去到未来,另一种是从未来到过去。这种方法与单向的不同之处在于,在向后运行的LSTM中,您可以保存来自未来的信息,以及使用两个隐藏状态组合在一起,您可以在任何时间点保存来自的过去和未来的信息。

他们适合的是一个非常复杂的问题,但BiLSTM显示了非常好的结果,因为他们可以更好地理解上下文,我将尝试通过一个例子来解释。

假设我们试图预测一个句子中的下一个单词,在较高的水平上,单向LSTM将看到的是

孩子们去了..。

并且尝试仅通过这个上下文来预测下一个单词,例如,使用双向LSTM,您将能够看到更多的信息。

远期LSTM:

孩子们去了..。

反向LSTM:

..。然后他们从游泳池里出来

您可以看到,利用来自未来的信息,网络可能更容易理解下一个单词是什么。

票数 147
EN

Stack Overflow用户

发布于 2018-06-24 22:36:34

添加到Bluesummer的回答中,下面是如何在不调用BiLSTM模块的情况下从头开始实现双向LSTM。这可能会更好地对比单向和双向LSTM之间的区别。如您所见,我们合并两个LSTM来创建一个双向LSTM。

您可以使用任何一个{'sum', 'mul', 'concat', 'ave'}合并前向和后向LSTM的输出。

代码语言:javascript
复制
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)
票数 24
EN

Stack Overflow用户

发布于 2018-12-07 06:48:12

LSTM相比,BLSTMBiLSTM有两个网络,一个在forward方向访问past信息,另一个在reverse方向上访问future维基

一个新的类Bidirectional按官方文档添加:docs/python/tf/keras/层/双向

代码语言:javascript
复制
model = Sequential()
model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(5,
10)))

激活函数可以添加如下:

代码语言:javascript
复制
model = Sequential()
model.add(Bidirectional(LSTM(num_channels, 
        implementation = 2, recurrent_activation = 'sigmoid'),
        input_shape=(input_length, input_dim)))

使用IMDB数据的完整示例将类似于4个时代之后的this.The结果。

代码语言:javascript
复制
Downloading data from https://s3.amazonaws.com/text-datasets/imdb.npz
17465344/17464789 [==============================] - 4s 0us/step
Train...
Train on 25000 samples, validate on 25000 samples
Epoch 1/4
25000/25000 [==============================] - 78s 3ms/step - loss: 0.4219 - acc: 0.8033 - val_loss: 0.2992 - val_acc: 0.8732
Epoch 2/4
25000/25000 [==============================] - 82s 3ms/step - loss: 0.2315 - acc: 0.9106 - val_loss: 0.3183 - val_acc: 0.8664
Epoch 3/4
25000/25000 [==============================] - 91s 4ms/step - loss: 0.1802 - acc: 0.9338 - val_loss: 0.3645 - val_acc: 0.8568
Epoch 4/4
25000/25000 [==============================] - 92s 4ms/step - loss: 0.1398 - acc: 0.9509 - val_loss: 0.3562 - val_acc: 0.8606

BiLSTMBLSTM

代码语言:javascript
复制
import numpy as np
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense, Dropout, Embedding, LSTM, Bidirectional
from keras.datasets import imdb


n_unique_words = 10000 # cut texts after this number of words
maxlen = 200
batch_size = 128

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=n_unique_words)
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
y_train = np.array(y_train)
y_test = np.array(y_test)

model = Sequential()
model.add(Embedding(n_unique_words, 128, input_length=maxlen))
model.add(Bidirectional(LSTM(64)))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

print('Train...')
model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=4,
          validation_data=[x_test, y_test])
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43035827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档