Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

轮次

在深度学习中,无论采用哪种梯度下降的方法,将整个训练集遍历一遍的过程称为一个轮次(Epoch)。

如果训练集有 nn 个样本:

  • 随机梯度下降:每轮进行 nn 次迭代;

  • 全批量梯度下降:每轮仅 1 次迭代;

  • 小批量梯度下降(批大小 mm):每轮进行 n/mn/m 次迭代。

通常,网络模型需要多个轮次的重复训练,才能使参数充分收敛到较优状态。

张量

数据集

模型

损失函数(均方误差)

优化器(随机梯度下降)

训练器

随着迭代、批处理和轮次等概念的引入,模型训练和评估的代码也逐渐变得复杂起来。我们将其封装为训练器(Trainer),就可以在不同的项目复用。

最基本的训练器主要提供两个函数:

  • train(训练函数):训练函数需要两个参数:数据集和轮数。训练函数将使用数据集的训练集,完成指定轮数的迭代训练。

  • test(测试函数):测试函数只需要一个参数:数据集。测试函数将使用数据集的测试集,对训练好的模型进行一轮测试。

💡 提示:观察一下训练器的训练函数,可以发现它的核心正是之前讲过的“五步循环”(清零梯度、前向传播、计算损失、反向传播、更新参数),只是外面又套了一层轮次循环。

超参数

学习率

批大小

轮数

这是我们的第三个超参数。轮数(Epochs)定义了模型训练中,训练数据的重复迭代次数。

轮数并非越多越好:

  • 在训练初期,模型参数通常会随着轮次增加而快速收敛,误差大幅下降;

  • 随后,收敛速度逐渐趋于平缓;

  • 如果轮数过多,模型可能会由于过拟合,导致在实际应用中的效果反而变差。

因此,我们需要通过监测网络模型在测试数据上的表现,找到性能提升的拐点(Turning Point),从而确定最佳轮数:

  • 轮数太少:欠拟合;

  • 轮数太多:可能过拟合。

一个有效的实践技巧叫做早停(Early Stopping):就是在每个轮次结束后,和上一轮对比。如果损失值的下降幅度已经很小(比如:小于 1%),就说明模型已经基本收敛,可以提前停止训练,避免过拟合。

而另一相关的实践技巧叫做重排(Shuffle):就是在每个轮次里打乱训练数据的迭代次序,以期进一步优化训练,获得更好的泛化能力。

建模

我们将模型、损失函数和优化器的实例作为训练器的参数。

训练

有了训练器后,模型训练只需要调用训练器的训练函数。

评估

同样的,评估也只需要调用训练器的测试函数。

prediction:	Tensor([[163.52327795]])
loss:	Tensor(2.1807080003283335)

经过 1000 个轮次,损失值降低至个位数。

至此,我们可以宣布:模型训练成功!

损失曲线

最后,让我们监控一下每轮训练损失值的变化,直观地感受一下模型训练的过程,观察一下哪里是拐点。

我们使用 Matplotlib 图形库来展示随着轮次增加,损失值的变化。

<Figure size 500x300 with 1 Axes>

上图是模型训练的损失曲线(Loss Curve),直观地向我们展示了随着轮次的增加,损失值快速降低,然后逐渐趋于平缓的过程。

课后练习

  1. 尝试在迭代过程中实现早停机制。调整早停的比例(比如:0.1%、0.5%、1%),观察对训练轮数有什么影响?

  2. 尝试在迭代过程中实现重排机制。观察对损失值有什么影响?

  3. 观察上面的损失曲线,你认为哪里是拐点?