gpt4 book ai didi

deep-learning - 循环神经网络 : what's the point of parameter sharing? 填充是否能解决问题?

转载 作者:行者123 更新时间:2023-12-02 15:18:10 27 4
gpt4 key购买 nike

以下是我对 RNN 中参数共享要点的理解:

在常规前馈神经网络中,每个输入单元都分配有一个单独的参数,这意味着输入单元(特征)的数量对应于要学习的参数的数量。在加工中,例如图像数据,输入单元的数量在所有训练示例中都是相同的(通常是恒定的像素大小 * 像素大小 * RGB 帧)。

但是,像句子这样的顺序输入数据的长度可能变化很大,这意味着参数的数量将根据处理的例句而不同。这就是为什么参数共享对于有效处理序列数据是必要的:它确保模型始终具有相同的输入大小,无论序列长度如何,因为它是根据从一种状态到另一种状态的转换来指定的。因此,可以在每个时间步使用具有相同权重(输入到隐藏权重、隐藏到输出权重、隐藏到隐藏权重)的相同转换函数。最大的优点是它可以泛化到训练集中未出现的序列长度。

我的问题是:

  1. 上面总结的我对 RNN 的理解是否正确?
  2. 在 Keras 的实际代码示例中,我查看了 LSTM,它们首先将句子填充为相等的长度。这样做是否会抹杀 RNN 中参数共享的全部目的?

最佳答案

参数共享

能够有效地处理不同长度的序列并不是参数共享的唯一优势。正如你所说,你可以通过填充来实现这一点。参数共享的主要目的是减少模型必须学习的参数。这就是使用 RNN 的全部目的。

如果您为每个时间步学习不同的网络并将第一个模型的输出提供给第二个模型等,您最终将得到一个常规的前馈网络。对于 20 个时间步长,您将需要学习 20 个模型。在卷积网络中,参数由卷积滤波器共享,因为我们可以假设图片的不同区域存在相似的有趣模式(例如简单的边缘)。这大大减少了我们必须学习的参数数量。类似地,在序列学习中,我们通常可以假设在不同的时间步长有相似的模式。比较“昨天我吃了一个苹果”“我昨天吃了一个苹果”。这两个句子的意思相同,但是“I ate an apple”部分发生在不同的时间步上。通过共享参数,您只需了解该部分的含义一次即可。否则,您必须为模型中可能出现的每个时间步骤学习它。

共享参数有一个缺点。因为我们的模型在每个时间步对输入应用相同的转换,所以它现在必须学习对所有时间步都有意义的转换。因此,它必须记住,哪个单词出现在哪个时间步,即“巧克力牛奶”不应导致与“牛奶巧克力”相同的隐藏和内存状态。但与使用大型前馈网络相比,这个缺点很小。

填充

对于序列的填充:主要目的不是直接让模型预测不同长度的序列。正如您所说,这可以通过使用参数共享来完成。填充用于高效训练 - 特别是为了在训练期间保持较低的计算图。如果没有填充,我们有两种训练选择:

  1. 我们展开每个训练样本的模型。因此,当我们有一个长度为 7 的序列时,我们将模型展开为 7 个时间步长,输入序列,通过 7 个时间步长进行反向传播并更新参数。这在理论上似乎很直观。但在实践中,这是低效的,因为 TensorFlow 的计算图不允许重复,它们是前馈的。
  2. 另一种选择是在开始训练之前创建计算图。我们让它们共享相同的权重,并为训练数据中的每个序列长度创建一个计算图。但是,当我们的数据集有 30 个不同的序列长度时,这意味着在训练期间有 30 个不同的图,因此对于大型模型,这是不可行的。

这就是我们需要填充的原因。我们将所有序列填充到相同的长度,然后在开始训练之前只需要构建一个计算图。当您的序列长度非常短和非常长(例如 5 和 100)时,您可以使用 bucketing and padding 。这意味着,您将序列填充到不同的存储桶长度,例如 [5, 20, 50, 100]。然后,您为每个存储桶创建一个计算图。这样做的好处是,您不必填充长度为 5 到 100 的序列,因为您会浪费大量时间来“学习”其中的 95 个填充标记。

关于deep-learning - 循环神经网络 : what's the point of parameter sharing? 填充是否能解决问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47865034/

27 4 0