刚开始研究RNN和LSTM ......我所查看的任何资源都没有回答过一个问题:
以下是我如何理解RNN中参数共享的重点。我的问题是:
在常规前馈神经网络中,每个输入单元都分配有一个单独的参数,这意味着输入单元(特征)的数量对应于要学习的参数数量。在处理例如在所有训练样例中,输入单元的数量是相同的(通常是恒定的像素大小*像素大小* rgb帧)。
然而,像句子这样的顺序输入数据可能会有很大的变化长度,这意味着根据处理的是哪个例句,参数的数量不会相同。这就是为什么参数共享对于有效处理顺序数据是必要的:它确保模型始终具有相同的输入大小,而不管序列长度如何,因为它是根据从一个状态到另一个状态的转换来指定的。因此,可以在每个时间步骤使用具有相同权重的相同转换函数(输入到隐藏权重,隐藏到输出权重,隐藏到隐藏权重)。最大的优点是它允许推广到训练集中没有出现的序列长度。
非常感谢。
答案 0 :(得分:2)
能够有效地处理不同长度的序列并不是参数共享的唯一优势。正如你所说,你可以用填充来实现。参数共享的主要目的是减少模型必须学习的参数。这是使用RNN的全部目的。
如果您要为每个时间步骤学习不同的网络并将第一个模型的输出提供给第二个等,您最终会得到一个常规的前馈网络。对于20个时间步骤,您将有20个模型需要学习。在卷积网中,参数由卷积滤波器共享,因为我们可以假设在图像的不同区域中存在类似的有趣模式(例如简单边缘)。这大大减少了我们必须学习的参数数量。类似地,在序列学习中,我们通常可以假设在不同的时间步骤存在类似的模式。比较'Yesterday I ate an apple'
和'I ate an apple yesterday'
。这两个句子的意思相同,但'I ate an apple'
部分出现在不同的时间步骤上。通过共享参数,您只需要了解该部分的含义。否则,您必须在每个时间步骤中学习它,在模型中可能会出现这种情况。
共享参数有一个缺点。因为我们的模型在每个时间步骤对输入应用相同的转换,所以它现在必须学习对所有时间步骤都有意义的转换。所以,它必须记住,在哪个时间步骤中出现了什么词,即'chocolate milk'
不应该导致与'milk chocolate'
相同的隐藏和记忆状态。但与使用大型前馈网络相比,这个缺点很小。
至于填充序列:主要目的不是让模型预测不同长度的序列。就像你说的,这可以通过使用参数共享来完成。填充用于有效的训练 - 特别是在训练期间保持计算图形低。没有填充,我们有两种培训选择:
这就是我们需要填充的原因。我们将所有序列填充到相同的长度,然后在开始训练之前只需要构建一个计算图。如果序列长度非常短且非常长(例如5和100),则可以使用bucketing and padding。这意味着,您将序列填充到不同的桶长度,例如[5,20,50,100]。然后,为每个桶创建一个计算图。这样做的好处是,您不必填充长度为5到100的序列,因为您会浪费大量时间在"学习"那里有95个填充标记。