我已经开始尝试训练机器学习模型,并在训练过程中遇到了一些关于纪元和步骤概念的困惑。在网上研究时,我遇到了一个与时期、步骤和批量大小相关的公式 (𝜎 = (𝜀 × 𝜂) ÷ 𝛽)。将此公式应用于我自己的数据集产生了一小部分步骤,这对我提出了关于在实践中通常如何处理步骤的问题。我不确定小数步骤是否向下舍入或这如何准确地转化为实际的训练过程。我缺乏实施训练循环的实践经验,因此很难直观地掌握这些概念如何映射到现实世界的模型训练场景。
为了更好地理解 epoch、步数和批量大小之间的关系,我尝试将我找到的公式 (𝜎 = (𝜀 × 𝜂) ÷ 𝛽) 应用于数据集(这只是一个理论示例数据集):
total_samples = 10000 # Total number of samples in my dataset
batch_size = 32 # Batch size I plan to use
epochs = 10 # Number of epochs I want to train for
steps_per_epoch = total_samples / batch_size
total_steps = (epochs * total_samples) / batch_size
print(f"Steps per epoch: {steps_per_epoch}")
print(f"Total steps: {total_steps}")
这产生了以下输出:
Steps per epoch: 312.5
Total steps: 3125.0
每个时期的步数分数结果 (312.5) 让我不确定这将如何在真正的训练循环中实现。具体来说:
我还没有真正实现训练循环,所以我不确定这些分数步骤将如何在代码中处理。我的主要困难是弥合理论计算与其在模型训练中的实际应用之间的差距。
如果发生舍入,这是否意味着每个时期可能会跳过一些数据样本?
小数步仅意味着一个纪元最后一步中的示例集小于批量大小。
实践中小数步数通常会向下舍入吗? 常见的机器学习框架如何处理这种情况?
让我们看看 Pytorch 如何处理这个问题。在 Pytorch 中,我们通常通过数据加载器加载数据。它有一个名为
drop_last
的参数,其目的正是指定是向下舍入还是向上舍入。默认情况下,它设置为 False
,这意味着向上舍入。这也可能是您实施的一个很好的参考点。