2

这个问题相当抽象,不一定与 tensorflow 或 keras 相关。假设你想训练一个语言模型,并且你想为你的 LSTM 使用不同大小的输入。特别是,我正在关注这篇论文:https ://www.researchgate.net/publication/317379370_A_Neural_Language_Model_for_Query_Auto-Completion 。

除其他外,作者使用词嵌入和字符的单热编码。最有可能的是,这些输入中的每一个的维度都不同。现在,为了将其输入网络,我看到了一些替代方案,但我确定我遗漏了一些东西,我想知道应该如何完成。

  • 创建一个形状的 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 编码。
4

1 回答 1

1

根据keras 文档,填充的想法似乎是其中之一。嵌入层中有一个masking参数,这将使 keras 跳过这些值而不是处理它们。从理论上讲,您不会损失那么多性能。如果库构建良好,则跳过实际上是跳过了额外的处理。

您只需要注意不要将值零归因于任何其他字符,甚至是空格或未知单词。

嵌入层不仅用于掩蔽(掩蔽只是嵌入层中的一个选项)。

嵌入层将整数值从单词/字符字典转换为特定形状的实际向量。

假设你有这本字典:

1: hey
2: ,
3: I'm
4: here
5: not

你会形成像这样的句子

[1,2,3,4,0] -> this is "hey, I'm here"
[1,2,3,5,4] -> this is "hey, I'm not here"
[1,2,1,2,1] -> this is "hey, hey, hey"

嵌入层会将这些整数中的每一个转换为特定大小的向量。这同时做了两件好事:

  • 转换向量中的单词,因为神经网络只能处理向量或强度。索引列表不能由神经网络直接处理,索引和单词之间没有逻辑关系

  • 创建一个向量,该向量将成为每个单词的“有意义”的特征集。

并且经过训练,它们变成了“有意义的”向量。每个元素开始代表单词的某个特征,尽管该特征对人类来说是模糊的。嵌入有可能能够检测动词、名词、女性、男性等词,所有内容都以数字值的组合(存在/不存在/特征的强度)编码。


您也可以尝试这个问题中的方法,而不是使用掩码,需要按长度分隔批次,因此可以一次训练每个批次而无需填充它们:Keras misinterprets training data shape

于 2017-09-12T19:01:50.277 回答