Keras - 如何将学习的 Embedding() 层用于输入和输出?
Keras - How to use the learned Embedding() Layer for Input and Output?
我想训练一个模型来生成文本,类似于this blog post
据我了解,此模型使用以下架构
[单词索引序列] -> [嵌入] -> [LSTM] -> [1 热编码 "next word"]
基本上,作者将这个过程建模为分类问题,其中输出层的维度与语料库中的单词一样多。
我想将该过程建模为回归问题,方法是重新使用学习到的嵌入,然后最小化预测嵌入和实际嵌入之间的距离。
基本上:
[单词索引序列] -> [嵌入] -> [LSTM] -> ["next word"]
的嵌入向量
我的问题是,由于模型正在动态学习嵌入,我如何以与输入输入(作为单词索引)相同的方式提供输出,然后告诉模型 "But before you use the output, replace it by its embedding vector" ?
非常感谢大家的帮助:-)
在训练阶段:
您可以使用两个输入(一个用于目标,一个用于输入,这两个序列之间的偏移量为 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,因此每个时间步输入一个字符。对于您的情况,它应该是一个单词,而不是一个字符): L95 预测下一个char 的分布,分布中的 L96 样本。希望这已经够清楚了。
我想训练一个模型来生成文本,类似于this blog post
据我了解,此模型使用以下架构
[单词索引序列] -> [嵌入] -> [LSTM] -> [1 热编码 "next word"]
基本上,作者将这个过程建模为分类问题,其中输出层的维度与语料库中的单词一样多。
我想将该过程建模为回归问题,方法是重新使用学习到的嵌入,然后最小化预测嵌入和实际嵌入之间的距离。
基本上:
[单词索引序列] -> [嵌入] -> [LSTM] -> ["next word"]
的嵌入向量我的问题是,由于模型正在动态学习嵌入,我如何以与输入输入(作为单词索引)相同的方式提供输出,然后告诉模型 "But before you use the output, replace it by its embedding vector" ?
非常感谢大家的帮助:-)
在训练阶段:
您可以使用两个输入(一个用于目标,一个用于输入,这两个序列之间的偏移量为 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,因此每个时间步输入一个字符。对于您的情况,它应该是一个单词,而不是一个字符): L95 预测下一个char 的分布,分布中的 L96 样本。希望这已经够清楚了。