Keras-如何将学习到的Embedding()层用于输入和输出?

另一个编码员

我想训练一个模型来生成文本,类似于此博客文章

就我所知,此模型使用以下架构
[单词索引的顺序]-> [嵌入]-> [LSTM]-> [1热编码的“下一个单词”]

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


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

基本上:

[单词索引的顺序]-> [嵌入]-> [LSTM]-> [下一个单词的嵌入向量]

我的问题是,由于模型正在动态学习嵌入,因此如何以输入输入(作为单词索引)的相同方式提供输出,然后告诉模型“但是在使用输出之前,请替换它通过其嵌入向量”?


非常感谢您的帮助:-)

独奏

在训练阶段:

您可以使用两个输入(一个用于目标,一个用于输入,这两个序列之间的偏移量为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样本中分发。希望这足够清楚。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章