在 Keras 模型中优化准确性而不是损失
Optimizing for accuracy instead of loss in Keras model
如果我正确理解了损失函数对模型的重要性,它会指导模型根据损失值最小化进行训练。因此,例如,如果我希望我的模型接受训练以获得最小平均绝对误差,我应该使用 MAE 作为损失函数。例如,为什么有时您会看到有人想要尽可能获得最佳准确度,却构建模型以最小化另一个完全不同的函数?例如:
model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')
为什么上面的模型经过训练可以给我们最好的 acc,因为在训练期间它会尝试最小化另一个函数 (MSE)。我知道,经过训练后,模型的指标将为我们提供训练期间找到的最佳 acc。
我的疑问是:模型在训练期间的重点不应该是最大化 acc(或最小化 1/acc)而不是最小化 MSE 吗?如果以这种方式完成,模型不会给我们更高的准确性,因为它知道它必须在训练期间最大化它吗?
首先,您用作示例的代码片段:
model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')
实际上是无效的(尽管 Keras 不会产生任何错误或警告),原因非常简单和基本:MSE 是回归的有效损失 问题,对于这些问题,准确性是没有意义的(它仅对 分类 问题有意义,其中 MSE 不是有效的损失函数)。有关详细信息(包括代码示例),请参阅 ; for a similar situation in scikit-learn, see own answer in 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) 中的性能。
现在,你的问题:
shouldn't the focus of the model during its training to maximize acc (or minimize 1/acc) instead of minimizing MSE?
确实是有效的,至少在原则上是有效的(除了参考MSE),但只适用于分类问题,其中,大致来说,情况如下:我们不能使用大量的凸优化方法来直接最大化精度,因为精度不是可微函数;所以,我们需要一个代理可微函数作为损失。这种适用于分类问题的损失函数最常见的例子是 cross entropy.
不出所料,您的这个问题时常出现,尽管上下文略有不同;例如在
中查看自己的答案
对于二元分类特殊情况下损失和准确度之间的相互作用,您可能会发现我在以下主题中的回答很有用:
如果我正确理解了损失函数对模型的重要性,它会指导模型根据损失值最小化进行训练。因此,例如,如果我希望我的模型接受训练以获得最小平均绝对误差,我应该使用 MAE 作为损失函数。例如,为什么有时您会看到有人想要尽可能获得最佳准确度,却构建模型以最小化另一个完全不同的函数?例如:
model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')
为什么上面的模型经过训练可以给我们最好的 acc,因为在训练期间它会尝试最小化另一个函数 (MSE)。我知道,经过训练后,模型的指标将为我们提供训练期间找到的最佳 acc。
我的疑问是:模型在训练期间的重点不应该是最大化 acc(或最小化 1/acc)而不是最小化 MSE 吗?如果以这种方式完成,模型不会给我们更高的准确性,因为它知道它必须在训练期间最大化它吗?
首先,您用作示例的代码片段:
model.compile(loss='mean_squared_error', optimizer='sgd', metrics='acc')
实际上是无效的(尽管 Keras 不会产生任何错误或警告),原因非常简单和基本:MSE 是回归的有效损失 问题,对于这些问题,准确性是没有意义的(它仅对 分类 问题有意义,其中 MSE 不是有效的损失函数)。有关详细信息(包括代码示例),请参阅
继续你的一般问题:在回归设置中,通常我们不需要单独的性能指标,我们通常只使用损失函数本身来达到这个目的,即您使用的示例的正确代码只是
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) 中的性能。
现在,你的问题:
shouldn't the focus of the model during its training to maximize acc (or minimize 1/acc) instead of minimizing MSE?
确实是有效的,至少在原则上是有效的(除了参考MSE),但只适用于分类问题,其中,大致来说,情况如下:我们不能使用大量的凸优化方法来直接最大化精度,因为精度不是可微函数;所以,我们需要一个代理可微函数作为损失。这种适用于分类问题的损失函数最常见的例子是 cross entropy.
不出所料,您的这个问题时常出现,尽管上下文略有不同;例如在
中查看自己的答案对于二元分类特殊情况下损失和准确度之间的相互作用,您可能会发现我在以下主题中的回答很有用: