经常性NN:参数共享的重点是什么?无论如何填充都不起作用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经常性NN:参数共享的重点是什么?无论如何填充都不起作用?相关的知识,希望对你有一定的参考价值。

刚刚开始研究RNN和LSTM ......我所查看的任何资源都没有回答过一个问题:

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

  1. 我对RNN的理解,如下所述,是否正确?
  2. 在Keras的实际代码示例中,我查看了LSTM,他们将句子填充到相同的长度之前。通过这样做,这不会消除RNN中参数共享的全部目的吗?

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

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

非常感谢。

答案

Parameter Sharing

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

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

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

Padding

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

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

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

以上是关于经常性NN:参数共享的重点是什么?无论如何填充都不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

深度学习与CV教程 | 卷积神经网络

Hadoop之HDFS(NameNode和SecondaryNameNode)(面试开发重点)

PyTorch教程 参数访问#yyds干货盘点#

重点突破——如何快速识别并解决“闭包问题”?

HDFS--如何动态刷新一个配置项

nn.ReflectionPad2d(镜像填充)