代码之家  ›  专栏  ›  技术社区  ›  yuhengd

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

  •  6
  • yuhengd  · 技术社区  · 7 年前

    我试图理解LSTM是如何被用来对由预先训练的单词嵌入组成的文本句子(单词序列)进行分类的。我正在阅读一些关于lstm的帖子,我对详细的程序感到困惑:

    在keras上使用LSTM进行IMDB分类: https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/ 科拉对LSTM的解释: http://colah.github.io/posts/2015-08-Understanding-LSTMs/

    比如说,我想用lstm对电影评论进行分类,每个评论的固定长度为500字。我使用预先训练好的单词嵌入(来自fasttext),为每个单词提供100维向量。什么是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 回复  |  直到 7 年前
        1
  •  6
  •   Daniel Möller    7 年前

    嵌入的形状:

    • 输入数据的形状: 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 你会得到 y_train 有型 (reviews,1) .

    问题:

    如果每个Xt都是一个100维向量,代表一篇评论中的一个单词,那么我是否每次将评论中的每个单词输入一个LSTM?

    不,LSTM层已经独立完成了所有工作,包括所有重复的步骤,前提是其输入具有形状 (评论、文字、嵌入大小)


    这100个神经元是如何相互联系的?

    它们有点平行(你可以想象100张像你贴的一样的图片,都是平行的),几乎和其他类型的普通图层一样。

    但在反复的步骤中,有一个数学表达式使他们交谈(不幸的是,我无法确切解释如何)。


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

    你可以,如果你想的话,但是细胞越多,层就越智能(就像其他类型的层一样)

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


    深刻理解LSTM:

        2
  •  5
  •   nuric    7 年前

    你混淆了一些术语,让我们试着一步一步地弄清楚发生了什么:

    1. 您的案例中的数据将具有一定的形状(样本,500),这意味着我们有一些评论,每个评论最多500个字编码为整数。
    2. 然后 Embedding 分层 words[index] 对于每个样本中的每个单词,如果嵌入大小为100,则给出一个张量(样本,500100)。
    3. 现在,当我们说 LSTM(100) 它意味着一个运行 仅有一个的 输出大小为100的每个单词上的LSTM单元(类似于Colah的图表)。让我再试一次,创建一个LSTM单元,将输入转换为100大小的输出(隐藏大小)和图层 单词上的同一个单元格。
    4. 现在我们获得(样本,100),因为相同的LSTM处理每一个500字的评论,并返回大小为100的最终输出。比如我们通过了 return_sequences=True 然后,图中每个隐藏的输出,h-1,h,h+1都会被返回,这样我们就可以得到一个形状(样本,500,100)。
    5. 最后,我们将(样本100)传递给 Dense 层来进行预测,从而为批处理中的每次评审提供(样本1)预测。

    最重要的教训是 LSTM 绕着一个 LSTMCell 并在每个时间步上运行它,这样就不必自己编写循环操作。

    推荐文章