我试图训练一个神经网络来将单词分类到不同的类别中。 我注意到两件事:
当我使用较小的 batch_size
(如8、16、32)时,损失并没有下降,而是呈现出零散变化的趋势。当我使用更大的 batch_size
(如128、256)时,损失虽然下降但非常缓慢。
更重要的是,当我使用一个较大的 EPOCH
值时,我的模型可以很好地减少损失。但是我使用了一个非常大的值(EPOCHS = 10000
)。
问题:如何获得最佳的 EPOCH
和 batch_size
值?
我试图训练一个神经网络来将单词分类到不同的类别中。 我注意到两件事:
当我使用较小的 batch_size
(如8、16、32)时,损失并没有下降,而是呈现出零散变化的趋势。当我使用更大的 batch_size
(如128、256)时,损失虽然下降但非常缓慢。
更重要的是,当我使用一个较大的 EPOCH
值时,我的模型可以很好地减少损失。但是我使用了一个非常大的值(EPOCHS = 10000
)。
问题:如何获得最佳的 EPOCH
和 batch_size
值?
没有什么规则可以决定这些值。不幸的是,最佳选择取决于问题和任务。但是,我可以为您提供一些见解。
当训练神经网络时,您需要计算一个能够减少损失的梯度。为了做到这一点,您需要向后传播损失。现在,在理想情况下,您应该基于数据中所有样本来计算损失,因为这样您就考虑了基本上每个样本,并且得出了能够捕获所有样本的梯度。在实践中,由于计算所有样本的梯度的计算复杂度,这是不可能的。因为对于每次更新,您必须对所有样本进行前向传递。那种情况下的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应该既能为您提供信息丰富的梯度,又足够小,以便您可以有效地训练网络。你只能通过尝试来找到它。