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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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