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

在使用 TensorFlow 之前,我自己编写了一些全连接 MLP 和一些循环网络 Python数值模拟 但大多数情况下,我遇到的问题是简单的平方误差和简单的梯度下降就足够了。

然而,由于 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 中,对我来说并不重要)以及有关此主题的一些解释。和/或一些适合初学者的资源;)

有帮助吗?

解决方案

这个答案在 一般的 成本函数的一侧,与 TensorFlow 无关,并且主要解决您问题的“有关此主题的一些解释”部分。

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

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


选择正确的成本函数来实现期望的结果是机器学习问题的关键点。如果您不确切知道您想要从方法中得到什么,基本方法是使用 均方误差(维基百科) 对于回归问题和分类问题的错误百分比。但是,如果你想要 好的 根据你的方法得出的结果,你需要 定义好, ,从而定义适当的成本函数。这来自于领域知识(你的数据是什么,你想要实现什么),以及你可以使用的工具的知识。

我不相信我可以指导您完成 TensorFlow 中已经实现的成本函数,因为我对该工具知之甚少,但我可以给您一个关于如何编写和评估不同成本函数的示例。


为了说明成本函数之间的各种差异,让我们对每个样本使用二元分类问题的示例 $x_n$, , 班上 $f(x_n) \in \{0,1\}$.

从...开始 计算特性;测量“同一事物”的两个函数如何导致不同的结果。采用以下简单的成本函数;错误的百分比。如果你有 $N$ 样品, $f(y_n)$ 是预测类别并且 $y_n$ 真正的类,你想最小化

  • $ frac {1} {n} sum_n left { begin {array} {ll} {ll} 1& text {if} f}结束{array} right。= \sum_n y_n[1-f(x_n)] + [1-y_n]f(x_n)$.

该成本函数的优点是易于解释。然而,这并不顺利;如果只有两个样本,函数会从 0“跳转”到 0.5,再到 1。如果您尝试在此函数上使用梯度下降,这将导致不一致。避免这种情况的一种方法是更改​​成本函数以使用分配概率; $p(y_n = 1 | x_n)$. 。该函数变为

  • $\frac{1}{N} \sum_n y_n p(y_n = 0 | x_n) + (1 - y_n) p(y_n = 1 | x_n)$.

该函数更平滑,并且与梯度下降方法配合使用效果更好。您将得到一个“更精细”的模型。然而,它还有其他问题;如果你有一个模棱两可的样本,假设你没有足够的信息来表达比 $p(y_n = 1 | x_n) = 0.5$. 。然后,在此成本函数上使用梯度下降将导致模型尽可能地增加此概率,因此可能会过度拟合。

这个函数的另一个问题是如果 $p(y_n = 1 | x_n) = 1$ 尽管 $y_n = 0$, ,你肯定是对的,但你是错的。为了避免这个问题,您可以取概率的对数, $\log p(y_n | x_n)$. 。作为 $\log(0) = \infty$$\log(1) = 0$, ,以下函数不存在上一段描述的问题:

  • $\frac{1}{N} \sum_n y_n \log p(y_n = 0 | x_n) + (1 - y_n) \log p(y_n = 1 | x_n)$.

这应该说明,为了优化 一样, ,错误百分比,如果在计算上更容易理解,不同的定义可能会产生不同的结果。

成本函数是可以的 $A$$B$ 来测量 相同的概念, , 但 $A$ 可能会导致你的方法比 $B$.


现在让我们看看不同的成本函数如何衡量不同的概念。在信息检索的上下文中,例如在谷歌搜索中(如果我们忽略排名),我们希望返回的结果

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

为了判断此类算法,常见的成本函数是 $F$-分数(维基百科). 。常见的情况是 $F_1$-score,它对精度和召回率给予同等的权重,但一般情况下 $F_\测试版$- 分数,你可以调整 $\测试版$ 要得到

  • 更高的召回率,如果你使用 $\beta > 1$
  • 如果使用的话,精度会更高 $\beta < 1$.

在这样的场景下, 选择成本函数就是选择你的算法应该做什么权衡.

另一个经常提到的例子是医疗诊断的情况,你可以选择一个成本函数来惩罚更多的假阴性或假阳性,具体取决于什么是更可取的:

  • 更多健康的人被归类为患病(但是,我们可能会治疗健康的人,这是昂贵的,并且如果他们实际上没有生病,可能会伤害他们)
  • 更多病人被归类为健康(但随后,他们可能会在不接受治疗的情况下死亡)

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


边注:一些成本函数有很好的算法方法来实现其目标。例如,一个很好的方法来最小化 铰链损失(维基百科) 存在,通过解决对偶问题 支持向量机(维基百科)

其他提示

为了回答您在交叉熵上的问题,您会注意到您提到的两者都是同一件事。

$ - frac {1} {n} sum(y _train * log(y _Output) +(1- y _train) cdot log(1 -y _OUTPUT)$

您提到的只是二进制交叉熵损失,您假设$ y _train $是0/1标量,而$ y _Output $再次是标量,表明输出的概率为1。

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

-tf.reduce_sum(y_train * tf.log(y_output))与写作一样

$ - sum_n火车 _prob cdot log(out _prob)$

在多个类别上的总和是每个类的概率。显然,在二进制案例中,这与前面提到的完全相同。 $ n $项被省略,因为它不会以最小化的方式贡献,因为它是一个常数。

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

长答案:

不久前,我的团队正在挣扎着同样的问题。这里的所有答案都很棒,但是我想与您分享上下文的“初学者答案”,作为新手机器学习的人们的起点。

您想瞄准一个成本函数,该成本函数是平稳且凸出的,用于您的特定选择算法和数据集。那是因为您希望您的算法能够自信,有效地调整权重,以最终达到该成本功能的全球最低限度。如果您的成本函数与本地Max和Min的Main和/或没有全球最低限度“颠簸”,那么您的算法可能很难融合;它的权重可能只是整个地方跳跃,最终无法为您提供准确和/或一致的预测。

例如,如果您使用线性回归来根据其身高(实际数字,英寸)和年龄(实际数字,年龄)来预测某人的体重(实际数量,磅),则平均平方错误成本函数应为一条漂亮,光滑,凸曲线。您的算法不会融合任何问题。

但是,说相反,您正在使用逻辑回归算法来解决二进制分类问题,例如根据该人在过去30天内是否购买了尿布的性别,以及该人是否在过去30天内购买了啤酒。在这种情况下,均方根误差可能不会给您光滑的凸表面,这可能对训练不利。您会通过实验说明这一点。

您可以从使用MSE和数据的少量简单示例或使用该实验生成的模拟数据进行试验开始。可视化Matplotlib(或您喜欢的任何绘图解决方案)正在发生的事情。产生的误差曲线是否光滑且凸?再次尝试使用附加的输入变量...结果表面是否仍然光滑且凸?通过此实验,您可能会发现,尽管MSE不符合您的问题/解决方案,但交叉熵为您提供了更适合您需求的光滑凸形。因此,您可以使用较大的示例数据集尝试一下,并查看假设是否仍然存在。如果确实如此,那么您可以使用完整的培训设置进行几次尝试,看看它的性能以及它是否始终如一地提供相似的型号。如果没有,请选择其他成本函数并重复该过程。

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

当然,其他人已经进行了许多试验和错误,因此我们还利用公共知识来帮助我们过滤我们对此过程中可能是好的成本功能的选择。例如,横熵通常是分类问题的一个不错选择,无论是带有逻辑回归的二进制分类,例如上面的示例,还是更复杂的多标签分类,以软磁性层作为输出。尽管MSE是线性回归问题的一个不错的首选,在这种情况下,您正在寻求标量预测,而不是已知类别中已知类别中会员资格的可能性,但在这种情况下,代替了SoftMax层作为输出,您会' D可以只有输入加权加权总和而无需激活函数。

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

重新评估您的问题

大多数张量示例中的(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]

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

许可以下: CC-BY-SA归因
scroll top