LSTM如何使用单词嵌入进行文本分类,例如Keras

时间:2018-05-18 20:40:27

标签: tensorflow machine-learning keras deep-learning lstm

我试图理解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维向量。 Xt的尺寸是什么才能进入LSTM? LSTM是如何训练的?如果每个Xt是100维向量代表评论中的一个单词,我是否一次将评论中的每个单词提供给LSTM? LSTM在每个时代都会做些什么?我真的很困惑......

lstm cell from Colah's blog

# LSTM for sequence classification in the IMDB dataset
import numpy
from keras.datasets import imdb
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
# fix random seed for reproducibility
numpy.random.seed(7)
# load the dataset but only keep the top n words, zero the rest
top_words = 5000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words)
# truncate and pad input sequences
max_review_length = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_review_length)
X_test = sequence.pad_sequences(X_test, maxlen=max_review_length)
# create the model
embedding_vecor_length = 32
model = 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 model
scores = 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个神经元如何相互连接?为什么我不能只使用上图中的1个单元格进行分类,因为它是一种循环方式,因此它会在下一个时间戳中将输出反馈给自身?任何可视化图表都将受到欢迎。

谢谢!

2 个答案:

答案 0 :(得分:3)

你混淆了一些条款,让我们试着澄清一步一步的进展:

  1. 您案例中的数据将成形(样本,500),这意味着我们有一些评论,每次评论最多500个字,编码为整数。
  2. 如果您的嵌入尺寸为100,则Embedding图层会为每个样本中的每个单词words[index]提供张量(样本,500,100)。
  3. 现在这里是令人困惑的一点,当我们说LSTM(100)时,它意味着一个层运行一个单个 LSTM单元格(就像在Colah的图中一样)输出大小为100.让我再试一次,你创建一个LSTM单元,将输入转换为100大小的输出(隐藏大小),层运行单词上的相同单元格。
  4. 现在我们获得(样本,100),因为相同的LSTM处理500个单词的每个评论并返回大小为100的最终输出。例如,我们通过return_sequences=True然后每个隐藏的输出,h-1将返回图中的h,h + 1,因此我们将获得一个形状(样本,500,100)。
  5. 最后,我们将(样本,100)传递给Dense图层进行预测,给出(样本,1)预测批次中的每个评论。
  6. 免费教训是LSTM 图层包围了LSTMCell,并在每个时间步长运行它,因此您不必编写循环自己动手。

答案 1 :(得分:3)

嵌入的形状:

  • 输入数据的形状: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(但这适用于您的模型)。

您的代码似乎正在做所有事情,因此您不必做任何特殊的事情来训练此模型。将fitX_train一起使用,您将获得y_train形状为(reviews,1)的{​​{1}}。

<强>问题:

  

如果每个Xt是100维向量代表评论中的一个单词,我是否一次将评论中的每个单词提供给LSTM?

不,LSTM层已经自行完成所有操作,包括所有重复步骤,只要其输入具有形状(reviews, words, embedding_size)

  

100个神经元如何相互连接?

它们有点平行(您可以想象100个图像,如您发布的图像,全部平行),几乎与其他类型的常用图层相同。

但是在经常性的步骤中,有一种可以让他们进行对话的物质表达(不幸的是,我无法解释具体如何)。

  

为什么我不能只使用上图中的1个单元格进行分类,因为它是一种循环方式,因此它会在下一个时间戳中将输出反馈给自身?

如果你愿意,你可以,但是细胞越多,层就越聪明(与其他各种层一样)

选择的数字100没有什么特别之处。这可能是巧合或误解。它可以是任何数量,50个细胞,200个细胞,1000个细胞......

深入了解LSTM: