神经网络:使用哪个成本函数?


48

我正在使用TensorFlow主要用于神经网络的实验。尽管现在我已经做了大量的实验(XOR问题,MNIST,一些回归的东西……),但是我为特定的问题选择“正确的”成本函数很困难,因为总的来说我可以被认为是一个初学者。

在上TensorFlow之前,我自己使用PythonNumPy编写了一些完全连接的MLP和一些递归网络,但大多数情况下,我遇到了一个简单的平方误差和简单的梯度设计就足够了的问题。

但是,由于TensorFlow本身提供了很多成本函数以及构建自定义成本函数的功能,所以我想知道是否存在某种专门针对神经网络上的成本函数的教程?(我已经完成了一半的TensorFlow官方教程,但它们并没有真正解释为什么特定成本函数或学习者用于特定问题-至少对于初学者而言)

举一些例子:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

我猜想它在两个输入上都应用了softmax函数,以便一个向量的总和等于1。但是对数与logits的交叉熵到底是什么呢?我以为它会汇总值并计算交叉熵...那么一些度量标准度量值呢?如果我对输出进行归一化,求和并求平方误差,这是否会完全相同?此外,为什么将其用于MNIST(甚至更困难的问题)?当我想分类为10个甚至1000个类时,汇总这些值是否会完全破坏有关输出实际上是哪个类的任何信息?

cost = tf.nn.l2_loss(vector)

这个是来做什么的?我以为l2损失几乎是平方误差,但TensorFlow的API告诉它输入只是一个张量。根本不知道这个主意吗?

此外,我经常看到这种用于交叉熵的方法

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

...但是为什么要使用它?数学上的交叉熵损失不是:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

哪里是(1 - y_train) * log(1 - y_output)在最TensorFlow例子的一部分?它不丢失吗?


答:我知道这个问题是很开放的,但是我不希望得到详细列出每个问题/成本函数的10页。我只需要简短总结一下何时使用哪个成本函数(一般而言还是在TensorFlow中,对我来说并不重要),以及有关此主题的一些解释。和/或一些初学者的资源;)


1
好问题。欢迎来到网站:)
Dawny33

2
通常,MSE用于回归,而交叉熵用于分类。Hampshire和Waibel在“使用时延神经网络改善音素识别的新型目标函数”中引入了分类优点指标(CFM)。如果我没记错的话,他们还解释了为什么像他们一样设计CFM。
马丁·托马

1
我认为reduce_sum(y_train * tf.log(y_output))被大量使用,因为它是一个非常常见的“简单案例”示例。它将对每个批次的错误求和,这意味着如果您的batch_sizes为两倍,则错误将使成本(和梯度的大小)增加一倍。在我看来,对reduce_mean进行简单更改至少将使调试和使用设置更加容易理解。
神经元

Answers:


33

该答案是成本函数的一般方面,与TensorFlow不相关,并且将主要解决问题的“有关此主题的某些解释”部分。

在我遵循的大多数示例/教程中,使用的成本函数有些武断。重点是向读者介绍一种特定的方法,而不是针对成本函数。不应阻止您按照教程来熟悉这些工具,但我的回答应帮助您如何选择针对自己的问题的成本函数。

如果您需要有关交叉熵,Logit,L2规范或任何特定问题的答案,我建议您发布多个更具体的问题。这将增加具有特定知识的人看到您的问题的可能性。


选择正确的成本函数以获得理想的结果是机器学习问题的关键所在。如果您不完全知道要从方法中得到什么,则基本方法是对回归问题使用均方误差(Wikipedia),对分类问题使用误差百分比。但是,如果您希望从方法中获得好的结果,则需要定义good,从而定义足够的成本函数。这既来自领域知识(您的数据是什么,您想要达到什么目的),也来自于您可以使用的工具的知识。

我不认为可以指导您完成TensorFlow中已实现的成本函数,因为我对该工具了解甚少,但是我可以举一个示例说明如何编写和评估不同的成本函数。


XñFXñ{01个}

ñFÿñÿñ

  • 1个ññ{1个 如果 FXñÿñ0 除此以外=ñÿñ[1个-FXñ]+[1个-ÿñ]FXñ

pÿñ=1个|Xñ

  • 1个ññÿñpÿñ=0|Xñ+1个-ÿñpÿñ=1个|Xñ

pÿñ=1个|Xñ=0.5

pÿñ=1个|Xñ=1个ÿñ=0日志pÿñ|Xñ日志0=日志1个=0,以下功能没有上一段中描述的问题:

  • 1个ññÿñ日志pÿñ=0|Xñ+1个-ÿñ日志pÿñ=1个|Xñ

这应该说明,为了优化同一件事(错误百分比),如果更容易从计算上理解它们,则不同的定义可能会产生不同的结果。

一种一种


现在,让我们看看不同的成本函数如何衡量不同的概念。在信息检索的背景下,就像在Google搜索中一样(如果我们忽略排名),我们希望返回的结果能够

请注意,如果您的算法返回all,它将返回所有可能的结果,因此召回率很高,但精度很差。另一方面,如果只返回一个元素,则最确定的一个元素是相关的,它将具有较高的精度,但召回率较低。

FF1个Fββ

  • 如果您使用,则召回率更高β>1个
  • β<1个

在这种情况下,选择成本函数就是选择算法应该做的折衷

经常出现的另一个例子是医疗诊断,您可以选择一种成本函数,根据更可取的条件来惩罚更多的假阴性或假阳性:

  • 更多健康的人被归类为疾病(但是,我们可能会治疗健康的人,这很昂贵,如果他们实际上没有生病,可能会伤害他们)
  • 越来越多的患者被归类为健康患者(但是,如果不进行治疗,他们可能会死亡)

总之,定义成本函数就是定义算法的目标。该算法定义了如何到达那里。


旁注:某些成本函数具有实现目标的良好算法。例如,通过解决SVM中的双重问题(Wikipedia),存在一种最小化铰链损耗的好方法(Wikipedia)


10

要回答关于交叉熵的问题,您会注意到您提到的都是同一件事。

-1个ñÿ_Ť[R一种一世ñ日志ÿ_ØüŤpüŤ+1个-ÿ_Ť[R一种一世ñ日志1个-ÿ_ØüŤpüŤ

ÿ_Ť[R一种一世ñÿ_ØüŤpüŤ

您提到的另一个等式是扩展到多个类的更通用的变体

-tf.reduce_sum(y_train * tf.log(y_output)) 和写作是一样的

-ñŤ[R一种一世ñ_p[RØb日志ØüŤ_p[RØb

ñ


4

BLUF:具有数据子集和matplotlib的迭代试验和错误。

长答案:

不久前,我的团队就在同一个问题上苦苦挣扎。这里的所有答案都很不错,但是我想与您分享我的“初学者答案”,以了解上下文,并作为机器学习新手的起点。

您想要针对特定​​算法和数据集选择平滑且凸的成本函数。这是因为您希望算法能够自信有效地调整权重,以最终达到该成本函数的全局最小值。如果您的成本函数具有局部最大值和最小值的“颠簸”,和/或没有全局最小值,则您的算法可能难以收敛;它的权重可能会随处可见,最终无法为您提供准确和/或一致的预测。

例如,如果您使用线性回归基于某人的身高(实际数,以英寸为单位)和年龄(实际数,以年为单位)预测某人的体重(实际数,以磅为单位),则均方误差成本函数应为优美,平滑,凸出的曲线。您的算法收敛没有问题。

但是要说相反,您正在使用逻辑回归算法来解决二进制分类问题,例如根据该人在过去30天内是否购买过尿布以及该人在最近30天内是否购买过啤酒来预测一个人的性别。在这种情况下,均方误差可能无法为您提供光滑的凸面,这可能不利于训练。你会通过实验告诉。

您可以通过使用MSE和一小段简单的数据样本或为该实验生成的模拟数据进行试验来开始。可视化matplotlib(或您喜欢的任何绘图解决方案)发生的情况。产生的误差曲线是否平滑且凸出?再试一次其他输入变量...生成的表面是否仍然光滑且凸出?通过该实验,您可能会发现,尽管MSE不能解决您的问题/解决方案,但是交叉熵为您提供了一个平滑的凸形,可以更好地满足您的需求。因此,您可以使用更大的样本数据集进行尝试,看看该假设是否仍然成立。如果是这样,那么您可以将其与完整的训练集一起尝试几次,看看它的性能以及是否始终如一地提供相似的模型。如果不是,则选择另一个成本函数并重复该过程。

对于我和我的初学者数据科学家团队而言,这种高度迭代的反复试验过程一直非常有效,它使我们能够专注于找到问题的解决方案,而不必深入研究成本函数选择和选择背后的数学理论。模型优化。

当然,其他人已经做了很多这样的尝试和错误,因此我们还利用公共知识来帮助我们在过程的早期筛选可能是好的成本函数的选择。例如,交叉熵通常是分类问题的一个不错的选择,无论是像上面的例子那样的具有逻辑回归的二进制分类,还是以softmax层作为输出的更复杂的多标签分类。而对于线性回归问题,MSE是不错的首选,在这种情况下,您正在寻找标量预测,而不是在一组可能的已知类别中寻找某个已知类别的隶属关系,在这种情况下,您将使用softmax层作为输出,而不是d可能只具有输入的加权总和加上偏差,而没有激活函数。

希望这个答案可以帮助其他初学者,而不要过于简单和明显。


3

重提您的问题

在大多数TensorFlow示例中,(1-y_train)* log(1-y_output)部分在哪里?它不丢失吗?

答案是大多数输出​​函数都是softmax。这意味着您不必在错误情况下减少所有概率,因为当您增加正确概率的概率时,它们将自动减少。

例如:

优化之前

y_output = [0.2, 0.2, 0.6]y_train = [0, 0, 1]

优化后

y_output = [0.15, 0.15, 0.7]y_train = [0, 0, 1]

在这里观察到,即使我们只是增加了第三项,其他所有项也会自动减少

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.