我试图理解LSTM如何用于分类由预训练词嵌入组成的文本句子(词序列)。我阅读了一些关于LSTM的帖子,但我对详细的过程感到困惑:
使用Keras中的LSTM进行IMDB分类:https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/Colah对LSTM的解释:http://colah.github.io/posts/2015-08-Understanding-LSTMs/
例如,假设我想使用LSTM来分类电影评论,每个评论的长度固定为500个词。我使用预训练的词嵌入(来自fasttext),每个词得到一个100维的向量。输入LSTM的Xt的维度会是什么?LSTM是如何训练的?如果每个Xt是一个表示评论中一个词的100维向量,我是否需要一次将评论中的每个词输入到LSTM中?LSTM在每个epoch中会做什么?我真的很困惑…
# LSTM for sequence classification in the IMDB datasetimport numpyfrom keras.datasets import imdbfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import LSTMfrom keras.layers.embeddings import Embeddingfrom keras.preprocessing import sequence# fix random seed for reproducibilitynumpy.random.seed(7)# load the dataset but only keep the top n words, zero the resttop_words = 5000(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words)# truncate and pad input sequencesmax_review_length = 500X_train = sequence.pad_sequences(X_train, maxlen=max_review_length)X_test = sequence.pad_sequences(X_test, maxlen=max_review_length)# create the modelembedding_vecor_length = 32model = Sequential()model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))model.add(LSTM(100))model.add(Dense(1, activation='sigmoid'))model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])print(model.summary())model.fit(X_train, y_train, epochs=3, batch_size=64)# Final evaluation of the modelscores = model.evaluate(X_test, y_test, verbose=0)print("Accuracy: %.2f%%" % (scores[1]*100))
在上面的代码示例中(来自Jason Brownlee的博客 https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/),使用了100个单元/神经元的LSTM。100个神经元是如何相互连接的?为什么我不能只使用上图中的一个单元进行分类,因为它是以递归方式进行的,所以在下一个时间戳将其输出反馈给自己?欢迎任何可视化图表。
谢谢!!
回答:
带嵌入的形状:
- 输入数据的形状:
X_train.shape == (reviews, words)
,即(reviews, 500)
在LSTM中(嵌入之后,或者如果您没有嵌入层)
- 输入数据的形状:
(reviews, words, embedding_size)
:(reviews, 500, 100)
– 其中100是嵌入层自动创建的
- 如果没有嵌入层,模型的输入形状可以是:
input_shape = (500, 100)
input_shape = (None, 100)
– 此选项支持可变长度的评论
- 每个
Xt
是从input_data[:,timestep,:]
中切片得到的,其形状为:(reviews, 100)
- 但这是完全自动的,由层本身完成。
- 每个
Ht
都被丢弃,结果只有最后的h
,因为您没有使用return_sequences=True
(但这对您的模型来说没问题)。
您的代码似乎已经完成了所有操作,因此您不需要做任何特别的事情来训练这个模型。使用fit
和合适的X_train
,您将得到形状为(reviews,1)
的y_train
。
问题:
如果每个Xt是一个表示评论中一个词的100维向量,我是否需要一次将评论中的每个词输入到LSTM中?
不需要,LSTM层已经自动完成了一切,包括所有递归步骤,前提是其输入形状为(reviews, words, embedding_size)
100个神经元是如何相互连接的?
它们是并行的(您可以想象有100个像您发布的图那样并行的图像),几乎与其他类型的常规层相同。
但在递归步骤中,有一个数学表达式使它们进行交流(遗憾的是我无法准确解释这是如何实现的)。
为什么我不能只使用上图中的一个单元进行分类,因为它是以递归方式进行的,所以在下一个时间戳将其输出反馈给自己?
如果您想这样做是可以的,但单元越多,层就越智能(就像其他类型的层一样)
选择100这个数字没有什么特别的。可能只是巧合或误解。它可以是任何数字,50个单元,200个单元,1000个单元…
深入理解LSTM:
- 所有类型的使用方式,一对多,多对一,多对多:https://stackoverflow.com/a/50235563/2097240