【问题标题】:Keras - How to use the learned Embedding() Layer for Input and Output?Keras - 如何使用学习的 Embedding() 层进行输入和输出?
【发布时间】:2017-02-15 15:47:42
【问题描述】:

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

据我所知,此模型使用以下架构
[单词索引序列] -> [Embedding] -> [LSTM] -> [1 Hot Encoded "next word"]

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


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

基本上:

[单词索引序列] -> [Embedding] -> [LSTM] -> [Embedding-Vector of the "next word"]

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


非常感谢大家的帮助:-)

【问题讨论】:

  • 你搞定了吗?如果是这样,任何指向代码/博客的链接(甚至是自我回答) - 正确标记的答案仅显示分类方法,而不是您想要执行的回归方法。

标签: python tensorflow deep-learning keras 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 代码,只是伪代码。

处于测试阶段:

通常,您需要编写自己的解码函数。首先,你选择一个词(或几个词)开始。然后,将这个词(或短词序列)输入网络以预测下一个词的嵌入。在这一步,你可以定义你自己的样本函数,比如说:你可能想选择嵌入最接近预测的词作为下一个词,或者你可能想从一个分布中采样下一个词,其中词与更接近预测嵌入的嵌入有更大的概率被选择。一旦你选择了下一个单词,然后将其输入网络并预测下一个单词,依此类推。

因此,您需要一次生成一个单词(换句话说,一个嵌入),而不是向网络输入整个序列。

如果上面的陈述对你来说太抽象了,这里有一个很好的例子:https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py

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

【讨论】:

  • 非常感谢,这对培训很有意义!但是在运行时该怎么办?当我想预测“出局”而不是将其馈送到网络时?
猜你喜欢
  • 2020-05-29
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 2021-08-09
  • 2018-02-10
  • 2017-04-14
  • 2019-04-13
相关资源
最近更新 更多