为什么批次没有可变长度序列/数据条目(例如句子)?

问题描述 投票:1回答:1

问题中提到的限制发生在Keras上下文中。

我已经阅读了很多关于如何批量生成可变长度序列的帖子(我理解对这些帖子的回复),但是我发现的唯一的帖子是here on Data Science,答案是“在一个批次中,你必须具有相同的时间步数,因为它必须是张量(这通常是你看到0填充的地方)。“

但是,这似乎是一个不必要的限制(我对Keras / TensorFlow不是很熟悉,所以我的问题从一个不是特定于任何API的角度来看)。

在训练批次中,为什么数据条目(我提出了句子的例子)不具有可变长度(在我的例子中,这将是单词的数量)?由于可变长度序列是RNN的应用,这个问题归结为为什么在训练期间RNN中没有可变数量的时间步长给定批次?

以下原因让我质疑批量中缺少可变长度序列:

1)数据条目,无论它们所属的批次有多大,都具有与条目相关联的RNN参数的梯度。批量大小仅影响基于所述计算梯度实际更改网络参数的时间(取平均值,然后根据其他超参数应用)。可变长度序列将具有可变数量的时间步长,但是与每个条目相关联的梯度已经平均了每个时间步长的网络参数的影响(并且在给定任意数量的时间步长的情况下平均值是可能的),因此无论数量如何时间步长可以成功地计算每个条目的梯度,因此,对于整个批次(通过获取所有条目的平均梯度)。

2):对于具有可变长度序列的批次,矩阵乘法的并行性仍然是正常的,因为对于批次中的每个条目,矩阵乘法是并行化的,这将是一个序列,因此是固定长度。

tensorflow neural-network keras recurrent-neural-network backpropagation
1个回答
1
投票

This post带领我们完成RNN的实施。绝对是这样的情况:如果我们只有一个批次,我们可以采用最大长度序列并填充序列的其余部分。并且您可以通过批量大小为1来获得可变长度批量大小。但是如果您想使用批处理并利用矩阵运算并不比一次执行一个训练示例慢得多的事实那么您需要矩阵不是粗糙的张量(这可能是因为这是大多数矩阵库所期望的)。因此,如果您想在批次中使用可变长度序列,则必须使用pad the shorter sequences并截断较大的序列。每批动态执行此操作似乎只会隐藏更多详细信息,并且在没有任何好处的情况下使任何培训问题更难以理解。

问题是您期望从动态长度序列获得什么好处?期望从此提高效率似乎是不合理的,因为我相信如果是这样的话,他们会以这种方式实现它。它是否更容易以这种方式使用库?那么也许答案是填充是一个隐藏用户的危险细节,或者没有足够的用户请求它。你期望它能更好地训练吗?这对我来说似乎是合理的,但是没有给出足够的好处来值得实现复杂性。您可能需要预处理数据,以决定如何处理非常长的序列。

总之,我有兴趣看到培训与批量大小之间的比较,以便每次对于培训示例和当前批次方法的长度,梯度都是特定的。这将会慢得多,但如果模型训练得更好,可能值得进一步研究。

© www.soinside.com 2019 - 2024. All rights reserved.