【问题标题】:How to train with inputs of variable size?如何使用可变大小的输入进行训练?
【发布时间】: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


【解决方案1】:

根据keras documentation,填充的想法似乎是一个。嵌入层中有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

【讨论】:

  • 非常感谢您帮助我理清思路! :-) 问题是,我已经在使用经过训练的词嵌入了。因此,我有这个维度 200 的嵌入和维度 38 的另一个输入(一个热编码)。你如何将这两个输入输入嵌入层?
  • 嵌入不采用 one_hot 编码输入,它必须采用整数。你能告诉模式关于其他输入吗?这是什么?
猜你喜欢
  • 2018-07-25
  • 2017-10-25
  • 2018-09-26
  • 1970-01-01
  • 2016-07-15
  • 2014-06-30
  • 2016-11-15
  • 2016-11-20
  • 2021-09-05
相关资源
最近更新 更多