优化精度而不是Keras模型中的损失

时间:2019-06-07 16:59:20

标签: python r machine-learning keras loss-function

如果我正确地了解了损失函数对模型的重要性,它会基于最小化损失值来指导模型进行训练。因此,例如,如果我希望对模型进行训练以使平均绝对误差最小,则应使用MAE作为损失函数。例如,为什么有时您看到有人想要获得最佳的准确性,却建立模型以最小化另一个完全不同的功能,为什么呢?例如:

model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')

如何训练上面的模型以给我们提供最好的acc,因为在训练过程中它将尝试最小化另一个功能(MSE)。我知道,经过培训后,模型的指标将为我们提供培训期间发现的最佳acc。

我的疑问是:模型训练期间的重点是否应该最大化acc(或最小化1 / acc)而不是最小化MSE?如果采用这种方式,模型是否不会为我们提供更高的准确性,因为它知道必须在训练过程中将其最大化?

3 个答案:

答案 0 :(得分:0)

首先,以您作为示例的代码段为例:

model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')

实际上是无效(尽管Keras不会产生任何错误或警告),原因很简单:基本的原因:MSE对于回归问题是有效的损失,为此问题的准确性是没有意义的(仅对分类问题有意义,因为MSE不是有效的损失函数)。有关详细信息(包括代码示例),请参见What function defines accuracy in Keras when the loss is mean squared error (MSE)?中的答案。对于scikit-learn中类似的情况,请参见this thread中的答案。

继续您的一般问题:在回归设置中,通常我们不需要单独的性能指标,为此,我们通常仅使用损失函数本身,即用于您曾经使用过的示例就是

model.compile(loss='mean_squared_error', optimizer='sgd')

,未指定任何metrics。我们当然可以使用metrics='mse',但这是多余的,并不是真正需要的。有时人们会使用类似的

model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['mse','mae'])

即根据MSE损失优化模型,但除MSE之外,还显示其在平均绝对误差(MAE)中的性能。

现在,您的问题:

  

模型训练过程中的重点不是应该最大化acc(或最小化1 / acc),而不是最小化MSE吗?

至少在原则上确实有效(保留用于MSE的参考),但仅用于分类问题,在这种情况下,大致来说,情况如下:我们无法使用庞大的军械库凸优化方法是为了直接使精度最大化,因为精度不是微分函数;因此,我们需要代理可区分函数以用作损失。这种适合分类问题的损失函数最常见的例子是cross entropy

不出所料,这个问题会时不时地出现,尽管情况略有不同。例如查看自己的答案

对于在二进制分类的特殊情况下损失和准确性之间的相互作用,您可能会在以下有用的线程中找到我的答案:

答案 1 :(得分:0)

精度无与伦比。因此它不能是损失函数。它只能用作指标。

答案 2 :(得分:-1)

如果我理解正确,您的问题是:为什么我们可以优化“准确性”时优化“损失”。

简短答案:

当然可以! (对于融合是否有益是另一个问题)。您会发现,损失(在您的情况下为MSE)和准确性本质上都是常用函数,或者是精确的方程式,您可以选择任何方程式作为objective function

也许是由于使用了诸如“ mse”之类的东西,甚至更令人困惑:"acc"

检查this文件以更清楚地了解编写"mse"时的情况

"acc"有点困惑。您会看到,当您编写“ acc”时,它对Keras具有多种含义。因此,根据您使用的损失函数,Keras会为您确定最佳的“ acc”函数。检查this文件,查看编写"acc"

时会发生什么

最后,回答您的问题:shouldn't the focus of the model during it's training to maximize acc (or minimize 1/acc) instead of minimizing MSE?

对喀拉拉邦来说,MSEacc只是函数。 Keras会根据以下函数定义的反馈优化模型:

model.compile(loss=<function_to_take_feedback_from>, optimizer=<also_another_function>, metrics=<function_to_just_evaluate_and_print_result_hoping_this_printed_value_means_something_to_you_the_user>)

总结:

对于attribute: loss

传递一个函数。如果您不想这样做,只需编写"mse",keras就会为您传递所需的功能。

attribute: metrics

传递功能列表。如果您像我一样懒惰,那么可以简单地要求keras通过写"acc"

来做到这一点。

长答案:

您应该使用哪个函数/方程式作为目标函数?

那是另一天:)