损失函数:网络参数优化基准
引言
在上文「深度学习|模型训练:手写 SimpleNet」中,我们以简单的 Python 代码演示了神经网络的整个训练过程,我们知道了神经网络的学习
就是从数据样例中自动学得神经网络的权重参数最优解的过程。其中不难发现,要想让模型参数在模型训练的迭代中得到一次次的优化,其中损失函数起着至关重要的作用,损失函数是衡量模型参数好坏的基准,选择合适的损失函数是决定模型可以有效训练的前提条件。
本文我们将进一步介绍更多不同的损失函数,介绍它们的定义与代表的含义,以及它们在神经网络训练中的如何起到“促进”的作用。
均方误差
均方误差
(Mean Squared Error
, MSE
)是深度学习和机器学习中最常用的损失函数,尤其在回归问题中。
均方误差是模型的预测值()与实际值()之间差异的平方的平均值,其数学公式为式 1:
其中 是样本数量; 是实际值; 是预测值。
从均方误差的定义可以看出,它对于量化预测值与实际结果之间的差异非常有效。均方误差越小,说明模型的预测越准确(衡量预测精度)。在训练神经网络时,我们通常会使用均方误差作为损失函数,通过优化该损失函数,使得模型的预测结果尽可能接近实际结果,以最小化预测误差,从而提高模型性能。
计算示例
假设我们有四组预测值和实际值如下:
- 预测值:
- 实际值:
我们首先计算每个样本的平方误差:
然后,将这些平方误差求和,并求其平均值:
均方误差常用于回归问题,能够有效地衡量预测值与实际值之间的平均平方差。由于较大的误差值被平方,提高了其对模型训练过程中的重要性(敏感度
),使模型能够更倾向于“关注”出 错较大的样本,因此均方误差在深度学习和许多统计模型中被广泛应用。
矩阵形式
在大多时候模型单个样例的输出不是一个单值,而是一个包含 k 个值的数组(向量),我们可以将对上文单值输出的均方误差推广到对数组输出的均方误差计算。求一批预测结果的数组输出的均方误差,可以用式 2 表示:
其中 表示样本数量,k 表示 输出数组的长度; 是第 i 个样例的第 j 个输出的实际值; 是第 i 个样例的第 j 个输出的预测值。取 是为了方便后续计算方便,在求导中化掉。
在前文的手写数字识别任务中,我们知道神经网络输出的 one-hot
表示的 10 个 y 值,分别代表了推理结果为 0 ~ 9 的概率。
假设我们有两组预测和实际值如下:
- 预测值 1:
[0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
(索引位 2 的概率值最大,表示预测结果为数字 2); - 预测值 2:
[0.5, 0.05, 0.2, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
(索引位 0 的概率值最大,表示预测结果为数字 0); - 实际值:
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
(实际结果为数字 2); - 实际值:
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
(实际结果为数字 0);
按照式 2 计算均方误差:
代码实现
均方误差的 Python 代码实现如下:
import numpy as np
def mean_squared_error(y, t):
"""
均方误差函数
Args:
y: 神经网络的输出
t: 监督数据
Returns:
float: 均方误差
"""
batch_size = y.shape[0]
return 0.5 * np.sum((y-t)**2) / batch_size
# 示例数据
y_true = np.array([2.5, 0.0, 2.0, 8.0]) # 真实值
y_pred = np.array([3.0, -0.5, 2.0, 7.0]) # 预测值
# 计算并输出均方误差
mse = mean_squared_error(y_pred, y_true)
print("Mean Squared Error (MSE):", mse)
# Mean Squared Error (MSE): 0.1875
这里引入了取最终结果的 ,所以所得 0.1875 正好是上文示例中计算结果的一半。
由于均方误差是一个连续且光滑的函数(平滑性),许多优化算法(如梯度下降法
)可以有效利用其梯度信息进行参数更新,从而有效提高学习效率。
对于很多像预测房价、温度等的回归问题,均方误差是最常用的损失函数,它能够有效捕捉模型预测的偏差,从而指导模型朝着更小的误差方向调整。借助梯度下降法,可以通过对均方误差函数求关于模型权重参数的导数,然后随着梯度向下调整模型参数,使得模型的预测结果更加准确。
均方误差由于其对大偏差实例的敏感性
,当存在异常值的情况下,可能导致模型不稳定。在面对异常值时,可以考虑使用其他损失函数,如均绝对误差
(Mean Absolute Error
, MAE
)或鲁棒回归 损失函数
。
交叉熵误差
交叉熵误差
(Cross-Entropy Loss
)可用于量化两个概率分布之间的差异,比如预测分布和真实标签分布之间的差距,也是一种很常用的损失函数,尤其在分类任务中。
在二分类问题中,交叉熵误差的计算公式如式 3:
在多分类问题中,交叉熵误差的计算工时如式 4:
其中:
- 是交叉熵误差。
- 是样本的总数。
- 表示第 n 个样本的真实标签(通常为 0 或 1)。
- 表示模型对第 n 个样本预测为正类的概率。
- 表示第 n 个样本的第 k 个输出的真实标签(通常为 0 或 1)。
- 表示模型对第 n 个样本的第 k 个输出预测为正类的概率。
交叉熵误差的目标在于最小化预测概率与真实标签之间的不一致性。当预测概率接近真实标签时,交叉熵损失较低;当预测概率远离真实标签时,损失值较高。该损失函数非常适合于处理概率输出,可以确保反馈的信息能够有效地更新模型参数。