我目前正在参加谷歌机器学习速成课程。在本课程的特定部分中,我们将介绍线性回归在python代码中的实际应用。以下是相关代码(完整代码可在此处找到):-
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)
这里假定所有必需的库都包含在内,并且函数正在定义中(此处不感兴趣)。在上面的代码中,我在理解Hyperparameterbatch_size
时遇到问题。它在ML Wiki中被描述为否。一批中的示例数。它与时期(迭代?)有关,因此N/Batch_size
给了我们迭代次数(如果batch_size<N,则无法理解)。
在三个超参数中,我了解
Learning_rate
作为负梯度增量值,指向低损耗区域epochs
作为示例(完整数据集)的处理次数batch_size
作为示例超集的子集合
请确认:-以上数据集的示例为{1.0, 5.0}
。
问题:-当批处理大小低于N
时,示例究竟是如何处理的?
p.S.:-batch_size
显然对结果输出有很大影响,因为在稍后的练习中,我们将对17000个示例执行回归。当batch_size
为30时,我们得到的RMS误差为100+,但当batch_size
为17000时,RMS误差为1000+!!
Fom machinelearningmastery.com
批量大小是在更新模型之前处理的样本数。时期的数量是通过训练数据集的完整通过次数。
让我解释一下。
正如您可能已经了解到的,梯度下降可以用于更新训练参数。但是,为了获得更新量的准确值(计算梯度),该算法可以查看多个数据样本的误差。此选定样本集的大小称为批次大小。
至于问题:
通常的情况是批量大小低于N
(我假设N
=数据集大小)。通常,从数据集中随机选择一组大小为batch_size
的样本。该过程的其余部分与batch_size
等于N
时相同:找到误差的导数,然后更新训练参数以使误差最小化。
至于大批量与小批量的影响,需要权衡使用GPU进行训练时,较大的批量大小可能很有用。如果CCD_ 16=CCD_。然而,它可能会导致过拟合,因为它将是训练集的最佳解决方案。
另一方面,较小的批处理大小允许模型更好地泛化,这可能解释了您所观察到的情况。测试/验证集可能与训练集大不相同。此外,由于模型在计算整个数据集的误差之前就开始学习,因此较小的批量通常会更快。
我不知道你说的";请确认";,但可以随意问我是否遗漏了什么。
编辑1:batch_size < N
的解释
- 我们有一条线路
y = m*x + c
- 如果你有10个样本,而
batch_size
是5,我们随机选择5个样本,并根据这5个样本获得m
和c
的梯度(我不讨论如何计算梯度的细节。你可以在这里了解更好的想法) - 接下来,我们根据学习率和梯度更新m和c。现在,一批已经用于培训
- 我们还有5个样品。现在,我们从剩下的5个样本中计算梯度。注意,这里我们使用更新的
m
和c
来计算梯度 - 接下来,我们使用该梯度来再次更新
m
和c
这是一个时代。当你继续执行更多的划时代时,这条线就越适合你的数据。
编辑2:解释为什么较低的批量大小似乎可以获得更好的结果。
当batch_size = N
和你取梯度时,它是同时使用整个数据集计算的。因此,您可以保证,无论发生什么,从数学上讲,m
和c
都会接近其全局最优值,因为它总是可以看到整个数据集。这样做的问题在于,这只是针对训练数据。可能是测试数据与训练数据显著不同的情况。(查找术语"过拟合")。然而,当我们有较小的批量时,模型无法适应整个数据集。因此,它可能永远不会达到全局最优。这可能是有利的,因为它有助于模型更好地推广到它没有训练过的输入
另一个可能的原因可能是,对于较小的批量,模型比较大的批量更快地接近良好的估计。这是因为模型以更高的频率更新自己,因为它不必使用整个数据集来计算梯度。因此,如果你观察训练损失,最初较小的批量会有较低的损失,但最终,较大的批量模型可能会达到更低的损失。
这些可能是你观察到的原因,但事实并非如此。如果训练集是整个数据集的良好表示,则大批量可能工作得更好。或者可能只是模型需要更多的训练。