训练神经网络并非一次性计算。相反,它是一个迭代过程,网络会逐步从训练数据中学习。这种迭代优化发生在通常称为训练循环的过程中。理解这种循环的构成方式对掌握模型学习的过程非常重要。其核心是,训练循环重复执行一系列步骤,旨在调整网络的参数——权重 $W$ 和偏置 $b$,使预测值随时间推移更接近实际目标值。可以将其视为一种系统化的方式,向网络展示样本、评估其表现,并指导它如何调整以在下次做得更好。典型的训练循环涉及多次遍历数据集。每次完整地遍历整个训练数据集被称为一个周期(epoch)。在每个周期内,数据通常分小块处理,这些小块称为批次(batches)或小批次(mini-batches)。以下是对训练循环单次迭代中执行的主要步骤的细分,通常以一个数据批次为单位进行操作:获取批次数据: 选取一小部分(批次)训练数据(输入 $X_{batch}$ 和相应的目标输出 $Y_{batch}$)。使用批次而不是一次性处理整个数据集,可以使计算更易管理,特别是对于大型数据集,并且由于更新的随机性,通常会带来更快的收敛速度和更好的泛化能力。前向传播: 将输入数据($X_{batch}$)逐层送入网络,应用线性变换(使用当前 $W$ 和 $b$)和激活函数,以生成预测值($\hat{Y}_{batch}$)。这是第三章中详细说明的过程。计算损失: 计算网络预测值($\hat{Y}{batch}$)与实际目标值($Y{batch}$)之间的差异。这会使用选定的损失函数 $L$,例如用于回归的均方误差 (MSE) 或用于分类的交叉熵损失,如第四章所述。损失值衡量了网络对当前批次数据的预测有多么不准确。反向传播 (Backprop): 计算损失函数相对于网络中每个参数的梯度(例如,所有权重和偏置的 $\frac{\partial L}{\partial W}$ 和 $\frac{\partial L}{\partial b}$)。此过程在第四章中也有介绍,它使用链式法则来确定每个参数对总体损失的贡献程度。这些梯度指出了损失函数上升最快的方向。更新参数: 调整网络的权重和偏置以最小化损失。这通常使用优化算法完成,例如梯度下降或其变体(例如 Adam, RMSprop)。参数会沿着梯度的反方向更新,更新幅度由学习率($\eta$)控制: $$W = W - \eta \frac{\partial L}{\partial W}$$ $$b = b - \eta \frac{\partial L}{\partial b}$$ 此步骤会推动参数朝向在下一次迭代中减少损失的方向移动。这五个步骤构成一次训练迭代或训练步。循环会在一个周期内为所有批次重复这些步骤,然后为多个周期重复整个过程。整体结构可按如下方式展现:digraph TrainingLoop { rankdir=TB; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fillcolor="#e9ecef", style="filled,rounded"]; edge [color="#495057"]; Start [label="开始训练\n(初始化参数)", shape=ellipse, fillcolor="#96f2d7"]; EpochLoop [label="针对每个周期", shape=diamond, style=filled, fillcolor="#bac8ff"]; BatchLoop [label="针对周期中的每个批次", shape=diamond, style=filled, fillcolor="#a5d8ff"]; GetBatch [label="1. 获取数据批次\n(X_batch, Y_batch)", fillcolor="#ffec99"]; ForwardPass [label="2. 前向传播\n计算预测值 Y_hat", fillcolor="#ffec99"]; Loss [label="3. 计算损失\nL(Y_hat, Y_batch)", fillcolor="#ffec99"]; Backprop [label="4. 反向传播\n计算梯度 dL/dW, dL/db", fillcolor="#ffec99"]; Update [label="5. 更新参数\nW = W - η * dL/dW\nb = b - η * dL/db", fillcolor="#ffec99"]; EndEpoch [label="周期结束"]; EndTraining [label="训练结束", shape=ellipse, fillcolor="#ffc9c9"]; Start -> EpochLoop; EpochLoop -> BatchLoop [label=" 开始周期 "]; BatchLoop -> GetBatch [label=" 下一个批次 "]; GetBatch -> ForwardPass; ForwardPass -> Loss; Loss -> Backprop; Backprop -> Update; Update -> BatchLoop [label=" 还有更多批次吗? "]; BatchLoop -> EndEpoch [label=" 没有更多批次 "]; EndEpoch -> EpochLoop [label=" 还有更多周期吗? "]; EpochLoop -> EndTraining [label=" 没有更多周期 "]; }典型的神经网络训练循环结构,遍历周期并以批次处理数据。每个批次都经过前向传播、损失计算、反向传播和参数更新。在训练期间,需要监控网络表现,通常通过跟踪训练集和单独验证集上的损失和准确率(针对分类任务)来完成,这可以在每个周期之后,甚至在一定数量的迭代之后进行。这有助于诊断过拟合或欠拟合等问题,并决定何时停止训练(将在第六章中进一步讨论)。虽然像TensorFlow和PyTorch这样的深度学习框架提供了高级抽象,通常向用户隐藏了明确的循环结构,但理解这种基本流程对于调试、自定义训练过程以及解释模型行为非常重要。接下来的章节将引导你实现这些步骤,以构建和训练你的第一个网络。