Jan*_*ber 6 nlp deep-learning lstm recurrent-neural-network
以下是我对 RNN 中参数共享点的理解:
在常规的前馈神经网络中,每个输入单元都被分配了一个单独的参数,这意味着输入单元(特征)的数量对应于要学习的参数数量。在处理例如图像数据时,输入单元的数量在所有训练示例中都是相同的(通常是恒定像素大小 * 像素大小 * rgb 帧)。
然而,像句子这样的顺序输入数据的长度可能会有很大差异,这意味着参数的数量不会相同,具体取决于处理哪个例句。这就是为什么参数共享对于有效处理序列数据是必要的:它确保模型始终具有相同的输入大小,而不管序列长度如何,因为它是根据从一种状态到另一种状态的转换来指定的。因此,可以在每个时间步使用具有相同权重(输入到隐藏权重、隐藏到输出权重、隐藏到隐藏权重)的相同转移函数。最大的优点是它允许泛化到没有出现在训练集中的序列长度。
我的问题是:
能够有效地处理不同长度的序列并不是参数共享的唯一优势。正如你所说,你可以通过填充来实现这一点。参数共享的主要目的是减少模型必须学习的参数。这就是使用 RNN 的全部目的。
如果您为每个时间步学习不同的网络并将第一个模型的输出提供给第二个模型等,您最终将得到一个常规的前馈网络。对于 20 个时间步长,您将需要学习 20 个模型。在卷积网络中,参数由卷积滤波器共享,因为我们可以假设图片的不同区域存在相似的有趣模式(例如简单的边缘)。这大大减少了我们必须学习的参数数量。类似地,在序列学习中,我们通常可以假设在不同的时间步长有相似的模式。比较'Yesterday I ate an apple'
和'I ate an apple yesterday'
。这两句话的意思相同,但该'I ate an apple'
部分发生在不同的时间步上。通过共享参数,您只需了解该部分的含义一次即可。否则,您必须为模型中可能出现的每个时间步骤学习它。
共享参数有一个缺点。因为我们的模型在每个时间步对输入应用相同的转换,所以它现在必须学习对所有时间步都有意义的转换。因此,它必须记住,哪个单词在哪个时间步中出现,即'chocolate milk'
不应导致与 相同的隐藏和记忆状态'milk chocolate'
。但与使用大型前馈网络相比,这个缺点很小。
至于填充序列:主要目的不是直接让模型预测不同长度的序列。正如您所说,这可以通过使用参数共享来完成。填充用于高效训练 - 特别是为了在训练期间保持较低的计算图。如果没有 padding,我们有两种训练选择:
这就是为什么我们需要填充。我们将所有序列填充到相同的长度,然后在开始训练之前只需要构建一个计算图。当您的序列长度非常短和非常长(例如 5 和 100)时,您可以使用分桶和填充。这意味着,您将序列填充到不同的存储桶长度,例如 [5, 20, 50, 100]。然后,您为每个存储桶创建一个计算图。这样做的好处是,您不必填充长度为 5 到 100 的序列,因为您会浪费大量时间来“学习”其中的 95 个填充标记。
归档时间: |
|
查看次数: |
2789 次 |
最近记录: |