用于训练深度学习神经网络的损失和损失函数

神经网络使用随机梯度下降进行训练,并要求你在设计和配置模型时选择损失函数。

有许多损失函数可供选择,知道要选择什么,甚至知道损失函数是什么,以及它在训练神经网络时所起的作用可能是具有挑战性的。

在这篇文章中,你将了解损失函数和损失函数在训练深度学习神经网络中的作用,以及如何为你的预测建模问题选择正确的损失函数。

读完这篇文章,你就会知道:

  • 使用需要损失函数来计算模型误差的优化过程来训练神经网络。
  • 最大似然法提供了在训练神经网络和机器学习模型时选择损失函数的框架。
  • 交叉熵和均方误差是训练神经网络模型时使用的两种主要损失函数。

我们开始吧。

概述

本教程分为七个部分,它们是:

  • 作为优化的神经网络学习。
  • 什么是损失函数和损失?
  • 最大似然。
  • 最大似然与交叉熵。
  • 使用什么损失函数?
  • 如何实现损失函数。
  • 损失函数和报告的模型性能。

我们将集中讨论损失函数背后的理论。

有关选择和实施不同损失函数的帮助,请参阅帖子:

作为优化的神经网络学习

深度学习神经网络学习将一组输入映射到来自训练数据的一组输出。

我们不能为神经网络计算完美的权重,因为有太多的未知数。取而代之的是,学习问题被转换为搜索或优化问题,并且使用算法来导航模型可能使用的权重集合的空间,以便做出好的或足够好的预测。

通常,使用随机梯度下降优化算法训练神经网络模型,并使用误差反向传播算法更新权重。

梯度下降中的“梯度”指的是误差梯度。使用具有给定权重集的模型进行预测,并计算这些预测的误差。

梯度下降算法寻求改变权重,以便下一次评估减少误差,这意味着优化算法正在向下导航误差的梯度(或斜率)。

既然我们知道训练神经网络解决了优化问题,我们就可以看看如何计算给定权重集的误差。

什么是损失函数和损失?

在优化算法的上下文中,用于评估候选解(即,一组权重)的函数被称为目标函数。

我们可以寻求最大化或最小化目标函数,这意味着我们正在搜索分别具有最高分数或最低分数的候选解。

通常,对于神经网络,我们寻求将误差降至最低。因此,目标函数通常被称为成本函数或损失函数,而由损失函数计算的值被简称为“损失”。

我们要最小化或最大化的函数称为目标函数或准则。当我们将其最小化时,我们也可以称其为成本函数、损失函数或误差函数。

成本或损失函数有一项重要的工作,因为它必须忠实地将模型的所有方面提取成一个单独的数字,以便该数字的改进是更好的模型的标志。

成本函数将可能复杂的系统的所有各种好的和不好的方面减少到单个数字,即标量值,这允许对候选解决方案进行排序和比较。

-第155页,神经锤炼:前馈人工神经网络中的监督学习,1999年。

在优化过程中计算模型误差时,必须选择损失函数。

这可能是一个具有挑战性的问题,因为该功能必须捕获问题的属性,并由对项目和利益相关者重要的关注点驱动。

因此,重要的是,该功能必须忠实地代表我们的设计目标。如果我们选择了一个不好的误差函数,并且得到了不满意的结果,那么错误是我们的,因为我们没有很好地说明搜索的目标。

既然我们已经熟悉了损失函数和损失,我们需要知道要使用哪些函数。

最大似然

有许多函数可以用来估计神经网络中一组权值的误差。

我们更喜欢这样的函数,其中候选解的空间映射到平滑(但高维)的景观上,优化算法可以通过迭代更新模型权重来合理地导航该景观。

最大似然估计,或MLE,是一个推理框架,用于从历史训练数据中找到参数的最佳统计估计:这正是我们试图用神经网络做的事情。

最大似然通过最大化从训练数据导出的似然函数来寻找参数的最佳值。

我们有一个具有一个或多个输入变量的训练数据集,并且我们需要一个模型来估计模型权重参数,该参数最好地将输入的示例映射到输出或目标变量。

在给定输入的情况下,模型试图做出与目标变量的数据分布相匹配的预测。在最大似然情况下,损失函数估计模型作出的预测的分布与训练数据中的目标变量的分布有多接近。

解释最大似然估计的一种方法是将其视为将经验分布之间的差异最小化[…]。由训练集和模型分布来定义,两者之间的相异程度由KL发散度来衡量。[…]。最小化这种KL发散恰好对应于最小化分布之间的交叉熵。

对于神经网络和一般的机器学习,使用最大似然作为估计模型参数(权重)的框架的好处在于,随着训练数据集中的样本数量的增加,模型参数的估计得到改善。这就是所谓的“一致性”属性。

在适当的条件下,极大似然估计具有相合性[…]。这意味着当训练样本的数量接近无穷大时,参数的最大似然估计收敛到该参数的真值。

既然我们已经熟悉了最大似然法的一般方法,我们就可以看看误差函数了。

最大似然与交叉熵

在最大似然框架下,使用交叉熵来度量两个概率分布之间的误差。

当我们对分类问题建模时,其中我们感兴趣的是将输入变量映射到类别标签,我们可以将问题建模为预测示例属于每个类别的概率。在二分类问题中,会有两个类别,因此我们可以预测示例属于第一个类别的概率。在多类分类的情况下,我们可以预测属于每个类的示例的概率。

在训练数据集中,示例属于给定类的概率将是1或0,因为训练数据集中的每个样本都是来自域的已知示例。我们知道答案。

因此,在最大似然估计下,我们将寻求一组模型权重,以最小化给定数据集的模型预测概率分布与训练数据集中的概率分布之间的差异。这就是所谓的交叉熵。

在大多数情况下,我们的参数模型定义分布[…]。我们简单地使用了最大似然原理。这意味着我们使用训练数据和模型预测之间的交叉熵作为代价函数。

从技术上讲,交叉熵来自信息论领域,以“比特”为单位。它用于估计估计的概率分布和预测的概率分布之间的差异。

在预测数量的回归问题中,通常使用均方误差(MSE)损失函数来代替。

一些基本功能是非常常用的。均方误差在函数逼近(回归)问题中很常见[…]。当输出被解释为指定类别中的成员概率时,交叉熵误差函数通常用于分类问题。

然而,在极大似然估计的框架下,假设目标变量服从高斯分布,均方误差可以认为是模型预测值的分布与目标变量的分布之间的交叉熵。

许多作者使用术语“交叉熵”来明确地识别伯努利分布或softmax分布的负对数可能性,但这是一个用词不当的说法。任何由负对数似然组成的损失都是由训练集定义的经验分布和由模型定义的概率分布之间的交叉熵。例如,均方误差是经验分布和高斯模型之间的交叉熵。

因此,在使用最大似然估计的框架时,我们会实现交叉熵损失函数,这在实践中往往意味着分类问题的交叉熵损失函数和回归问题的均方误差损失函数。

几乎所有的深度学习神经网络都是在最大似然框架下使用交叉熵作为损失函数进行训练的。

大多数现代神经网络都是使用最大似然法进行训练的。这意味着成本函数为[…]。描述为训练数据和模型分布之间的交叉熵。

事实上,采用这个框架可以被认为是深度学习的一个里程碑,因为在完全形式化之前,神经网络用于分类有时使用均方误差损失函数是很常见的。

这些算法改变之一是用损失函数的交叉熵族代替均方误差。均方误差在20世纪80年代和90年代很流行,但随着想法在统计界和机器学习界之间传播,逐渐被交叉熵损失和最大似然原理所取代。

最大似然法几乎被普遍采用,不仅是因为它的理论框架,而且主要是因为它产生的结果。具体地说,在输出层使用sigmoid或softmax激活函数的用于分类的神经网络使用交叉熵损失函数学习更快且更稳健。

交叉熵损失的使用大大改善了具有sigmoid和softmax输出的模型的性能,这些模型以前在使用均方误差损失时存在饱和和学习速度慢的问题。

使用什么损失函数?

我们可以总结上一节,并直接建议在最大似然框架下应该使用的损失函数。

重要的是,损失函数的选择与神经网络输出层使用的激活函数直接相关。这两个设计元素是相互联系的。

将输出层的配置视为关于预测问题的成帧的选择,并将损失函数的选择视为计算给定问题成帧的误差的方法。(=。

成本函数的选择与产出单位的选择紧密相连。大多数情况下,我们简单地使用数据分布和模型分布之间的交叉熵。然后,如何表示输出的选择决定了交叉熵函数的形式。

我们将回顾关于输出层和损失函数的每种问题类型的最佳实践或默认值。

回归问题

预测实际数量的问题。

  • 输出层配置:一个节点,一个线性激活单元。
  • 损失函数:均方误差(MSE)。

二分分类问题

将示例归类为属于以下两类之一的问题。

问题被框定为预测属于类别1的示例的可能性,例如,你将整数值指定为1的类别,而将值分配为0的类别属于另一个类别。

  • 输出层配置:一个节点带有一个S型激活单元。
  • 损失函数:交叉熵,也称为对数损失。

多类分类问题

将示例归类为属于两个以上类别之一的问题。

问题的框架是预测属于每个类别的示例的可能性。

  • 输出层配置:每个类一个节点,使用Softmax激活功能。
  • 损失函数:交叉熵,也称为对数损失。

如何实现损失函数

为了使损失函数具体化,本节将解释每种主要类型的损失函数是如何工作的,以及如何在Python中计算分数。

均方误差损失

均方误差损失,简称MSE,计算为预测值和实际值之间的平方差的平均值。

无论预测值和实际值的符号如何,结果始终为正,完美值为0.0。损失值是最小化的,尽管它可以通过使得分为负来用于最大化优化过程。

下面的Python函数提供了一个伪代码形式的函数工作实现,该函数用于计算一列实际和一列预测实值数量的均方误差。

# calculate mean squared error
def mean_squared_error(actual, predicted):
	sum_square_error = 0.0
	for i in range(len(actual)):
		sum_square_error += (actual[i] - predicted[i])**2.0
	mean_square_error = 1.0 / len(actual) * sum_square_error
	return mean_square_error

为了更有效地实现,我建议你使用scikit-learn mean_squared_error()函数。

交叉熵损失(或原木损失)

交叉熵损失通常简称为“交叉熵”、“对数损失”、“逻辑损失”或“原木损失”。

将每个预测概率与实际类输出值(0或1)进行比较,并根据与期望值的距离计算惩罚概率的分数。处罚是对数的,小差别(0.1或0.2)得小分,大差别(0.9或1.0)得高分。

交叉熵损失最小,其中较小的值表示比较大的值更好的模型。预测完美概率的模型的交叉熵或对数损失为0.0。

二进制或两类预测问题的交叉熵实际上计算为所有示例的平均交叉熵。

下面的Python函数提供了函数的伪代码形式的工作实现,该函数用于计算与类1的预测概率相比的实际0和1值列表的交叉熵。

from math import log

# calculate binary cross entropy
def binary_cross_entropy(actual, predicted):
	sum_score = 0.0
	for i in range(len(actual)):
		sum_score += actual[i] * log(1e-15 + predicted[i])
	mean_sum_score = 1.0 / len(actual) * sum_score
	return -mean_sum_score

请注意,我们将一个非常小的值(在本例中为1E-15)添加到预测概率,以避免计算对数0.0。这意味着在实践中,最好的可能损失将是非常接近于零的值,但不完全是零。

对于多类分类,可以计算交叉熵。类已经被热编码,这意味着每个类值都有一个二进制特征,并且预测必须具有每个类的预测概率。然后,跨每个二进制特征对交叉熵求和,并跨数据集中的所有示例求平均。

下面的Python函数提供了函数的伪代码形式的工作实现,该函数用于计算实际热编码值列表与每个类的预测概率相比较的交叉熵。

from math import log

# calculate categorical cross entropy
def categorical_cross_entropy(actual, predicted):
	sum_score = 0.0
	for i in range(len(actual)):
		for j in range(len(actual[i])):
			sum_score += actual[i][j] * log(1e-15 + predicted[i][j])
	mean_sum_score = 1.0 / len(actual) * sum_score
	return -mean_sum_score

为了更有效地实现,我建议你使用scikit-learn log_loss()函数。

损失函数和报告的模型性能

在给定最大似然框架的情况下,我们知道在随机梯度下降下需要使用交叉熵或均方误差损失函数。

然而,我们可能希望也可能不希望使用损失函数报告模型的性能。

例如,对数损失很难解释,特别是对于非机器学习从业者利益相关者。对于均方误差也可以这样说。相反,可能更重要的是分别报告用于分类和回归的模型的精度和均方根误差。

基于这些指标而不是损失来选择模型可能也是可取的。这是一个重要的考虑因素,因为损失最小的模型可能不是具有对项目利益相关者重要的最佳度量的模型。

需要考虑的一个很好的划分是使用损失来评估和诊断模型的学习情况。这包括优化过程的所有考虑因素,如过拟合、欠拟合和收敛。然后可以选择对项目涉众有意义的替代度量,以评估模型性能和执行模型选择。

  • 损失:仅用于评估和诊断模型优化。
  • 公制:用于在项目上下文中评估和选择模型。

这两个关注点可以使用相同的度量标准,但更有可能的是,优化过程的关注点与项目的目标不同,需要不同的分数。然而,通常情况下,改善损失会改善,或者在最坏的情况下,对感兴趣的度量没有影响。

进一步阅读

如果你想深入了解,本节提供了更多关于该主题的资源。

书籍

文章

摘要

在这篇文章中,你发现了损失函数和损失函数在训练深度学习神经网络中的作用,以及如何为你的预测建模问题选择正确的损失函数。

具体地说,你了解到:

  • 使用需要损失函数来计算模型误差的优化过程来训练神经网络。
  • 最大似然法提供了在训练神经网络和机器学习模型时选择损失函数的框架。
  • 交叉熵和均方误差是训练神经网络模型时使用的两种主要损失函数。

00

Python

发表评论

邮箱地址不会被公开。 必填项已用*标注

什么阻碍了你实现迈入机器学习领域的目标?

什么阻碍了你实现迈入机器学习领域的目标?

2020-04-22 机器学习

如果你在为进入机器学习领域而挣扎,感觉到有什么东西阻止了自己的开始,那么你应该看看这篇文章。 在这篇文章中,我们会讨论阻止进入机器学习领域的自我限制的信念,让你明白面临的问题。 几乎总是一种自我限制的信念阻碍了你们的进步。 也许你会在一个或多个这样的信念中看到自己。如果是这样的话, [......]

了解详情

R语言机器学习迷你课程

R语言机器学习迷你课程

2020-08-12 机器学习

在这个迷你课程中,你将发现如何开始,构建精确的模型,并自信地完成在14天内使用R预测建模机器学习项目。 这是一个重要而重要的文章。你可能想把它书签。 了解如何准备数据,拟合机器学习模型,并用我的新书评估他们在r上的预测,包括14步教程、3个项目和完整源代码。 我们开始吧。 [......]

了解详情

关于机器学习的几点思考

关于机器学习的几点思考

2020-04-26 机器学习

机器学习是一个大的、跨学科的研究领域。 你可以通过机器学习获得令人印象深刻的结果,并找到非常具有挑战性的问题的解决方案。但这只是更广泛的机器学习领域的一小部分,通常被称为预测建模或预测分析。 在这篇文章中,你将发现如何改变你对机器学习的思考方式,以便更好地为你提供机器学习实践者的服务。 [......]

了解详情

找到你的机器学习部落

找到你的机器学习部落

2020-04-26 机器学习

机器学习是一个充满算法和数据的迷人而强大的研究领域。 问题是,有这么多不同类型的人对机器学习感兴趣,每个人都有不同的需求。重要的是要了解你想要从机器学习中得到什么,并根据这些需求调整你的自学。 如果你不这样做,你很容易就会陷入困境,迷失方向,失去兴趣,得不到你想要的东西。 找到 [......]

了解详情

应用机器学习过程

应用机器学习过程

2020-04-26 机器学习

随着时间的推移,在处理应用机器学习问题时,你会开发出一种模式或流程,以快速获得良好的正常结果。 一旦开发完成,你就可以在一个又一个项目上反复使用此过程。你的流程越健壮、越发达,你就能越快地获得可靠的结果。 在这篇文章中,我想与你分享我解决机器学习问题的过程框架。 你可以将其用作下一 [......]

了解详情