神经网络训练过程中,优化环节的核心在于如何准确衡量当前模型与真实情况之间的差距,并据此调整权重参数。这个关键的误差评估工具,就是损失函数(也称代价函数或目标函数)。
损失函数的选择与神经网络模型从数据中学习的具体任务类型密切相关,例如分类任务或回归任务。下面我们将系统梳理几种常用的损失函数,包括回归任务中的均方误差损失,以及二元分类任务中的交叉熵损失和Hinge损失。
回归模型的损失函数
回归预测模型的目标是预测连续数值变量。这里我们使用 scikit-learn 的 make_regression() 函数生成模拟数据来构建模型。我们生成20个输入特征,其中10个有实际意义,另外10个是无关噪声;随机生成1000个样本,并固定随机种子,确保每次运行代码结果一致。

将输入和输出变量缩放到合理范围,通常能够有效提升神经网络模型的性能。这里我们使用 StandardScaler 进行标准化处理,在数据分割为训练集和测试集之前统一完成缩放。

随后将数据平均分割成训练集和验证集两部分。

为了展示不同损失函数的效果,我们构建一个小型多层感知器(MLP)模型。输入层包含20个特征,输出层仅有一个节点(用于预测一个实数值)。

优化器选择SGD,学习率设置为0.01,动量系数为0.9,这些参数属于合理的默认值。训练过程持续100个epoch,每个epoch结束后在测试集上评估模型,并绘制学习曲线。

MSE(均方误差)
回归问题中最常用的损失函数是均方误差(Mean Squared Error,MSE)。当目标变量服从高斯分布时,MSE在最大似然估计框架下是首选损失函数。除非有充分的理由,否则不建议轻易替换它。在Keras中编译模型时,直接指定 'mse' 或 'mean_squared_error' 即可使用该损失函数。

下面是完整的示例代码。

运行结果:训练集和测试集的均方误差均保留三位小数,显示为0.000。

从学习曲线可以看出,模型收敛速度很快,训练和测试性能均保持稳定。MSE在回归问题中确实是一个很好的选择。

MSLE(均方对数误差)
当回归问题的目标值取值范围很大时,我们可能不希望像MSE那样对较大预测值施加同样严厉的惩罚。此时可以先对每个预测值取自然对数,再计算均方误差——这就是均方对数误差(Mean Squared Logarithmic Error,MSLE)。它对大值差异的惩罚相对宽松,适合模型直接预测未缩放数值的场景。在Keras中使用 'mean_squared_logarithmic_error' 作为损失函数。

下面是使用MSLE的完整代码。

结果显示,训练集和测试集上的MSE都比直接使用MSE时略差。这是因为目标变量分布为标准高斯分布,MSLE并不完全适合这个问题。

从下图中可以看到,MSE收敛情况不错,但似乎从第20轮开始出现了过拟合迹象——下降趋势减缓甚至略有上升。

MAE(平均绝对误差)
如果目标变量分布近似高斯,但包含一些远离均值的异常值,那么平均绝对误差(Mean Absolute Error,MAE)更加合适,因为它对异常值具有更强的鲁棒性。MAE计算实际值与预测值绝对差值的平均值。在Keras中使用 'mean_absolute_error' 作为损失函数。

下面是MAE的完整代码。

结果如下。

从下图可以看到,MAE虽然最终收敛了,但收敛过程有些颠簸。MAE在本例中并不理想,因为目标变量服从高斯分布且没有较大的异常值。

二元分类的损失函数
二元分类问题需要预测两个标签中的一个(通常编码为0或1),实际应用中常输出属于类别1的概率。这里我们使用sklearn的圆问题生成数据:一个二维平面,包含两个同心圆,外圆上的点属于类别0,内圆上的点属于类别1。为了增加难度,样本中加入了10%的统计噪声,共生成1000个样本。

数据集的散点图有助于理解问题结构。完整示例如下。

散点图中,输入变量决定了点的位置,颜色代表类别(蓝色为0,橙色为1)。

同样,一半数据用于训练,一半用于测试。

定义一个简单的MLP模型。

使用SGD优化器,学习率0.01,动量0.99。

训练200个epoch,根据损失和准确率评估模型表现。

BCE(二元交叉熵)
二元交叉熵(Binary Cross-Entropy,BCE)是二元分类问题的默认损失函数,在最大似然估计框架下它是首选。对于类别1的预测,交叉熵计算实际概率分布与预测概率分布之间的平均差异。在Keras中指定 'binary_crossentropy' 作为损失函数。

输出层需要一个节点和 'sigmoid' 激活函数,以输出属于类别1的概率。

完整代码如下。

模型对问题的学习效果相对不错,测试集准确率约83%~85%。训练和测试分数有一定重叠,说明没有明显的过拟合或欠拟合现象。从下图看,训练效果良好。由于误差是连续的概率分布差异,损失曲线平滑;而准确率曲线因为预测结果只有正确/错误两种状态,显得凹凸不平,颗粒信息较少。

Hinge(铰链损失)
支持向量机(SVM)模型常用Hinge损失作为交叉熵的替代方案。Hinge损失的目标值属于集合{-1, 1},当实际类别与预测类别符号不同时,误差较大。在二元分类任务中,它有时比交叉熵表现更好。第一步需要将目标变量值改为{-1, 1}。

在Keras中称为 'hinge'。

网络输出层使用tanh激活函数的单个节点,输出介于-1和1之间的值。

完整代码如下。

性能比交叉熵略差,训练和测试准确率不到80%。

从下图可以看出,模型已经收敛,分类准确率曲线也趋于稳定。

总体来看,在这个问题上还是BCE表现更好。可能的原因与数据中存在的噪声点有关。
