当前位置: 代码迷 >> python >> Keras-如何将学习到的Embedding()层用于输入和输出?
  详细解决方案

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

热度:79   发布时间:2023-06-16 10:07:44.0

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

就我所知,此模型使用以下架构
[单词索引的顺序]-> [嵌入]-> [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代码,只是伪代码。

在测试阶段:

通常,您需要编写自己的解码函数。 首先,您选择一个单词(或几个单词)作为起点。 然后,将此单词(或短单词序列)馈入网络以预测下一个单词的嵌入。 在此步骤中,您可以定义自己的示例函数,例如:您可能希望选择嵌入最接近预测的单词的单词作为下一个单词,或者您可能希望从分布有以下单词的分布中抽取下一个单词:与预测嵌入更接近的嵌入具有较大的可能性被选择。 选择下一个单词后,将其输入网络并预测下一个单词,依此类推。

因此,您需要一次生成一个单词(以另一种方式输入,一次嵌入),而不是将整个序列输入到网络中。

如果以上声明对您来说太抽象了,那么这是一个很好的示例: :

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

  相关解决方案