你已经训练了一个神经网络,它在你用于训练的数据上取得了令人满意的准确度,可能甚至达到了99%。这很不错,但这只是故事的一半。衡量模型成功与否的最终标准不是它记住训练数据的能力;而是在它之前未遇到过的新的、未见过的数据上表现如何。这种在新输入上表现良好的能力被称为泛化。想象一下构建一个垃圾邮件过滤器。如果它只学习识别训练中使用的确切垃圾邮件,那么它将无法应对垃圾邮件制造者不断制造的新变体。类似地,预测房价的模型需要对不在其原始数据集中的房屋有效,而医疗诊断系统必须对新患者准确。大多数机器学习应用(特别是深度学习)的主要目标是构建能够有效泛化的模型。我们可以认为我们关注的数据(例如,所有可能的猫狗图像,所有潜在的垃圾邮件)来自某个底层、未知的数据分布。我们的训练数据集只是从这个分布中抽取的一个有限样本。我们的目标是训练一个模型,它能学习这个分布的真实底层模式,而不仅仅是我们有限训练样本中存在的特定怪癖或噪声。训练误差与泛化误差模型训练期间,模型在训练数据本身上的表现通常会被监测。损失函数(如交叉熵或均方误差)是常用的衡量工具,它量化了模型预测与训练集中真实标签之间的距离。训练集上的平均损失被称为训练误差,$E_{train}$。但最小化 $E_{train}$ 并非我们的主要目标。我们真正想要最小化的是泛化误差(也称为测试误差),$E_{gen}$,它是模型在从同一底层数据分布中抽取的新数据点上的预期误差。在实践中,我们无法直接衡量真实的泛化误差,因为我们无法获得完整的数据分布。相反,我们通过在一个单独的数据集上评估训练好的模型来估计它,这个数据集被称为测试集(或有时是验证集)。这个数据集包含模型在训练期间从未见过的例子。模型在这个保留集上的表现为我们提供了其泛化能力的近似值。泛化差距理想情况下,模型在测试集上的表现应与其在训练集上的表现接近。然而,特别是对于拥有大量参数的复杂深度学习模型,通常会看到明显的差异。模型可能在训练误差上表现非常低,但在测试集上表现差很多。训练误差和测试误差之间的这种差异有时被称为泛化差距。{"data": [{"x": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "y": [1.5, 1.1, 0.8, 0.6, 0.45, 0.35, 0.3, 0.26, 0.23, 0.21, 0.19, 0.18, 0.17, 0.16, 0.15], "mode": "lines+markers", "name": "训练损失", "line": {"color": "#228be6"}, "marker": {"color": "#228be6"}}, {"x": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "y": [1.6, 1.2, 0.9, 0.7, 0.55, 0.5, 0.48, 0.47, 0.48, 0.5, 0.53, 0.57, 0.61, 0.65, 0.7], "mode": "lines+markers", "name": "验证损失", "line": {"color": "#fd7e14"}, "marker": {"color": "#fd7e14"}}], "layout": {"title": "训练损失对比验证损失", "xaxis": {"title": "训练周期", "color": "#495057", "gridcolor": "#dee2e6"}, "yaxis": {"title": "损失", "color": "#495057", "gridcolor": "#dee2e6"}, "plot_bgcolor": "#f8f9fa", "paper_bgcolor": "#f8f9fa", "legend": {"bgcolor": "#e9ecef", "bordercolor": "#ced4da"}}}训练期间的常见模式。训练损失持续下降,而验证损失最初下降,随后开始上升,这表明模型开始对训练数据过拟合,其泛化性能正在下降。理解这个差距为何出现以及如何减小它,对于构建有效的深度学习模型非常重要。当模型未能很好地泛化时,它通常属于两种情况之一:欠拟合或过拟合。这些情况,以及诊断和解决它们的方法,构成了本课程的核心内容。我们将讲授的技术,即正则化和优化方法,专门旨在提升模型从训练数据泛化到未见过样本的能力。