如何在 keras 的 SGD 中设置小批量大小

机器算法验证 神经网络 Python 梯度下降 喀拉斯 随机梯度下降
2022-02-06 12:03:19

我是 Keras 的新手,需要您的帮助。

我正在 Keras 中训练一个神经网络,我的损失函数是平方差 b/w 网络的输出和目标值。

我想使用梯度下降来优化它。经过网上的一些链接,我了解到一般使用的梯度下降有 3 种类型:

  1. 单样本梯度下降:这里,每次迭代只从一个样本计算梯度——>梯度可能是有噪声的。
  2. 批量梯度下降:这里,梯度是从数据集中所有样本计算的梯度的平均值 --> 梯度更通用,但对于大型数据集来说难以处理。
  3. Mini-batch 梯度下降:类似于 Batch GD。不是使用整个数据集,而是只使用少数样本(由 batch_size 确定)来计算每次迭代中的梯度 --> 噪音不是很大,计算上也很容易处理 --> 两全其美。

问题:

  1. 我想在 Keras 中执行小批量梯度下降。我怎样才能做到这一点?我应该使用 SGD 优化器吗?
  2. 如果要使用SGD,如何设置batch_size?SGD 函数似乎没有设置 batch_size 的参数。

    optimizer = keras.optimizers.SGD(lr=0.01, decay=0.1, momentum=0.1, nesterov=False)
    
  3. Keras 的 model.fit() 中有一个 batch_size 参数。

    history = model.fit(x, y, nb_epoch=num_epochs, batch_size=20, verbose=0, validation_split=0.1)
    

    这与小批量梯度下降中的批量大小相同吗?如果不是,那么对一批输入进行训练究竟意味着什么?这是否意味着'batch_size'没有。线程并行运行并并行更新模型权重?

如果有帮助,这是我到目前为止编写的 python 代码片段

2个回答

是的你是对的。在 Kerasbatch_size中是指 Mini-batch Gradient Descent 中的批大小。如果要运行批量梯度下降,则需要将 设置batch_size为训练样本数。您的代码看起来很完美,只是我不明白您为什么将model.fit函数存储到对象历史记录中。

抛开理论上的考虑,考虑到现实生活中的数据集和典型现代神经网络的大小,训练大小为 1 的批次通常会花费不合理的时间,而且您将没有足够的 RAM 和/或 GPU 内存来训练整个数据集立刻。因此,通常不是“是否应该使用”小批量的问题,而是应该使用“什么大小”的批次。batch_size参数是在单个步骤中训练的观察数量,通常较小的尺寸效果更好,因为具有正则化效果此外,人们经常使用更复杂的优化器(例如 Adam、RMSprop)和其他正则化技巧,这使得模型性能、批量大小、学习率和计算时间之间的关系更加复杂。