神经网络在学习之前,需要一种方式来衡量其预测的准确度。这项衡量工作由损失函数(也称为成本函数或目标函数)完成。可以将其视为一个分数,用以量化模型预测值与训练数据中实际目标值之间的差异。训练的目标是调整网络权重,使这个分数尽可能低。在训练过程中,对当前批次数据进行前向传播(进行预测)后,会计算损失函数的值。然后,这个损失值会被优化算法(我们接下来会讨论)在反向传播中使用,以计算梯度,从而确定减少误差所需的权重调整方向和幅度。选择得当的损失函数能有效引导网络做出更好的预测。损失函数的选择并非随意;它直接取决于您尝试解决的问题类型。使用不合适的损失函数可能导致模型性能不佳,即使网络架构良好也是如此。接下来我们看看常用机器学习任务的标准损失函数。回归问题的损失函数回归问题涉及预测连续的数值,例如预测房价、温度或股票价值。均方误差 (MSE)均方误差或许是回归最常用的损失函数。它计算预测值 ($\hat{y}_i$) 与真实值 ($y_i$) 之间平方差的平均值。$$ MSE = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2 $$这里,$N$ 是批次中的样本数量。将差异平方化有两个主要作用:确保误差始终为正值。对较大误差的惩罚远重于较小误差。如果特别不希望出现大误差,这可能是有益的,但这也使得MSE对数据中的异常值敏感。在 Keras 中,您可以使用字符串标识符'mean_squared_error'或'mse'来指定MSE,或者通过导入并使用keras.losses.MeanSquaredError类。平均绝对误差 (MAE)平均绝对误差计算预测值与真实值之间绝对差的平均值。$$ MAE = \frac{1}{N} \sum_{i=1}^{N} |y_i - \hat{y}_i| $$MAE衡量误差的平均大小,而不考虑其方向。与MSE不同,它不会不成比例地惩罚大误差,使其更适合处理异常值。如果您的数据集包含您不希望主导损失计算的显著异常值,MAE可能是一个更好的选择。在 Keras 中,使用标识符'mean_absolute_error'或'mae',或keras.losses.MeanAbsoluteError类。{"layout": {"title": "异常值对MSE与MAE的影响", "xaxis": {"title": "预测值"}, "yaxis": {"title": "损失"}, "legend": {"traceorder": "normal"}}, "data": [{"type": "scatter", "name": "MSE", "x": [1, 2, 3, 4, 10], "y": [1, 0, 1, 4, 64], "mode": "lines+markers", "line": {"color": "#228be6"}, "marker": {"color": "#228be6"}}, {"type": "scatter", "name": "MAE", "x": [1, 2, 3, 4, 10], "y": [1, 0, 1, 2, 8], "mode": "lines+markers", "line": {"color": "#fd7e14"}, "marker": {"color": "#fd7e14"}}]}比较预测目标值2时MSE和MAE的损失。请注意,当预测值偏离真实值较远时(例如,预测值为10),MSE的损失增长要陡峭得多,这表明与MAE相比,它对大误差或异常值更为敏感。分类问题的损失函数分类问题涉及预测离散的类别或类标签。损失函数的选择取决于它是二分类(两个类别)还是多分类(多于两个类别),以及标签的格式。二元交叉熵用于只有两个可能结果类别(例如,垃圾邮件/非垃圾邮件、猫/狗)的二分类问题。通常,网络处理此类任务的最后一层具有一个带有Sigmoid激活函数的输出单元,生成0到1之间的概率。目标标签应为0或1。二元交叉熵衡量真实标签($y$,为0或1)与预测概率($\hat{y}$)之间的差异。单个预测的公式为:$$ Loss = -(y \log(\hat{y}) + (1-y) \log(1-\hat{y})) $$当预测概率$\hat{y}$接近真实标签$y$时,损失较低;否则损失较高。例如,如果真实标签$y=1$,损失简化为$-\log(\hat{y})$。当$\hat{y}$接近1时,此值接近0;当$\hat{y}$接近0时,此值趋于无穷大。反之,如果$y=0$,损失为$-\log(1-\hat{y})$,这会惩罚接近1的预测值。在 Keras 中,使用标识符'binary_crossentropy'或keras.losses.BinaryCrossentropy类。分类交叉熵用于多分类问题,其中每个样本恰好属于三个或更多类别中的一个(例如,对0-9的数字图像进行分类)。此损失函数期望目标标签采用独热编码。独热编码标签是一个与类别数量相同长度的向量,除了对应真实类别的索引处为1之外,其他所有位置都为零。例如,如果类别是“猫”、“狗”、“鸟”,那么“狗”的标签将是[0, 1, 0]。网络处理此类任务的最后一层通常具有$C$个输出单元(其中$C$是类别数量),并使用Softmax激活函数。Softmax确保输出是所有类别概率之和为1的概率。分类交叉熵将预测概率($\hat{y}$)的分布与真实分布($y$,独热向量)进行比较。单个样本的公式为:$$ Loss = -\sum_{c=1}^{C} y_c \log(\hat{y}_c) $$其中$C$是类别数量,$y_c$在$c$是真实类别时为1,否则为0,$\hat{y}c$是类别$c$的预测概率。由于只有一个$y_c$为1(真实类别),所以求和实际上变为$-\log(\hat{y}{真实类别})$。如果模型为正确类别分配了较低的概率,它会受到严厉的惩罚。在 Keras 中,使用'categorical_crossentropy'或keras.losses.CategoricalCrossentropy。稀疏分类交叉熵此损失函数与分类交叉熵目的相同(多分类),但用于目标标签以整数形式提供而非独热编码向量的情况。例如,对于“狗”的标签,不是[0, 1, 0],而是简单地使用整数1(假设“猫”是0,“狗”是1,“鸟”是2)。使用稀疏分类交叉熵通常更方便,因为它避免了将整数标签显式转换为独热向量的需要。执行的计算在数学上等同于分类交叉熵;Keras在内部处理转换。与分类交叉熵一样,它要求模型的最后一层使用Softmax激活。在 Keras 中,使用'sparse_categorical_crossentropy'或keras.losses.SparseCategoricalCrossentropy。根据目标标签的格式纯粹地选择categorical_crossentropy或sparse_categorical_crossentropy:独热向量需要前者,而整数标签需要后者。在 Keras 中指定损失函数您在使用compile()方法编译模型时选择损失函数。您可以使用其字符串标识符(最常见)或通过实例化keras.losses中的损失类来指定它。import keras # 回归模型的例子 model.compile(optimizer='adam', loss='mean_squared_error') # 使用MSE的字符串标识符 # 二分类模型的例子 model.compile(optimizer='rmsprop', loss='binary_crossentropy', # 使用字符串标识符 metrics=['accuracy']) # 使用整数标签的多分类模型的例子 model.compile(optimizer='adam', loss=keras.losses.SparseCategoricalCrossentropy(), # 使用类实例 metrics=['accuracy']) # 使用独热编码标签的多分类模型的例子 model.compile(optimizer='adam', loss='categorical_crossentropy', # 使用字符串标识符 metrics=['accuracy'])选择正确的损失函数是配置训练过程的基础步骤。它定义了模型将努力最小化的量,直接影响模型从数据中学习的方式。定义了损失函数后,接下来的一个环节是优化算法,它决定了根据计算出的损失如何更新模型的权重。