我正在使用keras做语言模型。
基本上,我的词汇量N是~30.000,我已经在它上面训练了一个word2vec,所以我使用嵌入,然后是LSTM,然后我用一个完全连接的层来预测下一个单词,然后是softmax。我的模型如下所示:
EMBEDDING_DIM = 256
embedding_layer = Embedding(N,EMBEDDING_DIM,weights=[embeddings],
trainable=False)
model = Sequential()
model.add(embedding_layer)
model.add(LSTM(EMBEDDING_DIM))
model.add(Dense(N))
model.add(Activation('softmax'))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop")
我有两个问题:
在这种情况下,你能确认我们只使用LSTM的最后一个隐藏层(后面是完全连接层和softmax),并且没有LSTM的连续隐藏层的max/mean-pooling(就像这里的情感分析http://deeplearning.net/tutorial/lstm.html)吗?
你怎么想,而不是连接的最后一个隐层lstm大完全连接层的大小为N(30.000),连接到一层EMBEDDING_DIM大小,预测下一个单词的嵌入而不是这个词本身,在这种情况下,我们通过类似mse取代损失,减少训练时间,主要是"帮助"我们的模型,因为词汇量也大,嵌入可能有用的网络?
谢谢!
我只能肯定地回答第一个问题:
是的,LSTM层的输出是最后一个隐藏单元。它只会返回所有隐藏状态如果你给它参数return_sequences=True
。默认为False。
对于第二个问题,我只能说我试图预测嵌入而不是单词的单向量表示,但它给了我不好的结果。单词仍然是分类变量,即使我们可以通过连续表示来近似它们。出于这个原因,人们已经投入了大量的精力来开发hierarchy Softmax。