关于神经网络epoch和batch的理解
理解粗浅,仅为个人想法,提前感谢指正。
一个epoch代表全部数据进入网络一次,这个时候,整个网络结构只对这批数据全部走完一次,损失函数的下降还不够,因此需要多次epoch。需要多少个epoch才能使得网络训练到较为合理的地步,暂时没有定论,具体问题具体分析。
batch指的是将一个epoch(所有数据)分割成几份,每份的大小为batch size。问题来了,为什么要把数据切割成一个batch一个batch进去训练呢?关于这个问题,基础不扎实的小白也想了好久。查阅了不少博客,有人提到,第一个原因,有时候一整份数据量过多,无法一次性全部喂进去,即内存不够。这又是为什么呢?把全部数据喂进去的时候网络是如何更新参数的呢?如果不分batch,一次性全部投入网络,那么网络是如何更新(即为什么占用内存过大)参数的呢?
举个例子,有一份数据,包含100个样本,每个样本有10个特征值,那么这份数据就为(100,10)。再来看网络,假设是一个回归的预测问题,用最简单的全连接层,第一层为(input_size,hidden_size),hidden_size的大小自定义,这边假设为15,即网络的第一层为(10,15)。依此假设,第二层(15,10),第三层(10,1)。那么数据一次性进入网络的前向传播就会这样计算,(100,10)x(10,15)=(100,15),(100,15)x(15,10)=(100,10),(100,10)x(10,1)=(100,1)。到这里,输出层的输出就为(100,1)的一个向量,也就是我们要预测的值。这里只是100个样本,计算机可以轻松满足,但如果变成1000,10000,100000…还有实际的网络结构也会更复杂,反向传播所需要的计算量也远大于前向传播。因此分batch也是为了满足较小的内存计算。
第二个原因,是最优解的问题。接上面的回归网络,用mse损失函数,不分batch,这时候一个epoch的损失函数是这100个样本和真实标签的mse之和。
这时候BP,是要使得这100个样本的总和mse下降。也就是说,这时候的BP,会照顾到所有样本,让大家尽量都下降,但无法照顾到每一个样本,较为稳定,也更容易陷入局部最优解,即某种鞍点。因为损失函数就想着,啊,既然总体稳定下降,我也无需跑更远了,大家就在这附近老实呆着吧。但如果是分batch,每个batch之间的差异更大(假设,epoch是班级,batch是班级里的小组(极端点的话,个人,就是batch_size为1),班级和班级的差异,一般来说会比小组(个人)之间的差异小。不太准确,抽象理解)。损失函数为了让每个batch下降。不得不到处跑,没办法,大家差异有点大,这样,最终解不容易陷入局部,能找到更好的方向下降,泛化性也更强一些。
总结,不分batch,梯度下降较为稳定,但容易陷入局部最优解,同时内存也是个问题。如果batch_size为1,损失函数为了下降就要到处跑,非常不稳定,不容易收敛。最后,适当的batch_size能帮助网络较为稳定的下降,也能加快收敛速度。