神经网络开始学习前,我们需要一种方法来准确衡量它在给定任务上的表现。它能准确预测房价吗?它能正确地分类猫狗图片吗?这种衡量就是损失函数的作用,有时也被称为成本函数或目标函数。可以将损失函数视为对网络预测结果的评分。它将网络的输出(预测值,通常表示为 $\hat{y}$)与数据集中的真实目标值 ($y$) 进行比较。结果是一个标量值,表示这些预测的“误差”或“损失”。完美的预测会产生零损失,而更大的误差会导致更高的损失值。训练的目标是使这个损失值最小化。梯度下降和反向传播的整个机制,我们将在后面讨论,都是为了调整网络的权重和偏差,从而系统地降低所选损失函数的输出。你选择的特定损失函数很重要,并且在很大程度上取决于你试图解决的问题类型,主要是它是否是回归或分类任务。回归问题的损失函数回归问题涉及预测连续的数值,例如房价、明日气温或股票市场价值。均方误差 (MSE)回归中最常用的损失函数是均方误差 (MSE)。它计算预测值与实际值之间平方差的平均值。对于包含 $N$ 个示例的数据集,MSE 的计算方式如下:$$ L_{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2 $$这里:$N$ 是数据点(例如批次中的)的数量。$y_i$ 是第 $i$ 个数据点的真实目标值。$\hat{y}_i$ 是网络对第 $i$ 个数据点的预测值。为什么要平方差值?方向无关紧要:平方确保误差(差值)总是正值。欠预测 ($y_i > \hat{y}_i$) 与过预测 ($y_i < \hat{y}_i$) 会受到同等惩罚。对大误差施加更多惩罚:平方运算意味着更大的差值对总损失的贡献远大于较小的差值。例如,误差为 2 贡献 4 到总和,而误差为 4 贡献 16。如果大误差对你的应用尤其成问题,这会很理想。数学上的便利:MSE 函数是平滑且可微分的,这使得计算反向传播的梯度变得容易。考虑:因为 MSE 会将误差项平方,所以它对异常值很敏感。一个具有非常大误差的单一数据点可能会主导损失值,并可能扭曲训练过程。{"layout": {"title": "均方误差 (MSE) 与预测误差的关系", "xaxis": {"title": "预测误差 (y - y_hat)"}, "yaxis": {"title": "损失 (MSE 分量)"}}, "data": [{"x": [-4, -3, -2, -1, 0, 1, 2, 3, 4], "y": [16, 9, 4, 1, 0, 1, 4, 9, 16], "mode": "lines+markers", "name": "MSE", "line": {"color": "#228be6"}}]}预测误差与对 MSE 损失贡献之间的关系。较大的误差(正或负)会导致损失值呈二次方增长。平均绝对误差 (MAE)另一种用于回归的替代方案是平均绝对误差 (MAE)。它计算预测值与目标值之间绝对差的平均值。$$ L_{MAE} = \frac{1}{N} \sum_{i=1}^{N} |y_i - \hat{y}_i| $$MAE 衡量误差的平均大小,而不考虑其方向。与 MSE 不同,它对误差进行线性惩罚。这使得 MAE 对异常值的敏感度低于 MSE,这在存在显著噪声或异常的数据集中可能是有益的。然而,它的梯度是常数,这在使用梯度下降时有时会导致收敛问题,尤其当损失接近最小值时。分类问题的损失函数分类问题涉及预测离散的类别或类标签,例如识别垃圾邮件、图像分类或预测客户流失(是/否)。二元交叉熵(对数损失)在处理二元分类(两个可能的输出类别,通常标记为 0 和 1)时,标准损失函数是二元交叉熵,常被称为对数损失。它通常在网络输出层具有一个带有 Sigmoid 激活函数的单个神经元时使用,该激活函数将输出压缩到 0 到 1 之间的概率。对于 $N$ 个示例的二元交叉熵公式为:$$ L_{BCE} = - \frac{1}{N} \sum_{i=1}^{N} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)] $$这里:$y_i$ 是第 $i$ 个数据点的真实标签(0 或 1)。$\hat{y}_i$ 是网络预测的概率(Sigmoid 函数的输出,介于 0 和 1 之间),表示第 $i$ 个数据点属于类别 1。我们来分解一下:如果真实标签 $y_i$ 为 1:第二项 $(1 - y_i) \log(1 - \hat{y}_i)$ 变为零。损失变为 $- \log(\hat{y}_i)$。如果网络正确预测的概率 $\hat{y}_i$ 接近 1,则 $\log(\hat{y}_i)$ 接近 0,损失很小。如果网络错误预测的概率 $\hat{y}_i$ 接近 0,则 $\log(\hat{y}_i)$ 趋近负无穷大,损失变得非常大。如果真实标签 $y_i$ 为 0:第一项 $y_i \log(\hat{y}_i)$ 变为零。损失变为 $- \log(1 - \hat{y}_i)$。如果网络正确预测 $\hat{y}_i$ 接近 0,则 $1 - \hat{y}_i$ 接近 1,$\log(1 - \hat{y}_i)$ 接近 0,损失很小。如果网络错误预测 $\hat{y}_i$ 接近 1,则 $1 - \hat{y}_i$ 接近 0,$\log(1 - \hat{y}_i)$ 趋近负无穷大,损失变得非常大。二元交叉熵会严厉惩罚那些自信却错误的预测。{"layout": {"title": "二元交叉熵损失", "xaxis": {"title": "预测概率 (y_hat)"}, "yaxis": {"title": "损失"}, "legend": {"traceorder": "reversed"}}, "data": [{"x": [0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.99], "y": [4.61, 2.30, 1.61, 1.20, 0.92, 0.69, 0.51, 0.36, 0.22, 0.11, 0.01], "mode": "lines", "name": "若真实标签为 1 时的损失 (-log(y_hat))", "line": {"color": "#12b886"}}, {"x": [0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.99], "y": [0.01, 0.11, 0.22, 0.36, 0.51, 0.69, 0.92, 1.20, 1.61, 2.30, 4.61], "mode": "lines", "name": "若真实标签为 0 时的损失 (-log(1-y_hat))", "line": {"color": "#fa5252"}}]}当预测概率偏离真实标签(0 或 1)时,二元交叉熵损失会急剧增加。分类交叉熵对于多类别分类问题(多于两个类别),我们使用分类交叉熵。这要求真实标签 $y$ 采用独热编码格式(例如,3 个类别中的第 2 个类别将是 [0, 0, 1])。网络的输出层通常使用 Softmax 激活函数,它在所有 $C$ 个类别上产生一个概率分布,确保预测概率总和为 1。对于 $N$ 个示例和 $C$ 个类别的分类交叉熵公式为:$$ L_{CCE} = - \frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{C} y_{ij} \log(\hat{y}_{ij}) $$这里:$N$ 是数据点的数量。$C$ 是类别的数量。$y_{ij}$ 是如果数据点 $i$ 确实属于类别 $j$ 则为 1,否则为 0(来自独热编码)。$\hat{y}_{ij}$ 是网络预测的数据点 $i$ 属于类别 $j$ 的概率(Softmax 函数的输出)。因为 $y_{ij}$ 仅对单个正确类别为 1,对所有其他类别为 0,所以内部求和简化为 $- \log(\hat{y}_{ik})$,其中 $k$ 是数据点 $i$ 的真实类别的索引。损失函数有效地衡量了实际正确类别所对应的预测概率有多低。真实类别的预测概率越高,损失越低。选择合适的损失函数选择合适的损失函数对于模型训练的成功是根本性的:对于预测连续值的回归任务,MSE 是标准选择,但如果异常值是一个主要问题,可以考虑使用 MAE。对于二元分类(两个类别),使用二元交叉熵,通常与 Sigmoid 输出激活函数配对。对于多类别分类(多于两个类别),使用分类交叉熵,通常与 Softmax 输出激活函数和独热编码标签配对。损失函数提供了驱动学习的误差信号。通过计算网络预测值与真实目标值偏离的程度,它为优化过程奠定了基础。下一步是理解像梯度下降这样的算法如何使用这个误差信号来调整网络的参数。