批量大小与输入层神经元数量的关系

数据挖掘 喀拉斯 lstm 批量标准化
2021-09-30 01:20:39

关于 LSTM 神经网络,我无法理解批量大小、输入层中的神经元数量和输入中“变量”或“列”的数量之间的关系。(假设有关系,尽管看到相反的例子,我不明白为什么没有关系)

为了清楚起见,我将使用一个示例来制定我的查询。

假设数据集包含三列输入和一列输出。所以它将类似于 输入变量 1 输入变量 2 输入变量 3 输出变量 1

据我了解,LSTM 网络的输入层必须有 3 个神经元对应每个输入变量。它不能少或多即使我已经看过类似这个答案的例子(这似乎描述得很好,但不幸的是,我无法理解它。)

现在让我们说我们有上述 4 列中的 50 行。

这对我来说基本上意味着我们有 50 个样本。现在如果批量大小为 5,那么我们有多少个输入神经元?输入层中的神经元数量是否与批量大小无关?我理解批量大小的方式是神经网络在更新其权重之前将看到的样本数量。所以让我们假设如果我们在输入层中只有三个神经元,那么我们将传递第一行输入变量,然后是第二行输入变量,并在我们更新权重之前重复它直到第五行。这与仅仅通过第五排有什么不同?

2个回答

总的来说,我认为您已经理解了这两个概念。我将尝试更详细地解决这两个问题。

输入层大小

在神经网络 (NN) 中,输入层的大小始终等于数据中变量(或我们通常在机器学习中称之为特征)的数量。

批量大小

这是指网络在更新其权重之前将看到多少数据样本。

通常,当执行梯度下降(即训练神经网络的算法)时,网络将输入所有样本以计算损失并更新权重。然而,尤其是在深度神经网络 (DNN) 中,这是不可行的,因为数据集的大小太大,即使网络有足够的内存,梯度的计算也会效率低下。相反,我们所做的是一次传递几个样本(称为批次)并在它们上训练模型。然后另一批通过,依此类推。我们在每次迭代中输入模型的样本数称为批量大小

两人的关系

从理论上讲,如果您有许多功能(数千个),您就不能使用足够大的批量大小,并且您拥有的功能越多,您可以使用的批量大小就越少。然而,在实践中,我发现这两者实际上是无关的!在深度神经网络中,批量大小主要由模型的大小决定。估计这个大小的一种简单(但并不总是准确)的方法是通过模型中可训练参数的数量。更多的参数,意味着更多的模型内存(和更长的梯度计算),导致更小的批量大小。在具有多个层的 DNN 中,只有一小部分参数是输入层的参数。因此,特征的数量在批量大小的选择中起着很小的作用。

例子

在您的示例中,您说您有 50 行和 4 列,其中 3 个是输入变量。

输入层中的神经元数量为 3,以匹配输入变量(或特征)的数量。这是我们无法改变的,即使我们想改变!

批量大小是我们可以改变的。假设我们使用 5 的批量大小。

第一次迭代:
在第一次迭代中,NN 将获得前 5 行数据。对于每一个,前三列将被传递到网络的第一层,它将计算一个输出。在所有 5 个输出生成后,它们将与第 4 列的前 5 行进行比较,以计算损失。使用这个损失,网络将计算梯度并执行更新。同样,这个损失对应于前 5 个样本,而不仅仅是第 5 个。

第二次迭代:
第 6-10 行将被传递到网络,它将执行与第一步相同的过程。

第 10 次迭代: 第 45-50 行将被传递到网络。这标志着 NN 已经看到每个数据样本一次。在机器学习的上下文中,我们称之为epoch至此,数据被打乱,第 2 个 epoch 的第 1 次迭代开始。

笔记:

在大多数框架中,每批中的样本由网络并行处理,而不是按顺序处理。这对结果没有影响,我只是想指出这一点。

我不同意@Djib2011 关于他所说的“输入层中的神经元数量将是 3,以匹配输入变量(或特征)的数量。即使我们愿意,我们也无法改变!” 神经元的数量,也称为单元或节点,是一个完全自由的参数,由您指定。它不必与特征的数量相匹配。它决定了这一层输出的尺寸。

在这里查看示例https://keras.io/layers/core/,其中第一层

model.add(Dense(32, input_shape=(16,)))

这里 32 是神经元的数量,16 是特征的数量。另一个隐藏层

model.add(Dense(32))

其中 32 也是神经元的数量,在 keras 中,您不需要在第一个隐藏层之后指定输入(前一层的输出)的维度(ps 输入层不是真实层而是张量)。

另请查看此示例https://machinelearningmastery.com/tutorial-first-neural-network-python-keras/,其中作者提到:

我们可以通过添加每一层来将它们拼凑在一起:

  • 该模型需要具有 8 个变量的数据行(input_dim=8 参数)
  • 第一个隐藏层有 12 个节点,使用 relu 激活函数。
  • 第二个隐藏层有 8 个节点,使用 relu 激活函数。
  • 输出层有一个节点,使用 sigmoid 激活函数。
# define the keras model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))