神经网络:Epoch和Batch大小

3

我试图训练一个神经网络来将单词分类到不同的类别中。 我注意到两件事:

当我使用较小的 batch_size (如8、16、32)时,损失并没有下降,而是呈现出零散变化的趋势。当我使用更大的 batch_size (如128、256)时,损失虽然下降但非常缓慢。

更重要的是,当我使用一个较大的 EPOCH 值时,我的模型可以很好地减少损失。但是我使用了一个非常大的值(EPOCHS = 10000)。

问题:如何获得最佳的 EPOCH batch_size 值?


我认为你应该进行超参数调整...Optuna库在PyTorch中表现得非常好。 - Prajot Kuvalekar
@PrajotKuvalekar 谢谢,我会去看看,似乎是我需要的东西。 - newbieprogrammer
1个回答

4

没有什么规则可以决定这些值。不幸的是,最佳选择取决于问题和任务。但是,我可以为您提供一些见解。

当训练神经网络时,您需要计算一个能够减少损失的梯度。为了做到这一点,您需要向后传播损失。现在,在理想情况下,您应该基于数据中所有样本来计算损失,因为这样您就考虑了基本上每个样本,并且得出了能够捕获所有样本的梯度。在实践中,由于计算所有样本的梯度的计算复杂度,这是不可能的。因为对于每次更新,您必须对所有样本进行前向传递。那种情况下的batch_size = N,其中N是您拥有的数据点的总数。

因此,我们使用小的batch_size作为近似值!这个想法是,我们不考虑所有的样本,而是说我会基于一些小的样本计算梯度,但问题在于我会丢失关于梯度的信息。

经验法则: 较小的batch size会产生噪声梯度,但收敛更快,因为每个epochs有更多的更新。如果batch size为1,你每个epoch将进行N次更新。如果是N,则每个epoch只有1次更新。另一方面,较大的batch size会产生更多的信息梯度,但收敛速度较慢。

这就是为什么对于较小的batch size,您观察到损失变化很大的原因,因为梯度是嘈杂的。而对于较大的batch size,您的梯度是信息丰富的,但需要很多epochs,因为您更新的频率较低。

理想的batch size应该既能为您提供信息丰富的梯度,又足够小,以便您可以有效地训练网络。你只能通过尝试来找到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接