使用batch训练神经网络时,每次模型训练,更新权重时,就拿一个batch的样本来更新权重。
求损失loss用于梯度下降,更新权重时,有几种方式。一种是全部的样本用来求loss,这种方式称为批量梯度下降(BGD);一种是随机的选取一个样本,求loss,进而求梯度,这种方式称为随机梯度下降(SGD);BGD和SGB的这种,产生了第三种梯度下降的方法:小批量梯度下降(MBGD)。
当我们使用批量梯度下降BGD方法来更新权重时,面临一个问题:当陷入局域最小点时,梯度为0时,无论怎么更新权重,loss都不再改变,从而无法找到全局最优点。
而随机梯度下降SGB是,随机选取一个样本求loss进而求梯度。这种方式就很大程度上规避了梯度为0的情况:即使某次训练更新权重时,梯度为0,下次也不一定为0。而批量梯度下降BGD则不然,本次更新权重时,梯度为0,下次还是0。梯度下降法就失效了。
但批量梯度下降BGD和随机梯度下降SGD有各自的优缺点:
1.使用批量梯度下降BGD时,虽然模型的性能低,但耗费时间时间也低。(由于其求梯度,更新权重时,可以并行计算,因此是求所有样本损失的累加和)
2.使用随机梯度下降SGD时,虽然模型的性能高,但耗费的时间也高。(由于其求梯度,更新权重时,不可以并行计算。某步更新权重,要依赖上一步权重)
因此就提出了一种折中的方法:小批量梯度下降(MBGD)
Epoch:1个epoch等于使用训练集中的全部样本训练一次,通俗的讲几次epoch就是整个数据集被轮几次
Iteration:1个iteration等于使用batchsize个样本训练一次,也就是说训练一批的样本,称为一次迭代。比如训练集有500个样本,batchsize = 10 ,那么训练完整个样本集:iteration=50,epoch=1.
batchsize最大是样本总数N,此时就是Full batch learning;最小是1,即每次只训练一个样本,这就是在线学习(Online Learning)。
关于BGD,SGD,MBGD的数学原理,可以参考:https://www.cnblogs.com/lliuye/p/9451903.html
从数学公式中我们可以知道,batchsize越大,并行效率越高,梯度下降更稳定,但训练总时间不一定就短,但对显存占用更大。
训练总时间 = 一次网络参数更新所需的计算时间(和梯度计算并行效率有关,理想情况下,并行计算2个样本和并行计算200个样本所需时间一样)X 收敛所需更新次数(和梯度收敛速度有关:参数更新了多少次,更新方向正确与否)
训练总时间和batchsize的关系和Mem大小,CUDA流处理器数量,单个样本的梯度计算复杂度,梯度收敛速度均有关。
假设Mem很大,但是CUDA流处理器数量少,那么 batchsize越大,训练总时间有可能会长很多(因为最后计算的样本可能很多:计算的样本梯度多,但是网络参数的更新次数少,收敛慢)。
一次性加载进显存,不等于CUDA流处理器能一次并行完。