问题描述
我想训练一个模型来生成文本,类似于
就我所知,此模型使用以下架构
[单词索引的顺序]-> [嵌入]-> [LSTM]-> [1热编码的“下一个单词”]
基本上,作者将过程建模为分类问题,其中输出层的维数与语料库中的单词一样多。
我想通过重用学习到的嵌入,然后最小化预测嵌入和实际嵌入之间的距离,将过程建模为回归问题。
基本上:
[单词索引的顺序]-> [嵌入]-> [LSTM]-> [下一个单词的嵌入向量]
我的问题是,由于模型正在动态学习嵌入,因此如何以输入输入(作为单词索引)的相同方式提供输出,然后告诉模型“但是在使用输出之前,请替换它通过其嵌入向量”?
非常感谢您的所有帮助:-)
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代码,只是伪代码。
在测试阶段:
通常,您需要编写自己的解码函数。 首先,您选择一个单词(或几个单词)作为起点。 然后,将此单词(或短单词序列)馈入网络以预测下一个单词的嵌入。 在此步骤中,您可以定义自己的示例函数,例如:您可能希望选择嵌入最接近预测的单词的单词作为下一个单词,或者您可能希望从分布有以下单词的分布中抽取下一个单词:与预测嵌入更接近的嵌入具有较大的可能性被选择。 选择下一个单词后,将其输入网络并预测下一个单词,依此类推。
因此,您需要一次生成一个单词(以另一种方式输入,一次嵌入),而不是将整个序列输入到网络中。
如果以上声明对您来说太抽象了,那么这是一个很好的示例: :
第85行是引言部分,它从语料库中随机选择一小段文本进行处理。 从第90行开始,存在一个循环,其中每个步骤都采样一个字符(这是一个字符,因此每个时间步都输入一个字符。对于您的情况,应该是一个单词,而不是一个字符):L95预测下一个字符的分布,从L96样本中分发。 希望这足够清楚。