Machine learning 什么';双向LSTM和LSTM之间的区别是什么?

Machine learning 什么';双向LSTM和LSTM之间的区别是什么?,machine-learning,neural-network,keras,lstm,recurrent-neural-network,Machine Learning,Neural Network,Keras,Lstm,Recurrent Neural Network,有人能解释一下吗?我知道双向LSTM有向前和向后传球,但这比单向LSTM有什么优势 它们中的每一个更适合做什么?LSTM在其核心中,使用隐藏状态保存已经通过它的输入的信息 单向LSTM只保留过去的信息,因为它看到的唯一输入来自过去 使用双向将以两种方式运行输入,一个是从过去到未来,一个是从未来到过去,这种方法与单向的不同之处在于,在向后运行的LSTM中,您可以保存来自未来的信息,并且使用两种隐藏状态组合,您可以在任何时间点保存来自过去和未来的信息 它们适合什么是一个非常复杂的问题,但是BILST

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


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

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

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

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

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

让我们试着预测句子中的下一个单词,在一个高层次上,单向LSTM将看到什么

男孩们去了

并将尝试仅通过此上下文预测下一个单词,例如,使用双向LSTM,您将能够看到进一步的信息

正向LSTM:

男孩们去了

反向LSTM:

。。。然后他们走出了游泳池


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

双向LSTM的另一个用例可能是用于文本中的单词分类。它们可以看到单词的过去和未来上下文,更适合对单词进行分类

除了Bluesummer的答案之外,下面是如何从头开始实现双向LSTM,而无需调用
BiLSTM
模块。这可能会更好地对比单向和双向LSTM之间的差异。如您所见,我们合并两个LSTM以创建一个双向LSTM

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

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
相比,
BLSTM
BiLSTM
有两个网络,一个访问
前向
方向的过去信息,另一个访问
后向
方向的未来

根据此处的官方文件,添加了一个新的类
双向

可以这样添加激活功能:

model = Sequential()
model.add(Bidirectional(LSTM(num_channels, 
        implementation = 2, recurrent_activation = 'sigmoid'),
        input_shape=(input_length, input_dim)))
使用IMDB数据的完整示例如下。4个历元后的结果

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

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])

它也有助于时间序列预测问题,如预测家庭用电量。然而,我们也可以在这方面使用LSTM,但双向LSTM在这方面也会做得更好。

有一个疑问,当一个句子通过双向LSTM运行时,那么向前或向后LSTM单元的输出,如果我们试图对句子进行编码,我们应该使用哪一个?我认为没有一个答案,但是我相信使用这两种方法都是一个好方法——也许本文可以有所帮助,但是双向lstm的使用会受到限制,对吗?因为当你试图预测一个单词时,你不会知道下一个单词,也许你可以指出一些真实世界的例子?非常感谢!正如你所说,翻译、情感分析和其他与NLP无关的应用程序有很多用途。此外,双向LSTM(或甚至超过2路LSTM)可应用于图像或光谱仪inputs@Kaileghbi LSTM通常用于序列到序列的应用程序中,您知道预测时的完整输入,但不知道它对应什么。如前所述,例如翻译(你有完整的短语)、语音识别(你有完整的话语)、OCR(你有完整的图像)。如果你使用
双向(LSTM(64))
而不是
,会有所不同吗?如果不是,那么双向的
东西在内部是这样实现的吗?
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])