我正在尝试调整CNN中的超参数,即批量大小。我的电脑配置为酷睿i7,12GB RAM,我正在使用CIFAR-10数据集训练CNN网络,这个数据集可以在这个博客中找到。
首先,我对机器学习中批量大小的一些了解和学习如下:
首先假设我们正在进行在线学习,即使用批量大小为1。关于在线学习的明显担忧是,使用仅包含单个训练样本的迷你批量会导致我们对梯度的估计产生重大错误。事实上,这些错误实际上并不是那么大的问题。原因是个别梯度估计不需要非常准确。我们只需要一个足够准确的估计,使我们的成本函数趋向于持续下降。这就像你试图到达北磁极,但你的指南针每次查看时都有10到20度的偏差。只要你频繁停下来检查指南针,并且指南针平均来说指向正确方向,你最终还是会顺利到达北磁极。
基于这一论点,似乎我们应该使用在线学习。事实上,情况比这更复杂。正如我们所知,我们可以使用矩阵技术同时计算一个迷你批量中所有样本的梯度更新,而不是逐个循环处理它们。根据我们的硬件和线性代数库的具体细节,这可能会使计算一个迷你批量(例如大小为100)的梯度估计变得相当快,而不是单独循环处理这100个训练样本来计算迷你批量的梯度估计。这可能只需要(比如说)50倍的时间,而不是100倍的时间。现在,乍一看,这似乎并没有帮助我们太多。
其中求和是在迷你批量中的训练样本上进行的。这与
用于在线学习的情况相比。即使迷你批量更新只需要50倍的时间,似乎进行在线学习仍然更好,因为我们会更频繁地更新。然而,假设在迷你批量的情况下,我们将学习率增加100倍,那么更新规则变为
这很像使用学习率η
进行单独的在线学习实例。但这只需要进行单个在线学习实例的50倍时间。尽管如此,使用更大的迷你批量似乎明显可能加速进程。
现在我尝试使用MNIST数字数据集
运行了一个示例程序,并首先将批量大小设置为1
。我记录了训练整个数据集所需的时间。然后我增加了批量大小,我注意到速度变快了。
但是在使用这个代码和GitHub链接进行训练时,改变批量大小并不会减少训练时间。无论我使用30、128还是64,训练时间都保持不变。他们声称达到了92%
的准确率。在两三个epoch后,他们达到了超过40%
的准确率。但当我在我的电脑上运行代码时,除了批量大小外没有做任何更改,经过10个epoch后,我得到了更差的结果,只有28%的准确率,测试准确率在接下来的epoch中停滞不前。然后我想,既然他们使用了128的批量大小,我也需要使用这个。然后我使用了相同的批量大小,但结果变得更糟,经过10个epoch后只有11%的准确率,并且停滞在那里。这是为什么?
回答:
神经网络通过在权重空间中对由训练样本参数化的误差函数进行梯度下降来学习。这意味着变量是神经网络的权重。该函数是“通用的”,当你使用训练样本时,它变得具体。正确的做法是使用所有训练样本来使函数具体化。这被称为“批量梯度下降”,通常由于两个原因不这样做:
- 它可能无法适应你的RAM(通常是GPU,因为对于神经网络,使用GPU会带来巨大的提升)。
- 实际上不需要使用所有样本。
在机器学习问题中,你通常有数千个训练样本。但当你只查看少数(例如64、128或256)样本时,误差表面可能看起来相似。
把它想象成一张照片:要了解照片的内容,你通常不需要2500×1800像素的分辨率。一张256×256像素的图像就能让你很好地了解照片的内容。然而,你会错过细节。
所以想象一下,梯度下降就像在误差表面上行走:你从一个点开始,你想找到最低点。为此,你向下走。然后你再次检查你的高度,检查哪个方向是向下的,并在那个方向上迈出一步(步长由学习率和其他几个因素决定)。当你使用迷你批量训练而不是批量训练时,你在不同的误差表面上行走。在低分辨率的误差表面上。它实际上可能在“真实”的误差表面上上升。但总体来说,你会朝正确的方向前进。而且你可以更快地迈出单个步骤!
现在,当你降低分辨率(减小批量大小)时会发生什么?
对的,你对误差表面看起来的图像变得不那么准确。这对你有多大影响取决于以下因素:
- 你的硬件/实现
- 数据集:误差表面有多复杂,以及仅用一小部分数据来近似它有多好?
- 学习:你具体是如何学习的(动量?newbob?rprop?)