深度学习中batch/lr/epoch三者的关系

看一下batch_size,epoch这两个参数影响的都是什么,就会有答案了。

1. 先看batch size的大小影响的是什么?

batch size的大小影响的是训练过程中的完成每个epoch所需的时间(假设算力确定了)和每次迭代(iteration)之间梯度的平滑程度。

为什么这么说?假设训练集大小为N,每个epoch中mini-batch大小为b,那么完成每个epoch所需的迭代次数为 N/bN/b , 因此完成每个epoch所需的时间会随着迭代次数的增加而增加(此为batch_size影响的是完成每个epoch所需的时间)。

另外,如pytorch\tensorflow等深度学习框架,在进行mini-batch的loss反向传播时,一般都是先将每个mini-batch中每个样本得到的loss求sum后再平均化之后再反求梯度,进行迭代,因此b的大小决定了相邻迭代batch之间的梯度平滑程度。因为一个batch内所含样本越多,这个batch的梯度应该越能反映真实的梯度,因此这样的大batch间梯度不会跨越太大。再举个极端的例子:b=1,一个样本作为一个mini_batch,这样的梯度抖动肯定是相当大的,因为太片面了,相反,大点的batch_size,抖动就比较小了。

这也是为什么大的batch_size往往建议可以相应取大点learning_rate, 因为梯度震荡小,大learning_rate可以加速收敛过程,也可以防止陷入到局部最小值,而小batch_size用小learning_rate迭代,防止错过最优点,一直上下震荡没法收敛(这也是一个小trick)

2. 在看epoch的影响?

其实看完batch_size的解释,基本就应该知道epoch在发挥个什么作用了。说简单点,epoch影响的就是迭代计算的次数。

举个例子,训练集大小为N,epoch=1(也就是只迭代一个轮次),每个epoch中mini-batch大小为b,因此反向传播优化模型参数总共进行1*N/b次。将找最优点比喻成下山的话,也就是往下走1*N/b步,若是此时还没到达山底,那么就说明还应该继续走,此时就需要增大epoch,继续进行迭代。假设epoch=100,迭代 100∗N/b100*N/b 次,在迭代 2∗N/b2*N/b 次时,已经走到山底了,loss也不再降了,那么后面的 98∗N/b98*N/b 就不用走了,因为再怎么走也就是在这个最低点徘徊了。

 

3. 再结合题主问题再总结一下

在不限内存的情况,应当用大点的batch_size, 进行模型优化,稳且快。在内存有限的情况下,减小batch_size的情况下应该相应减小的是learning_rate, 至于epoch怎么调,你就需要综合看你的loss下降情况与验证集的指标情况了。

1. 若是loss还能降,指标还在升,那说明欠拟合,还没收敛,应该继续train,增大epoch。
2. 若是loss还能再降,指标也在降,说明过拟合了,那就得采用提前终止(减少epoch)或采用weight_decay等防过拟合措施。
3.若是设置epoch=16,到第8个epoch,loss也不降了,指标也不动了,说明8个epoch就够了,剩下的白算了。
当然以上说的都是预设的一些理想情况,现实中往往没有这么明确,就如第三种情况,它可能只是到了局部最优点,并没有最优,你可能换个大点的batch_size,模型就调了个方向继续下坡,指标又能往上走点,这也就是炼丹的奥秘了,这样的情况就不再讨论了。
posted @ 2023-03-14 14:25  海_纳百川  阅读(695)  评论(0编辑  收藏  举报
本站总访问量