在训练自编码器时,如前所述,我们的主要目的就是让重建输出尽可能接近原始输入。我们通过损失函数来衡量这一点,并试图将其减小。但就像一个通过背诵特定问答来备考的学生一样,模型有时会对训练数据学习过度,或学习不足。这在机器学习中会引出两种常见情形:过拟合与欠拟合。让我们简单看一下这些在自编码器中的含义。了解欠拟合:学习不足设想你正在学画一只猫,但你只看了一张非常模糊的图片,或者只花了很少时间研究。之后你画的猫可能就不太像了。这类似于欠拟合。当自编码器过于简单,无法捕获数据中的重要模式时,就会发生欠拟合。它未能学到数据的基础结构,因此不仅在新数据上表现差,在训练过的数据上表现也差。两种情况下的重建误差都会很高。什么可能导致自编码器欠拟合呢?瓶颈层太小: 如果瓶颈层限制性过强,试图将数据压缩到极小的空间,可能会丢失太多信息。这就像试图用一个词总结一整本书。模型过于简单: 编码器或解码器可能没有足够的层或神经元来学习数据的复杂性。训练不足: 如果你没有对模型进行足够的训练轮次,它就根本没有足够的机会调整权重并充分学习。欠拟合的自编码器不擅长重建输入,而且它在瓶颈层学到的特征可能过于普通或不完整,无法派上用场。{"layout": {"title": "欠拟合:所有数据上误差均高", "xaxis": {"title": "训练轮次"}, "yaxis": {"title": "重建误差"}, "legend": {"x": 0.7, "y": 0.95}}, "data": [{"x": [1, 5, 10, 15, 20, 25, 30], "y": [0.8, 0.75, 0.72, 0.7, 0.69, 0.68, 0.67], "mode": "lines+markers", "name": "训练误差", "line": {"color": "#339af0"}}, {"x": [1, 5, 10, 15, 20, 25, 30], "y": [0.82, 0.78, 0.75, 0.73, 0.72, 0.71, 0.70], "mode": "lines+markers", "name": "验证误差", "line": {"color": "#fa5252"}}]}在欠拟合情形下,训练误差和验证误差都保持高位,表明模型没有很好地学习数据。了解过拟合:学习过多细节现在,设想相反情况。你正在准备那场考试,但你没有理解主题,而是记住课本例子中的每一个标点符号。你可能在那些使用完全相同例子的测试中取得高分,但如果问题略有不同,你就会很吃力。这就是过拟合。当自编码器对训练数据学习得过于具体,包括该特定数据集中的任何噪声或随机波动时,就会发生过拟合。它变得如此适应训练例子,以至于无法泛化到新的、未见过的数据。因此,你会看到训练数据上的重建误差非常低,但当你用它之前未遇到的数据进行测试时,误差会高得多。为什么会发生过拟合?模型过于复杂: 如果自编码器的层数或神经元数量相对于训练数据的数量或复杂性过多,它就有能力记忆而非学习一般模式。瓶颈层限制不足: 如果瓶颈层没有强制进行足够的压缩,模型可能只是直接通过数据,而未学习到有意义的紧凑表示。训练时间过长: 给予足够时间,一个复杂的模型会开始记住训练数据中的噪声。过拟合的自编码器可能会给你训练图像的美丽重建,但它提取的特征可能对那些特定图像过于定制化,对于更广泛的用途不太有用。{"layout": {"title": "过拟合:训练表现佳,新数据表现差", "xaxis": {"title": "训练轮次"}, "yaxis": {"title": "重建误差"}, "legend": {"x": 0.7, "y": 0.3}}, "data": [{"x": [1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50], "y": [0.8, 0.5, 0.3, 0.2, 0.15, 0.1, 0.08, 0.06, 0.05, 0.04, 0.03], "mode": "lines+markers", "name": "训练误差", "line": {"color": "#339af0"}}, {"x": [1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50], "y": [0.82, 0.55, 0.38, 0.3, 0.28, 0.27, 0.29, 0.32, 0.35, 0.39, 0.43], "mode": "lines+markers", "name": "验证误差", "line": {"color": "#fa5252"}}]}过拟合的特点是训练误差减小,但在某个点之后验证误差开始增加。目标:良好拟合我们的目标是良好拟合。这是指自编码器能够从训练数据中很好地学到真实的基础模式,从而泛化到新数据。它不只是记忆训练集,也不会过于简单而无法捕获重要信息。训练误差和未见过数据上的误差(通常称为验证误差或测试误差)都较低并彼此接近。{"layout": {"title": "良好拟合:均衡学习", "xaxis": {"title": "训练轮次"}, "yaxis": {"title": "重建误差"}, "legend": {"x": 0.7, "y": 0.95}}, "data": [{"x": [1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50], "y": [0.8, 0.5, 0.3, 0.2, 0.15, 0.12, 0.10, 0.09, 0.085, 0.08, 0.078], "mode": "lines+markers", "name": "训练误差", "line": {"color": "#339af0"}}, {"x": [1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50], "y": [0.82, 0.55, 0.38, 0.25, 0.19, 0.15, 0.13, 0.12, 0.11, 0.10, 0.095], "mode": "lines+markers", "name": "验证误差", "line": {"color": "#fa5252"}}]}良好拟合的模型表明训练误差和验证误差都收敛到低值。这对自编码器为何重要?即使自编码器通常以无监督方式训练(只是尝试重建输入),瓶颈层中学到的表示的质量也具有重要作用。如果你的自编码器欠拟合,瓶颈表示将过于粗糙,无法捕获太多关于你数据的有用信息。如果你的自编码器过拟合,瓶颈表示可能对训练数据的噪声和特质过于具体。它不会是一种好的通用特征表示,无法用于其他任务或新数据。因此,在减小重建误差的同时,我们还需要注意模型是在学习可泛化的特征还是仅仅记忆。这只是对这些内容的一个快速介绍。有各种方法可以帮助避免过拟合并确保你的模型泛化良好,例如调整模型复杂度、使用正则化方法,或在适当时间停止训练(一种称为早期停止的方法)。我们现在不会详细说明这些,但当你开始使用自编码器及其他机器学习模型时,了解这些常见问题是有益的。当你准备构建你的第一个自编码器时,记住这些可能的问题将帮助你更好地理解训练过程并评估模型表现。