更大的批量大小会使机器学习中的计算时间减少吗?

时间:2016-02-02 16:12:17

标签: machine-learning neural-network conv-neural-network torch gradient-descent

我正在尝试调整CNN中的超级参数,即批量大小。我有一台corei7,RAM 12GB的计算机,我正在训练一个带有CIFAR-10数据集的CNN网络,可以在这个blog

现在首先我已经阅读并了解了机器学习中的批量大小:

  我们首先假设我们正在进行在线学习,即我们正在进行   使用小批量的1.对在线学习的明显担心   是使用只包含一次培训的小型客舱   例子会导致我们对梯度的估计出现重大误差。   事实上,错误结果并非如此。该   原因是个人梯度估计不需要   superaccurate。我们所需要的只是一个足够准确的估计值   成本函数趋于持续下降。就像你在尝试一样   到了北磁极,但是有一个不稳定的指南针   每次看它都要10-20度。只要你停下来   经常检查罗盘,罗盘方向正确   平均而言,你最终只会在北磁极上   细点。

     

基于这个论点,听起来好像我们应该在线使用   学习。事实上,情况变得更加复杂   我们知道我们可以使用矩阵技术来计算梯度   同时更新小批量中的所有示例,而不是   循环遍历它们。取决于我们的硬件和线性的细节   代数库这可以使计算速度快得多   (例如)大小为100的小批量的梯度估计   比通过循环计算小批量梯度估计   100个培训示例分开。它可能只需要50次   很长,而不是100倍。现在,好像开始似乎   这对我们没有多大帮助。

     

我们使用100码的小批量作为权重的学习规则   看起来像是:enter image description here

     

其中总和超过了小批量的培训示例。这是   与enter image description here进行在线学习。   即使只需要50倍的时间来进行miniatch更新,它也是如此   在线学习似乎更好,因为我们会   更频繁地更新。但是,假设在   minibatch案例我们将学习率提高了100倍,所以   更新规则变为
enter image description here
  这就像在线学习的单独实例一样   学习率为η。但它只需要花费50倍的时间   在线学习的单一实例。不过,它看起来很明显   使用较大的小批量可能会加快速度。



现在我尝试使用MNIST digit dataset并运行示例程序并首先设置批量大小1。我记下了完整数据集所需的培训时间。然后我增加了批量大小和我注意到它变得更快。
但是如果使用此codegithub link进行培训,则批量大小不会减少培训时间。如果我使用30或128或64,则保持相同。他们说他们得到{{精确度。经过两三个时代,他们的准确度已超过92%。但是当我在计算机中运行代码而不改变批量大小以外的任何东西时,我在10个时代之后的结果变得更糟,只有28%和测试准确性在下一个时期停留在那里。然后我想,因为他们使用的批量大小为128我需要使用它。然后我使用相同但更糟糕的是在10个纪元后只留下11%并且卡在那里。 >为什么会这样?

3 个答案:

答案 0 :(得分:5)

神经网络通过梯度下降来学习权重空间中的误差函数,该函数由训练样例进行参数化。这意味着变量是神经网络的权重。该功能是"泛型"并在使用培训示例时变得具体。 "正确"方法是使用所有训练样例来制定特定的功能。这被称为"批量梯度下降"并且通常不会出于两个原因:

  1. 它可能不适合您的RAM(通常是GPU,对于神经网络,当您使用CPU时会获得巨大的提升)。
  2. 实际上没有必要使用所有示例。
  3. 在机器学习问题中,您通常会有数千个培训示例。但是,当您只查看一些(例如64,128或256)示例时,错误表面看起来可能类似。

    将其视为照片:为了了解照片的内容,您通常不需要2500x1800px的结果。 256x256px图像可以让您清楚地了解照片的内容。但是,你错过了细节。

    因此想象一下梯度下降是错误表面上的一个步行:你从一个点开始,你想找到最低点。为此,你走了下来。然后你再次检查你的身高,检查它向下的方向并做出一个步骤" (其大小由学习率和其他几个因素决定)朝这个方向。当您进行小批量培训而不是批量培训时,您将走在不同的错误表面上。在低分辨率的错误表面。它实际上可能会出现在"真实的"错误表面。但总的来说,你会朝着正确的方向前进。而且你可以更快地完成单个步骤!

    现在,当您将分辨率降低(批量较小)时会发生什么?

    对,你的错误表面看起来像的图像不太准确。这对你有多大影响取决于以下因素:

    • 您的硬件/实施
    • 数据集:错误表面有多复杂,只有一小部分有多好?
    • 学习:你究竟在学习(动力?newbob?rprop?)

答案 1 :(得分:2)

我想补充一下这里已经说过的更大的批量并不总是有利于推广。我自己看过这些案例,批量大小的增加会影响验证的准确性,特别是对于使用CIFAR-10数据集的CNN而言。

来自"On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima"

  

随机梯度下降(SGD)方法及其变体是   许多深度学习任务的首选算法。这些方法   以小批量方式运作,其中一部分是训练   数据,比如32-512个数据点,被采样以计算近似值   到了渐变。 在实践中已经观察到使用时   较大的批次,模型的质量有所下降,如   通过其推广能力来衡量。我们调查原因   大批量制度中的这种泛化下降并呈现   支持大批量方法观点的数字证据   倾向于收敛于训练和测试的尖锐最小化   功能 - 众所周知,尖锐的最小值导致更差   概括。相比之下,小批量方法始终如一地融合   平坦的最小化器,我们的实验支持一个普遍的观点   这是由于梯度估计中的固有噪声。我们   讨论了几种尝试帮助大批量方法的策略   消除这种泛化差距。

底线:您应该调整批量大小,就像any other hyperparameter一样,以找到最佳值。

答案 2 :(得分:0)

2018 opinion retweeted by Yann LeCun是论文Revisiting Small Batch Training For Deep Neural Networks, Dominic Masters and Carlo Luschi,表明一个好的通用最大批处理大小是:

32

与学习率的选择相互作用。

2016年早些时候的论文On Large-batch Training For Deep Learning: Generalization Gap And Sharp Minima给出了不使用大批量的一些原因,我很难解释一下,因为大批量可能会卡在局部(“尖锐”)最小值中,小批量则不会。