在神经网络训练过程中,首先要评估当前模型的预测误差,再借助一个函数来指导权重的更新——这个函数被称为损失函数。通俗地讲,损失函数好比一位裁判,它告诉模型:“刚才那轮预测偏差有多大,接下来应该如何调整”。

选择何种损失函数,主要取决于神经网络需要解决的具体任务——是分类还是回归。本文将盘点几种最常用的损失函数,包括:回归模型中的均方误差损失,以及二元分类模型中的交叉熵损失和Hinge损失。
回归模型的损失函数
回归任务的目标是预测连续数值,这里先使用scikit-learn的make_regression()函数模拟数据来搭建模型。生成20个输入特征,其中10个有效、10个无关;共1000个样本,固定随机种子以确保每次运行数据一致。

通常将实值输入和输出缩放到合理范围,能提升神经网络的性能。这里采用StandardScaler进行标准化处理,为简化流程,在划分训练集和测试集之前先对全部数据做缩放。

然后平均划分为训练集和验证集。

为了演示不同损失函数,搭建一个小型多层感知器(MLP)模型。问题有20个特征作为输入,输出需要预测一个实值,因此输出层设置一个节点。

使用SGD优化器,学习率0.01,动量0.9——这些都是比较可靠的默认配置。训练100个epoch,每个epoch结束后在测试集上评估,并绘制学习曲线。

模型搭建完成后,逐一介绍损失函数。
MSE:回归问题的默认首选
均方误差损失(MSE)是回归问题中最常用的损失函数。当目标变量服从高斯分布时,在最大似然估计框架下它是最优选择。因此,除非有更充分的理由,否则不建议替换为其他损失函数。在Keras中,编译模型时指定损失函数为'mse'或'mean_squared_error'即可。

以下代码是使用MSE的完整示例:

运行结果中,训练集和测试集的MSE均保留三位小数显示为0.000,表明误差非常小。

从学习曲线来看,模型收敛迅速,训练与测试性能稳定。对于回归问题而言,MSE确实是一个可靠的选择。

MSLE:应对数值跨度大的场景
如果回归问题的目标值范围很宽,可能不希望模型在预测大数值时被过度惩罚(像MSE那样)。此时可以先对每个预测值取自然对数,再计算均方误差——这就是均方对数误差(MSLE)。它对大数值的惩罚相对宽松,适合模型直接预测未经缩放的原始量。Keras中的对应损失函数是'mean_squared_logarithmic_error'。

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

结果发现,训练集和测试集上的MSE都比MSE方案略微差一些。原因在于目标变量本身是标准高斯分布,MSLE对此种分布并不太适合。

从训练轮次的对比图可以看出,MSE收敛得不错,但大约从20轮开始下降趋缓甚至回升,说明模型可能出现了过拟合。

MAE:对异常值更稳健
在回归问题中,若目标变量大致服从高斯分布但包含一些离群点(远离均值的大值或小值),那么平均绝对误差(MAE)是更合适的选择,因为它对异常值不那么敏感。MAE计算的是实际值与预测值之间绝对差值的均值。Keras中可以使用'mean_absolute_error'作为损失函数。

以下是使用MAE的完整代码:

结果如下:

从曲线看,MAE确实收敛了,但过程有些颠簸。在本例中,目标变量呈高斯分布且无明显大离群值,因此MAE也并非最佳选择。

二元分类的损失函数
二元分类问题需要预测两个标签之一,通常用0和1表示,实践中一般输出属于类别1的概率。这里仍使用scikit-learn生成数据,采用“圆问题”:二维平面上有两个同心圆,外圆上的点属于类别0,内圆上的点属于类别1。为增加学习难度,加入10%的统计噪声,总共1000个样本。

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

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

同样将数据分为一半训练、一半测试。

定义一个简单的MLP模型:

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

训练200个epoch,并根据损失和准确率评估模型性能。

BCE:二元分类的默认损失
二元交叉熵(BCE)是解决二元分类问题时的默认损失函数,在最大似然估计框架下也是首选。它计算的是实际概率分布与预测概率分布之间的平均差异。在Keras中编译模型时,指定损失函数为'binary_crossentropy'。

为了输出属于类别1的概率,输出层必须包含一个节点,并使用'sigmoid'激活函数。

完整代码如下:

模型学习效果理想,测试集准确率达到83%,精确率85%。训练和测试分数有一定重叠,说明既不过拟合也不欠拟合。从学习曲线看,训练效果良好。由于概率分布之间的误差是连续的,损失曲线很平滑;而准确率曲线有些凹凸不平,因为每个样本只能被判断为正确或错误,颗粒度较粗。

Hinge:来自SVM的替代方案
Hinge损失函数来源于支持向量机(SVM),可作为交叉熵的替代方案。它的目标值要求是{-1, 1},如果实际类别与预测类别的符号不同,Hinge会施加更大的惩罚。在某些二元分类任务中,其表现可能优于交叉熵。使用前需将目标变量从{0,1}转换为{-1,1}。

Keras中对应的损失函数名为'hinge'。

网络的输出层需要使用'tanh'激活函数的单个节点,输出值范围在-1到1之间。

完整代码如下:

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

从下图中可以看到,模型已收敛,分类精度图也趋于稳定。

总体而言,在本问题中BCE表现更好,这可能与数据中存在噪声点有关。
