我正在MNIST上训练自动编码器,并注意到在128位之后增加批处理大小,开始在固定的数据集大小上花费更多的计算时间。
我正在使用tensorflow-gpu,并装有GeForce GTX 1070。
我尝试在5000个样本(784个暗号)的固定训练集上运行了一些测试,并运行了10个时期。
批次是来自5000个训练样本的连续batch-size
个块,因此有效的迭代次数取决于批次的大小。
我跟踪了该数据的性能(损失),执行时间和python进程的GPU内存使用情况(来自nvidia-smi输出):
5000 datapoints 10 epochs
batch size
512: loss: 53.7472; execution took 00:00:13,787; 4281MiB
256: loss: 48.1941; execution took 00:00:04,973; 695MiB
128: loss: 42.7486; execution took 00:00:03,350; 439MiB
64: loss: 40.0781; execution took 00:00:04,191; 439MiB
32: loss: 37.7348; execution took 00:00:06,487; 441MiB
16: loss: 36.6291; execution took 00:00:12,102; 441MiB
8: loss: nan; execution took 00:00:23,115; 441MiB
当我尝试大于512的小批量时,出现内存不足错误。
我认为较小的批处理需要更长的时间执行是有道理的,因为在同一日期顺序会有更多的更新。但是,我不确定为什么小批量大于128个样本时会增加计算时间,而不是进一步减少。
一个假设是,这与GPU充满并无法正确并行化有关,但是我在网上找不到任何此类注释。
答案 0 :(得分:0)
以较小的批次大小训练模型时,虽然随机性更高,但模型更新的频率更高。这有助于在每个时期更快地收敛。例如,如果您以500的batch_size
进行训练,则将在1个时期内更新100次模型参数,但是如果您以50的batch_size
进行训练,则1个时期内的更新次数为1000。 / p>
以更大的批次大小训练模型时,每次更新都更稳定且随机性更低。
当您以更大的批处理量训练模型时,它利用了CPU或GPU上的矢量化计算,例如使用batch_size = 1
,我们得到了更多的更新,但没有矢量化的优势。但是,当您使用非常大的批处理(大于内存的容量)进行训练时,则说明内存不足。
通常,我们在批处理数量和收敛速度之间取得平衡。
答案 1 :(得分:0)
较大的批次意味着每个时期的总更新较少,这也意味着每个批次将需要更多的时间来处理,而增大批次的大小会使批次的总数变小,这也可能导致收敛速度变慢。
如您所见,这是一个折衷方案。您将必须为数据集找到最佳的批次大小。对于MNIST,批量大小通常在50到150之间。
我不确定如何从数据库中加载批处理,但是如果使用正确的方式,则批处理的优点是您不必将整个数据加载到RAM中。因此,大批处理量会导致内存不足错误是很自然的。