2017-12-18 261 views
1

刚开始研究RNN和LSTM ...有一个问题没有回答我看过的任何资源:经常性神经网络:参数共享点是什么?无论如何,填充不会诀窍?

以下是我如何理解RNN中参数共享的要点。我的问题是:

  1. 我对RNN的理解,总结如下,是否正确?
  2. 在Keras的实际代码示例中,我研究了LSTM,它们将句子填充到相同的长度。通过这样做,这不会冲走RNN中参数共享的全部目的吗?

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

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

非常感谢。

+0

参见https://stats.stackexchange.com/q/221513/130598 – Maxim

+0

谢谢,很好的提示! –

回答

0

参数共享

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

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

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

填充

作为填充序列:主要目的是不直接让模型预测不同长度的序列。就像你说的那样,这可以通过使用参数共享来完成。填充用于有效的训练 - 特别是在训练时保持低的计算图。没有填充,我们有两种训练选项:

  1. 我们展开每个训练样本的模型。因此,当我们有一个长度为7的序列时,我们将模型展开为7个时间步长,馈送序列,通过7个时间步长进行反向传播并更新参数。理论上这看起来很直观。但实际上,这是非常低效的。当使用TensorFlow时,您会在每个训练步骤创建一个新的计算图,因为TensorFlows计算图不允许重复性,它们是前馈的。
  2. 另一种选择是在开始训练前创建计算图。我们让他们分享相同的权重,并为我们的训练数据中的每个序列长度创建一个计算图。但是当我们的数据集有30个不同的序列长度时,这意味着在训练期间有30个不同的图形,所以对于大型模型,这是不可行的。

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

+1

非常感谢!这是一个非常有用的答案! –