LSTM如何与词嵌入一起用于文本分类,Keras中的示例

我试图理解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中会做什么?我真的很困惑…

来自Colah博客的LSTM单元

# 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:

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注