Keras - 如何使用学习的嵌入()层进行输入和输出?

时间:2017-02-15 15:47:43

标签: python tensorflow deep-learning keras lstm

我想训练一个模型来生成文本,类似于this blog post

此模型使用 - 据我所知 - 以下架构
[单词索引的顺序] - > [嵌入] - > [LSTM] - > [1 Hot Encoded" next word"]

基本上,作者将过程建模为分类问题,其中输出层的维度与语料库中的单词一样多。

我想通过重新使用学习的嵌入,然后最小化预测嵌入和实际嵌入之间的距离来将过程建模为回归问题。

基本上:

[单词指数序列] - > [嵌入] - > [LSTM] - > [嵌入 - 矢量"下一个字"]

我的问题是,当模型正在动态学习嵌入时,我怎样才能以与输入相同的方式输入输出(作为单词索引)然后告诉模型"但在你之前使用输出,用嵌入向量替换它" ?

非常感谢您的帮助: - )

1 个答案:

答案 0 :(得分:3)

在培训阶段:

您可以使用两个输入(一个用于目标,一个用于输入,这两个序列之间的偏移量为1)并重用嵌入层。 如果你输入的句子是[1,2,3,4],你可以从中生成两个序列:in = [1,2,3],out = [2,3,4]。然后,您可以使用Keras的功能API重用嵌入层:

emb1 = Embedding(in)
emb2 = Embedding(out)
predict_emb = LSTM(emb1)
loss = mean_squared_error(emb2, predict_emb)

注意它不是Keras代码,只是伪代码。

在测试阶段:

通常,您需要编写自己的解码功能。首先,您选择一个单词(或几个单词)开始。然后,将此单词(或短字序列)提供给网络以预测下一个单词的嵌入。在此步骤中,您可以定义自己的示例函数,例如:您可能希望选择嵌入最接近预测的单词作为下一个单词,或者您可能希望从分布中选择下一个单词作为下一个单词更接近预测嵌入的嵌入具有更大的选择概率。选择下一个单词后,将其提供给网络并预测下一个单词,依此类推。

因此,您需要一次生成一个单词(换句话说,一个嵌入),而不是将整个序列输入网络。

如果上述陈述过于抽象,这里有一个很好的例子:https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py

第85行是引言部分,它从语料库中随机选择一小段文本进行处理。从第90行开始,有一个循环,其中每个步骤都对一个字符进行采样(这是一个字符,所以每个时间步都输入一个字符。对于你的情况,它应该是一个单词,而不是一个字符):L95预测下一个字符的分布,L96样品来自分销。希望这很清楚。