我想训练一个生成文本的模型,类似于这篇博客文章
据我所知,该模型使用了以下体系结构
->嵌入-> LSTM -> 1热编码“下一个单词”的词义序列
基本上,作者将过程建模为分类问题,其中输出层的维数与语料库中的单词相同。
我想把这个过程建模为回归问题,方法是重用所学的嵌入,然后最小化预测和实际嵌入之间的距离。
基本上:
->嵌入-> LSTM ->嵌入序列-下一个单词的向量
我的问题是,当模型正在动态地学习嵌入式时,我如何才能像输入(作为单词索引)那样提供输出,然后告诉模型“但是在使用输出之前,用它的嵌入向量替换它”?
非常感谢大家的帮助:-)
发布于 2017-02-16 06:07:56
训练阶段的:
您可以使用两个输入(一个用于目标,一个用于输入,这两个序列之间的偏移量为1)并重用嵌入层。如果输入的句子是1,2,3,4,可以从它生成两个序列: in = 1,2,3,out = 2,3,4。然后可以使用Keras的functional重用嵌入层:
emb1 = Embedding(in)
emb2 = Embedding(out)
predict_emb = LSTM(emb1)
loss = mean_squared_error(emb2, predict_emb)注意,这不是Keras代码,只是伪代码。
测试阶段的:
通常,您需要编写自己的解码函数。首先,你选择一个单词(或几个词)开始。然后,将这个单词(或短的单词序列)提供给网络,以预测下一个单词的嵌入。在这一步中,您可以定义自己的示例函数,例如:您可能希望选择嵌入与预测词最近的单词作为下一个单词,或者您可能希望从一个分布中抽取下一个单词,在该分布中,嵌入更接近预测嵌入的单词被选择的概率更大。一旦您选择了下一个单词,然后将其提供给网络,并预测下一个单词,等等。
因此,您需要一次生成一个单词(换句话说,一个嵌入),而不是将整个序列输入到网络.。
如果上述语句对您来说太抽象了,下面是一个很好的示例:generation.py
第85行是导论部分,从语料库中随机选取一小块文本进行研究。在第90行中有一个循环,每个步骤都采样一个字符(这是一个char-rnn,所以每个时间步骤都输入一个字符。对于您的情况,应该是一个单词,而不是char):L95预测下一个char的分布,L96样本来自发行版。希望这已经足够清楚了。
https://stackoverflow.com/questions/42253934
复制相似问题