训练自编码器,或者说大多数机器学习模型时,学习并非一次性完成。相反,这是一个迭代过程,模型通过多次查看数据来逐步提升表现。您会遇到两个基本术语来描述这种迭代学习的结构:“迭代次数(epochs)”和“批次(batches)”。理解这些将帮助您更好地了解自编码器等模型是如何被有效训练的。想象您有一本需要学习的大部头教科书,以便学习一个新主题。只读一遍整本书可能不足以完全掌握所有内容。您很可能需要多次阅读,每次可能侧重于不同的方面。在机器学习中,一个**迭代次数(epoch)**是指对整个训练数据集进行一次完整遍历。如果您的自编码器进行了10个迭代次数,这意味着它已经查看了训练数据中的每个样本10次。每个迭代次数都给模型另一次机会来学习数据中的潜在模式,并调整其内部参数(权重和偏置),以更好地最小化我们之前讨论过的重建误差。通常,模型的训练需要多个迭代次数,因为复杂的模式需要重复的接触模型才能学习到它们。现在,再次考虑那本大部头教科书。与其尝试一口气读完整本书(这可能让人难以承受且效率低下),您可能会将其分解成章节或部分。您会读一个章节,尝试理解它,然后再进入下一个。这就是**批次(batches)**发挥作用的地方。一次性处理整个大型数据集在计算上可能要求很高,特别是当您有数百万个数据样本时。它甚至可能无法完全载入您计算机的内存。为了解决这个问题,训练数据集被分成更小、更易于管理的部分,称为批次。**批次大小(batch size)**是一个批次中包含的训练样本数量。例如,如果您有一个包含1,000张图像的数据集,并将批次大小设置为100,那么您的数据集将被分成 $1000 / 100 = 10$ 个批次。模型一次处理一个批次。处理每个批次后,它会计算损失,然后使用反向传播更新其权重。这意味着模型在一个迭代次数内会进行多次更新。完成一个迭代次数所需的批次数量通常被称为迭代步数(iterations)或每迭代步数(steps per epoch)。在我们有1,000个样本和批次大小为100的例子中,每个迭代次数会有10个迭代步数。使用批次有以下几个优点:内存效率高:较小的批次需要较少内存,使得在非常大的数据集上训练成为可能。更快的反馈与更新:模型的权重在每个批次处理后都会更新。如果一个迭代次数中有10个批次,那么模型在每个迭代次数中会获得10次更新,而不是像一次性处理整个数据集那样只获得一次更新。这可以促进更快的收敛。更强的泛化能力:来自较小批次的更新可能会有些“噪声”(因为每个批次只是数据的一小部分),但这种特性有时可以帮助模型在优化过程中避免陷入不佳的解决方案,并更好地泛化到新数据。因此,训练过程通常如下所示:在每个迭代次数开始时,整个训练数据集通常会被打乱(以确保批次的随机性)。对于每个迭代次数: a. 数据集根据选定的批次大小被划分为批次。 b. 对于当前迭代次数中的每个批次: i. 自编码器处理批次中的样本(前向传播)。 ii. 计算该批次的重建损失。 iii. 根据此损失调整自编码器的权重(反向传播)。 c. 一旦所有批次处理完毕,该迭代次数就完成了。整个迭代次数循环会重复进行,直到模型表现令人满意或达到预设的迭代次数。以下图表说明了数据集在迭代次数和批次中的使用方式:digraph 训练周期解释 { rankdir=TB; fontname="sans-serif"; node [shape=box, style="rounded,filled", fontname="sans-serif", margin="0.25,0.15", width=3.5]; /* Default width */ edge [fontname="sans-serif"]; Dataset [label="完整训练数据集\n(例如,10,000个样本)", shape=cylinder, fillcolor="#74c0fc"]; Epoch [label="一个迭代次数\n(对所有10,000个样本进行一次完整遍历)", fillcolor="#ffe066"]; Dataset -> Epoch [label=" 用于 "]; Batches [label="在一个迭代次数内,数据以批次形式处理\n(例如,批次大小 = 100个样本)\n生成100个批次 (10,000 / 100)", fillcolor="#a5d8ff"]; Epoch -> Batches [label=" 涉及 "]; ProcessingLoop [label="对于每个批次:\n1. 模型处理样本\n2. 计算损失\n3. 调整权重", fillcolor="#96f2d7"]; Batches -> ProcessingLoop [label=" 逐个 "]; RepeatEpochs [label="整个迭代次数过程会重复\n(例如,20个迭代次数)\n直到模型表现令人满意。", shape=ellipse, fillcolor="#fab005"]; ProcessingLoop -> RepeatEpochs [label=" 在当前迭代次数的所有批次处理后 "]; }此图展示了从完整数据集到通过批次处理数据的一个迭代次数,进而通过多个迭代次数进行模型迭代优化的流程。在训练模型时,选择合适的迭代次数和批次大小是重要的决定。这些常被称为超参数,是您在训练开始前需要配置的设置。迭代次数:如果训练的迭代次数太少,模型可能无法从数据中学习到足够的信息,这种情况称为欠拟合。相反,训练的迭代次数过多会导致模型过度学习训练数据,包括其中的噪声,这使得它在新数据上的表现不佳。这称为过拟合,我们会在后面简要提及此主题。批次大小:非常小的批次大小会使训练变慢(每个迭代次数内更新次数多),并使学习过程噪声较大。非常大的批次大小可能需要过多内存,有时会导致模型陷入次优解。常见的批次大小范围从32、64、128到几千,具体取决于数据集和硬件。没有普适的最佳值;这些通常取决于特定的数据集和模型架构。通常需要通过实验来找到好的值。随着模型经过多个迭代次数的训练,您通常会观察到重建损失逐渐降低,这表明自编码器在其任务上表现越来越好。{"data": [{"x": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "y": [0.8, 0.65, 0.55, 0.48, 0.42, 0.37, 0.33, 0.30, 0.28, 0.26, 0.24, 0.23, 0.22, 0.21, 0.20, 0.19, 0.18, 0.17, 0.16, 0.15], "type": "scatter", "mode": "lines+markers", "name": "训练损失", "line": {"color": "#1c7ed6"}, "marker": {"color": "#1c7ed6"}}], "layout": {"title": {"text": "损失随迭代次数下降的典型趋势"}, "xaxis": {"title": {"text": "迭代次数"}}, "yaxis": {"title": {"text": "重建损失"}}, "font": {"family": "sans-serif"}, "height": 350, "width": 550, "margin": {"l": 70, "r": 20, "t": 50, "b": 50}}}该图表说明了随着模型训练的迭代次数增加,重建损失通常如何降低,显示了自编码器的进步。通过理解迭代次数和批次,您现在对自编码器训练背后的机制有了更清晰的认识。这种迭代式的改进,即通过多次遍历以可管理的部分处理数据,是这些网络学习压缩和重建信息的基本方式。