【发布时间】:2018-02-21 03:04:30
【问题描述】:
这个问题比较抽象,不一定与 tensorflow 或 keras 相关。假设你想训练一个语言模型,并且你想为你的 LSTM 使用不同大小的输入。特别是,我正在关注这篇论文:https://www.researchgate.net/publication/317379370_A_Neural_Language_Model_for_Query_Auto-Completion。
除其他外,作者使用词嵌入和字符的 one-hot 编码。最有可能的是,这些输入中的每一个的维度都不同。现在,为了将其输入网络,我看到了一些替代方案,但我确定我遗漏了一些东西,我想知道应该如何完成。
- 创建形状的 3D 张量(instances, 2, max(embeddings,characters))。也就是说,用 0 填充较小的输入。
- 创建形状的 3D 张量(实例、嵌入+字符、1))。也就是说,连接输入。
在我看来,这两种选择都不利于有效地训练模型。那么,解决这个问题的最佳方法是什么?我看到作者为此目的使用了嵌入层,但从技术上讲,这意味着什么?
编辑
这里有更多细节。我们将这些输入称为 X(字符级输入)和 E(字级输入)。在序列(文本)的每个字符上,我计算 x、e 和 y,即标签。
-
x:字符 one-hot 编码。我的字符索引大小为 38,所以这是一个用 37 个零和一个 1 填充的向量。 -
e:预先计算的 200 维词嵌入。如果字符是空格,我获取序列中前一个词的词嵌入,否则,我分配不完整词的向量(INC,大小也是 200) .带有“红色汽车”序列的真实示例:r>INC, e>INC, d>INC, _>embeddings["red"], c>INC, a>INC, r>INC。 -
y:要预测的标签,也就是下一个字符,one-hot 编码。此输出与x具有相同的维度,因为它使用相同的字符索引。在上面的示例中,对于“r”,y是“e”的 one-hot 编码。
【问题讨论】:
-
好像E也是一个字符序列,不是一个词序列,你能清楚吗?
-
不,
e是训练期间正在读取的字符的词嵌入。更具体地说,对于字典中的每个单词,它是一个向量或使用 Word2Vec 训练的 200 个浮点数。但是由于直到空格字符我才有完整的单词,所以这个向量随机填充了 200 个浮点数。当读取一个空格字符时,e是序列中前一个单词的单词嵌入。是不是更清楚了? -
一个嵌入用于字符作为一个输入,一个嵌入用于单词作为并行输入。
-
不一定... char 嵌入应该更小,毕竟只有 26(或 52)个字符加上一些额外的字符。您可以同时拥有嵌入并在最后一个轴上连接它们:one example of how to create parallel layers,在这种情况下,您应该定义两个输入张量,每个输入张量都进入不同的嵌入,然后在嵌入之后连接它们。
-
这正是我想做的,只是我找不到能说清楚的话。非常感谢你帮助我,你发布的链接很完美,你的解释很清楚。
标签: tensorflow deep-learning keras lstm rnn