【问题标题】:Need help understanding batch size in Tensorflow Linear Regression需要帮助了解 Tensorflow 线性回归中的批量大小
【发布时间】:2022-01-22 05:47:13
【问题描述】:

我目前注册了Google Machine Learning crash course。在课程的特定部分,我们将介绍线性回归在 Python 代码中的实际应用。下面是相关代码(完整代码可以在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)

这里假设包含所有必需的库并定义了函数(这里不感兴趣)。在上面的代码中,我无法理解 Hyperparameter batch_size。它在 ML Wiki 中被描述为 No。批量示例!?。它与 epochs (iterations?) 有关,因此 N/Batch_size 为我们提供了迭代次数(也无法理解 if batch_size)。

在我理解的三个超参数中

  • Learning_rate 作为负梯度增量值,指向低损失区域。
  • epochs 作为示例(完整数据集)被处理的次数
  • batch_size 作为示例超集的子部分

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

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

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

【问题讨论】:

    标签: python tensorflow linear-regression


    【解决方案1】:

    来自machinelearningmastery.com

    批量大小是模型更新前处理的样本数。 epochs 的数量是通过训练数据集的完整传递次数。

    让我解释一下。

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

    至于问题:

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

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

    另一方面,较小的批大小可以让模型更好地泛化,这可能解释了您观察到的情况。测试/验证集可能与训练集完全不同。此外,由于模型在计算整个数据集的误差之前就开始学习,因此通常较小的批大小往往会更快。

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

    编辑 1:解释何时 batch_size < N

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

    这是一个时代。随着您继续执行更多的 epoch,这条线将更适合您的数据。

    编辑 2:解释为什么较小的批量大小似乎可以提供更好的结果。

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

    另一个可能的原因可能是,使用较小的批大小,模型比较大的批大小更快地接近一个良好的估计值。这是因为模型以更高的频率自我更新,因为它不必使用整个数据集来计算梯度。因此,如果您正在查看训练损失,可能会出现这样的情况:最初较小的批大小会产生较低的损失,但最终,较大的批大小模型可能会达到更低的损失。

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

    【讨论】:

    • 我在问{1, 5]一个特征和标签对)是否被称为上述数据集的行中的一个值?
    • @HAPPYAPPLES {1, 5} 是数据集的单个样本。如果batch_size 为 1,那么它将自行训练以对训练参数进行一次更新。这能回答问题吗?
    • 考虑到我们在一个样本中有一个特征,我们有 10 个样本。如果我们的batch_size 为 5,我们正在计算这 5 个值的损失和梯度。对于一个完整的 epoch,我们也需要对其他 5 个值做同样的事情,导致它们自己的损失和负梯度。我们如何使用这些值来获得最终的损失和负梯度?
    • 如果我们使用batch_size = N,那么在计算负梯度时,我们得到低损失的方向。但如果我们为小批量做,它会如何工作?
    • 另外,您能否提供一个计算一小组数据的负梯度的示例!
    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2016-05-03
    相关资源
    最近更新 更多