2017-02-15 76 views
2

我想一个模型来生成文本,类似于训练到this blog postKeras - 如何使用学习的嵌入()图层进行输入和输出?

该模型使用 - 据我所知 - 下列结构
[词索引序列] - > [嵌入] - > [ LSTM] - > [1 Hot Encoded“next word”]

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


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

基本上:

[词索引序列] - > [嵌入] - > [LSTM] - >

我的问题是[ “下一个字” 的嵌入矢量],作为模型正在动态地学习嵌入,我怎样才能以与输入输入相同的方式(如字索引)来提供输出,然后告诉模型“但在使用输出之前,将其替换为嵌入向量”?


非常感谢您的所有帮助:-)

+0

您是否得到了这个工作?如果是这样,任何链接到代码/博客(甚至自我答复) - 正确标记的答案只是显示分类方法,而不是你想要做的回归方法。 –

回答

1

在训练阶段:

您可以使用两个输入(一个目标,一个用于输入,还有的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行开始有一个循环,其中每个步骤对一个字符进行采样(这是一个char- rnn,所以每个时间步输入一个char。对于你的情况,它应该是一个字,而不是字符):L95预测下一个字符的分布,来自分布的L96个样本。希望这已经够清楚了。

+0

非常感谢,这对训练有意义! 但是在运行时怎么办?当我想预测'out'并且不将它馈送到网络时? –

+0

我已经更新了答案。希望能帮助到你。 – soloice

+0

是的,谢谢! –