当前位置: 首页 > 科技观察

深度学习神经网络训练常用的五种损失函数

时间:2023-03-17 17:36:59 科技观察

神经网络在训练过程中的优化首先是对模型当前状态的误差进行估计,然后为了减少下一次评价的误差,它有必要使用一个可以代表权值更新的误差函数,这个函数称为损失函数。损失函数的选择与神经网络模型从样本中学习到的具体预测建模问题(如分类或回归)有关。在本文中我们将介绍一些常用的损失函数,包括:回归模型均方误差损失二元分类模型交叉熵和铰链损失回归模型损失函数回归预测模型主要用于预测连续值。因此,我们将使用scikit-learn的make_regression()函数生成一些模拟数据,并使用该数据构建回归模型。我们将生成20个输入特征:其中10个有意义,但10个与问题无关。并随机生成1,000个示例。并指定一个随机种子,因此每当运行代码时都会生成相同的1,000个示例。将实值输入和输出变量缩放到合理范围通常可以提高神经网络的性能。所以我们需要对数据进行标准化。StandardScaler在scikit-learn库中也可用,为了简化问题,我们将在将所有数据拆分为训练集和测试集之前缩放所有数据。然后平分训练集和验证集。为了引入不同的损失函数,我们将开发一个小型多层感知器(MLP)模型。根据问题定义,有20个特征作为输入,通过我们的模型。需要预测的真实值,因此输出层将有一个节点。我们使用学习率为0.01和动量为0.9的SGD进行优化,这两个默认值都是合理的。训练将进行100个epoch,测试集将在每个epoch结束时进行评估,并绘制学习曲线。模型完成后,可以引入损失函数:最常用的MSE回归问题是均方误差损失(MSE)。当目标变量的分布为高斯分布时,它是最大似然推理下的首选损失函数。所以如果你有更好的理由,你应该只更改为其他损失函数。如果在Keras中编译模型时指定“mse”或“mean_squared_error”作为损失函数,则使用均方误差损失函数。下面的代码是上述回归问题的完整示例。运行示例第一步,打印模型训练和测试数据集的均方误差,由于保留3位小数,所以显示为0.000。从下图可以看出,模型收敛速度相当快,训练和测试性能保持不变。基于模型的性能和收敛特性,均方误差是回归问题的一个很好的选择。MSLE在取值范围很广的回归问题中,预测大值时可能不希望像均方误差那样对模型进行惩罚。所以可以通过先计算每个预测值的自然对数来计算均方误差。这种损失称为MSLE,即均方对数误差。当预测值存在较大差异时,它具有放松惩罚效果的效果。当模型直接预测未缩放的数量时,它可能是更合适的损失度量。在keras中使用“mean_squared_logarithmic_error”作为损失函数下面的例子是使用MSLE损失函数的完整代码。该模型在训练和测试数据集上的均方误差略差。这是因为目标变量的分布是标准的高斯分布,说明我们的损失函数可能不是很适合这个问题。下图可以看出每个训练epoch的contrastiveMSE收敛的很好,但是MSE可能是过拟合了,因为它从20个epoch开始下降,开始上升。MAE根据回归问题的不同,目标变量的分布可能大部分呈高斯分布,但也可能包含离群值,例如远离均值的大值或小值。在这种情况下,平均绝对误差或MAE损失是一个合适的损失函数,因为它对异常值更稳健。计算为平均值,同时考虑实际值和预测值之间的绝对差值。使用“mean_absolute_error”损失函数,这是使用MAE的完整代码结果如下图所示。如您所见,MAE确实会收敛,但它有一个颠簸的过程。MAE在这种情况下也不是很合适,因为目标变量是没有大异常值的高斯函数。二元分类的损失函数二元分类问题是预测建模问题中的两个标签之一。这个问题定义为预测第一类或第二类的值为0或1,一般情况下通常实现为预测属于类值1的概率。我们也使用sklearn来生成数据。这里我们使用圆问题。它有一个带有两个同心圆的二维平面,其中外圆上的点属于0类,内圆上的点属于1类。为了使学习更具挑战性,我们还在样本中添加了统计噪声。样本量为1000,并添加10%的统计噪声。数据集的散点图可以帮助我们理解我们正在建模的问题。下面列出了一个完整的例子。散点图如下,其中输入变量决定了点的位置,颜色是类值。0是蓝色,1是橙色。在这里,一半用于训练,一半用于测试。我们仍然定义一个简单的MLP模型,使用SGD优化,学习率为0.01,动量为0.99。该模型训练了200轮进行拟合,并从损失和准确性方面评估了模型的性能。BCECE是用于解决二元分类问题的默认损失函数。它是最大似然推理框架下的首选损失函数。对于1类预测,交叉熵计算一个分数,该分数总结了实际概率分布和预测概率分布之间的平均差异。在编译Keras模型时,可以指定binary_crossentropy作为损失函数。为了预测第1类的概率,输出层必须包含具有“sigmoid”激活的节点。这是完整的代码:该模型相对较好地学习了问题,在测试数据集上达到了83%的准确率和85%的准确率。分数之间存在一定程度的重叠,表明该模型既不过度拟合也不欠拟合。如下图所示,训练效果很好。由于概率分布之间的误差是连续的,损失图是平滑的,而准确度线图显示出颠簸,因为训练和测试集中的示例只能预测为正确或错误,提供的信息粒度更小。铰链支持向量机(SVM)模型使用铰链损失函数作为二元分类问题的交叉熵的替代方法。目标值在集合[-1,1]中,用于二元分类。如果实际类值和预测类值的符号不同,Hinge会得到较大的误差。在二进制分类问题上,它有时比交叉熵更好。作为第一步,我们必须将目标变量的值修改为集合{-1,1}。在keras中,它被称为“铰链”。在网络的输出层,必须使用具有tanh激活函数的单个节点来输出-1和1之间的单个值。完整代码如下:性能比交叉熵差一点,两者的准确率都不到80%训练和测试集。如下图可以看出,模型收敛了,分类准确率图显示也收敛了。可以看出这道题比BCE好。这里可能的原因是我们有一些噪声点。