需要帮助理解 Tensorflow 线性回归中的批量大小

Need help understanding batch size in Tensorflow Linear Regression

我目前就读于 Google Machine Learning crash course. In a particular section of the course, we are introduced to the practical applications of Linear Regression in python code. Below is the relevant code (full code could be found here):-


my_feature = ([1.0, 2.0,  3.0,  4.0,  5.0,  6.0,  7.0,  8.0,  9.0, 10.0, 11.0, 12.0])
my_label   = ([5.0, 8.8,  9.6, 14.2, 18.8, 19.5, 21.4, 26.8, 28.9, 32.0, 33.8, 38.2])


learning_rate=0.05
epochs=100
my_batch_size= ? # Replace ? with an integer.

my_model = build_model(learning_rate)
trained_weight, trained_bias, epochs, rmse = train_model(my_model, my_feature, 
                                                        my_label, epochs,
                                                        my_batch_size)
plot_the_model(trained_weight, trained_bias, my_feature, my_label)
plot_the_loss_curve(epochs, rmse)

此处假设包含所有必需的库并定义了函数(此处不感兴趣)。在上面的代码中,我在理解 超参数 batch_size 时遇到了问题。它在 ML Wiki 中被描述为 No。一批中的示例!?。它与 epochs (iterations?) 有关,因此 N/Batch_size 给了我们迭代次数(无法理解 if batch_size< N).

我理解的三个超参数

请确认:- 以上数据集的示例为 {1.0, 5.0}.

问题:-当批处理大小小于 N 时,这些示例究竟是如何处理的?

P.S.:- batch_size 显然似乎对结果输出有很大影响,因为在后面的练习中我们要执行回归在 17,000 个例子中。在使用 30 的 batch_size 时,我们得到 100+ 的 RMS 误差%,但是在使用 17000 的 batch_size 时,RMS 误差%是 1000+!!

来自 machinelearningmastery.com

The batch size is a number of samples processed before the model is updated. The number of epochs is the number of complete passes through the training dataset.

让我解释一下。

你可能已经了解到,梯度下降可以用来更新训练参数。但是,为了获得更新多少的准确值(计算梯度),该算法可以查看多个数据样本的误差。这 selected 样本集的大小称为批量大小。

至于问题:

通常情况 批量大小小于 N(我假设 N=数据集大小)。通常,一组大小为 batch_size 的样本是从数据集中随机 selected 的。其余过程与 batch_size 等于 N 时相同:求误差的导数,然后更新训练参数以最小化误差。

至于大批量与小批量的影响,有一个trade-off。 较大的批量大小 在使用 GPU 进行训练时很有用。如果batch_size=N,它也会收敛到全局最优。但是,它可能会导致过度拟合,因为它是训练集的最佳解决方案。

另一方面,较小的批量大小 允许模型更好地泛化,这可能解释了您观察到的情况。 test/validation 集可能与训练集有很大不同。此外,由于模型在计算整个数据集的错误之前就开始学习,因此批次越小通常速度越快。

我不确定您所说的“请确认”是什么意思,但请随时询问我是否遗漏了什么。

编辑 1batch_size < N

时的解释
  • 我们有一行y = m*x + c
  • 如果你有10个样本并且batch_size是5,我们随机select 5个样本并根据这5个样本得到mc的梯度(我不会详细介绍如何计算梯度。您可以看一下 here 以获得更好的想法)。
  • 接下来,我们根据学习率和梯度更新m和c。现在,一批已经用于训练。
  • 我们还有 5 个样本。现在,我们计算剩下的 5 个样本的梯度。注意这里我们使用更新后的mc来计算梯度。
  • 接下来,我们使用该梯度再次更新 mc

这是一个纪元。随着您继续执行更多的纪元,这条线越适合您的数据。

编辑 2:解释为什么较小的批量似乎会产生更好的结果。

batch_size = N 并且您采用梯度时,它是使用整个数据集一次性计算的。因此,您可以保证无论如何,在数学上,mc 将接近其全局最优值,因为它始终可以看到整个数据集。这样做的问题在于,这仅针对训练数据。测试数据可能与训练数据明显不同。 (查找术语“过度拟合”)。然而,当我们的批量较小时,该模型并不适合整个数据集。所以它可能永远不会达到全局最优。这可能是有利的,因为它有助于模型更好地泛化到它没有接受过训练的输入。

另一个可能的原因可能是,对于较小的批量,模型接近良好估计的速度比较大的批量快得多。这是因为模型以更高的频率更新自身,因为它不必使用整个数据集来计算梯度。因此,如果您正在查看训练损失,情况可能是最初较小的批次大小会具有较低的损失,但最终,较高批次大小的模型可能会达到更低的损失。

这些是您观察的可能原因,但不一定是这种情况。如果训练集能很好地代表整个数据集,大批量可能会更好。或者可能只是模型需要更多训练。